commit 05b785083c5d222c9d4adc2600d6e8ca173846d4 Author: zhenhui <1276357500@qq.com> Date: Mon Mar 2 13:44:38 2026 +0800 初始化 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..52d40e8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +/.idea +/.vscode +/vendor +*.log +.env +/tests/tmp +/tests/.phpunit.result.cache +/public/storage +/node_modules +/build/ +/composer.lock +/phinx.php +.htaccess +nginx.htaccess diff --git a/.rnd b/.rnd new file mode 100644 index 0000000..ca56305 Binary files /dev/null and b/.rnd differ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2c66292 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 walkor and contributors (see https://github.com/walkor/webman/contributors) + +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/PROJECT_ANALYSIS.md b/PROJECT_ANALYSIS.md new file mode 100644 index 0000000..9493e88 --- /dev/null +++ b/PROJECT_ANALYSIS.md @@ -0,0 +1,444 @@ +# GGL 项目分析文档 + +## 一、项目概述 + +本项目是一个基于 **Webman(Workerman)** 框架构建的 **游戏聚合 + 支付平台** 后端系统,提供玩家端 API、第三方回调接口以及后台管理系统(ExAdmin)。 + +- **框架**: Webman (workerman/webman-framework ^1.5.0) +- **语言**: PHP >= 7.2 +- **ORM**: Illuminate Database (Eloquent) ^8.83 +- **后台管理**: ExAdmin (rockys/ex-admin-webman ^1.0) +- **HTTP 监听**: `http://0.0.0.0:8786` +- **进程数**: `cpu_count() * 4` + +--- + +## 二、项目目录结构 + +``` +ggl/ +├── addons/webman/ # ExAdmin 后台管理模块 +│ ├── controller/ # 后台控制器 (28个) +│ ├── model/ # Eloquent 数据模型 (60+) +│ ├── middleware/ # 后台中间件 +│ ├── database/ # 数据库迁移 & 种子 +│ ├── service/ # 菜单等服务 +│ ├── token/ # Token 驱动 +│ ├── traits/ # 公共 Trait +│ ├── validator/ # 验证器 +│ ├── common/ # 公共组件 (登录/系统) +│ ├── echart/ # 图表组件 +│ ├── form/ # 表单组件 +│ └── grid/ # 列表组件 +├── app/ +│ ├── api/controller/v1/ # 玩家端 API 控制器 +│ ├── external/ # 外部回调 API 控制器 +│ ├── exception/ # 异常处理 +│ ├── middleware/ # 应用中间件 +│ ├── queue/redis/ # Redis 队列消费者 +│ ├── service/ # 业务服务层 +│ │ └── game/ # 游戏平台接口适配 +│ └── functions.php # 全局函数 +├── config/ # 配置文件 +├── db/migrations/ # Phinx 数据库迁移 +├── process/ # 自定义进程 +├── public/ # Web 静态资源 +├── resource/translations/ # 多语言资源 (zh_CN, en, Ma_my, cam_dia) +├── runtime/ # 运行时文件 (日志/缓存) +├── support/ # 框架辅助文件 +├── composer.json +├── start.php # Linux 入口 +└── windows.php # Windows 入口 +``` + +--- + +## 三、核心功能模块 + +### 3.1 玩家端功能 + +| 模块 | 功能描述 | +|------|----------| +| 用户认证 | 手机号注册、短信验证码、登录、登出、忘记密码 | +| 玩家信息 | 获取玩家信息、编辑昵称 | +| 银行卡管理 | 银行列表、添加/编辑/删除银行卡 | +| 充值功能 | 充值列表、充值项配置、玩家充值、上传凭证、SePay充值 | +| 提现功能 | 提现申请、SePay提现 | +| 账单记录 | Cash In/Out列表、充提记录、游戏记录 | +| 游戏中心 | 登录游戏、获取游戏地址 | +| 抽奖系统 | 奖品列表、抽奖、抽奖记录 | +| 数据中心 | 礼品中心 | +| 版本更新 | APP 版本检测更新 | + +### 3.2 后台管理功能 + +| 模块 | 功能描述 | +|------|----------| +| 仪表盘 | 登录数据、玩家数据、充值/提现数据、图表统计 | +| 玩家管理 | 玩家列表、等级设置、标签管理、人工充值/提现、钱包管理、密码重置 | +| 游戏管理 | 游戏列表、进入游戏、奖品管理、每日库存补充、游戏服务配置 | +| 充值管理 | 充值记录、充值审核、充值方式配置、快捷支付配置 | +| 提现管理 | 提现记录、提现审核(通过/拒绝)、付款处理 | +| 渠道管理 | 渠道列表、渠道管理员、渠道配置 | +| 系统管理 | 菜单管理、角色权限管理、部门管理、岗位管理、系统设置 | +| 货币管理 | 货币列表、货币配置 | +| APP版本管理 | Android/iOS 版本管理、渠道配置、APK解压 | +| 附件管理 | 文件上传、分类管理 | +| 游戏记录 | 玩家游戏记录查询 | +| 配送记录 | 玩家配送记录查询 | + +### 3.3 第三方集成 + +| 服务 | 说明 | +|------|------| +| SKL Pay | 支付充值、提现、回调通知 | +| One Pay | 支付服务 | +| Se Pay | 支付充值、提现服务 | +| 短信服务 | Weiqucloud 短信 API(含日本/台湾短信) | +| Facebook SDK | Facebook Graph SDK 集成 | +| WebSocket 推送 | webman/push 实时消息推送 | + +### 3.4 游戏平台适配 + +通过 `GameServiceInterface` 统一接口 + `GameServiceFactory` 工厂模式,接入多个游戏平台: + +| 游戏平台 | 接口文件 | +|----------|----------| +| MEGA888 | MeGa888ServiceInterface.php | +| KISS918 | Kiss918ServiceInterface.php | +| Joker | JokerServiceInterface.php | +| JiLi | JiLiServiceInterface.php | +| JDB | JDBServiceInterface.php | +| Pragmatic | PragmaticServiceInterface.php | +| LionKing | LionKingServiceInterface.php | +| Lucky365 | Lucky365ServiceInterface.php | +| MarioClub | MarioClubServiceInterface.php | +| MonkeyKing | MonkeyKingServiceInterface.php | +| NextSpin | NextSpinServiceInterface.php | +| BigGaming | BigGamingServiceInterface.php | +| CS | CSServiceInterface.php | + +统一接口方法:`createPlayer()`、`getPlayer()`、`getSimpleGameList()`、`login()` + +--- + +## 四、API 接口清单 + +### 4.1 玩家端 API(`/api/v1`) + +> 请求方式:全部为 **POST** +> 中间件:`SiteAuthMiddleware`(需要 `Site-Id` 请求头)、`Lang`(多语言)、`AppVersionMiddleware`(版本校验) + +#### 4.1.1 认证与用户 + +| 接口路径 | 控制器方法 | 功能说明 | +|----------|-----------|----------| +| `/api/v1/phone-register` | PlayerController@phoneRegister | 手机号注册 | +| `/api/v1/send-msg` | PlayerController@sendMsg | 发送短信验证码 | +| `/api/v1/login` | PlayerController@login | 玩家登录 | +| `/api/v1/logout` | IndexController@logout | 玩家登出 | +| `/api/v1/forget-password` | PlayerController@forgetPassword | 忘记密码 | +| `/api/v1/player-info` | PlayerController@playerInfo | 获取玩家信息 | +| `/api/v1/edit-player-name` | PlayerController@editPlayerName | 编辑玩家昵称 | + +#### 4.1.2 银行卡管理 + +| 接口路径 | 控制器方法 | 功能说明 | +|----------|-----------|----------| +| `/api/v1/bank-list` | IndexController@bankList | 获取银行列表 | +| `/api/v1/bank-card-list` | IndexController@bankCardList | 获取用户银行卡列表 | +| `/api/v1/add-bank-card` | IndexController@addBankCard | 添加银行卡 | +| `/api/v1/edit-bank-card` | IndexController@editBankCard | 修改银行卡 | +| `/api/v1/delete-bank-card` | IndexController@deleteBankCard | 删除银行卡 | + +#### 4.1.3 充值相关 + +| 接口路径 | 控制器方法 | 功能说明 | +|----------|-----------|----------| +| `/api/v1/recharge-list` | PlayerController@rechargeList | 获取充值列表 | +| `/api/v1/recharge-setting-list` | PlayerController@rechargeSettingList | 获取充值项配置列表 | +| `/api/v1/recharge-info` | PlayerController@rechargeInfo | 获取充值配置详情 | +| `/api/v1/player-recharge` | IndexController@playerRecharge | 玩家充值 | +| `/api/v1/upload-certificate` | IndexController@uploadCertificate | 上传充值凭证 | +| `/api/v1/complete-recharge` | PlayerController@completeRecharge | 完成充值 | +| `/api/v1/se-recharge-list` | PlayerController@seRechargeList | SePay充值列表 | +| `/api/v1/se-recharge` | PlayerController@seRecharge | SePay充值 | + +#### 4.1.4 提现相关 + +| 接口路径 | 控制器方法 | 功能说明 | +|----------|-----------|----------| +| `/api/v1/withdrawal` | IndexController@playerWithdrawal | 玩家提现 | +| `/api/v1/se-withdrawal` | PlayerController@seWithdrawal | SePay提现 | + +#### 4.1.5 账单与记录 + +| 接口路径 | 控制器方法 | 功能说明 | +|----------|-----------|----------| +| `/api/v1/cash-out-list` | IndexController@cashOutList | Cash Out 列表 | +| `/api/v1/cash-in-list` | IndexController@cashInList | Cash In 列表 | +| `/api/v1/game-record` | PlayerController@gameRecord | 游戏记录 | +| `/api/v1/deposit-withdrawal-records` | PlayerController@depositWithdrawalRecord | 充提记录 | + +#### 4.1.6 游戏相关 + +| 接口路径 | 控制器方法 | 功能说明 | +|----------|-----------|----------| +| `/api/v1/login-game` | GameController@loginGame | 登录游戏(返回游戏地址)| +| `/api/v1/gametest` | GameController@gametest | 游戏测试接口 | + +#### 4.1.7 抽奖系统 + +| 接口路径 | 控制器方法 | 功能说明 | +|----------|-----------|----------| +| `/api/v1/prize-list` | GameController@getPrizeList | 获取奖品列表 | +| `/api/v1/lottery` | GameController@lottery | 执行抽奖 | +| `/api/v1/draw-records` | GameController@getDrawRecords | 获取抽奖记录 | + +#### 4.1.8 其他 + +| 接口路径 | 控制器方法 | 功能说明 | +|----------|-----------|----------| +| `/api/v1/get-app-update` | VersionController@getAppUpdate | 获取APP版本更新信息 | +| `/api/v1/channel-info` | IndexController@channelInfo | 获取渠道信息 | +| `/api/v1/gift-center` | PlayerController@giftCenter | 数据中心/礼品中心 | + +--- + +### 4.2 外部回调接口(`/external`) + +| 接口路径 | 请求方式 | 控制器方法 | 功能说明 | +|----------|---------|-----------|----------| +| `/external/login` | GET | ExternalApiController@login | 外部登录页面 | +| `/external/download` | GET | ExternalApiController@download | 外部下载页面 | +| `/external/skl-recharge-notify` | POST | ExternalApiController@sklRechargeNotify | SKL支付充值回调 | +| `/external/skl-withdrawal-notify` | POST | ExternalApiController@sklWithdrawalNotify | SKL支付提现回调 | +| `/external/skl-query/` | GET | ExternalApiController@sklQuery | SKL支付跳转查询 | + +--- + +### 4.3 后台管理接口 + +后台基于 ExAdmin 自动生成 CRUD 路由,默认路径前缀为 `/admin` 和 `/agent`。 + +#### 主要管理模块 + +| 模块 | 控制器 | 主要功能 | +|------|--------|----------| +| 管理员 | AdminController | 管理员列表、修改密码、编辑信息、重置密码 | +| 仪表盘 | IndexController | 登录/玩家/充值/提现数据统计、图表 | +| 玩家管理 | PlayerController | 玩家CRUD、等级/标签、人工充提、钱包、记录查询 | +| 游戏管理 | GameController | 游戏CRUD、进入游戏、奖品管理、服务配置 | +| 充值记录 | RechargeRecordController | 充值记录查询、玩家详情 | +| 提现记录 | WithdrawRecordController | 提现记录查询、玩家详情 | +| 菜单管理 | MenuController | 菜单CRUD | +| 角色管理 | RoleController | 角色CRUD、权限分配 | +| 部门管理 | DepartmentController | 部门CRUD | +| 岗位管理 | PostController | 岗位CRUD | +| 系统设置 | SystemSettingController | 系统配置、结算日期 | +| 货币管理 | CurrencyController | 货币CRUD | +| APP版本 | AppVersionController | Android/iOS版本管理 | +| 附件管理 | AttachmentController | 文件上传、分类 | +| 游戏记录 | PlayGameRecordController | 游戏记录查询 | +| 配送记录 | PlayerDeliveryRecordController | 配送记录查询 | + +#### 渠道端管理模块(`/agent`) + +| 模块 | 控制器 | 主要功能 | +|------|--------|----------| +| 渠道仪表盘 | ChannelIndexController | 渠道数据统计 | +| 渠道玩家 | ChannelPlayerController | 玩家管理、推广员绑定 | +| 渠道管理 | ChannelController | 渠道CRUD | +| 渠道管理员 | ChannelAdminController | 渠道管理员CRUD | +| 渠道充值记录 | ChannelRechargeRecordController | 充值审核(通过/拒绝)、凭证查看 | +| 渠道充值配置 | ChannelRechargeController | 充值方式、快捷支付配置 | +| 渠道提现记录 | ChannelWithdrawRecordController | 提现审核、付款处理 | +| 渠道游戏 | ChannelGameController | 游戏管理 | +| 渠道岗位 | ChannelPostController | 岗位管理 | +| 渠道游戏记录 | ChannelPlayGameRecordController | 游戏记录 | +| 渠道配送记录 | ChannelPlayerDeliveryRecordController | 配送记录 | + +--- + +## 五、中间件 + +### 5.1 应用中间件(API 请求) + +| 中间件 | 作用 | +|--------|------| +| SiteAuthMiddleware | 站点/渠道验证,通过 `Site-Id` 请求头识别渠道 | +| Lang | 多语言处理 | +| AppVersionMiddleware | APP 版本校验 | + +### 5.2 后台中间件 + +| 中间件 | 作用 | +|--------|------| +| AuthMiddleware | 后台管理员登录鉴权 | +| Permission | 角色权限校验 | +| LoadLangPack | 语言包加载 | +| RequestMiddleware | 请求预处理 | + +--- + +## 六、数据模型 + +### 6.1 玩家相关 + +| 模型 | 说明 | +|------|------| +| Player | 玩家基础信息 | +| PlayerExtend | 玩家扩展信息 | +| PlayerBank | 玩家银行卡 | +| PlayerRechargeRecord | 充值记录 | +| PlayerWithdrawRecord | 提现记录 | +| PlayerDeliveryRecord | 配送记录 | +| PlayerLoginRecord | 登录记录 | +| PlayerRegisterRecord | 注册记录 | +| PlayerEditLog | 编辑日志 | +| PlayerTag | 玩家标签 | +| PlayerLevel | 玩家等级 | +| PlayerPromoter | 推广员 | +| PlayerGamePlatform | 玩家游戏平台关联 | +| PlayerGameRecord | 游戏记录 | +| PlayerLotteryRecord | 抽奖记录 | +| PlayerChipRecord | 筹码记录 | +| PlayerBankruptcyRecord | 破产记录 | +| PlayerPlatformCash | 平台现金 | +| PlayerMoneyEditLog | 资金变动日志 | +| PlayerWalletTransfer | 钱包转账 | + +### 6.2 渠道相关 + +| 模型 | 说明 | +|------|------| +| Channel | 渠道 | +| ChannelRechargeMethod | 渠道充值方式 | +| ChannelRechargeMethodLang | 充值方式多语言 | +| ChannelRechargeSetting | 渠道充值配置 | +| ChannelFinancialRecord | 渠道财务记录 | + +### 6.3 管理后台相关 + +| 模型 | 说明 | +|------|------| +| AdminUser | 管理员用户 | +| AdminRole | 管理角色 | +| AdminMenu | 管理菜单 | +| AdminConfig | 管理配置 | +| AdminDepartment | 部门 | +| AdminPost | 岗位 | +| AdminFileAttachment | 文件附件 | + +### 6.4 业务相关 + +| 模型 | 说明 | +|------|------| +| Game | 游戏 | +| GamePlatform | 游戏平台 | +| GameType | 游戏类型 | +| Currency | 货币 | +| BankList | 银行列表 | +| Prize | 奖品 | +| DrawRecord | 抽奖记录 | +| Notice / Announcement | 公告/通知 | +| Activity / ActivityContent | 活动 | +| SepayRecharge | SePay充值记录 | +| Qrcode / QrcodeBatch / QrcodeOwner | 二维码管理 | +| PromoterProfitRecord | 推广员利润记录 | +| CommissionRecord | 佣金记录 | +| Broadcast | 广播消息 | +| AppVersion | APP版本 | +| SystemSetting | 系统设置 | +| ExternalApp | 外部应用 | +| ApiErrorLog | API 错误日志 | +| PhoneSmsLog | 短信日志 | + +--- + +## 七、技术架构 + +### 7.1 核心依赖 + +| 依赖包 | 版本 | 用途 | +|--------|------|------| +| workerman/webman-framework | ^1.5.0 | Web 框架核心 | +| illuminate/database | ^8.83 | Eloquent ORM | +| rockys/ex-admin-webman | ^1.0 | 后台管理系统 | +| tinywan/jwt | ^1.6 | JWT 鉴权 | +| webman/push | ^1.0 | WebSocket 推送 | +| webman/redis-queue | ^1.2 | Redis 消息队列 | +| workerman/crontab | ^1.0 | 定时任务 | +| symfony/translation | ^5.4 | 多语言翻译 | +| gitfei1231/webman-api-sign | ^0.0.21 | API 签名验证 | +| facebook/graph-sdk | ^5.1 | Facebook 集成 | +| endroid/qr-code | ^4.6 | 二维码生成 | +| robmorgan/phinx | ^0.14.0 | 数据库迁移 | +| yzh52521/webman-lock | ^1.0 | 分布式锁 | + +### 7.2 队列消费者 + +| 消费者 | 队列名 | 功能 | +|--------|--------|------| +| SendBroadcasts | broadcast_tasks | 广播消息发送 | +| CancelRecharge | - | 取消充值处理 | + +### 7.3 多语言支持 + +- 简体中文 (zh_CN) +- 英语 (en) +- 马来语 (Ma_my) +- 柬埔寨语 (cam_dia) + +### 7.4 存储 + +| 组件 | 配置 | +|------|------| +| MySQL | 默认数据库,utf8mb4 编码 | +| Redis | 127.0.0.1:6379,DB 1 | +| Redis Queue | 8 个消费进程,最大重试 5 次 | + +--- + +## 八、异常处理 + +| 异常类 | 说明 | +|--------|------| +| ApiHandler | API 统一异常处理 | +| GameException | 游戏相关异常 | +| PlayerCheckException | 玩家校验异常 | +| PromoterCheckException | 推广员校验异常 | + +--- + +## 九、支付服务 + +| 服务类 | 说明 | +|--------|------| +| SklPayServices | SKL 支付服务(充值/提现)| +| OnePayServices | OnePay 支付服务 | +| SePayServices | SePay 支付服务 | +| DrawService | 抽奖服务 | + +--- + +## 十、部署与运行 + +```bash +# Linux 启动 +php start.php start + +# Linux 守护进程 +php start.php start -d + +# Windows 启动 +php windows.php + +# 停止 +php start.php stop + +# 重启 +php start.php restart +``` + +默认监听地址:`http://0.0.0.0:8786` diff --git a/README.md b/README.md new file mode 100644 index 0000000..34c8bd4 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# webman + +High performance HTTP Service Framework for PHP based on [Workerman](https://github.com/walkor/workerman). + +# Manual (文档) + +https://www.workerman.net/doc/webman + +# Home page (主页) +https://www.workerman.net/webman + + +# Benchmarks (压测) + +https://www.techempower.com/benchmarks/#section=test&runid=9716e3cd-9e53-433c-b6c5-d2c48c9593c1&hw=ph&test=db&l=zg24n3-1r&a=2 +![image](https://user-images.githubusercontent.com/6073368/96447814-120fc980-1245-11eb-938d-6ea408716c72.png) + +## LICENSE + +MIT diff --git a/addons/IDE.php b/addons/IDE.php new file mode 100644 index 0000000..733324b --- /dev/null +++ b/addons/IDE.php @@ -0,0 +1,17 @@ +hasMethod($method)) { + $method = $constructor->getMethod($method); + if ($constructor->name == $method->class) { + return true; + } + } + return false; + } + + /** + * 权限节点 + * @return \ExAdmin\ui\auth\Node + */ + public static function node() + { + return \ExAdmin\ui\support\Container::getInstance()->node; + } + + /** + * 权限 + * @return array + */ + public static function permission() + { + $permissionKey = 'ADMIN_PERMISSIONS_' . Admin::id(); + $adminPermissions = Cache::get($permissionKey); + if(empty($adminPermissions)){ + $adminPermissions = Admin::user()->permission->pluck('node_id')->toArray(); + Cache::set($permissionKey, $adminPermissions); + } + return $adminPermissions; + } + + /** + * 角色 + * @return array + */ + public static function role() + { + return Admin::user()->roles->pluck('id')->toArray(); + } + + /** + * 用户 + * @return mixed + */ + public static function user() + { + + return Token::user(); + } + + /** + * 用户id + * @return int|string|null + */ + public static function id() + { + return Token::id(); + } + + public static function check($class, $function, $method) + { + $node = Admin::node()->all(); + $node = array_column($node, 'id'); + $actions[] = str_replace('-', '\\', $class) . '\\' . $function; + $actions[] = str_replace('-', '\\', $class) . '\\' . $function . '-' . strtolower($method); + foreach ($actions as $action) { + if (in_array($action, $node)) { + if (Admin::id() == plugin()->webman->config('admin_auth_id')) { + return true; + } + if (!in_array($action, Admin::permission())) { + return false; + } + } + } + return true; + } + + public static function getDispatch() + { + $class = null; + $function = null; + if (request()->route->getPath() == '/ex-admin/{class}/{function}') { + $class = request()->route->param('class'); + $function = request()->route->param('function'); + } + return [$class, $function]; + } + + /** + * 上传初始化配置 + */ + public static function uploadInit() + { + $uploadDiskConfig = function ($disk) { + $config = config("plugin.rockys.ex-admin-webman.filesystems.disks.$disk"); + //上传初始化 + $uploadConfig['driver'] = 'local'; + $adapter = Filesystem::disk($disk)->getAdapter(); + if ($config['driver'] == QiniuAdapter::class) { + $uploadConfig['domain'] = $config['domain']; + $uploadConfig['uploadToken'] = $adapter->getUploadToken(null, 3600 * 3); + $uploadConfig['driver'] = 'qiniu'; + } elseif ($config['driver'] == OssAdapter::class) { + $adapter->setCdnUrl($config['domain']); + $uploadConfig['domain'] = $config['domain']; + $uploadConfig['accessKey'] = $config['access_key']; + $uploadConfig['secretKey'] = $config['secret_key']; + $uploadConfig['region'] = $config['region']; + $uploadConfig['bucket'] = $config['bucket']; + $uploadConfig['driver'] = 'oss'; + } + return $uploadConfig; + + }; + $uploadDisk = function ($disk) use ($uploadDiskConfig) { + $uploadConfig = $uploadDiskConfig($disk); + foreach ($uploadConfig as $key => $value) { + $this->$key($value); + } + $this->attr('disk', $disk); + return $this; + }; + Image::addMethod('disk', $uploadDisk); + File::addMethod('disk', $uploadDisk); + Editor::addMethod('disk', function ($disk) use ($uploadDiskConfig) { + $uploadConfig = $uploadDiskConfig($disk); + $uploadConfig['disk'] = $disk; + $this->upload($uploadConfig + ['progress' => true]); + }); + + $finder = function ($upload, $type = '') { + $grid = Container::getInstance() + ->make(\ExAdmin\ui\Route::class) + ->invokeMethod(AttachmentController::class, 'index', [ + 'size' => $upload->attr('fileSize'), + 'ext' => $upload->attr('ext'), + 'type' => $type, + 'customStyle' => null + ] + ); + $grid->selectionField('url'); + $grid->params(['selectionField' => 'url']); + $attrs = $upload->getAttrs(); + unset($attrs['progress'], $attrs['onlyShow'], $attrs['type']); + $grid->attr('tools')[0]->attrs($attrs); + $upload->attr('finder', $grid); + }; + Image::beforeEnd(function ($image) use ($finder) { + $finder($image, 'image'); + }); + File::beforeEnd(function ($file) use ($finder) { + $finder($file); + }); + } +} diff --git a/addons/webman/ServiceProvider.php b/addons/webman/ServiceProvider.php new file mode 100644 index 0000000..79440cc --- /dev/null +++ b/addons/webman/ServiceProvider.php @@ -0,0 +1,92 @@ +config(),'admin'); + admin_config($this->config('ui'),'ui'); + } + + public function route(){ + Route::group('/agent', function () { + Route::get('', function () { + $content = file_get_contents(public_path('exadmin') . '/index.html'); + return str_replace( + [ + '{{Ex-Admin}}', + '{{Ex-Admin-App-Name}}', + ], + [ + admin_sysconf('web_name'), + 'agent', + ], + $content); + }); + }); + Route::group(plugin()->webman->config('route.prefix'), function () { + Route::get('', function () { + $content = file_get_contents(public_path('exadmin') . '/index.html'); + return str_replace( + [ + '{{Ex-Admin}}', + '{{Ex-Admin-App-Name}}', + ], + [ + admin_sysconf('web_name'), + plugin()->webman->config('route.prefix'), + ], + $content); + }); + }); + Route::any('/ex-admin/{class}/{function}', function ($class, $function) { + return \ExAdmin\ui\Route::dispatch($class, $function); + })->middleware(plugin()->webman->config('route.middleware')); + } + + /** + * 安装 + * @return mixed + */ + public function install() + { + $sql = file_get_contents($this->getPath().'/database/webman.sql'); + Db::unprepared($sql); + } + /** + * 更新 + * @param string $old_version 旧版本 + * @param string $version 更新版本 + * @return mixed + */ + public function update(string $old_version,string $version) + { + + } + /** + * 卸载 + * @return mixed + */ + public function uninstall() + { + + // TODO: Implement uninstall() method. + } +} diff --git a/addons/webman/common/Login.php b/addons/webman/common/Login.php new file mode 100644 index 0000000..5866665 --- /dev/null +++ b/addons/webman/common/Login.php @@ -0,0 +1,126 @@ +header('App-Name') == 'agent' ? 'agent.vue' : 'login.vue'; + return admin_view(plugin()->webman->getPath(). '/views/' . $view)->attrs([ + 'webLogo' => admin_sysconf('web_logo'), + 'webName' => admin_sysconf('web_name'), + 'webMiitbeian' => admin_sysconf('web_miitbeian'), + 'webCopyright' => admin_sysconf('web_copyright'), + 'deBug' => env('APP_DEBUG'), + 'agent_login' => admin_trans('login.agent_login'), + 'admin_login' => admin_trans('login.admin_login'), + 'enter_account' => admin_trans('login.enter_account'), + 'enter_password' => admin_trans('login.enter_password'), + 'enter_verify' => admin_trans('login.enter_verify'), + 'login' => admin_trans('login.login'), + 'password_verify' => admin_trans('login.password_verify'), + ]); + } + + /** + * 登陆页 + * @return Component + */ + public function agent(): Component + { + return admin_view(plugin()->webman->getPath(). '/views/agent.vue')->attrs([ + 'webLogo' => admin_sysconf('web_logo'), + 'webName' => admin_sysconf('web_name'), + 'webMiitbeian' => admin_sysconf('web_miitbeian'), + 'webCopyright' => admin_sysconf('web_copyright'), + 'deBug' => env('APP_DEBUG'), + 'agent_login' => admin_trans('login.agent_login'), + 'admin_login' => admin_trans('login.admin_login'), + 'enter_account' => admin_trans('login.enter_account'), + 'enter_password' => admin_trans('login.enter_password'), + 'enter_verify' => admin_trans('login.enter_verify'), + 'login' => admin_trans('login.login'), + 'password_verify' => admin_trans('login.password_verify'), + ]); + } + + /** + * 登录验证 + * @param array $data 提交数据 + * @return Message + */ + public function check(array $data): Message + { + $validator = validator($data, [ + 'username' => 'required', + 'source' => 'required', + 'password' => 'required|min:5' + ], [ + 'username.required' => admin_trans('login.account_not_empty'), + 'password.required' => admin_trans('login.password_not_empty'), + 'source.required' => admin_trans('login.source_not_empty'), + 'password.min' => admin_trans('login.password_min_length'), + ]); + if ($validator->fails()) { + return message_error($validator->errors()->first()); + } + $cacheKey = request()->getRealIp() . date('Y-m-d'); + $errorNum = Cache::get($cacheKey); + if ($errorNum > 3 && !Container::getInstance()->captcha->check($data['verify'], $data['hash'])) { + return message_error(admin_trans('login.captcha_error')); + } + $model = plugin()->webman->config('database.user_model'); + $type = AdminDepartment::TYPE_DEPARTMENT; + if ($data['source'] == 'agent') { + $type = AdminDepartment::TYPE_CHANNEL; + } + $user = $model::where('username', $data['username'])->where('type', $type)->first(); + if (!$user || !password_verify($data['password'], $user->password)) { + Cache::set($cacheKey, $errorNum + 1); + return message_error(admin_trans('login.error')); + } + return message_success(admin_trans('login.success'))->data([ + 'token' => Token::encode($user->toArray()), + ]); + } + /** + * 获取验证码 + * @return Response + */ + public function captcha(): Response + { + $cacheKey = request()->getRealIp() . date('Y-m-d'); + $errorNum = Cache::get($cacheKey); + $captcha = Container::getInstance()->captcha->create(); + $captcha['verification'] = $errorNum > 3; + return Response::success($captcha); + } + /** + * 退出登录 + * @return Message + */ + public function logout(): Message + { + Token::logout(); + $permissionKey = 'ADMIN_PERMISSIONS_' . Admin::id(); + Cache::delete($permissionKey); + return message_success(admin_trans('login.logout')); + } +} diff --git a/addons/webman/common/System.php b/addons/webman/common/System.php new file mode 100644 index 0000000..ee5abac --- /dev/null +++ b/addons/webman/common/System.php @@ -0,0 +1,216 @@ +webman->config('route.prefix'); + } + + /** + * 头部导航右侧 + * @return array + */ + public function navbarRight(): array + { + $ws = env('WS_URL', ''); + return [ + admin_view(plugin()->webman->getPath() . '/views/socket.vue')->attrs([ + 'id' => Admin::id(), + 'type' => Admin::user()->type == 1 ? 'admin' : 'channel', + 'department_id' => Admin::user()->department_id, + 'count' => 0, + 'lang' => Container::getInstance()->translator->getLocale(), + 'ws' => $ws, + 'title' => admin_trans('admin.system_messages'), + 'examine_withdraw' => Admin::check(ChannelWithdrawRecordController::class, 'reject', '') || Admin::check(ChannelWithdrawRecordController::class, 'pass', ''), + 'examine_recharge' => Admin::check(ChannelRechargeRecordController::class, 'reject', '') || Admin::check(ChannelRechargeRecordController::class, 'pass', ''), + ]) + ]; + } + + /** + * 头部点击用户信息下拉菜单 + * @return array + */ + public function adminDropdown(): array + { + return [ + MenuItem::create()->content(admin_trans('admin.user_info')) + ->modal([AdminController::class, 'editInfo'], ['id' => Admin::id()]), + MenuItem::create()->content(admin_trans('admin.update_password')) + ->modal([AdminController::class, 'updatePassword'], ['id' => Admin::id()]), + ]; + } + + /** + * 用户信息 + * @return array + * @throws HttpResponseException + */ + public function userInfo(): array + { + try { + Token::auth(); + } catch (AuthException $exception) { + throw new HttpResponseException( + response( + json_encode(['message' => $exception->getMessage(), 'code' => $exception->getCode()]), + 401, + ['Content-Type' => 'application/json']) + ); + } + return Admin::user() + ->setVisible(['id', 'nickname', 'avatar']) + ->toArray(); + } + + /** + * 菜单 + * @return array + */ + public function menu(): array + { + return Arr::tree(admin_menu()->all()); + } + + /** + * 上传写入数据库 + * @param $data 上传入库数据 + * @return Response + */ + public function upload($data): Response + { + $model = plugin()->webman->config('database.attachment_model'); + $model::firstOrCreate($data, [ + 'uploader_id' => Admin::id(), + ]); + return Response::success(); + } + + + /** + * 验证权限 + * @param $class 类名 + * @param $function 方法 + * @param $method 请求method + * @return bool + */ + public function checkPermissions($class, $function, $method): bool + { + return Admin::check($class, $function, $method); + } + + /** + * 获取新的消息 + * @param $page + * @param $size + * @return Response + */ + public function noticeList($page, $size): Response + { + $typeArr = []; + if (Admin::check(ChannelWithdrawRecordController::class, 'reject', '') || Admin::check(ChannelWithdrawRecordController::class, 'pass', '')) { + $typeArr[] = Notice::TYPE_EXAMINE_WITHDRAW; + } + if (Admin::check(ChannelRechargeRecordController::class, 'reject', '') || Admin::check(ChannelRechargeRecordController::class, 'pass', '')) { + $typeArr[] = Notice::TYPE_EXAMINE_RECHARGE; + } + $list = []; + if (Admin::user()->type == AdminDepartment::TYPE_DEPARTMENT && !empty($typeArr)) { + $list = Notice::where('receiver', Notice::RECEIVER_ADMIN)->whereIN('type', $typeArr) + ->latest() + ->forPage($page, $size) + ->get(); + } + if (Admin::user()->type == AdminDepartment::TYPE_CHANNEL && !empty($typeArr)) { + $list = Notice::where('receiver', Notice::RECEIVER_DEPARTMENT)->whereIN('type', $typeArr) + ->latest() + ->forPage($page, $size) + ->get(); + } + $data = []; + /** @var Notice $item */ + foreach ($list as $item) { + $title = admin_trans('notice.title.' . $item->type); + $createTime = date('Y-m-d H:i:s', strtotime($item->created_at)); + switch ($item->type) { + case Notice::TYPE_EXAMINE_RECHARGE: + /** @var PlayerRechargeRecord $playerRechargeRecord */ + $playerRechargeRecord = PlayerRechargeRecord::find($item->source_id); + $content = admin_trans('notice.content.' . $item->type, '', ['{player_name}' => !empty($playerRechargeRecord->player_name) ? $playerRechargeRecord->player_name : '', '{coins}' => $playerRechargeRecord->coins, '{money}' => $playerRechargeRecord->money]); + $data[] = [ + 'id' => $item->id, + 'source_id' => $item->source_id, + 'title' => $title, + 'content' => $content, + 'type' => $item->type, + 'created_at' => $createTime, + 'status' => $playerRechargeRecord->status == PlayerRechargeRecord::STATUS_RECHARGING, + 'url' => admin_url([ChannelRechargeRecordController::class, 'examineList']) + ]; + break; + case Notice::TYPE_EXAMINE_WITHDRAW: + /** @var PlayerWithdrawRecord $playerWithdrawRecord */ + $playerWithdrawRecord = PlayerWithdrawRecord::find($item->source_id); + $content = admin_trans('notice.content.' . $item->type, '', ['{player_name}' => !empty($playerWithdrawRecord->player_name) ? $playerWithdrawRecord->player_name : $playerWithdrawRecord->player_phone, '{coins}' => $playerWithdrawRecord->coins, '{money}' => $playerWithdrawRecord->money]); + $data[] = [ + 'id' => $item->id, + 'source_id' => $item->source_id, + 'title' => $title, + 'content' => $content, + 'type' => $item->type, + 'created_at' => $createTime, + 'status' => $playerWithdrawRecord->status == PlayerWithdrawRecord::STATUS_WAIT, + 'url' => admin_url([ChannelWithdrawRecordController::class, 'examineList']) + ]; + break; + } + } + return Response::success($data); + } +} diff --git a/addons/webman/config.php b/addons/webman/config.php new file mode 100644 index 0000000..bc68dfd --- /dev/null +++ b/addons/webman/config.php @@ -0,0 +1,344 @@ + [ + 'driver' => \addons\webman\token\driver\Cache::class, + //密钥 + 'key' => 'QoYEClMJsgOSWUBkSCq26yWkApqSuH3', + //token有效时长 + 'expire' => null, + //唯一登录 + 'unique' => true, + //验证字段 + 'auth_field' => ['password'], + + 'model' => addons\webman\model\AdminUser::class, + ], + //超级管理员id + 'admin_auth_id' => 1, + + 'request_interface' => [ + //ExAdmin\ui\contract\LoginAbstract + 'login' => addons\webman\common\Login::class, + //ExAdmin\ui\contract\SystemAbstract + 'system' => addons\webman\common\System::class, + ], + 'grid' => [ + //ExAdmin\ui\Manager + 'manager' => addons\webman\grid\GridManager::class, + ], + 'form' => [ + //ExAdmin\ui\Manager + 'manager' => addons\webman\form\FormManager::class, + //ExAdmin\ui\contract\ValidatorAbstract + 'validator' => addons\webman\form\Validator::class, + //ExAdmin\ui\contract\UploaderAbstract + 'uploader' => addons\webman\form\Uploader::class, + ], + 'echart' => [ + //ExAdmin\ui\Manager + 'manager' => \addons\webman\echart\EchartManager::class, + ], + 'route' => [ + //路由前缀 + 'prefix' => env('ADMIN_ROUTE_PREFIX', '/admin'), + //中间件 + 'middleware' => [ + AuthMiddleware::class, + LoadLangPack::class, + Permission::class, + ], + ], + //菜单 + 'menu' => \addons\webman\service\Menu::class, + + //上传配置 + 'upload' => [ + //config/filesystems.php + 'disk' => 'local', + //保存目录 + 'directory' => [ + 'image' => 'images', + 'file' => 'files', + ], + //禁止上传后缀 + 'disabled_ext' => ['php'] + ], + //扫描权限目录 + 'auth_scan' => [ + __DIR__ . '/controller', + app_path("admin/controller") + ], + 'database' => [ + //用户表 + 'user_table' => 'admin_users', + 'user_model' => addons\webman\model\AdminUser::class, + //菜单表 + 'menu_table' => 'admin_menus', + 'menu_model' => addons\webman\model\AdminMenu::class, + //角色表 + 'role_table' => 'admin_roles', + 'role_model' => addons\webman\model\AdminRole::class, + //角色权限关联表 + 'role_permission_table' => 'admin_role_permissions', + 'role_permission_model' => addons\webman\model\AdminRolePermission::class, + //角色菜单关联表 + 'role_menu_table' => 'admin_role_menus', + 'role_menu_model' => addons\webman\model\AdminRoleMenu::class, + //角色用户关联表 + 'role_user_table' => 'admin_role_users', + 'role_user_model' => addons\webman\model\AdminRoleUsers::class, + //系统配置表 + 'config_table' => 'admin_configs', + 'config_model' => addons\webman\model\AdminConfig::class, + //系统附件分类表 + 'attachment_cate_table' => 'admin_file_attachment_cates', + 'attachment_cate_model' => addons\webman\model\AdminFileAttachmentCate::class, + //系统附件表 + 'attachment_table' => 'admin_file_attachments', + 'attachment_model' => addons\webman\model\AdminFileAttachment::class, + //部门表 + 'department_table' => 'admin_department', + 'department_model' => addons\webman\model\AdminDepartment::class, + //岗位表 + 'post_table' => 'admin_post', + 'post_model' => addons\webman\model\AdminPost::class, + //角色数据权限部门关联表 + 'role_department_table' => 'admin_role_department', + 'role_department_model' => addons\webman\model\AdminRoleDepartment::class, + //玩家表 + 'player_table' => 'player', + 'player_model' => \addons\webman\model\Player::class, + //玩家扩展表 + 'player_extend_table' => 'player_extend', + 'player_extend_model' => \addons\webman\model\PlayerExtend::class, + //平台 + 'player_platform_cash_table' => 'player_platform_cash', + 'player_platform_cash_model' => \addons\webman\model\PlayerPlatformCash::class, + //机台API记录 + 'api_error_log_table' => 'api_error_log', + 'api_error_log_model' => \addons\webman\model\ApiErrorLog::class, + //轮播图管理 + 'slider_table' => 'slider', + 'slider_model' => \addons\webman\model\Slider::class, + //玩家钱包编辑记录 + 'player_money_edit_log_table' => 'player_money_edit_log', + 'player_money_edit_log_model' => \addons\webman\model\PlayerMoneyEditLog::class, + //玩家资金记录 + 'player_delivery_record_table' => 'player_delivery_record', + 'player_delivery_record_model' => \addons\webman\model\PlayerDeliveryRecord::class, + //玩家登录记录 + 'player_login_record_table' => 'player_login_record', + 'player_login_record_model' => \addons\webman\model\PlayerLoginRecord::class, + //玩家注册记录 + 'player_register_record_table' => 'player_register_record', + 'player_register_record_model' => \addons\webman\model\PlayerRegisterRecord::class, + //机台游戏日志 + 'system_setting_table' => 'system_setting', + 'system_setting_model' => \addons\webman\model\SystemSetting::class, + //短信记录 + 'phone_sms_log_table' => 'phone_sms_log', + 'phone_sms_log_model' => \addons\webman\model\PhoneSmsLog::class, + //玩家充值记录 + 'player_recharge_record_table' => 'player_recharge_record', + 'player_recharge_record_model' => \addons\webman\model\PlayerRechargeRecord::class, + //玩家标签 + 'player_tag_table' => 'player_tag', + 'player_tag_model' => \addons\webman\model\PlayerTag::class, + //公告 + 'announcement_table' => 'announcement', + 'announcement_model' => \addons\webman\model\Announcement::class, + //公告内容 + 'announcement_content_table' => 'announcement_content', + 'announcement_content_model' => \addons\webman\model\AnnouncementContent::class, + //玩家提现 + 'player_withdraw_record_table' => 'player_withdraw_record', + 'player_withdraw_record_model' => \addons\webman\model\PlayerWithdrawRecord::class, + //渠道 + 'channel_table' => 'channel', + 'channel_model' => \addons\webman\model\Channel::class, + //货币 + 'currency_table' => 'currency', + 'currency_model' => \addons\webman\model\Currency::class, + //渠道充值方式 + 'channel_recharge_method_table' => 'channel_recharge_method', + 'channel_recharge_method_model' => \addons\webman\model\ChannelRechargeMethod::class, + //渠道充值方式多语言 + 'channel_recharge_method_lang_table' => 'channel_recharge_method_lang', + 'channel_recharge_method_lang_model' => \addons\webman\model\ChannelRechargeMethodLang::class, + //渠道充值配置 + 'channel_recharge_setting_table' => 'channel_recharge_setting', + 'channel_recharge_setting_model' => \addons\webman\model\ChannelRechargeSetting::class, + //财务操作记录 + 'channel_financial_record_table' => 'channel_financial_record', + 'channel_financial_record_model' => \addons\webman\model\ChannelFinancialRecord::class, + //玩家银行卡 + 'player_bank_table' => 'player_bank', + 'player_bank_model' => \addons\webman\model\PlayerBank::class, + //玩家银行卡 + 'bank_list_table' => 'bank_list', + 'bank_list_model' => \addons\webman\model\BankList::class, + //外部应用 + 'external_app_table' => 'external_app', + 'external_app_model' => \addons\webman\model\ExternalApp::class, + //玩家信息修改日志 + 'player_edit_log_table' => 'player_edit_log', + 'player_edit_log_model' => \addons\webman\model\PlayerEditLog::class, + //消息 + 'notice_table' => 'notice', + 'notice_model' => \addons\webman\model\Notice::class, + //签到记录 + 'sign_ins_table' => 'sign_ins', + 'sign_ins_model' => \addons\webman\model\SignIns::class, + //活动 + 'activity_table' => 'activity', + 'activity_model' => \addons\webman\model\Activity::class, + //活动内容 + 'activity_content_table' => 'activity_content', + 'activity_content_model' => \addons\webman\model\ActivityContent::class, + //分润记录 + 'commission_record_table' => 'commission_record', + 'commission_record_model' => \addons\webman\model\CommissionRecord::class, + //玩家打碼量記錄 + 'player_chip_record_table' => 'player_chip_record', + 'player_chip_record_model' => \addons\webman\model\PlayerChipRecord::class, + //游戏平台 + 'game_platform_table' => 'game_platform', + 'game_platform_model' => \addons\webman\model\GamePlatform::class, + //游戏平台 + 'game_table' => 'game', + 'game_model' => \addons\webman\model\Game::class, + //玩家游戏平台账号 + 'player_game_platform_table' => 'player_game_platform', + 'player_game_platform_model' => \addons\webman\model\PlayerGamePlatform::class, + //玩家钱包转出/入记录 + 'player_wallet_transfer_table' => 'player_wallet_transfer', + 'player_wallet_transfer_model' => \addons\webman\model\PlayerWalletTransfer::class, + //玩家游戏记录 + 'play_game_record_table' => 'play_game_record', + 'play_game_record_model' => \addons\webman\model\PlayGameRecord::class, + //玩家破产记录 + 'player_bankruptcy_record_table' => 'player_bankruptcy_record', + 'player_bankruptcy_record_model' => \addons\webman\model\PlayerBankruptcyRecord::class, + //APP版本管理 + 'app_version_table' => 'app_version', + 'app_version_model' => \addons\webman\model\AppVersion::class, + //玩家等级 + 'player_level_table' => 'player_level', + 'player_level_model' => \addons\webman\model\PlayerLevel::class, + //推广员 + 'player_promoter_table' => 'player_promoter', + 'player_promoter_model' => \addons\webman\model\PlayerPromoter::class, + //推广员分润记录 + 'promoter_profit_record_table' => 'promoter_profit_record', + 'promoter_profit_record_model' => \addons\webman\model\PromoterProfitRecord::class, + //推广员分润结算记录 + 'promoter_profit_settlement_record_table' => 'promoter_profit_settlement_record', + 'promoter_profit_settlement_record_model' => \addons\webman\model\PromoterProfitSettlementRecord::class, + //玩家游戏局 + 'player_game_record_table' => 'player_game_record', + 'player_game_record_model' => \addons\webman\model\PlayerGameRecord::class, + //玩家派彩记录 + 'player_lottery_record_table' => 'player_lottery_record', + 'player_lottery_record_model' => \addons\webman\model\PlayerLotteryRecord::class, + //游戏类型 + 'game_type_table' => 'game_type', + //二维码 + 'qrcode_table' => 'qr_code', + 'qrcode_model' => \addons\webman\model\Qrcode::class, + 'qrcode_batch_table' => 'qr_code_batch', + 'qrcode_batch_model' => \addons\webman\model\QrcodeBatch::class, + 'qrcode_owner_table' => 'qr_code_owner', + 'qrcode_owner_model' => \addons\webman\model\QrcodeOwner::class, + //es支付 + 'sepay_recharge_table' => 'sepay_recharge_list', + 'sepay_recharge_model' => \addons\webman\model\SepayRecharge::class, + //奖品 + 'prize_table' => 'prizes', + 'prize_model' => \addons\webman\model\Prize::class, + //抽奖记录 + 'draw_records_table' => 'draw_records', + 'draw_records_model' => \addons\webman\model\DrawRecord::class, + ], + 'cache' => [ + //缓存目录 + 'directory' => runtime_path() + ], + //后台前端UI配置 + 'ui' => [ + //语言 + 'lang' => [ + // 默认语言 + 'default' => config('app.locale', 'zh-CN'), + //语言列表 + 'list' => [ + 'zh-CN' => '中文简体', + 'en' => 'English', + 'Ma-my' => 'Melayu', // 马来语(马来西亚) + ] + ], + //布局 headerSider顶部侧边 sider侧边 + 'layout' => 'headerSider', + //主题 light 暗黑dark + 'theme' => 'light', + //主题色 + 'theme_color' => '#1890ff', + //菜单主题 dark light + 'menu_theme' => 'light', + //导航模式 sideTopMenuLayout sideMenuLayout topMenuLayout + 'navigationMode' => 'sideTopMenuLayout', + //header背景色 + 'header_background' => '#1890ff', + //侧边栏 + 'sidebar' => [ + //选中色 + 'color' => '#1890ff', + //背景色 + 'background' => '#121929', + //宽度 + 'width' => 200, + //是否收起状态 + 'collapsed' => false, + //显示隐藏 + 'visible' => true, + //菜单并排数量 + 'menu_num' => 1 + ], + //多页标签 + 'tabs' => true, + //登录路由 + 'loginRoute' => '/ex-admin/login/index', + //公用渲染路由前缀 + 'commonRoutePrefix' => 'common/', + //后台渲染路由前缀 + 'adminRoutePrefix' => '', + ], + // 币种 + 'currency' => [ + 'CYN' => 'CYN', + 'TWD' => 'TWD', + 'USD' => 'USD', + 'JPY' => 'JPY', + 'RM' => 'RM', + ], + 'admin_node' => config('admin_node'), + 'channel_node' => config('channel_node'), + 'pay_type' => [ + '人工充值', + 'EsPay', + 'OnePay', + 'SKL99', + ], + 'game' => [ + 262 => '转盘', + 263 => '砸金蛋', + 264 => '盲盒', + 265 => '刮刮乐', + 266 => 'TURN', + 267 => '摇色子', + ] +]; diff --git a/addons/webman/controller/AdminController.php b/addons/webman/controller/AdminController.php new file mode 100644 index 0000000..4b56deb --- /dev/null +++ b/addons/webman/controller/AdminController.php @@ -0,0 +1,304 @@ +model = plugin()->webman->config('database.user_model'); + + } + + /** + * 系统用户 + * @auth true + */ + public function index(): Grid + { + return Grid::create(new $this->model, function (Grid $grid) { + $grid->title(admin_trans('admin.system_user')); + $grid->model() + ->when(plugin()->webman->config('admin_auth_id') != Admin::id(), function (Builder $builder) { + $builder->whereKeyNot(plugin()->webman->config('admin_auth_id')); + }); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->where('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->where('created_at', '<=', $exAdminFilter['created_at_end']); + } + $grid->autoHeight(); + $grid->userInfo(); + $grid->column('username', admin_trans('admin.fields.username'))->display(function ($val, $data) { + if ($data['id'] == plugin()->webman->config('admin_auth_id')) { + return Html::create() + ->content($val) + ->content( + Badge::create()->count(admin_trans('admin.super_admin'))->numberStyle(['backgroundColor' => '#1890ff', 'marginLeft' => '5px']) + ); + } else { + return $val; + } + })->copy(); + $grid->column('phone', admin_trans('admin.fields.phone')); + $grid->column('email', admin_trans('admin.fields.mail')); + $grid->column('status', admin_trans('admin.fields.status'))->switch(); + $grid->column('type', admin_trans('admin.fields.type')) + ->display(function ($value, AdminUser $data) { + $tag = ''; + switch ($value) { + case AdminDepartment::TYPE_DEPARTMENT: + $tag = Tag::create(admin_trans('department.type.' . AdminDepartment::TYPE_DEPARTMENT))->color('#108ee9'); + break; + case AdminDepartment::TYPE_CHANNEL: + $tag = Tag::create(admin_trans('department.type.' . AdminDepartment::TYPE_CHANNEL))->color('#f50'); + break; + } + if ($data->is_super == 1) { + $tag = Tag::create(admin_trans('admin.fields.is_super'))->color('#3b5999'); + } + return Html::create()->content([ + $tag, + ]); + })->sortable(); + $grid->column('created_at', admin_trans('admin.fields.create_at')); + $grid->quickSearch(); + $grid->hideDelete(); + $grid->setForm()->modal($this->form()); + $grid->filter(function (Filter $filter) { + $filter->like()->text('username')->placeholder(admin_trans('admin.fields.username')); + $filter->like()->text('phone')->placeholder(admin_trans('admin.fields.phone')); + $filter->eq()->select('status') + ->placeholder(admin_trans('admin.fields.status')) + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->options([ + 1 => admin_trans('admin.normal'), + 0 => admin_trans('admin.disable') + ]); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]); + }); + + $department_model = plugin()->webman->config('database.department_model'); + $departmentList = (new $department_model)::where('type', AdminDepartment::TYPE_DEPARTMENT) + ->orWhereHas('channel', function ($query) { + $query->whereNull('deleted_at'); + }) + ->get(); + $departmentTree = [ + ['id' => 'department', 'name' => admin_trans('admin.department_tree'), 'pid' => 0], + ['id' => 'channel', 'name' => admin_trans('admin.channel_tree'), 'pid' => 0], + ]; + /** @var AdminDepartment $value */ + foreach ($departmentList as $value) { + if ($value->type == AdminDepartment::TYPE_DEPARTMENT) { + $departmentTree[] = ['id' => $value->id, 'name' => $value->name, 'pid' => $value->pid == 0 ? 'department' : $value->pid]; + } + if ($value->type == AdminDepartment::TYPE_CHANNEL) { + $departmentTree[] = ['id' => $value->id, 'name' => $value->name, 'pid' => $value->pid == 0 ? 'channel' : $value->pid]; + } + } + $grid->sidebar('department_id', $departmentTree) + ->tree() + ->hideAdd() + ->hideDel() + ->searchPlaceholder(admin_trans('admin.search_department')); + + $grid->actions(function (Actions $actions, $data) { + if ($data['id'] == plugin()->webman->config('admin_auth_id')) { + $actions->hideDel(); + } + $actions->dropdown() + ->prepend(admin_trans('admin.reset_password'), 'fas fa-key') + ->modal($this->resetPassword($data['id'])); + + }); + + $grid->deling(function ($ids) { + if (is_array($ids) && in_array(plugin()->webman->config('admin_auth_id'), $ids)) { + return message_error(admin_trans('admin.super_admin_delete')); + } + }); + + $grid->updateing(function ($ids, $data) { + if (in_array(plugin()->webman->config('admin_auth_id'), $ids)) { + if (isset($data['status']) && $data['status'] == 0) { + return message_error(admin_trans('admin.super_admin_disabled')); + } + } + }); + }); + } + + /** + * 系统用户 + * @auth true + */ + public function form(): Form + { + return Form::create(new $this->model, function (Form $form) { + $form->title(admin_trans('admin.system_user')); + $form->text('username', admin_trans('admin.fields.username')) + ->ruleChsDash() + ->rule([ + (string)Rule::unique(plugin()->webman->config('database.user_model'))->ignore($form->input('id')) => admin_trans('admin.username_exist'), + ]) + ->required() + ->disabled($form->isEdit()); + $form->text('nickname', admin_trans('admin.fields.nickname')) + ->ruleChsAlphaNum() + ->required(); + $form->image('avatar', admin_trans('admin.fields.avatar')) + ->required(); + if (!$form->isEdit()) { + $form->password('password', admin_trans('admin.fields.password')) + ->default(123456) + ->help(admin_trans('admin.pass_help')) + ->required(); + } + $form->text('phone', admin_trans('admin.fields.phone')) + ->rule([ + (string)Rule::unique(plugin()->webman->config('database.user_model'))->ignore($form->input('id')) => admin_trans('admin.phone_exist'), + ]) + ->ruleMobile(); + $form->text('email', admin_trans('admin.fields.mail'))->ruleEmail(); + if ($form->input('id') != plugin()->webman->config('admin_auth_id')) { + $form->radio('type', admin_trans('admin.fields.type')) + ->default(AdminDepartment::TYPE_DEPARTMENT) + ->disabled($form->isEdit()) + ->options([ + AdminDepartment::TYPE_DEPARTMENT => admin_trans('department.type.' . AdminDepartment::TYPE_DEPARTMENT), + AdminDepartment::TYPE_CHANNEL => admin_trans('department.type.' . AdminDepartment::TYPE_CHANNEL) + ]) + ->when('==', AdminDepartment::TYPE_DEPARTMENT, function (Form $form) { + $roleModel = plugin()->webman->config('database.role_model'); + $role = $roleModel::where('type', AdminDepartment::TYPE_DEPARTMENT)->pluck('name', 'id')->toArray(); + $form->checkbox('roles', admin_trans('admin.access_rights')) + ->options($role); + + $department = plugin()->webman->config('database.department_model'); + $options = $department::where('status', 1)->where('type', AdminDepartment::TYPE_DEPARTMENT)->get()->toArray(); + $form->treeSelect('department_id', admin_trans('admin.department')) + ->required() + ->options($options); + + })->when('==', AdminDepartment::TYPE_CHANNEL, function (Form $form) { + $roleModel = plugin()->webman->config('database.role_model'); + $role = $roleModel::where('type', AdminDepartment::TYPE_CHANNEL)->pluck('name', 'id')->toArray(); + $form->checkbox('roles', admin_trans('admin.access_rights')) + ->options($role); + + $department = plugin()->webman->config('database.department_model'); + $options = $department::where('status', 1)->where('type', AdminDepartment::TYPE_CHANNEL)->whereHas('channel', function ($query) { + $query->whereNull('deleted_at'); + }) + ->get()->toArray(); + $form->treeSelect('department_id', admin_trans('admin.channel')) + ->required() + ->options($options); + }); + $department = plugin()->webman->config('database.post_model'); + $options = $department::where('status', 1)->pluck('name', 'id')->toArray(); + $form->select('post', admin_trans('admin.post')) + ->options($options) + ->multiple(); + } + }); + } + + /** + * 修改密码 + * @auth true + * @group all + * @return Form + */ + public function updatePassword(): Form + { + return Form::create(new $this->model, function (Form $form) { + $form->password('old_password', admin_trans('admin.old_password'))->required(); + $form->password('password', admin_trans('admin.new_password')) + ->rule([ + 'confirmed' => admin_trans('admin.password_confim_validate'), + 'min:6' => admin_trans('admin.password_min_number') + ]) + ->value('') + ->required(); + $form->password('password_confirmation', admin_trans('admin.confim_password')) + ->required(); + $form->saving(function (Form $form) { + if (!password_verify($form->input('old_password'), Admin::user()->password)) { + return message_error(admin_trans('admin.old_password_error')); + } + }); + }); + } + + /** + * 个人信息 + * @auth true + * @group all + * @return Form + */ + public function editInfo(): Form + { + return Form::create(new $this->model, function (Form $form) { + $form->text('username', admin_trans('admin.fields.username')) + ->ruleChsDash()->disabled(); + $form->text('nickname', admin_trans('admin.fields.nickname')) + ->ruleChsAlphaNum(); + $form->image('avatar', admin_trans('admin.fields.avatar')); + $form->text('phone', admin_trans('admin.fields.phone')) + ->rule([ + (string)Rule::unique(plugin()->webman->config('database.user_model'))->ignore($form->input('id')) => admin_trans('admin.phone_exist'), + ]) + ->ruleMobile(); + $form->text('email', admin_trans('admin.fields.mail'))->ruleEmail(); + }); + } + + /** + * 重置密码 + * @auth true + * @group all + * @param $id + * @return Form + */ + public function resetPassword($id): Form + { + return Form::create(new $this->model, function (Form $form) { + $form->password('password', admin_trans('admin.new_password')) + ->rule([ + 'confirmed' => admin_trans('admin.password_confim_validate'), + 'min:6' => admin_trans('admin.password_min_number') + ]) + ->value('') + ->required(); + $form->password('password_confirmation', admin_trans('admin.confim_password')) + ->required(); + }); + } +} diff --git a/addons/webman/controller/AppVersionController.php b/addons/webman/controller/AppVersionController.php new file mode 100644 index 0000000..ec1e313 --- /dev/null +++ b/addons/webman/controller/AppVersionController.php @@ -0,0 +1,274 @@ +model = plugin()->webman->config('database.app_version_model'); + + } + + /** + * 版本 + * @auth true + * @return Card + */ + public function index(): Card + { + return Card::create(Tabs::create() + ->pane(admin_trans('app_version.system_key.' . AppVersion::SYSTEM_KEY_ANDROID), $this->androidList()) + ->pane(admin_trans('app_version.system_key.' . AppVersion::SYSTEM_KEY_IOS), $this->iosList()) + ->type('card') + ->destroyInactiveTabPane() + ); + } + + /** + * 安装版本 + * @return Grid + */ + public function androidList(): Grid + { + return Grid::create(new $this->model(), function (Grid $grid) { + $grid->model()->where('system_key', AppVersion::SYSTEM_KEY_ANDROID)->orderBy('id', 'desc'); + $this->getList($grid, AppVersion::SYSTEM_KEY_ANDROID); + }); + } + + /** + * 苹果版本 + * @return Grid + */ + public function iosList(): Grid + { + return Grid::create(new $this->model(), function (Grid $grid) { + $grid->model()->where('system_key', AppVersion::SYSTEM_KEY_IOS)->orderBy('id', 'desc'); + $this->getList($grid, AppVersion::SYSTEM_KEY_IOS); + }); + } + + /** + * 版本列表 + * @param $grid + * @param $systemKey + */ + public function getList($grid, $systemKey) + { + $grid->title(admin_trans('app_version.title')); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->whereDate('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->whereDate('created_at', '<=', $exAdminFilter['created_at_end']); + } + $grid->autoHeight(); + $grid->bordered(true); + $grid->column('channel.name', admin_trans('channel.fields.name'))->align('center'); + $grid->column('system_key', admin_trans('app_version.fields.system_key'))->align('center'); + $grid->column('app_version', admin_trans('app_version.fields.app_version')); + $grid->column('app_version_key', admin_trans('app_version.fields.app_version_key'))->align('center'); + $grid->column('apk_url', admin_trans('app_version.fields.apk_url'))->align('center'); + $grid->column('force_update', admin_trans('app_version.fields.force_update'))->switch([[1 => ''], [0 => '']])->align('center'); + $grid->column('hot_update', admin_trans('app_version.fields.hot_update'))->switch([[1 => ''], [0 => '']])->align('center'); + $grid->column('regular_update', admin_trans('app_version.fields.regular_update'))->align('center'); + $grid->column('notes', admin_trans('app_version.fields.notes'))->align('center'); + $grid->column('status', admin_trans('app_version.fields.status'))->switch([[1 => ''], [0 => '']])->align('center'); + $grid->column('created_at', admin_trans('app_version.fields.created_at'))->align('center'); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->filter(function (Filter $filter) { + $filter->eq()->select('department_id') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('channel.fields.name')) + ->remoteOptions(admin_url(['addons-webman-controller-ChannelController', 'getDepartmentOptions'])); + $filter->eq()->select('status') + ->placeholder(admin_trans('app_version.fields.status')) + ->options([ + 1 => admin_trans('post.normal'), + 0 => admin_trans('post.disable') + ]); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]); + }); + $grid->setForm()->drawer($this->form($systemKey)); + $grid->quickSearch(); + } + + /** + * 添加修改版本 + * @auth true + */ + public function form($systemKey): Form + { + ini_set('memory_limit', '512M'); + Form::extend('myEditor', MyEditor::class); + return Form::create(new $this->model, function (Form $form) use ($systemKey) { + $form->title(admin_trans('app_version.title')); + $form->radio('system_key', admin_trans('app_version.fields.system_key')) + ->button() + ->default($systemKey) + ->options([ + AppVersion::SYSTEM_KEY_ANDROID => admin_trans('app_version.system_key.' . AppVersion::SYSTEM_KEY_ANDROID), + AppVersion::SYSTEM_KEY_IOS => admin_trans('app_version.system_key.' . AppVersion::SYSTEM_KEY_IOS), + ])->required(); + $form->dateTime('regular_update', admin_trans('app_version.fields.regular_update'))->required(); + $form->select('department_id', admin_trans('slider.fields.department_id')) + ->options($this->getChannelOptions())->required(); + $form->text('app_version', admin_trans('app_version.fields.app_version'))->rule([ + 'regex:/^\d+\.\d+\.\d+$/' => admin_trans('app_version.app_version_regex') + ])->maxlength(50)->required(); + $form->text('app_version_key', admin_trans('app_version.fields.app_version_key'))->disabled(true)->maxlength(50)->required(); + $form->watch([ + 'app_version' => function ($value, Watch $watch) { + $versionNumbers = explode('.', $value); + $newVersion = implode('', $versionNumbers); + $watch['app_version_key'] = $newVersion; + }, + ]); + $form->row(function (Form $form) { + $form->switch('status', admin_trans('app_version.fields.status'))->span(8)->required(); + $form->switch('force_update', admin_trans('app_version.fields.force_update'))->span(8)->required(); + $form->switch('hot_update', admin_trans('app_version.fields.hot_update')) + ->default(0) + ->when('==', 1, function (Form $form) { + $form->file('apk_url', admin_trans('app_version.hot_apk_url')) + ->directory('app_version') + ->type('file') + ->ext(['zip']) + ->chunkSize(1) + ->chunk() + ->limit(1) + ->fileSize('200MB')->hideFinder()->required(); + })->when('==', 0, function (Form $form) { + $form->text('apk_url', admin_trans('app_version.fields.apk_url'))->ruleUrl()->maxlength(200)->required(); + }) + ->span(8) + ->required(); + }, null); + $form->textarea('notes', admin_trans('app_version.fields.notes'))->maxlength(125)->bindAttr('rows', 3); + $form->myEditor('update_content', admin_trans('app_version.fields.update_content')); + $form->hidden('user_id')->value(!empty(Admin::user()) ? Admin::user()->id : 0); + $form->hidden('user_name')->value(!empty(Admin::user()) ? Admin::user()->username : ''); + $form->hidden('hot_update_url'); + $form->layout('vertical'); + $form->saving(function (Form $form) { + $apkUrl = $form->input('apk_url'); + $hotUpdate = $form->input('hot_update'); + $hotUpdateUrl = $form->input('hot_update_url'); + $appVersionKey = $form->input('app_version_key'); + if (!$apkUrl) { + return message_error(admin_trans('app_version.missing_package_address')); + } + if (!$appVersionKey) { + return message_error(admin_trans('app_version.app_version_key_not_found')); + } + if (AppVersion::query()->where('department_id', $form->input('department_id'))->where('app_version_key', $appVersionKey)->exists()) { + return message_error(admin_trans('app_version.app_version_key_exists')); + } + if ($hotUpdate == 1) { + $apkUrl = str_replace(env('APP_DOMAIN'), '', $apkUrl); + if (!file_exists(public_path() . $apkUrl)) { + return message_error(admin_trans('app_version.upload_update_package')); + } + if (empty($hotUpdateUrl)) { + $extension = pathinfo($apkUrl, PATHINFO_EXTENSION); + $fileName = pathinfo($apkUrl, PATHINFO_FILENAME); + if (!$extension || !$fileName) { + return message_error(admin_trans('app_version.hot_apk_url_error')); + } + // 解压压缩包 + $hotUrl = $this->decompression($appVersionKey, $extension, $apkUrl); + $form->input('hot_update_url', $hotUrl); + } + } + }); + }); + } + + /** + * 筛选部门/渠道 + * @return array + */ + public function getChannelOptions(): array + { + $channelList = Channel::query()->orderBy('created_at', 'desc')->get(); + $data = []; + /** @var Channel $channel */ + foreach ($channelList as $channel) { + $data[$channel->department_id] = $channel->name; + } + return $data; + } + + /** + * @param $appVersionKey + * @param string $type + * @param string $file + * @return string|void + * @throws \Exception + */ + public function decompression($appVersionKey, string $type = '', string $file = '') + { + try { + $file = public_path() . $file; + $savePath = '/storage/app_version/' . $appVersionKey; + $newPath = public_path() . $savePath; + if (!file_exists($newPath)) { + //检查是否有该文件夹,如果没有就创建,并给予最高权限 + mkdir($newPath, 0755, true); + } + switch ($type) { + case 'zip': + $zip = new ZipArchive; + if ($zip->open($file) === TRUE) { + $zip->extractTo($newPath); + $zip->close(); + return env('APP_DOMAIN') . $savePath; + } else { + throw new \Exception(admin_trans('app_version.decompression_failed')); + } + case 'rar': + $file = RarArchive::open($file); + if ($file !== FALSE) { + $entries = $file->getEntries(); + foreach ($entries as $entry) { + $entry->extract($newPath); + } + $file->close(); + return env('APP_DOMAIN') . $savePath; + } else { + throw new \Exception(admin_trans('app_version.decompression_failed')); + } + } + } catch (Exception $e) { + throw new \Exception($e->getMessage()); + } + } +} diff --git a/addons/webman/controller/AttachmentController.php b/addons/webman/controller/AttachmentController.php new file mode 100644 index 0000000..631f504 --- /dev/null +++ b/addons/webman/controller/AttachmentController.php @@ -0,0 +1,153 @@ +attachmentModel = plugin()->webman->config('database.attachment_model'); + $this->attachmentCateModel = plugin()->webman->config('database.attachment_cate_model'); + } + + /** + * 附件 + * @auth true + * @param string $type image图片 file文件 + * @param int $size 文件大小 + * @param array $ext 文件后缀 + * @param string $customStyle + * @param string $selectionField + * @return Grid + */ + public function index($type = '', $size = 0, $ext = [],$customStyle='card',$selectionField=''): Grid + { + $grid = Grid::create(new $this->attachmentModel); + if($selectionField){ + $grid->selectionField($selectionField); + } + $grid->title(admin_trans('attachment.title')); + $grid->model()->when($type, function (Builder $q, $value) { + $q->where('type', $value); + })->when($ext, function (Builder $q, $value) { + $q->whereIn('ext', $value); + })->when($size, function (Builder $q, $value) { + $q->where('size', '<=', $value); + }); + $grid->hideTrashed(); + $grid->autoHeight(); + $grid->sidebar('cate_id', new $this->attachmentCateModel) + ->model(function (Builder $builder) { + $builder->where(function (Builder $q) { + $q->orWhere('admin_id', Admin::id())->orWhere('permission_type', 0); + }); + + }) + ->setForm($this->cate()) + ->tree(); + $grid->custom(function ($data) { + return Html::create([ + Image::create() + ->src($data['url']) + ->style(['object-fit' => 'contain']) + ->width(80) + ->height(80)->whenShow($data['type'] == 'image'), + DownloadFile::create() + ->onlyImage() + ->style(['object-fit' => 'contain']) + ->width(80) + ->height(80) + ->url($data['url'])->whenShow($data['type'] == 'file'), + ToolTip::create()->title($data['real_name']) + ->placement('bottom') + ->content( + Html::create($data['real_name']) + ->style(['white-space' => 'nowrap', 'text-overflow' => 'ellipsis', 'overflow' => 'hidden', 'width' => '100%']) + ), + ])->style(['display' => 'flex', 'align-items' => 'center', 'flex-direction' => 'column', 'text-align' => 'center']); + }, 'ACard',$customStyle)->grid(10, 6) + ->when($customStyle=='card',function ($list){ + $list->class('ant-card')->style(['padding'=>'0 10px']); + }); + + $grid->pagination()->pageSize(24); + $grid->actions(function (Actions $actions, $data) { + $actions->icon(); + $actions->prepend( + Button::create() + ->icon('') + ->size('small') + ->shape('circle') + ->redirect($data['url']) + ); + }); + $grid->quickSearch('real_name'); + + $grid->vModel('selectedSidebar'); + + $grid->tools( + Upload::create() + ->multiple() + ->action('ex-admin/addons-webman-controller-AttachmentController/upload') + ->bindAttr('params', ['cate_id' => $grid->bindAttr('selectedSidebar')]) + ->style(['marginLeft' => '8px']) + ->eventCustom('success', 'GridRefresh') + ,false); + return $grid; + } + + /** + * 上传 + * @return mixed + */ + public function upload() + { + $class = plugin()->webman->config('form.uploader'); + $simpleUploader = new $class; + return $simpleUploader->upload(); + } + + /** + * 附件分类 + * @auth true + */ + public function cate() + { + return Form::create(new $this->attachmentCateModel(),function (Form $form){ + $options = $this->attachmentCateModel::where('admin_id', Admin::id())->get()->toArray(); + array_unshift($options, ['id' => 0, 'name' => admin_trans('attachment.cate.parent'), 'pid' => -1]); + $form->treeSelect('pid', admin_trans('attachment.cate.fields.pid')) + ->default(0) + ->required() + ->options($options); + $form->text('name', admin_trans('attachment.cate.fields.name'))->required(); + $form->radio('permission_type', admin_trans('attachment.cate.fields.permission_type')) + ->options([ + 0 => admin_trans('attachment.cate.public'), + 1 => admin_trans('attachment.cate.private'), + ]) + ->default(0); + $form->number('sort', admin_trans('attachment.cate.fields.sort'))->default($this->attachmentCateModel::max('sort') + 1); + $form->input('admin_id', Admin::id()); + }); + } +} diff --git a/addons/webman/controller/ChannelAdminController.php b/addons/webman/controller/ChannelAdminController.php new file mode 100644 index 0000000..32f26ed --- /dev/null +++ b/addons/webman/controller/ChannelAdminController.php @@ -0,0 +1,202 @@ +model = plugin()->webman->config('database.user_model'); + + } + + /** + * 渠道用户 + * @group channel + * @auth true + */ + public function index(): Grid + { + /** @var AdminUser $superAdmin */ + $superAdmin = AdminUser::where('department_id', Admin::user()->department_id)->where('is_super', 1)->first(); + return Grid::create(new $this->model, function (Grid $grid) use($superAdmin){ + $grid->title(admin_trans('admin.system_user')); + $grid->model() + ->when(plugin()->webman->config('admin_auth_id') != Admin::id(), function (Builder $builder) { + $builder->whereKeyNot(plugin()->webman->config('admin_auth_id')); + })->where('department_id', Admin::user()->department_id); + $grid->bordered(true); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->where('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->where('created_at', '<=', $exAdminFilter['created_at_end']); + } + $grid->autoHeight(); + $grid->userInfo(); + $grid->column('username', admin_trans('admin.fields.username'))->display(function ($val, $data) { + if ($data['id'] == plugin()->webman->config('admin_auth_id')) { + return Html::create() + ->content($val) + ->content( + Badge::create()->count(admin_trans('admin.super_admin'))->numberStyle(['backgroundColor' => '#1890ff', 'marginLeft' => '5px']) + ); + } else { + return $val; + } + })->copy(); + $grid->column('phone', admin_trans('admin.fields.phone')); + $grid->column('email', admin_trans('admin.fields.mail')); + $grid->column('status', admin_trans('admin.fields.status'))->switch(); + $grid->column('type', admin_trans('admin.fields.type')) + ->display(function ($value, AdminUser $data) { + if ($data->is_super == 1) { + $tag = Tag::create(admin_trans('admin.fields.is_super'))->color('#3b5999'); + } else { + $tag = Tag::create(admin_trans('department.type.' . AdminDepartment::TYPE_CHANNEL))->color('#f50'); + } + return Html::create()->content([ + $tag, + ]); + })->sortable(); + $grid->column('created_at', admin_trans('admin.fields.create_at')); + $grid->quickSearch(); + $grid->hideDelete(); + $grid->setForm()->modal($this->form()); + $grid->filter(function (Filter $filter) { + $filter->like()->text('username')->placeholder(admin_trans('admin.fields.username')); + $filter->like()->text('phone')->placeholder(admin_trans('admin.fields.phone')); + $filter->eq()->select('status') + ->placeholder(admin_trans('admin.fields.status')) + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->options([ + 1 => admin_trans('admin.normal'), + 0 => admin_trans('admin.disable') + ]); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.date_start'), admin_trans('public_msg.date_end')]); + }); + + $grid->actions(function (Actions $actions, $data) use($superAdmin){ + if ($data['id'] == $superAdmin->id) { + $actions->hideDel(); + } + if ($data['id'] != $superAdmin->id) { + $actions->dropdown() + ->prepend(admin_trans('admin.reset_password'), 'fas fa-key') + ->modal($this->resetPassword($data['id'])); + } else { + $actions->dropdown(); + } + }); + + $grid->deling(function ($ids) use($superAdmin){ + if (is_array($ids) && in_array($superAdmin->id, $ids)) { + return message_error(admin_trans('admin.super_admin_delete')); + } + }); + + $grid->updateing(function ($ids, $data) use($superAdmin){ + if (in_array($superAdmin->id, $ids)) { + if (isset($data['status']) && $data['status'] == 0) { + return message_error(admin_trans('admin.super_admin_disabled')); + } + } + }); + }); + } + + /** + * 重置密码 + * @auth true + * @group channel + * @param $id + * @return Form + */ + public function resetPassword($id): Form + { + return Form::create(new $this->model, function (Form $form) { + $form->password('password', admin_trans('admin.new_password')) + ->rule([ + 'confirmed' => admin_trans('admin.password_confim_validate'), + 'min:6' => admin_trans('admin.password_min_number') + ]) + ->value('') + ->required(); + $form->password('password_confirmation', admin_trans('admin.confim_password')) + ->required(); + }); + } + + /** + * 系统用户 + * @group channel + * @auth true + */ + public function form(): Form + { + return Form::create(new $this->model, function (Form $form) { + $form->title(admin_trans('admin.system_user')); + $form->text('username', admin_trans('admin.fields.username')) + ->ruleChsDash() + ->rule([ + (string)Rule::unique(plugin()->webman->config('database.user_model'))->ignore($form->input('id')) => admin_trans('admin.username_exist'), + ]) + ->required() + ->disabled($form->isEdit()); + $form->text('nickname', admin_trans('admin.fields.nickname')) + ->ruleChsAlphaNum() + ->required(); + $form->image('avatar', admin_trans('admin.fields.avatar')) + ->required(); + if (!$form->isEdit()) { + $form->password('password', admin_trans('admin.fields.password')) + ->default(123456) + ->help(admin_trans('admin.pass_help')) + ->required(); + } + $form->text('phone', admin_trans('admin.fields.phone')) + ->rule([ + (string)Rule::unique(plugin()->webman->config('database.user_model'))->ignore($form->input('id')) => admin_trans('admin.phone_exist'), + ]) + ->ruleMobile(); + $form->text('email', admin_trans('admin.fields.mail'))->ruleEmail(); + $form->hidden('department_id')->default(Admin::user()->department_id); + if (!$form->isEdit() || $form->driver()->get('is_super') != 1) { + $roleModel = plugin()->webman->config('database.role_model'); + $role = $roleModel::where('type', AdminDepartment::TYPE_CHANNEL)->pluck('name', 'id')->toArray(); + $form->checkbox('roles', admin_trans('admin.access_rights')) + ->options($role); + $post = plugin()->webman->config('database.post_model'); + $options = $post::where('status', 1)->pluck('name', 'id')->toArray(); + $form->select('post', admin_trans('admin.post')) + ->options($options) + ->multiple(); + } + }); + } +} diff --git a/addons/webman/controller/ChannelController.php b/addons/webman/controller/ChannelController.php new file mode 100644 index 0000000..03f1242 --- /dev/null +++ b/addons/webman/controller/ChannelController.php @@ -0,0 +1,380 @@ +model = plugin()->webman->config('database.channel_model'); + + } + + /** + * 渠道 + * @auth true + */ + public function index(): Grid + { + return Grid::create(new $this->model, function (Grid $grid) { + $grid->title(admin_trans('channel.title')); + $grid->model()->with(['department'])->orderBy('created_at', 'desc'); + $grid->autoHeight(); + $grid->bordered(true); + $grid->column('department_id', admin_trans('channel.fields.id'))->align('center')->fixed(true); + $grid->column('name', admin_trans('channel.fields.name'))->align('center')->fixed(true); + $grid->column('department.leader', admin_trans('channel.fields.leader'))->align('center')->copy()->fixed(true); + $grid->column('department.phone', admin_trans('channel.fields.phone'))->align('center')->copy(); + $grid->column('player_num', admin_trans('channel.fields.player_num'))->display(function ($val, Channel $data) { + return $data->player->count(); + })->align('center'); + $grid->column('created_at', admin_trans('channel.fields.create_at'))->align('center'); + $grid->column('status', admin_trans('channel.fields.status'))->switch(); + $grid->column('lang', admin_trans('channel.fields.lang'))->display(function ($val) { + return Html::create()->content([ + admin_config('ui.lang.list')[$val] ?? '' + ]); + })->align('center'); + $grid->column('currency', admin_trans('channel.fields.currency'))->align('center'); + $grid->column('pay_type', admin_trans('channel.fields.pay_type'))->display(function ($val) { + return Html::create()->content([ + admin_trans('channel.pay_type.'.$val) + ]); + })->align('center')->align('center'); + $grid->column('game_id', admin_trans('channel.fields.game_id'))->display(function ($val) { + return Html::create()->content([ + admin_trans('channel.game.'.$val) + ]); + })->align('center')->align('center'); + $grid->column('channel_function', admin_trans('channel.fields.channel_function'))->display(function ($value, Channel $channel) { + $channelFunction = []; + if ($channel->web_login_status == 1) { + $channelFunction[] = 'web_login_status'; + } + if ($channel->recharge_status == 1) { + $channelFunction[] = 'recharge_status'; + } + if ($channel->withdraw_status == 1) { + $channelFunction[] = 'withdraw_status'; + } + if ($channel->wallet_action_status == 1) { + $channelFunction[] = 'wallet_action_status'; + } + if ($channel->promotion_status == 1) { + $channelFunction[] = 'promotion_status'; + } + $html = Html::create(); + foreach ($channelFunction as $option) { + $html->content( + Tag::create(admin_trans('channel.fields.' . $option)) + ->color('success') + ); + } + return $html; + })->align('center'); + $grid->column('player_total_amount', admin_trans('channel.fields.player_total_amount'))->display(function ($val, Channel $data) { + return $data->wallet()->sum('money'); + })->align('center'); + $grid->column('domain', admin_trans('channel.fields.domain'))->display(function ($value) { + return ToolTip::create(Str::of($value)->limit(30, ' (...)'))->title($value); + })->width('150px')->align('center')->ellipsis(true)->copy(); + $grid->column('telegram_url', admin_trans('channel.fields.whats_app'))->display(function ($value) { + return ToolTip::create(Str::of($value)->limit(30, ' (...)'))->title($value); + })->width('150px')->align('center')->ellipsis(true)->copy(); + $grid->column('package_url', admin_trans('channel.fields.package_url'))->display(function ($value) { + return ToolTip::create(Str::of($value)->limit(30, ' (...)'))->title($value); + })->width('150px')->align('center')->ellipsis(true)->copy(); + $grid->hideDelete(); + $grid->setForm()->drawer($this->form()); + $grid->filter(function (Filter $filter) { + $filter->eq()->text('id')->placeholder(admin_trans('channel.fields.id')); + $filter->like()->text('name')->placeholder(admin_trans('channel.fields.name')); + $filter->like()->text('phone')->placeholder(admin_trans('channel.fields.phone')); + $filter->like()->text('leader')->placeholder(admin_trans('channel.fields.leader')); + $filter->eq()->select('status') + ->placeholder(admin_trans('channel.fields.status')) + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->options([ + 1 => admin_trans('channel.normal'), + 0 => admin_trans('channel.disable') + ]); + }); + $grid->quickSearch(function (Builder $builder, $quickSearch) { + $builder->whereHas('department', function ($query) use ($quickSearch) { + $query->where([ + ['leader', 'like', '%' . $quickSearch . '%', 'or'], + ['phone', 'like', '%' . $quickSearch . '%', 'or'], + ]); + })->orWhere('id', $quickSearch) + ->orWhere('name', $quickSearch) + ->orWhere('domain', $quickSearch); + }); + $grid->deleted(function ($ids) { + DB::beginTransaction(); + try { + $departmentIds = Arr::pluck(Channel::select('department_id')->whereIn('id', $ids)->withTrashed()->get()->toArray(), 'department_id'); + AdminDepartment::whereIn('id', $departmentIds)->delete(); + AdminUser::whereIn('department_id', $departmentIds)->delete(); + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + } + }); + }); + } + + /** + * 渠道 + * @auth true + */ + public function form(): Form + { + return Form::create(new $this->model, function (Form $form) { + $form->title(admin_trans('channel.title')); + $form->row(function (Form $form) { + $form->text('name', admin_trans('channel.fields.name')) + ->ruleChsDash() + ->rule([ + (string)Rule::unique(plugin()->webman->config('database.channel_model'))->ignore($form->input('id')) => admin_trans('channel.name_exist'), + ]) + ->required(); + $form->text('domain', admin_trans('channel.fields.domain')) + ->ruleUrl() + ->rule([ + (string)Rule::unique(plugin()->webman->config('database.channel_model'))->ignore($form->input('id')) => admin_trans('channel.channel_exist'), + ]) + ->required()->style(['margin-left' => '10px']); + }); + $form->row(function (Form $form) { + $form->text('department.phone', admin_trans('channel.fields.phone'))->ruleNumber(); + $form->text('department.leader', admin_trans('channel.fields.leader'))->style(['margin-left' => '10px']); + }); + $form->text('telegram_url', admin_trans('channel.fields.whats_app')) + ->ruleUrl() + ->rule([ + (string)Rule::unique(plugin()->webman->config('database.channel_model'))->ignore($form->input('id')) => admin_trans('channel.telegram_url_exist'), + ]) + ->required(); + $form->text('package_url', admin_trans('channel.fields.package_url')) + ->ruleUrl() + ->rule([ + (string)Rule::unique(plugin()->webman->config('database.channel_model'))->ignore($form->input('id')) => admin_trans('channel.package_url_exist'), + ]) + ->required(); + $form->radio('currency', admin_trans('channel.fields.currency')) + ->button() + ->options(plugin()->webman->config('currency')) + ->required(); + $form->radio('lang', admin_trans('channel.fields.lang')) + ->button() + ->options(admin_config('ui.lang.list')) + ->required(); + $form->radio('game_id', admin_trans('channel.fields.game_id')) + ->button() + ->options(plugin()->webman->config('game')) + ->required(); + $form->row(function (Form $form) { + if (!$form->isEdit()) { + $form->text('user.username', admin_trans('channel.fields.username')) + ->ruleChsDash() + ->rule([ + (string)Rule::unique(plugin()->webman->config('database.user_model'), 'username')->ignore($form->input('id')) => admin_trans('admin.username_exist'), + ]) + ->required() + ->addonAfter(Copy::create($form->input('user.username'))) + ->disabled($form->isEdit()); + $form->password('user.password', admin_trans('channel.fields.password')) + ->default(123456) + ->help(admin_trans('admin.pass_help')) + ->required(); + } else { + $form->text('user.username', admin_trans('channel.fields.username')) + ->ruleChsDash() + ->addonAfter(Copy::create($form->input('user.username'))) + ->disabled($form->isEdit()); + } + }); + $channelFunction = []; + if ($form->isEdit()) { + $id = $form->driver()->get('id'); + /** @var Channel $channel */ + $channel = Channel::find($id); + if ($channel->recharge_status == 1) { + $channelFunction[] = 'recharge_status'; + } + if ($channel->withdraw_status == 1) { + $channelFunction[] = 'withdraw_status'; + } + if ($channel->web_login_status == 1) { + $channelFunction[] = 'web_login_status'; + } + if ($channel->wallet_action_status == 1) { + $channelFunction[] = 'wallet_action_status'; + } + if ($channel->promotion_status == 1) { + $channelFunction[] = 'promotion_status'; + } + } + $form->row(function (Form $form) use ($channelFunction) { + $form->checkbox('channel_function', admin_trans('channel.fields.channel_function')) + ->value($channelFunction) + ->options([ + 'web_login_status' => admin_trans('channel.fields.web_login_status'), + 'recharge_status' => admin_trans('channel.fields.recharge_status'), + 'withdraw_status' => admin_trans('channel.fields.withdraw_status'), + 'wallet_action_status' => admin_trans('channel.fields.wallet_action_status'), + 'promotion_status' => admin_trans('channel.fields.promotion_status'), + ]); + }); + $form->layout('vertical'); + $form->saving(function (Form $form) { + $channelFunction = $form->input('channel_function'); + if (!empty($channelFunction)) { + $artificial = collect(['recharge_status', 'withdraw_status']); + $intersectArtificial = $artificial->intersect($channelFunction)->toArray(); + if (!empty($intersectArtificial) && !empty($intersectQTalk)) { + return message_error(admin_trans('channel.channel_function_help')); + } + } + if (!$form->isEdit()) { + DB::beginTransaction(); + try { + $adminDepartment = new AdminDepartment(); + $adminDepartment->name = $form->input('name'); + $adminDepartment->leader = $form->input('department.leader'); + $adminDepartment->phone = $form->input('department.phone'); + $adminDepartment->type = AdminDepartment::TYPE_CHANNEL; + $adminDepartment->save(); + + $adminUser = new AdminUser(); + $adminUser->username = $form->input('user.username'); + $adminUser->password = $form->input('user.password'); + $adminUser->nickname = $form->input('name'); + $adminUser->department_id = $adminDepartment->id; + $adminUser->type = AdminDepartment::TYPE_CHANNEL; + $adminUser->is_super = 1; + $adminUser->save(); + + $adminRole = new AdminRoleUsers(); + $adminRole->role_id = AdminRole::ROLE_CHANNEL; + $adminRole->user_id = $adminUser->id; + $adminRole->save(); + + $channel = new Channel(); + $channel->name = $form->input('name'); + $channel->domain = $form->input('domain'); + $channel->telegram_url = $form->input('telegram_url'); + $channel->package_url = $form->input('package_url'); + $channel->lang = $form->input('lang'); + $channel->game_id = $form->input('game_id'); + $channel->currency = $form->input('currency'); + $channel->pay_type = $form->input('pay_type') ?? 4; + $channel->department_id = $adminDepartment->id; + $channel->user_id = $adminUser->id; + $channel->site_id = gen_uuid(); // 站点标识 + $channel->recharge_status = in_array('recharge_status', $channelFunction); + $channel->withdraw_status = in_array('withdraw_status', $channelFunction); + $channel->web_login_status = in_array('web_login_status', $channelFunction); + $channel->wallet_action_status = in_array('wallet_action_status', $channelFunction); + $channel->promotion_status = in_array('promotion_status', $channelFunction); + $channel->save(); + + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return message_error($e->getMessage()); + } + $adminDepartment->path = $adminDepartment->id; + $adminDepartment->save(); + return message_success(admin_trans('channel.save_success')); + } else { + $orgData = $form->driver()->get(); + /** @var Channel $channel */ + $channel = Channel::find($orgData['id']); + if (empty($channel)) { + return message_error(admin_trans('channel.not_fount')); + } + DB::beginTransaction(); + try { + $channel->name = $form->input('name'); + $channel->domain = $form->input('domain'); + $channel->telegram_url = $form->input('telegram_url'); + $channel->package_url = $form->input('package_url'); + $channel->lang = $form->input('lang'); + $channel->game_id = $form->input('game_id'); + $channel->currency = $form->input('currency'); + $channel->pay_type = $form->input('pay_type') ?? 4; + $channel->recharge_status = in_array('recharge_status', $channelFunction); + $channel->withdraw_status = in_array('withdraw_status', $channelFunction); + $channel->web_login_status = in_array('web_login_status', $channelFunction); + $channel->wallet_action_status = in_array('wallet_action_status', $channelFunction); + $channel->status = $form->input('status'); + $channel->promotion_status = in_array('promotion_status', $channelFunction); + $channel->save(); + /** @var AdminDepartment $adminDepartment */ + $adminDepartment = AdminDepartment::find($channel->department_id); + $adminDepartment->name = $form->input('name'); + $adminDepartment->leader = $form->input('department.leader'); + $adminDepartment->phone = $form->input('department.phone'); + $adminDepartment->save(); + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return message_error(admin_trans('channel.save_error')); + } + return message_success(admin_trans('channel.save_success')); + } + }); + }); + } + + /** + * 筛选部门/渠道 + * @return mixed + */ + public function getDepartmentOptions() + { + $request = Request::input(); + $channel = Channel::orderBy('created_at', 'desc'); + if (!empty($request['search'])) { + $channel->where('name', 'like', '%' . $request['search'] . '%'); + } + $channelList = $channel->get(); + $data = []; + /** @var Channel $channel */ + foreach ($channelList as $channel) { + $data[] = [ + 'value' => $channel->department_id, + 'label' => $channel->name, + ]; + } + return Response::success($data); + } +} diff --git a/addons/webman/controller/ChannelGameController.php b/addons/webman/controller/ChannelGameController.php new file mode 100644 index 0000000..5fabb60 --- /dev/null +++ b/addons/webman/controller/ChannelGameController.php @@ -0,0 +1,420 @@ +game = plugin()->webman->config('database.game_model'); + $this->prize = plugin()->webman->config('database.prize_model'); + } + + /** + * 游戏列表 + * @group channel + * @auth true + * @return Grid + */ + public function index(): Grid + { + return Grid::create(new $this->game(), function (Grid $grid) { + $grid->title(admin_trans('game.title')); + if (plugin()->webman->config('admin_auth_id') != Admin::id()){ + $gameId = Channel::query()->where('department_id', Admin::user()['department_id'])->value('game_id'); + $grid->model()->where('id', $gameId); + } + $grid->model()->orderBy('status', 'desc')->orderBy('id', 'asc'); + $grid->bordered(true); + $grid->autoHeight(); + $grid->column('id', admin_trans('game.fields.id'))->align('center'); + $grid->column('logo', 'LOGO')->display(function ($val, $data) { + $image = Image::create() + ->width(50) + ->height(50) + ->style(['border-radius' => '50%', 'objectFit' => 'cover']) + ->src($data['logo']); + return Html::create()->content([ + $image, + ]); + })->align('center'); + $grid->column('name', admin_trans('game.fields.name'))->align('center'); + $grid->column('game_image', admin_trans('game.fields.game_image'))->display(function ($val, $data) { + $image = Image::create() + ->width(50) + ->height(50) + ->style(['border-radius' => '50%', 'objectFit' => 'cover']) + ->src($data['game_image']); + return Html::create()->content([ + $image, + ]); + })->align('center'); + $grid->column('description', admin_trans('game.fields.description'))->align('center'); + $grid->column('status', admin_trans('game_platform.fields.status'))->switch()->align('center'); + $grid->column('updated_at', admin_trans('game.fields.updated_at'))->align('center'); + $grid->expandFilter(); + $grid->actions(function (Actions $actions, $data) { + $actions->hideDel(); + $actions->prepend( + Button::create(admin_trans('game.enter_game'))->ajax([$this, 'enterGame'], + ['id' => $data['id']]) + ); + $actions->prepend( + Button::create(admin_trans('game.view_prize'))->modal([$this, 'getPrizeList'], + ['id' => $data['id']])->width('100%') + ); + })->align('center'); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->hideAdd(); + $grid->hideTrashed(); + }); + } + + /** + * 进入游戏 + * @param $id + * @group channel + * @auth true + * @return Notification + */ + public function enterGame($id): Notification + { + $game = Game::query()->where('id', $id)->first(); + if (empty($game->test_url)) { + $player = Player::query()->where('test', 1)->find($id); + $channel = Channel::query()->whereJsonContains('game_id', $id)->first(); + if (empty($channel) || empty($player)) { + return notification_error(admin_trans('admin.success'),admin_trans('game_platform.action_error'))->redirect(''); + } + $token = JwtToken::generateToken([ + 'id' => $player->uuid, + 'account' => $player->account, + 'game_id' => $id, + 'app_id' => $channel->externalApp->app_id, + 'channel' => openssl_encrypt($channel->externalApp->app_secret, 'DES-ECB', config('app.channel_des_key')), + 'access_exp' => 864000000, + 'refresh_exp' => 864000000, + ]); + $url = $game->game_url . $id . '?access_token=' . $token['access_token']; + } else { + $url = $game->test_url; + } + return notification_success(admin_trans('admin.success'), + admin_trans('game_platform.action_success'))->redirect($url); + } + + /** + * 游戏详情 + * @auth true + * @group channel + * @return Form + */ + public function form(): Form + { + return Form::create(new $this->game(), function (Form $form) { + $form->title(admin_trans('prize.title')); + $form->text('name', admin_trans('game.fields.name'))->required()->maxlength(50); + $form->image('logo', admin_trans('game.fields.logo')) + ->required(); + $form->image('game_image', admin_trans('game.fields.game_image')) + ->required(); + $form->textarea('description', admin_trans('game.fields.description'))->maxlength(500)->bindAttr('rows', 10); + $form->layout('vertical'); + }); + } + + /** + * 查看奖品 + * @param $id + * @group channel + * @return Grid + * @auth true + */ + public function getPrizeList($id): Grid + { + $num = Game::query()->where('id', $id)->value('prize_num'); + $prizeNum = Prize::query()->where('game_id', $id) + ->where('department_id', Admin::user()->department_id) + ->where('status', 1) + ->count(); + if ($prizeNum < $num) { + + for ($j = $num - $prizeNum; $j >= 1; $j--) { + Prize::query()->create([ + 'game_id' => $id, + 'department_id' => Admin::user()->department_id, + 'name' => '奖品名称', + 'probability' => 0, + 'type' => 1, + 'total_stock' => 0, + 'daily_stock' => 0, + 'total_remaining' => 0, + 'daily_remaining' => 0, + 'admin_id' => Admin::id(), + 'admin_name' => Admin::user()->username, + ]); + } + } + return Grid::create(new $this->prize(), function (Grid $grid) use($id) { + $grid->title(admin_trans('prize.title')); + $grid->model()->where('game_id', $id)->where('department_id', Admin::user()->department_id)->orderBy('probability'); + $grid->bordered(true); + $grid->autoHeight(); + $grid->column('id', admin_trans('prize.fields.id'))->align('center')->width('5%'); + $grid->column('name', admin_trans('prize.fields.name'))->align('center')->width('10%'); + $grid->column('type', admin_trans('prize.fields.type'))->display(function ($val) { + return admin_trans('prize.prize_type.' . $val); + })->align('center')->width('10%'); + $grid->column('pic', admin_trans('prize.fields.pic'))->display(function ($val, $data) { + $image = Image::create() + ->width(50) + ->height(50) + ->src($data['pic']); + return Html::create()->content([ + $image, + ]); + })->align('center'); + $grid->column('probability', admin_trans('prize.fields.probability'))->align('center')->width('10%'); + $grid->column('total_stock', admin_trans('prize.fields.total_stock'))->align('center')->width('8%'); + $grid->column('daily_stock', admin_trans('prize.fields.daily_stock'))->align('center')->width('8%'); + $grid->column('total_remaining', admin_trans('prize.fields.total_remaining'))->align('center')->width('8%'); + $grid->column('daily_remaining', admin_trans('prize.fields.daily_remaining'))->align('center')->width('8%'); + $grid->column('description', admin_trans('prize.fields.description'))->align('center')->width('20%'); + $grid->column('admin_name', admin_trans('prize.fields.admin_name'))->align('center')->width('8%'); + $grid->column('updated_at', admin_trans('prize.fields.updated_at'))->align('center')->width('8%'); + $grid->expandFilter(); + $grid->setForm()->drawer($this->editPrize($id)); + $grid->actions(function (Actions $actions, $data) { + $actions->hideDel(); + $actions->prepend( + Button::create(admin_trans('prize.replenish_daily_stock'))->ajax([$this, 'replenishDailyStock'], + ['id' => $data['id']]) + ); + })->align('center'); + $grid->hideDelete(); + $grid->hideAdd(); + $grid->hideSelection(); + $grid->hideTrashed(); + }); + } + + /** + * 补充每日库存 + * @param $id + * @group channel + * @auth true + * @return Msg + */ + public function replenishDailyStock($id): Msg + { + /** @var Prize $prize */ + $prize = Prize::query()->where('id', $id)->first(); + + if ($prize->daily_remaining < $prize->daily_stock) { + $diff = $prize->daily_stock - $prize->daily_remaining; + $prize->daily_remaining = $prize->daily_stock; + $prize->total_remaining = $prize->total_remaining + $diff; + $prize->total_stock = $prize->total_stock + $diff; + } + $prize->save(); + return message_success(admin_trans('prize.action_success')); + } + + /** + * 奖品详情 + * @auth true + * @group channel + * @param $gameId + * @return Form + */ + public function editPrize($gameId): Form + { + return Form::create(new $this->prize(), function (Form $form) use ($gameId) { + $form->title(admin_trans('prize.title')); + $form->text('name', admin_trans('prize.fields.name'))->required()->maxlength(50); + $form->select('type', admin_trans('prize.fields.type'))->options([ + Prize::PRIZE_TYPE_PHYSICAL => admin_trans('prize.prize_type.' . Prize::PRIZE_TYPE_PHYSICAL), + Prize::PRIZE_TYPE_VIRTUAL => admin_trans('prize.prize_type.' . Prize::PRIZE_TYPE_VIRTUAL), + Prize::PRIZE_TYPE_LOSE => admin_trans('prize.prize_type.' . Prize::PRIZE_TYPE_LOSE), + ])->required(); + $form->image('pic', admin_trans('prize.fields.pic')); + $form->hidden('game_id')->default($gameId); + $form->number('probability', admin_trans('prize.fields.probability'))->min(1)->max(999)->required(); + $form->number('total_stock', admin_trans('prize.fields.total_stock'))->min(1)->max(100000)->required(); + $form->number('daily_stock', admin_trans('prize.fields.daily_stock'))->min(1)->max(100000) + ->help(admin_trans('prize.daily_stock_help'))->required(); + $form->textarea('description', admin_trans('prize.fields.description'))->maxlength(500)->bindAttr('rows', 10); + $form->layout('vertical'); + $form->saving(function (Form $form) { + try { + if (!$form->isEdit()) { + $prize = new Prize(); + $prize->game_id = $form->input('game_id'); + } else { + $prizeId = $form->driver()->get('id'); + $prize = Prize::query()->find($prizeId); + } + $prize->type = $form->input('type'); + $prize->name = $form->input('name'); + $prize->pic = $form->input('pic'); + $prize->probability = $form->input('probability'); + $prize->total_remaining = $form->input('total_stock'); + $prize->daily_remaining = $form->input('daily_stock'); + $prize->total_stock = $form->input('total_stock'); + $prize->daily_stock = $form->input('daily_stock'); + if ($prize->daily_stock > $prize->total_stock) { + return message_error(admin_trans('prize.daily_stock_help')); + } + $prize->description = $form->input('description'); + $prize->admin_id = Admin::id(); + $prize->admin_name = !empty(Admin::user()) ? Admin::user()->toArray()['username'] : trans('system_automatic', [], 'message'); + $prize->department_id = !empty(Admin::user()) ? Admin::user()->toArray()['department_id'] : trans('system_automatic', [], 'message'); + $prize->save(); + } catch (\Exception $e) { + return message_error(admin_trans('form.save_fail')); + } + return message_success(admin_trans('form.save_success')); + }); + }); + } + + /** + * 筛选游戏平台 + * @return mixed + */ + public function getGamePlatformOptions() + { + $request = Request::input(); + $gamePlatform = GamePlatform::query()->orderBy('created_at', 'desc'); + if (!empty($request['search'])) { + $gamePlatform->where('name', 'like', '%' . $request['search'] . '%'); + } + $channelList = $gamePlatform->get(); + $data = []; + /** @var GamePlatform $gamePlatform */ + foreach ($channelList as $gamePlatform) { + $data[] = [ + 'value' => $gamePlatform->id, + 'label' => $gamePlatform->name, + ]; + } + return Response::success($data); + } + + /** + * 游戏类型列表 + * @auth true + */ + public function serviceList(): Grid + { + return Grid::create(new GameType(), function (Grid $grid) { + $grid->title(admin_trans('game_type.title')); + $grid->autoHeight(); + $grid->bordered(true); + $grid->column('game_type', admin_trans('game_type.fields.game_type'))->display(function ($val) { + return $val ? admin_trans('game_type.game_type.' . $val) : admin_trans('game_type.nu_set'); + })->align('center'); + + $grid->column('ratio', admin_trans('game_type.fields.ratio'))->display(function ($value) { + return $value . '%'; + })->editable( + (new Editable)->number('ratio') + ->min(1) + ->max(100) + ->addonAfter('%') + )->align('center')->ellipsis(true); + + $grid->column('updated_at', admin_trans('game_type.fields.updated_at'))->align('center')->display(function ($val) { + return $val ? date('Y-m-d H:i:s', strtotime($val)) : ''; + })->ellipsis(true); + $grid->actions(function (Action $actions) { + $actions->hideDel(); + $actions->hideEdit(); + }); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->hideAdd(); + }); + } + + /** + * 游戏类型 + * @auth true + */ + public function serviceForm(): Form + { + return Form::create(new GamePlatform, function (Form $form) { + $form->title(admin_trans('game_platform.game_platform')); + $form->text('name', admin_trans('game_platform.fields.name')); + $form->text('title', admin_trans('game_platform.fields.title')); + $form->number('service_ratio', admin_trans('game_platform.fields.service_ratio'))->addonAfter('%'); + + $form->layout('vertical'); + $form->saving(function (Form $form) { + if (!$form->isEdit()) { + return message_error(admin_trans('game_platform.save_error')); + DB::beginTransaction(); + try { + $gamePlatform = new GamePlatform(); + $gamePlatform->name = $form->input('name'); + $gamePlatform->title = $form->input('title'); + $gamePlatform->service_ratio = $form->input('service_ratio'); + $gamePlatform->status = 1; + $gamePlatform->save(); + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return message_error($e->getMessage()); + } + return message_success(admin_trans('game_platform.save_success')); + } else { + $gamePlatform = GamePlatform::find($form->input('id')); + if (empty($gamePlatform)) { + return message_error(admin_trans('game_platform.not_fount')); + } + DB::beginTransaction(); + try { + $gamePlatform->name = $form->input('name'); + $gamePlatform->title = $form->input('title'); + $gamePlatform->service_ratio = $form->input('service_ratio'); + $gamePlatform->save(); + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return message_error($e->getMessage()); + } + return message_success(admin_trans('game_platform.save_success')); + } + }); + }); + } +} diff --git a/addons/webman/controller/ChannelIndexController.php b/addons/webman/controller/ChannelIndexController.php new file mode 100644 index 0000000..1948c0c --- /dev/null +++ b/addons/webman/controller/ChannelIndexController.php @@ -0,0 +1,292 @@ +rechargeData(); + $withdrawData = $this->withdrawData(); + $playerData = $this->playerData(); + $loginData = $this->loginData(); + $layout = Layout::create(); + $layout->row(function (Row $row) use ($rechargeData, $withdrawData, $playerData, $loginData) { + $row->gutter([10, 10]); + $row->column( + Card::create([ + Row::create()->column(Icon::create('fas fa-globe')->style(['fontSize' => '45px', 'color' => 'rgb(0,154,97)', 'marginRight' => '20px']), 4), + Row::create()->column(Statistic::create()->title(admin_trans('data_center.department_id')) + ->value(Admin::user()->department->id ?? '')->style(['fontSize' => '45px', 'text-align' => 'center']), 6), + Divider::create()->type('vertical')->style(['height' => '4.9em']), + Row::create()->column(Statistic::create()->title(admin_trans('data_center.department_name')) + ->value(Admin::user()->department->name ?? '')->style(['fontSize' => '45px', 'text-align' => 'center']), 8), + ])->bodyStyle(['display' => 'flex', 'align-items' => 'center'])->hoverable()->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px']) + , 12); + $row->column( + Card::create([ + Row::create()->column(Icon::create('fas fa-user')->style(['fontSize' => '45px', 'color' => '#409eff', 'marginRight' => '20px']), 6), + Row::create()->column(Statistic::create()->title(admin_trans('data_center.today_add_player')) + ->value($playerData['today'])->style(['fontSize' => '45px', 'text-align' => 'center']), 8), + Divider::create()->type('vertical')->style(['height' => '4.9em']), + Row::create()->column(Statistic::create()->title(admin_trans('data_center.player_all')) + ->value($playerData['all'])->style(['fontSize' => '45px', 'text-align' => 'center']), 8), + ])->bodyStyle(['display' => 'flex', 'align-items' => 'center'])->hoverable()->extra(Icon::create('MoreOutlined') + ->redirect('ex-admin/addons-webman-controller-ChannelPlayerController/index')) + ->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px']) + , 12); + $row->column( + Card::create([ + Row::create()->column(Icon::create('fas fa-user')->style(['fontSize' => '45px', 'color' => '#e91e63', 'marginRight' => '20px']), 6), + Row::create()->column(Statistic::create()->title(admin_trans('data_center.today_active_player')) + ->value($loginData['today'])->style(['fontSize' => '45px', 'text-align' => 'center']), 8) + ->redirect('ex-admin/addons-webman-controller-PlayerController/index',['active_player' => 1]), + Divider::create()->type('vertical')->style(['height' => '4.9em']), + Row::create()->column(Statistic::create()->title(admin_trans('data_center.mouth_active_player')) + ->value($loginData['month'])->style(['fontSize' => '45px', 'text-align' => 'center']), 8) + ->redirect('ex-admin/addons-webman-controller-PlayerController/index',['active_player' => 2]) + ])->bodyStyle(['display' => 'flex', 'align-items' => 'center'])->hoverable() + , 12); + $row->column( + Card::create([ + Row::create()->column(Icon::create('fas fa-money-bill')->style(['fontSize' => '45px', 'color' => '#409eff', 'marginRight' => '20px']), 6), + Row::create()->column(Statistic::create()->title(admin_trans('data_center.recharge_all')) + ->value(floatval($rechargeData['all']))->style(['fontSize' => '45px', 'text-align' => 'center']), 8), + ])->bodyStyle(['display' => 'flex', 'align-items' => 'center'])->hoverable()->extra(Icon::create('MoreOutlined') + ->redirect('ex-admin/addons-webman-controller-ChannelRechargeRecordController/index')) + ->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px']) + , 6); + + $row->column( + Card::create([ + Row::create()->column(Icon::create('fas fa-money-bill-alt')->style(['fontSize' => '45px', 'color' => '#ff9800', 'marginRight' => '20px']), 6), + Row::create()->column(Statistic::create()->title(admin_trans('data_center.withdraw_all')) + ->value(floatval($withdrawData['all']))->style(['fontSize' => '45px', 'text-align' => 'center']), 8), + ])->bodyStyle(['display' => 'flex', 'align-items' => 'center'])->hoverable()->extra(Icon::create('MoreOutlined') + ->redirect('ex-admin/addons-webman-controller-ChannelWithdrawRecordController/index')) + ->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px']) + , 6); + + $row->column(Card::create($this->rechargeChart())->hoverable(), 12); + $row->column(Card::create($this->withdrawChart())->hoverable(), 12); + $row->column(Card::create($this->playerChart())->hoverable(), 12); + }); + + return $layout; + } + + /** + * 获取活跃玩家数据 + * @return array + */ + public function loginData(): array + { + return [ + 'month' => PlayerLoginRecord::whereYear('created_at', date('Y'))->whereMonth('created_at', date('m'))->distinct('player_id')->count(), + 'today' => PlayerLoginRecord::whereDate('created_at', date('Y-m-d'))->distinct('player_id')->count(), + ]; + } + + /** + * 获取玩家数据 + * @return array + */ + public function playerData(): array + { + return [ + 'all' => Player::count('*'), + 'today' => Player::whereDate('created_at', date('Y-m-d'))->count(), + ]; + } + + /** + * 获取充值数据 + * @return array + */ + public function rechargeData(): array + { + return [ + 'all' => PlayerRechargeRecord::where('status', PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS)->whereIn('type', [PlayerRechargeRecord::TYPE_REGULAR, PlayerRechargeRecord::TYPE_ARTIFICIAL])->sum('coins'), + 'regular' => PlayerRechargeRecord::where('status', PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS)->where('type', PlayerRechargeRecord::TYPE_REGULAR)->sum('coins'), + 'artificial' => PlayerRechargeRecord::where('status', PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS)->where('type', PlayerRechargeRecord::TYPE_ARTIFICIAL)->sum('coins'), + ]; + } + + /** + * 获取提现数据 + * @return array + */ + public function withdrawData(): array + { + return [ + 'all' => PlayerWithdrawRecord::where('status', PlayerWithdrawRecord::STATUS_SUCCESS)->sum('coins'), + 'self' => PlayerWithdrawRecord::where('status', PlayerWithdrawRecord::STATUS_SUCCESS)->where('type', PlayerWithdrawRecord::TYPE_SELF)->sum('coins'), + 'artificial' => PlayerWithdrawRecord::where('status', PlayerWithdrawRecord::STATUS_SUCCESS)->where('type', PlayerWithdrawRecord::TYPE_ARTIFICIAL)->sum('coins'), + ]; + } + + + /** + * 充值趋势图 + * @return LineChart + */ + public function rechargeChart(): LineChart + { + $range = Carbon::now()->subDays(15)->format('Y-m-d'); + $data = PlayerRechargeRecord::whereDate('created_at', '>=', $range) + ->where('status', PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS) + ->whereIn('type', [PlayerRechargeRecord::TYPE_REGULAR, PlayerRechargeRecord::TYPE_ARTIFICIAL]) + ->groupBy('date') + ->orderBy('date', 'DESC') + ->get([ + DB::raw('Date(`created_at`) as date'), + DB::raw('SUM(`coins`) as value') + ]) + ->toArray(); + $data = $data ? array_column($data, 'value', 'date') : []; + $xAxis = []; + $yAxis = []; + for ($i = 14; $i >= 0; $i--) { + $date = Carbon::now()->subDays($i)->format('Y-m-d'); + $xAxis[] = $date; + $yAxis[] = $data[$date] ?? 0; + } + + return LineChart::create() + ->height('280px') + ->hideDateFilter() + ->header(Html::create(admin_trans('data_center.recharge_chart'))->tag('h2')->style(['text-align' => 'center'])) + ->xAxis($xAxis) + ->data(admin_trans('data_center.recharge_amount'), $yAxis); + } + + /** + * 提现趋势图 + * @return LineChart + */ + public function withdrawChart(): LineChart + { + $range = Carbon::now()->subDays(15)->format('Y-m-d'); + $data = PlayerWithdrawRecord::whereDate('created_at', '>=', $range) + ->where('status', PlayerWithdrawRecord::STATUS_SUCCESS) + ->groupBy('date') + ->orderBy('date', 'DESC') + ->get([ + DB::raw('Date(`created_at`) as date'), + DB::raw('SUM(`coins`) as value') + ]) + ->toArray(); + $data = $data ? array_column($data, 'value', 'date') : []; + $xAxis = []; + $yAxis = []; + + for ($i = 14; $i >= 0; $i--) { + $date = Carbon::now()->subDays($i)->format('Y-m-d'); + $xAxis[] = $date; + $yAxis[] = $data[$date] ?? 0; + } + + return LineChart::create() + ->height('280px') + ->hideDateFilter() + ->header(Html::create(admin_trans('data_center.withdraw_chart'))->tag('h2')->style(['text-align' => 'center'])) + ->xAxis($xAxis) + ->data(admin_trans('data_center.withdraw_amount'), $yAxis); + } + + /** + * 上传 + * @return Response|void + */ + public function myEditorUpload() + { + $file = request()->file('file'); + if ($file && $file->isValid()) { + $size = $file->getSize(); + if ($file->getSize() >= 1024 * 1024) { + return jsonFailResponse(trans('image_upload_size_fail', ['{size}' => '1M'], 'message')); + } + $extension = $file->getUploadExtension(); + if (!in_array($extension, ['png', 'jpg', 'jpeg'])) { + return jsonFailResponse(trans('image_upload_size_fail', ['{size}' => '1M'], 'message')); + } + $uploadName = $file->getUploadName(); + $basePath = public_path() . '/storage/' . date('Ymd') . DIRECTORY_SEPARATOR; + $baseUrl = env('APP_URL', 'http://127.0.0.1:8787') . '/storage/' . date('Ymd') . '/'; + $uniqueId = hash_file('md5', $file->getPathname()); + $saveFilename = $uniqueId . '.' . $file->getUploadExtension(); + $savePath = $basePath . $saveFilename; + $file->move($savePath); + + return jsonSuccessResponse('success', [ + 'origin_name' => $uploadName, + 'save_name' => $saveFilename, + 'save_path' => $savePath, + 'url' => $baseUrl . $saveFilename, + 'unique_id' => $uniqueId, + 'size' => $size, + 'mime_type' => $file->getUploadMimeType(), + 'extension' => $extension, + ]); + } + } + + /** + * 新增玩家 + * @return BarChart + */ + public function playerChart(): BarChart + { + $range = Carbon::now()->subDays(15)->format('Y-m-d'); + $data = Player::whereDate('created_at', '>=', $range) + ->groupBy('date') + ->orderBy('date', 'DESC') + ->get([ + DB::raw('Date(`created_at`) as date'), + DB::raw('COUNT(`id`) as value') + ]) + ->toArray(); + $data = $data ? array_column($data, 'value', 'date') : []; + $xAxis = []; + $yAxis = []; + for ($i = 14; $i >= 0; $i--) { + $date = Carbon::now()->subDays($i)->format('Y-m-d'); + $xAxis[] = $date; + $yAxis[] = $data[$date] ?? 0; + } + + return BarChart::create() + ->height('280px') + ->hideDateFilter() + ->header(Html::create(admin_trans('data_center.player_chart'))->tag('h2')->style(['text-align' => 'center'])) + ->xAxis($xAxis) + ->data(admin_trans('data_center.player_amount'), $yAxis); + } +} \ No newline at end of file diff --git a/addons/webman/controller/ChannelPlayGameRecordController.php b/addons/webman/controller/ChannelPlayGameRecordController.php new file mode 100644 index 0000000..75a3f95 --- /dev/null +++ b/addons/webman/controller/ChannelPlayGameRecordController.php @@ -0,0 +1,91 @@ +model = plugin()->webman->config('database.draw_records_model'); + } + + /** + * 玩家游戏记录 + * @group channel + * @auth true + */ + public function index(): Grid + { + return Grid::create(new $this->model, function (Grid $grid) { + $grid->title(admin_trans('play_game_record.title')); + $grid->model()->orderBy('created_at', 'desc'); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->whereDate('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->whereDate('created_at', '<=', $exAdminFilter['created_at_end']); + } + $grid->autoHeight(); + $grid->bordered(true); + $grid->hideAction(); + $grid->hideDelete(); + $grid->hideDeleteSelection(); + $grid->hideSelection(); + $grid->column('id', admin_trans('play_game_record.fields.id'))->fixed(true)->align('center'); + $grid->column('player.name', admin_trans('player.fields.name'))->display(function ($val, DrawRecord $data) { + $image = !empty($data->player->avatar) ? Avatar::create()->src(is_numeric($data->player->avatar) ? config('def_avatar.' . $data->player->avatar) : $data->player->avatar) : Avatar::create()->icon(Icon::create('UserOutlined')); + return Html::create()->content([ + $image, + Html::div()->content($val), + ]); + })->fixed(true)->align('center'); + $grid->column('channel.name', admin_trans('channel.fields.name'))->align('center'); + $grid->column('game_type', admin_trans('game.fields.game_type'))->display(function ($val) { + return $val ? admin_trans('game.game_type.' . $val) : admin_trans('game.nu_set'); + })->align('center'); + $grid->column('prize_name', admin_trans('prize.fields.name'))->align('center'); + $grid->column('prize_type', admin_trans('prize.fields.type'))->display(function ($val) { + return $val ? admin_trans('prize.prize_type.' . $val) : admin_trans('prize.nu_set'); + })->align('center'); + $grid->column('created_at', admin_trans('play_game_record.fields.create_at'))->align('center'); + $grid->filter(function (Filter $filter) { + $filter->like()->text('player.name')->placeholder(admin_trans('player.fields.name')); + $filter->eq()->select('game_type') + ->placeholder(admin_trans('play_game_record.fields.game_type')) + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->options([ + Game::GAME_TYPE_EGG => admin_trans('game.game_type.' . Game::GAME_TYPE_EGG), + Game::GAME_TYPE_TURNTABLE => admin_trans('game.game_type.' . Game::GAME_TYPE_TURNTABLE), + Game::GAME_TYPE_BLINDBOX => admin_trans('game.game_type.' . Game::GAME_TYPE_BLINDBOX), + Game::GAME_TYPE_TICKET => admin_trans('game.game_type.' . Game::GAME_TYPE_TICKET), + Game::GAME_TYPE_LOTTERY => admin_trans('game.game_type.' . Game::GAME_TYPE_LOTTERY), + Game::GAME_TYPE_DICE => admin_trans('game.game_type.' . Game::GAME_TYPE_DICE), + ]); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]); + }); + $grid->quickSearch(); + }); + } +} diff --git a/addons/webman/controller/ChannelPlayerController.php b/addons/webman/controller/ChannelPlayerController.php new file mode 100644 index 0000000..0481b6e --- /dev/null +++ b/addons/webman/controller/ChannelPlayerController.php @@ -0,0 +1,1310 @@ +model = plugin()->webman->config('database.player_model'); + $this->playerTag = plugin()->webman->config('database.player_tag_model'); + $this->withdraw = plugin()->webman->config('database.player_withdraw_record_model'); + $this->recharge = plugin()->webman->config('database.player_recharge_record_model'); + $this->promoter = plugin()->webman->config('database.player_promoter_model'); + $this->playerChipRecord = plugin()->webman->config('database.player_chip_record_model'); + $this->playerActivityPhaseRecord = plugin()->webman->config('database.player_activity_phase_record_model'); + $this->playerLotteryRecord = plugin()->webman->config('database.player_lottery_record_model'); + $this->playerDeliveryRecord = plugin()->webman->config('database.player_delivery_record_model'); + } + + /** + * 渠道玩家 + * @auth true + * @group channel + * @return Grid + */ + public function index(): Grid + { + /** @var Channel $channel */ + $channel = Channel::where('department_id', Admin::user()->department_id)->first(); + return Grid::create(new $this->model(), function (Grid $grid) use ($channel) { + $grid->title(admin_trans('player.title')); + $requestFilter = Request::input('ex_admin_filter', []); + if (isset($requestFilter['search_type']) && !empty($requestFilter['search_type'])) { + $grid->model()->where('is_coin', $requestFilter['search_type']); + } + if (isset($requestFilter['created_at_start']) && !empty($requestFilter['created_at_start'])) { + $grid->model()->where('player.created_at', '>=', $requestFilter['created_at_start']); + } + if (isset($requestFilter['created_at_end']) && !empty($requestFilter['created_at_end'])) { + $grid->model()->where('player.created_at', '<=', $requestFilter['created_at_end']); + } + $activePlayer = Request::input('active_player') ?? null; + if (!empty($activePlayer)){ + $grid->model()->whereHas('the_last_player_login_record', function ($query) use ($activePlayer) { + if ($activePlayer == 1){ + $query->whereDate('created_at', date('Y-m-d')); + } else { + $query->whereYear('created_at', date('Y')) + ->whereMonth('created_at', date('m')); + } + }); + } + $subQuery = PlayerDeliveryRecord::select('player_id', Db::raw('sum(amount) as amount')) + ->whereNotIn('type', [1,2,3,4,5,9,10]) + ->groupBy('player_id'); + $grid->model()->with(['player_register_record', 'the_last_player_login_record']) + ->select([ + 'player.*', + 'player_extend.recharge_amount', + 'player_extend.withdraw_amount', + 'player_platform_cash.money as money', + 'record.amount as present_coins' + ]) + ->leftjoin('player_extend', 'player.id', '=', 'player_extend.player_id') + ->leftjoin('player_platform_cash', 'player.id', '=', 'player_platform_cash.player_id') + ->leftjoinSub($subQuery, 'record', function ($join) { + $join->on('player.id', '=', 'record.player_id'); + }) + ->orderBy('player.id', 'desc'); + $grid->autoHeight(); + $grid->bordered(); + $grid->column('id', admin_trans('player.fields.id'))->fixed(true)->align('center'); + $grid->column('name', admin_trans('player.fields.name'))->display(function ($val, Player $data) { + $image = $data->avatar ? Avatar::create()->src(is_numeric($data->avatar) ? config('def_avatar.' . $data->avatar) : $data->avatar) : Avatar::create()->icon(Icon::create('UserOutlined')); + return Html::create()->content([ + $image, + Html::div()->content($val), + ]); + })->fixed(true)->align('center'); + $grid->column('uuid', admin_trans('player.fields.uuid'))->fixed(true)->ellipsis(true)->align('center'); + $grid->column('phone', admin_trans('player.fields.phone'))->fixed(true)->ellipsis(true)->align('center'); + $grid->column('money', admin_trans('player_platform_cash.platform_name.' . PlayerPlatformCash::PLATFORM_SELF))->display(function ($val, Player $data) { + return Tag::create($val)->color('orange')->style(['cursor' => 'pointer'])->modal([$this, 'playerRecord'], ['id' => $data->id])->width('70%')->title($data->name . ' ' . $data->uuid); + })->ellipsis(true)->align('center')->sortable(); + $grid->column('player_extend.recharge_amount', admin_trans('player_extend.fields.recharge_amount'))->ellipsis(true)->align('center')->sortable(); + $grid->column('player_extend.withdraw_amount', admin_trans('player_extend.fields.withdraw_amount'))->ellipsis(true)->align('center')->sortable(); + $grid->column('status', admin_trans('player.fields.status'))->switch()->ellipsis(true)->align('center'); + $grid->column('player.created_at', admin_trans('player.fields.created_at'))->display(function ($val, Player $data) { + return Html::create()->content([ + Html::div()->content(date('Y-m-d H:i:s', strtotime($data->created_at))), + Html::div()->content($data->player_register_record->ip ?? ''), + Html::div()->content($data->player_register_record->country_name ?? ''), + ]); + })->ellipsis(true)->align('center')->sortable(); + $grid->column('last_login', admin_trans('player.fields.player_login_record'))->display(function ($val, Player $data) { + return Html::create()->content([ + Html::div()->content($val ?? (!empty($data->the_last_player_login_record->created_at) ? date('Y-m-d H:i:s', strtotime($data->the_last_player_login_record->created_at)) : '')), + Html::div()->content($data->the_last_player_login_record->ip ?? ''), + Html::div()->content($data->the_last_player_login_record->country_name ?? ''), + ]); + })->ellipsis(true)->align('center')->sortable(); + $grid->filter(function (Filter $filter) use ($channel) { + $filter->like()->text('uuid')->placeholder(admin_trans('player.fields.uuid')); + $filter->like()->text('name')->placeholder(admin_trans('player.fields.name')); + $filter->like()->text('phone')->placeholder(admin_trans('player.fields.phone')); + $filter->eq()->select('level') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('player.fields.level')) + ->options(playerLevelOptions()); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateTimeRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]); + }); + $grid->expandFilter(); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->tools( + $grid->addButton()->modal($this->form()) + ); + $grid->actions(function (Actions $actions, Player $data) use ($channel) { + $actions->edit()->modal($this->form())->width('60%'); + $actions->hideDel(); + $dropdown = $actions->dropdown(); + if ($channel->wallet_action_status == 1) { + $dropdown->append(admin_trans('player.wallet.player_wallet'), 'MoneyCollectFilled') + ->modal($this->playerWallet([ + 'id' => $data->id, + 'money' => $data->wallet->money ?? 0, + ]))->width('600px'); + } + $dropdown->append(admin_trans('player.wallet.artificial_recharge'), 'TransactionOutlined') + ->modal($this->artificialRecharge([ + 'id' => $data->id, + 'money' => $data->wallet->money ?? 0, + ]))->width('600px')->title(Html::create(admin_trans('player.wallet.artificial_recharge'))->content( + ToolTip::create(Icon::create('QuestionCircleOutlined')->style(['marginLeft' => '5px', 'cursor' => 'pointer']))->title(admin_trans('player.wallet.artificial_recharge_tip')) + )); + $dropdown->append(admin_trans('player.wallet.artificial_withdrawal'), 'PayCircleOutlined') + ->modal($this->artificialWithdrawal([ + 'id' => $data->id, + 'money' => $data->wallet->money ?? 0, + ]))->width('600px')->title(Html::create(admin_trans('player.wallet.artificial_withdrawal'))->content( + ToolTip::create(Icon::create('QuestionCircleOutlined')->style(['marginLeft' => '5px', 'cursor' => 'pointer']))->title(admin_trans('player.wallet.artificial_withdrawal_tip')) + )); + }); + $grid->tools([ + ToolTip::create(Icon::create('QuestionCircleOutlined')->style(['margin-left' => '10px', 'margin-top' => '4px', 'line-height' => '28px', 'font-size' => '15px', 'cursor' => 'pointer']))->title(admin_trans('player.set_promoter_tip')) + ]); + $grid->updateing(function ($ids, $data) { + if (isset($ids[0]) && isset($data['player_extend'])) { + if (PlayerExtend::updateOrCreate( + ['player_id' => $ids[0]], + $data['player_extend'] + )) { + return message_success(admin_trans('player.remark_edit_success')); + } + } + }); + }); + } + + /** + * 人工提现 + * @auth true + * @group channel + * @param $data + * @return Form + */ + public function artificialWithdrawal($data): Form + { + return Form::create(new $this->model, function (Form $form) use ($data) { + $form->number('coins', admin_trans('player_withdraw_record.fields.coins')) + ->min(0) + ->max(100000000) + ->precision(2) + ->style(['width' => '100%']) + ->addonBefore(admin_trans('player.wallet.wallet') . ' ' . $data['money'] ?? 0) + ->required(); + $form->number('money', admin_trans('player_withdraw_record.fields.money')) + ->min(0) + ->max(100000000) + ->precision(2) + ->style(['width' => '100%']); + $form->text('currency', admin_trans('player_withdraw_record.fields.currency'))->maxlength(10); + $form->text('bank_name', admin_trans('player_withdraw_record.fields.bank_name'))->maxlength(50); + $form->text('account', admin_trans('player_withdraw_record.fields.account'))->maxlength(50); + $form->text('account_name', admin_trans('player_withdraw_record.fields.account_name'))->maxlength(50); + $form->textarea('remark', admin_trans('player_withdraw_record.fields.remark'))->maxlength(255)->bindAttr('rows', 4); + $form->layout('vertical'); + $form->hidden('id')->value($data['id']); + $form->saving(function (Form $form) { + /** @var Player $player */ + $player = Player::where('id', $form->input('id'))->whereNull('deleted_at')->first(); + if (empty($player)) { + return message_error(admin_trans('player.not_fount')); + } + if ($player->status == 0) { + return message_error(admin_trans('player.disable')); + } + if ($player->wallet->money < $form->input('coins')) { + return message_error(admin_trans('player.insufficient_balance')); + } + DB::beginTransaction(); + try { + // 生成订单 + $playerWithdrawRecord = new PlayerWithdrawRecord(); + $playerWithdrawRecord->player_id = $player->id; + $playerWithdrawRecord->talk_user_id = $player->talk_user_id; + $playerWithdrawRecord->department_id = $player->department_id; + $playerWithdrawRecord->tradeno = createOrderNo(); + $playerWithdrawRecord->player_name = $player->name ?? ''; + $playerWithdrawRecord->player_phone = $player->phone ?? ''; + $playerWithdrawRecord->money = $form->input('money') ?? 0; + $playerWithdrawRecord->coins = $form->input('coins') ?? 0; + $playerWithdrawRecord->fee = 0; + $playerWithdrawRecord->inmoney = bcsub($playerWithdrawRecord->money, $playerWithdrawRecord->fee, 2); // 实际提现金额 + $playerWithdrawRecord->currency = $form->input('currency') ?? 0; + $playerWithdrawRecord->bank_name = $form->input('bank_name') ?? 0; + $playerWithdrawRecord->account = $form->input('account') ?? 0; + $playerWithdrawRecord->account_name = $form->input('account_name') ?? 0; + $playerWithdrawRecord->type = PlayerWithdrawRecord::TYPE_ARTIFICIAL; + $playerWithdrawRecord->status = PlayerWithdrawRecord::STATUS_SUCCESS; + $playerWithdrawRecord->finish_time = date('Y-m-d H:i:s'); + $playerWithdrawRecord->save(); + $beforeGameAmount = $player->wallet->money; + // 玩家钱包扣减 + $player->wallet->money = bcsub($player->wallet->money, $playerWithdrawRecord->coins, 2); + // 更新玩家统计 + $player->player_extend->withdraw_amount = bcadd($player->player_extend->withdraw_amount, $playerWithdrawRecord->coins, 2); + $player->push(); + //寫入金流明細 + $playerDeliveryRecord = new PlayerDeliveryRecord; + $playerDeliveryRecord->player_id = $playerWithdrawRecord->player_id; + $playerDeliveryRecord->department_id = $playerWithdrawRecord->department_id; + $playerDeliveryRecord->target = $playerWithdrawRecord->getTable(); + $playerDeliveryRecord->target_id = $playerWithdrawRecord->id; + $playerDeliveryRecord->type = PlayerDeliveryRecord::TYPE_WITHDRAWAL; + $playerDeliveryRecord->source = 'artificial_withdrawal'; + $playerDeliveryRecord->amount = $playerWithdrawRecord->coins; + $playerDeliveryRecord->amount_before = $beforeGameAmount; + $playerDeliveryRecord->amount_after = $player->wallet->money; + $playerDeliveryRecord->tradeno = $playerWithdrawRecord->tradeno ?? ''; + $playerDeliveryRecord->remark = $playerWithdrawRecord->remark ?? ''; + $playerDeliveryRecord->save(); + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return message_error(admin_trans('player.artificial_withdrawal_error')); + } + return message_success(admin_trans('player.artificial_withdrawal_success')); + }); + }); + } + + /** + * 人工充值 + * @auth true + * @group channel + * @param $data + * @return Form + */ + public function artificialRecharge($data): Form + { + return Form::create(new $this->model, function (Form $form) use ($data) { + $form->number('coins', admin_trans('player_recharge_record.fields.coins')) + ->min(0) + ->max(100000000) + ->precision(2) + ->style(['width' => '100%']) + ->addonBefore(admin_trans('player.wallet.wallet') . ' ' . $data['money'] ?? 0) + ->required(); + $form->number('money', admin_trans('player_recharge_record.fields.money')) + ->min(0) + ->max(100000000) + ->precision(2) + ->style(['width' => '100%']); + $form->text('currency', admin_trans('player_recharge_record.fields.currency'))->maxlength(10); + $form->textarea('remark', admin_trans('player_recharge_record.fields.remark'))->maxlength(255)->bindAttr('rows', 4); + $form->layout('vertical'); + $form->hidden('id')->value($data['id']); + $form->saving(function (Form $form) { + /** @var Player $player */ + $player = Player::where('id', $form->input('id'))->whereNull('deleted_at')->first(); + if (empty($player)) { + return message_error(admin_trans('player.not_fount')); + } + if ($player->status == 0) { + return message_error(admin_trans('player.disable')); + } + DB::beginTransaction(); + try { + $beforeGameAmount = $player->wallet->money; + // 生成订单 + $playerRechargeRecord = new PlayerRechargeRecord(); + $playerRechargeRecord->player_id = $player->id; + $playerRechargeRecord->department_id = $player->department_id; + $playerRechargeRecord->tradeno = createOrderNo(); + $playerRechargeRecord->player_name = $player->name ?? ''; + $playerRechargeRecord->money = $form->input('money') ?? 0; + $playerRechargeRecord->inmoney = $form->input('money') ?? 0; + $playerRechargeRecord->currency = $form->input('currency') ?? ''; + $playerRechargeRecord->type = PlayerRechargeRecord::TYPE_ARTIFICIAL; + $playerRechargeRecord->coins = $form->input('coins'); + $playerRechargeRecord->status = PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS; + $playerRechargeRecord->remark = $form->input('remark'); + $playerRechargeRecord->finish_time = date('Y-m-d H:i:s'); + $playerRechargeRecord->user_id = Admin::id() ?? 0; + $playerRechargeRecord->user_name = !empty(Admin::user()) ? Admin::user()->toArray()['username'] : ''; + $playerRechargeRecord->save(); + $player->wallet->money = bcadd($player->wallet->money, $playerRechargeRecord->coins, 2); + $player->player_extend->recharge_amount = bcadd($player->player_extend->recharge_amount, $playerRechargeRecord->coins, 2); + $player->push(); + + //寫入金流明細 + $playerDeliveryRecord = new PlayerDeliveryRecord; + $playerDeliveryRecord->player_id = $playerRechargeRecord->player_id; + $playerDeliveryRecord->department_id = $playerRechargeRecord->department_id; + $playerDeliveryRecord->target = $playerRechargeRecord->getTable(); + $playerDeliveryRecord->target_id = $playerRechargeRecord->id; + $playerDeliveryRecord->type = PlayerDeliveryRecord::TYPE_RECHARGE; + $playerDeliveryRecord->source = 'artificial_recharge'; + $playerDeliveryRecord->amount = $playerRechargeRecord->coins; + $playerDeliveryRecord->amount_before = $beforeGameAmount; + $playerDeliveryRecord->amount_after = $player->wallet->money; + $playerDeliveryRecord->tradeno = $playerRechargeRecord->tradeno ?? ''; + $playerDeliveryRecord->remark = $playerRechargeRecord->remark ?? ''; + $playerDeliveryRecord->save(); + + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return message_error(admin_trans('player.artificial_recharge_error')); + } + return message_success(admin_trans('player.artificial_recharge_success')); + }); + }); + } + + /** + * 玩家钱包 + * @auth true + * @group channel + * @param $data + * @return Form + */ + public function playerWallet($data): Form + { + return Form::create(new $this->model, function (Form $form) use ($data) { + $form->hidden('id')->default($data['id']); + $form->row(function (Form $form) { + $type = $form->getBindField('type'); + $form->radio('type', admin_trans('player.wallet.type')) + ->button() + ->disabled($form->isEdit()) + ->default(PlayerMoneyEditLog::TYPE_INCREASE) + ->options([ + admin_trans('player.wallet.deduct'), + admin_trans('player.wallet.increase'), + ])->required()->span(7); + $form->hidden('type')->bindAttr('value', $type) + ->when(PlayerMoneyEditLog::TYPE_DEDUCT, function (Form $form) { + $form->select('deduct_action', admin_trans('player.wallet.action')) + ->remoteOptions(admin_url([$this, 'getTranOptions'], ['type' => PlayerMoneyEditLog::TYPE_DEDUCT])) + ->required()->span(16)->style(['margin-left' => '22px']); + })->when(PlayerMoneyEditLog::TYPE_INCREASE, function (Form $form) { + $form->select('increase_action', admin_trans('player.wallet.action')) + ->remoteOptions(admin_url([$this, 'getTranOptions'], ['type' => PlayerMoneyEditLog::TYPE_INCREASE])) + ->required()->span(16)->style(['margin-left' => '22px']); + }); + }); + $form->number('money', admin_trans('player.wallet.money'))->min(0)->max(100000000)->precision(2)->style(['width' => '100%'])->addonBefore(admin_trans('player.wallet.wallet') . ' ' . $data['money'] ?? 0)->required(); + $form->textarea('remark', admin_trans('player.wallet.textarea'))->maxlength(255)->bindAttr('rows', 4)->required(); + $form->actions()->hideResetButton(); + $form->saving(function (Form $form) use ($data) { + /** @var Channel $channel */ + $channel = Channel::where('department_id', Admin::user()->department_id)->first(); + if ($channel->wallet_action_status == 0) { + return message_error(admin_trans('player.wallet_action_status_has_closed')); + } + return $this->store([ + 'id' => $form->input('id'), + 'type' => $form->input('type'), + 'deduct_action' => $form->input('deduct_action'), + 'increase_action' => $form->input('increase_action'), + 'money' => $form->input('money'), + 'remark' => $form->input('remark'), + ]); + }); + $form->layout('vertical'); + }); + } + + /** + * 钱包操作 + * @param $data + * @return Msg + */ + public function store($data): Msg + { + try { + DB::beginTransaction(); + playerManualSystem($data); + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return message_error(admin_trans('player.wallet.wallet_operation_failed')); + } + return message_success(admin_trans('player.wallet.wallet_operation_success')); + } + + /** + * 钱包操作类型 + * @param $type + * @return mixed + */ + public function getTranOptions($type) + { + $options = []; + if ($type == PlayerMoneyEditLog::TYPE_INCREASE) { + $transactionType = [ + PlayerMoneyEditLog::ACTIVITY_GIVE, + PlayerMoneyEditLog::ADMIN_INCREASE, + PlayerMoneyEditLog::OTHER + ]; + } else { + $transactionType = [ + PlayerMoneyEditLog::ADMIN_DEDUCT, + PlayerMoneyEditLog::OTHER + ]; + } + + foreach ($transactionType as $item) { + $options[] = [ + 'value' => $item, + 'label' => admin_trans('player.wallet.wallet_type.' . $item), + ]; + } + + return Response::success($options); + } + + /** + * 处理标签 + * @param array $value + * @return Html + */ + public function handleTagIds(array $value): Html + { + $options = $this->getPlayerTagOptions($value); + $html = Html::create(); + foreach ($options as $option) { + $html->content( + Tag::create($option) + ->color('success') + ); + } + return $html; + } + + /** + * 获取玩家标签选项(筛选id) + * @param array $ids + * @return array + */ + public function getPlayerTagOptions(array $ids = []): array + { + $idsStr = json_encode($ids); + $cacheKey = md5("player_tag_options_ids_$idsStr"); + if (Cache::has($cacheKey)) { + return Cache::get($cacheKey); + } else { + if (!empty($ids)) { + $data = (new PlayerTag())->whereIn('id', $ids)->select(['name', 'id'])->get()->toArray(); + $data = $data ? array_column($data, 'name', 'id') : []; + Cache::set($cacheKey, $data, 24 * 60 * 60); + + return $data; + } + return []; + } + } + + /** + * 获取玩家标签(筛选id) + * @return array + */ + public function getPlayerTagOptionsFilter(): array + { + $cacheKey = "doc_player_tag_options_filter"; + if (Cache::has($cacheKey)) { + return Cache::get($cacheKey); + } else { + $data = (new PlayerTag())->select(['name', 'id'])->get()->toArray(); + $data = $data ? array_column($data, 'name', 'id') : []; + Cache::set($cacheKey, $data, 24 * 60 * 60); + + return $data; + } + } + + /** + * 渠道玩家 + * @auth true + * @group channel + * @return Form + */ + public function form(): Form + { + $options = []; + foreach (config('def_avatar') as $key => $item) { + $options[$key] = Avatar::create()->style(['padding' => '1px'])->src($item)->shape('square'); + } + return Form::create(new $this->model(), function (Form $form) use ($options) { + if ($form->isEdit()) { + $form->title(admin_trans('player.details')); + $form->row(function (Form $form) use ($options) { + $form->column(function (Form $form) use ($options) { + $form->text('phone', admin_trans('player.fields.phone'))->maxlength(50)->ruleNumber() + ->rule([ + (string)Rule::unique(plugin()->webman->config('database.player_model'))->ignore($form->input('id')) => admin_trans('player.phone_exist'), + ]) + ->disabled(true); + $form->text('name', admin_trans('player.fields.name'))->maxlength(50); + $form->radio('avatar_type', admin_trans('player.avatar_type')) + ->button() + ->default(is_numeric($form->driver()->get('avatar')) ? 2 : 1) + ->options([ + 1 => admin_trans('player.upload_avatar'), + 2 => admin_trans('player.def_avatar') + ]) + ->when(1, function (Form $form) { + $form->file('avatar', admin_trans('player.fields.avatar')) + ->value(is_numeric($form->driver()->get('avatar')) ? '' : $form->driver()->get('avatar')) + ->ext('jpg,png,jpeg') + ->type('image') + ->fileSize('1m') + ->hideFinder() + ->paste(); + })->when(2, function (Form $form) use ($options) { + $form->radio('def_avatar', admin_trans('player.def_avatar')) + ->default(1) + ->options($options); + }); + $form->text('player_extend.id_number', admin_trans('player_extend.fields.id_number'))->ruleAlphaNum()->maxlength(20); + $form->desc('the_last_player_login_record.created_at', admin_trans('player.fields.login_at'))->value($form->input('the_last_player_login_record.created_at') ? date('Y-m-d H:i:s', strtotime($form->input('the_last_player_login_record.created_at'))) : ''); + $form->desc('created_at', admin_trans('player.fields.created_at'))->value($form->input('created_at') ? date('Y-m-d H:i:s', strtotime($form->input('created_at'))) : ''); + $form->desc('player_register_record.ip', admin_trans('player.fields.register_ip')); + $form->desc('player_register_record.register_domain', admin_trans('player.fields.register_domain')); + })->span(12); + + $form->column(function (Form $form) { + $form->text('player_extend.address', admin_trans('player_extend.fields.address'))->maxlength(255); + $form->date('player_extend.birthday', admin_trans('player_extend.fields.birthday')); + $form->text('player_extend.email', admin_trans('player_extend.fields.email'))->ruleEmail()->maxlength(20); + $form->text('player_extend.line', admin_trans('player_extend.fields.line'))->ruleAlphaNum()->maxlength(20); + $form->textarea('player_extend.remark', admin_trans('player_extend.fields.remark')) + ->showCount() + ->rule(['max:255' => admin_trans('player_extend.fields.remark')]); + $playerBank = PlayerBank::query()->where('player_id', $form->driver()->get('id'))->get()->toArray(); + foreach ($playerBank as $key => $item) { + $form->row(function (Form $form) use ($item, $key) { + $form->text('bank_name'.$key, admin_trans('player.bank_name')) + ->value($item['bank_name'] ?? 0) + ->disabled(true); + $form->text('account_name'.$key, admin_trans('player.account_name')) + ->value($item['account_name'] ?? 0) + ->disabled(true); + $form->text('account'.$key, admin_trans('player.account')) + ->value($item['account'] ?? 0) + ->disabled(true); + }); + } + })->span(12); + }); + } else { + $form->title(admin_trans('player.add_player')); + $form->text('phone', admin_trans('player.fields.phone'))->maxlength(50)->ruleAlphaNum()->required(); + $form->radio('avatar_type', admin_trans('player.avatar_type')) + ->button() + ->default(2) + ->options([ + 1 => admin_trans('player.upload_avatar'), + 2 => admin_trans('player.def_avatar') + ]) + ->when(1, function (Form $form) { + $form->image('avatar', admin_trans('player.fields.avatar'))->ext('jpg,png,jpeg')->fileSize('1m'); + })->when(2, function (Form $form) use ($options) { + $form->radio('def_avatar', admin_trans('player.def_avatar')) + ->default(1) + ->options($options); + }); + $form->select('country_code', admin_trans('player.fields.country_code'))->options([ + PhoneSmsLog::COUNTRY_CODE_MY => PhoneSmsLog::COUNTRY_CODE_MY, + ])->required(); + $form->text('name', admin_trans('player.fields.name'))->maxlength(50)->required(); + $form->password('password', admin_trans('player.new_password')) + ->rule([ + 'confirmed' => admin_trans('player.password_confim_validate'), + 'min:6' => admin_trans('player.password_min_number') + ]) + ->value('') + ->required(); + $form->password('password_confirmation', admin_trans('player.confim_password')) + ->required(); + } + $form->saved(function () { + return message_success(admin_trans('player.save_player_info_success')); + }); + $form->saving(function (Form $form) { + if ($form->isEdit()) { + $orgData = $form->driver()->get(); + /** @var Player $player */ + $player = Player::find($orgData['id']); + if (empty($player)) { + return message_error(admin_trans('player.not_fount')); + } + DB::beginTransaction(); + try { + $player->name = $form->input('name'); + $player->avatar = $form->input('avatar_type') == 1 ? $form->input('avatar') : $form->input('def_avatar'); + $player->save(); + PlayerExtend::query()->updateOrCreate(['player_id' => $orgData['id']], [ + 'address' => $form->input('player_extend.address'), + 'birthday' => $form->input('player_extend.birthday'), + 'id_number' => $form->input('player_extend.id_number'), + 'email' => $form->input('player_extend.email'), + 'line' => $form->input('player_extend.line'), + 'remark' => $form->input('player_extend.remark'), + 'player_id' => $orgData['id']]); + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return message_error($e->getMessage()); + } + return message_success(admin_trans('player.save_player_info_success')); + } else { + $phone = $form->input('phone'); + $password = $form->input('password'); + $country_code = $form->input('country_code'); + /** @var $player Player */ + $player = Player::query()->where('phone', $country_code.$phone)->first(); + if (!empty($player)) { + return message_error(admin_trans('player.phone_has_register')); + } + /** @var Channel $channel */ + $channel = Channel::where('department_id', Admin::user()->department_id)->first(); + if (empty($channel)) { + return message_error(admin_trans('channel.not_fount')); + } + DB::beginTransaction(); + try { + $player = new Player(); + $player->phone = $country_code.$phone; + $player->name = $form->input('name'); + if ($form->input('avatar_type') == 1) { + $player->avatar = $form->input('avatar') ?? config('def_avatar.1'); + } + if ($form->input('avatar_type') == 2) { + $player->avatar = $form->input('def_avatar') ?? config('def_avatar.1'); + } + $player->country_code = $country_code; + $player->type = Player::TYPE_PLAYER; + $player->currency = $channel->currency; + $player->password = $password; + $player->uuid = gen_uuid(); + $player->department_id = Admin::user()->department_id; + $player->recommend_code = createCode(); + $player->save(); + + addPlayerExtend($player, [ + 'email' => $data['email'] ?? '' + ]); + addRegisterRecord($player->id, PlayerRegisterRecord::TYPE_ADMIN, $player->department_id); + + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return message_error($e->getMessage()); + } + return message_success(admin_trans('player.save_player_info_success')); + } + }); + }); + } + + /** + * 玩家记录 + * @param $id + * @auth true + * @group channel + * @return Card + */ + public function playerRecord($id): Card + { + $tabs = Tabs::create() + ->pane(admin_trans('player.player_recharge_record'), $this->rechargeRecord($id)) + ->pane(admin_trans('player.player_withdraw_record'), $this->withdrawalRecords($id)) + ->pane(admin_trans('player.player_delivery_record'), $this->playerDeliveryRecord($id)) + ->type('card'); + return Card::create($tabs); + } + + /** + * 钱包操作 + * @param $id + * @return Grid + */ + public function playerDeliveryRecord($id): Grid + { + return Grid::create(new $this->playerDeliveryRecord, function (Grid $grid) use ($id) { + $lang = Container::getInstance()->translator->getLocale(); + $grid->title(admin_trans('promoter_profit_record.player_activity_phase_record_title')); + $grid->model() + ->where('player_id', $id) + ->whereIn('type', [ + PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD, + PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT, + ]) + ->orderBy('id', 'desc'); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (!empty($exAdminFilter)) { + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->where('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->where('created_at', '<=', $exAdminFilter['created_at_end']); + } + } + $grid->autoHeight(); + $grid->bordered(true); + $grid->column('id', admin_trans('player_delivery_record.fields.id'))->align('center'); + $grid->column('source', admin_trans('player_delivery_record.fields.source'))->display(function ($val, PlayerDeliveryRecord $data) use ($lang) { + switch ($data->type) { + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD: + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT: + return Tag::create(trans($val, [], 'message', $lang))->color('red'); + default: + return ''; + } + })->align('center'); + $grid->column('type', admin_trans('player_delivery_record.fields.type')) + ->display(function ($value) { + switch ($value) { + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD))->color('#2db7f5'); + break; + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT))->color('#108ee9'); + break; + default: + $tag = ''; + } + return Html::create()->content([ + $tag + ]); + })->align('center')->sortable(); + $grid->column('amount', admin_trans('player_delivery_record.fields.amount'))->display(function ($val, PlayerDeliveryRecord $data) { + if ($data->amount == 0) { + return Html::create()->content([$val])->style(['color' => 'green']); + } + switch ($data->type) { + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT: + return Html::create()->content(['-' . $val])->style(['color' => '#cd201f']); + default: + return Html::create()->content(['+' . $val])->style(['color' => 'green']); + } + })->align('center'); + $grid->column('user_name', admin_trans('player_delivery_record.fields.user_name'))->display(function ($val, PlayerDeliveryRecord $data) { + $name = '--'; + if (in_array($data->type, [PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD, PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT])) { + $name = $data->user_name ?? '管理员'; + } + return Html::create()->content([ + Html::div()->content($name), + ]); + }); + $grid->column('created_at', admin_trans('player_delivery_record.fields.created_at'))->align('center')->ellipsis(true); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->hideTrashed(); + $grid->actions(function (Actions $actions) { + $actions->hideDel(); + }); + $grid->filter(function (Filter $filter) { + $filter->eq()->select('type') + ->placeholder(admin_trans('player_delivery_record.fields.type')) + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->options([ + PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD), + PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT), + ]); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateTimeRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]); + }); + }); + } + + /** + * 提现记录 + * @param $id + * @return Grid + */ + public function withdrawalRecords($id): Grid + { + return Grid::create(new $this->withdraw(), function (Grid $grid) use ($id) { + $grid->title(admin_trans('player_withdraw_record.title')); + $grid->model()->with(['player'])->where('player_id', $id)->where('status', PlayerWithdrawRecord::STATUS_SUCCESS)->orderBy('created_at', 'desc'); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (!empty($exAdminFilter)) { + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->where('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->where('created_at', '<=', $exAdminFilter['created_at_end']); + } + if (isset($exAdminFilter['finish_time_start']) && !empty($exAdminFilter['finish_time_start'])) { + $grid->model()->where('finish_time', '>=', $exAdminFilter['finish_time_start']); + } + if (isset($exAdminFilter['finish_time_end']) && !empty($exAdminFilter['finish_time_end'])) { + $grid->model()->where('finish_time', '<=', $exAdminFilter['finish_time_end']); + } + } + $grid->bordered(); + $grid->autoHeight(); + $grid->column('id', admin_trans('player_withdraw_record.fields.id'))->ellipsis(true)->align('center')->fixed(true); + $grid->column('player_phone', admin_trans('player_withdraw_record.fields.player_phone'))->display(function ($val, PlayerWithdrawRecord $data) { + $image = (isset($data->player->avatar) && !empty($data->player->avatar)) ? Avatar::create()->src($data->player->avatar) : Avatar::create()->icon(Icon::create('UserOutlined')); + return Html::create()->content([ + $image, + Html::div()->content($val) + ]); + })->align('center')->ellipsis(true)->fixed(true); + $grid->column('tradeno', admin_trans('player_withdraw_record.fields.tradeno'))->ellipsis(true)->copy()->align('center'); + $grid->column('money', admin_trans('player_withdraw_record.fields.money'))->display(function ($val, PlayerWithdrawRecord $data) { + return $val . ' ' . ($data->currency == 'TALK' ? 'Q币' : $data->currency); + })->ellipsis(true)->align('center'); + $grid->column('coins', admin_trans('player_withdraw_record.fields.coins'))->align('center'); + $grid->column(function (Grid $grid) { + $grid->column('bank_name', admin_trans('player_withdraw_record.fields.bank_name'))->copy()->align('center'); + $grid->column('account_name', admin_trans('player_withdraw_record.fields.account_name'))->copy()->align('center'); + $grid->column('account', admin_trans('player_withdraw_record.fields.account'))->copy()->align('center'); + }, admin_trans('player_withdraw_record.player_bank'))->ellipsis(true); + $grid->column('type', admin_trans('player_withdraw_record.fields.type'))->display(function ($val) { + switch ($val) { + case PlayerRechargeRecord::TYPE_ACTIVITY: + return Tag::create(admin_trans('player_recharge_record.type.' . $val)) + ->color('#55acee'); + case PlayerRechargeRecord::TYPE_REGULAR: + return Tag::create(admin_trans('player_recharge_record.type.' . $val)) + ->color('#3b5999'); + case PlayerRechargeRecord::TYPE_ARTIFICIAL: + return Tag::create(admin_trans('player_recharge_record.type.' . $val)) + ->color('#cd201f'); + default: + return ''; + } + })->ellipsis(true)->align('center'); + $grid->column('status', admin_trans('player_withdraw_record.fields.status')) + ->display(function () { + return Tag::create(admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_SUCCESS))->color('#87d068'); + })->align('center')->ellipsis(true)->sortable(); + $grid->column('created_at', admin_trans('player_withdraw_record.fields.created_at'))->ellipsis(true)->sortable()->align('center'); + $grid->column('finish_time', admin_trans('player_withdraw_record.fields.finish_time'))->ellipsis(true)->fixed('right')->sortable()->align('center'); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->actions(function (Actions $actions) { + $actions->hideDel(); + $actions->hideEdit(); + }); + $grid->filter(function (Filter $filter) { + $filter->like()->text('tradeno')->placeholder(admin_trans('player_withdraw_record.fields.tradeno')); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateTimeRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]); + $filter->form()->hidden('finish_time_start'); + $filter->form()->hidden('finish_time_end'); + $filter->form()->dateTimeRange('finish_time_start', 'finish_time_end', '')->placeholder([admin_trans('player_withdraw_record.fields.finish_time'), admin_trans('player_withdraw_record.fields.finish_time')]); + }); + }); + } + + /** + * 充值记录 + * @param $id + * @return Grid + */ + public function rechargeRecord($id): Grid + { + return Grid::create(new $this->recharge(), function (Grid $grid) use ($id) { + $grid->title(admin_trans('player_recharge_record.title')); + $grid->bordered(); + $grid->autoHeight(); + $grid->model()->with(['player'])->where('player_id', $id)->where('status', PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS)->orderBy('created_at', 'desc'); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (!empty($exAdminFilter)) { + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->where('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->where('created_at', '<=', $exAdminFilter['created_at_end']); + } + if (isset($exAdminFilter['finish_time_start']) && !empty($exAdminFilter['finish_time_start'])) { + $grid->model()->where('finish_time', '>=', $exAdminFilter['finish_time_start']); + } + if (isset($exAdminFilter['finish_time_end']) && !empty($exAdminFilter['finish_time_end'])) { + $grid->model()->where('finish_time', '<=', $exAdminFilter['finish_time_end']); + } + } + $grid->column('id', admin_trans('player_recharge_record.fields.id'))->ellipsis(true)->fixed(true)->align('center'); + $grid->column('player.name', admin_trans('player_recharge_record.fields.player_name'))->display(function ($val, PlayerRechargeRecord $data) { + $image = (isset($data->player->avatar) && !empty($data->player->avatar)) ? Avatar::create()->src($data->player->avatar) : Avatar::create()->icon(Icon::create('UserOutlined')); + return Html::create()->content([ + $image, + Html::div()->content($val) + ]); + })->ellipsis(true)->fixed(true)->align('center'); + $grid->column('tradeno', admin_trans('player_recharge_record.fields.tradeno'))->ellipsis(true)->copy(); + $grid->column('channel.name', admin_trans('player_recharge_record.fields.department_id'))->ellipsis(true)->align('center'); + $grid->column('type', admin_trans('player_recharge_record.fields.type'))->display(function ($val) { + switch ($val) { + case PlayerRechargeRecord::TYPE_REGULAR: + return Tag::create(admin_trans('player_recharge_record.type.' . $val)) + ->color('#55acee'); + case PlayerRechargeRecord::TYPE_ACTIVITY: + return Tag::create(admin_trans('player_recharge_record.type.' . $val)) + ->color('#3b5999'); + case PlayerRechargeRecord::TYPE_ARTIFICIAL: + return Tag::create(admin_trans('player_recharge_record.type.' . $val)) + ->color('#cd201f'); + default: + return ''; + } + })->ellipsis(true)->align('center'); + $grid->column('money', admin_trans('player_recharge_record.fields.money'))->display(function ($val, PlayerRechargeRecord $data) { + return $val . ' ' . ($data->currency == 'TALK' ? 'Q币' : $data->currency); + })->ellipsis(true)->align('center'); + $grid->column('coins', admin_trans('player_recharge_record.fields.coins'))->ellipsis(true)->align('center'); + $grid->column(function (Grid $grid) { + $grid->column('bank_name', admin_trans('channel_recharge_method.fields.bank_name'))->copy()->align('center'); + $grid->column('sub_bank', admin_trans('channel_recharge_method.fields.sub_bank'))->copy()->align('center'); + $grid->column('owner', admin_trans('channel_recharge_method.fields.owner'))->copy()->align('center'); + $grid->column('account', admin_trans('channel_recharge_method.fields.account'))->copy()->align('center'); + }, admin_trans('channel_recharge_setting.recharge_setting_info'))->ellipsis(true); + $grid->column('status', admin_trans('player_recharge_record.fields.status'))->display(function () { + return Tag::create(admin_trans('player_recharge_record.status_success'))->color('#87d068'); + })->ellipsis(true)->align('center'); + $grid->column('created_at', admin_trans('player_recharge_record.fields.created_at'))->ellipsis(true)->sortable()->align('center'); + $grid->column('finish_time', admin_trans('player_recharge_record.fields.finish_time'))->ellipsis(true)->fixed('right')->sortable()->align('center'); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->actions(function (Actions $actions) { + $actions->hideDel(); + $actions->hideEdit(); + }); + $grid->filter(function (Filter $filter) { + $filter->eq()->select('type') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('player_recharge_record.fields.type')) + ->options([ + PlayerRechargeRecord::TYPE_REGULAR => admin_trans('player_recharge_record.type.' . PlayerRechargeRecord::TYPE_REGULAR), + PlayerRechargeRecord::TYPE_ACTIVITY => admin_trans('player_recharge_record.type.' . PlayerRechargeRecord::TYPE_ACTIVITY), + PlayerRechargeRecord::TYPE_ARTIFICIAL => admin_trans('player_recharge_record.type.' . PlayerRechargeRecord::TYPE_ARTIFICIAL), + ]); + $filter->like()->text('tradeno')->placeholder(admin_trans('player_recharge_record.fields.tradeno')); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateTimeRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]); + $filter->form()->hidden('finish_time_start'); + $filter->form()->hidden('finish_time_end'); + $filter->form()->dateTimeRange('finish_time_start', 'finish_time_end', '')->placeholder([admin_trans('player_recharge_record.fields.finish_time'), admin_trans('player_recharge_record.fields.finish_time')]); + + }); + }); + } + + /** + * 打码量记录 + * @param $id + * @return Grid + */ + public function playerChipRecord($id): Grid + { + return Grid::create(new $this->playerChipRecord(), function (Grid $grid) use ($id) { + $grid->title(admin_trans('player_chip_record.title')); + $grid->bordered(); + $grid->autoHeight(); + $grid->model()->with(['channel', 'player']) + ->where('player_id', $id) + ->orderBy('created_at', 'desc'); + $exAdminFilter = Request::input('ex_admin_filter', []); + $query = clone $grid->model(); + $totalData = $query->where(function ($query) use($exAdminFilter) { + if(!empty($exAdminFilter['created_at'])) { + $query->whereBetween('created_at', $exAdminFilter['created_at']); + } + })->sum('chip_amount'); + $layout = Layout::create(); + $layout->row(function (Row $row) use ($totalData) { + $row->gutter([10, 0]); + $row->column( + Card::create([ + Row::create()->column(Statistic::create()->value($totalData) + ->prefix(admin_trans('player_chip_record.fields.chip_amount')) + ->valueStyle([ + 'font-size' => '14px', + 'font-weight' => '500', + 'text-align' => 'center' + ])), + ])->bodyStyle([ + 'display' => 'flex', + 'align-items' => 'center', + 'height' => '30px', + 'padding' => '0px' + ])->hoverable()->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px']) + , 4); + })->style(['background' => '#fff']); + $grid->tools([ + $layout + ]); + $grid->column('id', admin_trans('player_chip_record.fields.id'))->align('center'); + $grid->column('channel.name', admin_trans('channel.fields.name'))->align('center'); + $grid->column('chip_amount', admin_trans('player_chip_record.fields.chip_amount'))->display(function ($val, PlayerChipRecord $data) { + if ($val == 0) { + return Html::create()->content(['+' . $val])->style(['color' => 'green']); + } + switch ($data->type) { + case PlayerChipRecord::TYPE_DEC: + return Html::create()->content(['-' . $val])->style(['color' => '#cd201f']); + default: + return Html::create()->content(['+' . $val])->style(['color' => 'green']); + } + })->align('center'); + $grid->column('must_chip_amount', admin_trans('player_chip_record.fields.must_chip_amount'))->display(function ($val, PlayerChipRecord $data) { + if ($val == 0) { + return Html::create()->content(['+' . $val])->style(['color' => 'green']); + } + switch ($data->type) { + case PlayerChipRecord::TYPE_DEC: + return Html::create()->content(['-' . $val])->style(['color' => '#cd201f']); + default: + return Html::create()->content(['+' . $val])->style(['color' => 'green']); + } + })->align('center'); + $grid->column('record_type', admin_trans('player_chip_record.fields.record_type'))->display(function ($val) { + switch ($val) { + case PlayerChipRecord::RECORD_TYPE_SIGN: + case PlayerChipRecord::RECORD_TYPE_RECHARGE: + case PlayerChipRecord::RECORD_TYPE_FIRST_RECHARGE_REWARD: + $tag = Tag::create(admin_trans('player_chip_record.record_type.' . $val)) + ->color('#55acee'); + break; + case PlayerChipRecord::RECORD_TYPE_ACTIVITY: + case PlayerChipRecord::RECORD_TYPE_GAME: + case PlayerChipRecord::RECORD_TYPE_BET_REBATE: + $tag = Tag::create(admin_trans('player_chip_record.record_type.' . $val)) + ->color('#3b5999'); + break; + case PlayerChipRecord::RECORD_TYPE_COMMISSION: + case PlayerChipRecord::RECORD_TYPE_BANKRUPTCY: + $tag = Tag::create(admin_trans('player_chip_record.record_type.' . $val)) + ->color('#cd201f'); + break; + default: + return ''; + } + return Html::create()->content([ + $tag, + ]); + })->align('center'); + $grid->column('amount', admin_trans('player_chip_record.fields.amount'))->align('center'); + $grid->column('created_at', admin_trans('player_chip_record.fields.created_at'))->sortable()->align('center'); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->actions(function (Actions $actions) { + $actions->hideDel(); + $actions->hideEdit(); + }); + $grid->filter(function (Filter $filter) { + $filter->eq()->select('record_type') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('player_chip_record.fields.record_type')) + ->options([ + PlayerChipRecord::RECORD_TYPE_SIGN => admin_trans('player_chip_record.record_type.' . PlayerChipRecord::RECORD_TYPE_SIGN), + PlayerChipRecord::RECORD_TYPE_RECHARGE => admin_trans('player_chip_record.record_type.' . PlayerChipRecord::RECORD_TYPE_RECHARGE), + PlayerChipRecord::RECORD_TYPE_ACTIVITY => admin_trans('player_chip_record.record_type.' . PlayerChipRecord::RECORD_TYPE_ACTIVITY), + PlayerChipRecord::RECORD_TYPE_GAME => admin_trans('player_chip_record.record_type.' . PlayerChipRecord::RECORD_TYPE_GAME), + PlayerChipRecord::RECORD_TYPE_COMMISSION => admin_trans('player_chip_record.record_type.' . PlayerChipRecord::RECORD_TYPE_COMMISSION), + PlayerChipRecord::RECORD_TYPE_BANKRUPTCY => admin_trans('player_chip_record.record_type.' . PlayerChipRecord::RECORD_TYPE_BANKRUPTCY), + PlayerChipRecord::RECORD_TYPE_BET_REBATE => admin_trans('player_chip_record.record_type.' . PlayerChipRecord::RECORD_TYPE_BET_REBATE), + PlayerChipRecord::RECORD_TYPE_FIRST_RECHARGE_REWARD => admin_trans('player_chip_record.record_type.' . PlayerChipRecord::RECORD_TYPE_FIRST_RECHARGE_REWARD), + ]); + $filter->between()->dateTimeRange('created_at')->placeholder([admin_trans('player_chip_record.fields.created_at'), admin_trans('player_chip_record.fields.created_at')]); + + }); + $grid->quickSearch(); + }); + } + + + + /** + * 设置推广员 + * @auth true + * @group channel + * @param $id + * @return Form + */ + public function setPromoter($id): Form + { + /** @var PlayerPromoter $promoter */ + $promoter = PlayerPromoter::with(['parent_promoter'])->where('player_id', $id)->first(); + return Form::create($promoter ?? new $this->promoter(), function (Form $form) use ($id) { + $form->push(Html::markdown('>' . admin_trans('player_promoter.submit_confirm') . '')); + /** @var PlayerPromoter $model */ + $model = $form->driver()->model(); + $maxRatio = $model->parent_promoter->ratio ?? 100; + $form->text('name') + ->value($model->name ?? '') + ->maxlength(30) + ->required()->addonBefore(admin_trans('player_promoter.fields.name')); + $form->text('ratio') + ->value($model->ratio ?? '') + ->rulePattern('^[0-9]+(.[0-9]{1,2})?$', admin_trans('validator.twoDecimal')) + ->rule([ + 'max:' . $maxRatio => admin_trans('validator.max', null, ['{max}' => $maxRatio]), + 'min:0' => admin_trans('validator.min', null, ['{min}' => 0]), + 'regex:/^[0-9]+(.[0-9]{1,2})?$/' => admin_trans('validator.twoDecimal'), + ]) + ->required() + ->addonAfter('%') + ->help(!empty($model->parent_promoter->ratio) ? admin_trans('player_promoter.ratio_help_parent', null, ['{max_ratio}' => $maxRatio]) : admin_trans('player_promoter.ratio_help_platform', null, ['{max_ratio}' => $maxRatio])) + ->placeholder(admin_trans('player_promoter.ratio_placeholder', null, ['{max_ratio}' => $maxRatio])) + ->addonBefore(admin_trans('player_promoter.fields.ratio')); + $form->saving(function (Form $form) use ($id) { + return $this->savePromoter($id, $form->input('ratio'), $form->input('name')); + }); + }); + } + + /** + * 保存推广员信息 + * @param $id + * @param $ratio + * @param string $name + * @return Msg + */ + public function savePromoter($id, $ratio, string $name = ''): Msg + { + DB::beginTransaction(); + try { + /** @var Player $player */ + $player = Player::with(['player_promoter'])->find($id); + if (empty($player)) { + throw new Exception(admin_trans('player.not_fount')); + } + if (empty($player->player_promoter) && !empty($player->recommend_id)) { + throw new Exception(admin_trans('player.player_must_not_attributed')); + } + $promoter = $player->player_promoter ?? new PlayerPromoter(); + $promoter->ratio = $ratio; + $promoter->player_id = $id; + $promoter->recommend_id = $parentPromoter->player_id ?? 0; + $promoter->department_id = $player->department_id; + $promoter->name = $name; + $promoter->path = $player->id; + $promoter->save(); + // 更新玩家信息 + $player->is_promoter = 1; + $player->recommend_code = createCode(); + $player->save(); + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return message_error($e->getMessage()); + } + + return message_success(admin_trans('form.save_success')); + } + + /** + * 绑定推广员 + * @auth true + * @group channel + * @param $id + * @return Form|Msg + */ + public function bindPromoter($id) + { + /** @var Player $player */ + $player = Player::query()->find($id); + if (empty($player)) { + return message_error(admin_trans('player.player_not_found')); + } + if (!empty($player->recommended_code)) { + return message_error(admin_trans('player.player_has_bind')); + } + if ($player->is_promoter > 0) { + return message_error(admin_trans('player.has_been_promoter')); + } + /** @var Channel $channel */ + $channel = Channel::query()->where('department_id', $player->department_id)->first(); + if (empty($channel)) { + return message_error(admin_trans('player.channel_not_found')); + } + if ($channel->promotion_status != 1) { + return message_error(admin_trans('player.channel_close_promoter')); + } + return Form::create($player, function (Form $form) use ($player) { + $form->push(Html::markdown('>' . admin_trans('player.bind_promoter_confirm') . '')); + $options = PlayerPromoter::query() + ->where('department_id', $player->department_id) + ->where('status', 1) + ->pluck('name', 'player_id')->toArray(); + $form->select('recommend_id') + ->style(['width' => '200px']) + ->options($options); + $form->saving(function (Form $form) use ($player) { + /** @var PlayerPromoter $recommendPlayer */ + $recommendPlayer = PlayerPromoter::query() + ->where('player_id', $form->input('recommend_id')) + ->where('department_id', $player->department_id)->first(); + if (empty($recommendPlayer)) { + return message_error(admin_trans('player.promoter_not_found')); + } + if ($recommendPlayer->player->status == 0) { + return message_error(admin_trans('player.promoter_has_disable')); + } + $player->recommend_id = $recommendPlayer->player->id; + $player->recommended_code = $recommendPlayer->player->recommend_code; + $player->save(); + $recommendPlayer->increment('player_num'); + return message_success(admin_trans('player.action_success')); + }); + }); + } + + +} diff --git a/addons/webman/controller/ChannelPlayerDeliveryRecordController.php b/addons/webman/controller/ChannelPlayerDeliveryRecordController.php new file mode 100644 index 0000000..e5f7248 --- /dev/null +++ b/addons/webman/controller/ChannelPlayerDeliveryRecordController.php @@ -0,0 +1,206 @@ +model = plugin()->webman->config('database.player_delivery_record_model'); + } + + /** + * 玩家账变 + * @group channel + * @auth true + */ + public function index(): Grid + { + $lang = Container::getInstance()->translator->getLocale(); + return Grid::create(new $this->model(), function (Grid $grid) use ($lang) { + $grid->title(admin_trans('player_delivery_record.title')); + $grid->model()->with(['player'])->orderBy('created_at', 'desc'); + $grid->autoHeight(); + $grid->bordered(true); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->where('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->where('created_at', '<=', $exAdminFilter['created_at_end']); + } + if (isset($exAdminFilter['search_source']) && !empty($exAdminFilter['search_source'])) { + $searchSource = $exAdminFilter['search_source']; + $grid->model()->where(function ($query) use ($searchSource) { + $query->where(function ($query) use ($searchSource) { + $query->where([ + ['source', 'like', '%' . $searchSource . '%', 'and'], + ]); + }); + }); + } + $grid->column('id', admin_trans('player_delivery_record.fields.id'))->align('center'); + $grid->column('player.uuid', admin_trans('player.fields.uuid'))->align('center'); + $grid->column('player.name', admin_trans('player.fields.name'))->display(function ($val, PlayerDeliveryRecord $data) { + $image = $data->player->avatar ? Avatar::create()->src(is_numeric($data->player->avatar) ? config('def_avatar.' . $data->player->avatar) : $data->player->avatar) : Avatar::create()->icon(Icon::create('UserOutlined')); + return Html::create()->content([ + $image, + Html::div()->content($data->player->name), + ]); + })->align('center')->filter( + FilterColumn::like()->text('player.phone') + ); + $grid->column('source', admin_trans('player_delivery_record.fields.source'))->display(function ($val, PlayerDeliveryRecord $data) use ($lang) { + switch ($data->type) { + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD: + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT: + case PlayerDeliveryRecord::TYPE_RECHARGE: + case PlayerDeliveryRecord::TYPE_WITHDRAWAL: + case PlayerDeliveryRecord::TYPE_WITHDRAWAL_BACK: + return Tag::create(trans($val, [], 'message', $lang))->color('red'); + case PlayerDeliveryRecord::TYPE_REGISTER_PRESENT: + return Tag::create(trans($val, [], 'message', $lang))->color('blue'); + case PlayerDeliveryRecord::TYPE_COMMISSION: + case PlayerDeliveryRecord::TYPE_GAME_OUT: + return Tag::create(trans($val, [], 'message', $lang))->color('purple'); + case PlayerDeliveryRecord::TYPE_SIGN: + case PlayerDeliveryRecord::TYPE_GAME_IN: + case PlayerDeliveryRecord::TYPE_BET_REBATE: + case PlayerDeliveryRecord::TYPE_DAMAGE_REBATE: + case PlayerDeliveryRecord::TYPE_RECHARGE_REWARD: + case PlayerDeliveryRecord::TYPE_PROFIT: + return Tag::create(trans($val, [], 'message', $lang))->color('orange'); + default: + return ''; + } + })->align('center'); + $grid->column('type', admin_trans('player_delivery_record.fields.type')) + ->display(function ($value) { + switch ($value) { + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD))->color('#2db7f5'); + break; + case PlayerDeliveryRecord::TYPE_RECHARGE: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_RECHARGE))->color('#3C87C9'); + break; + case PlayerDeliveryRecord::TYPE_WITHDRAWAL: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_WITHDRAWAL))->color('#C98341'); + break; + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT))->color('#108ee9'); + break; + case PlayerDeliveryRecord::TYPE_WITHDRAWAL_BACK: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_WITHDRAWAL_BACK))->color('#CC6600'); + break; + case PlayerDeliveryRecord::TYPE_COMMISSION: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_COMMISSION))->color('#3C87C9'); + break; + case PlayerDeliveryRecord::TYPE_REGISTER_PRESENT: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_REGISTER_PRESENT))->color('#3C87C9'); + break; + case PlayerDeliveryRecord::TYPE_SIGN: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_SIGN))->color('#CC6600'); + break; + case PlayerDeliveryRecord::TYPE_GAME_IN: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_GAME_IN))->color('#CC6600'); + break; + case PlayerDeliveryRecord::TYPE_GAME_OUT: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_GAME_OUT))->color('#3C87C9'); + break; + case PlayerDeliveryRecord::TYPE_BET_REBATE: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_BET_REBATE))->color('#C98341'); + break; + case PlayerDeliveryRecord::TYPE_DAMAGE_REBATE: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_DAMAGE_REBATE))->color('#3C87C9'); + break; + case PlayerDeliveryRecord::TYPE_RECHARGE_REWARD: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_RECHARGE_REWARD))->color('#3C87C9'); + break; + case PlayerDeliveryRecord::TYPE_PROFIT: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_PROFIT))->color('#3C87C9'); + break; + default: + $tag = ''; + } + return Html::create()->content([ + $tag + ]); + })->align('center')->sortable(); + $grid->column('amount', admin_trans('player_delivery_record.fields.amount'))->display(function ($val, PlayerDeliveryRecord $data) { + switch ($data->type) { + case PlayerDeliveryRecord::TYPE_WITHDRAWAL: + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT: + return Html::create()->content(['-' . $val])->style(['color' => '#cd201f']); + default: + return Html::create()->content(['+' . $val])->style(['color' => 'green']); + } + })->align('center'); + $grid->column('amount_after', admin_trans('player_delivery_record.fields.amount_after'))->align('center'); + $grid->column('amount_before', admin_trans('player_delivery_record.fields.amount_before'))->align('center'); + $grid->column('user_name', admin_trans('player_delivery_record.fields.user_name'))->display(function ($val, PlayerDeliveryRecord $data) { + $name = '玩家'; + if (in_array($data->type, [PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD, PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT])) { + $name = $data->user_name ?? '管理员'; + } + return Html::create()->content([ + Html::div()->content($name), + ]); + }); + $grid->column('created_at', admin_trans('player_delivery_record.fields.created_at'))->sortable()->align('center'); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->actions(function (Actions $actions) { + $actions->hideDel(); + $actions->hideEdit(); + }); + $grid->filter(function (Filter $filter) { + $filter->like()->text('player.uuid')->placeholder(admin_trans('player.fields.uuid')); + $filter->like()->text('player.name')->placeholder(admin_trans('player.fields.name')); + $filter->like()->text('search_source')->placeholder(admin_trans('player_delivery_record.fields.source')); + $filter->eq()->select('type') + ->placeholder(admin_trans('player_delivery_record.fields.type')) + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->options([ + PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD), + PlayerDeliveryRecord::TYPE_RECHARGE => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_RECHARGE), + PlayerDeliveryRecord::TYPE_WITHDRAWAL => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_WITHDRAWAL), + PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT), + PlayerDeliveryRecord::TYPE_WITHDRAWAL_BACK => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_WITHDRAWAL_BACK), + PlayerDeliveryRecord::TYPE_REGISTER_PRESENT => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_REGISTER_PRESENT), + PlayerDeliveryRecord::TYPE_COMMISSION => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_COMMISSION), + PlayerDeliveryRecord::TYPE_SIGN => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_SIGN), + PlayerDeliveryRecord::TYPE_GAME_OUT => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_GAME_OUT), + PlayerDeliveryRecord::TYPE_GAME_IN => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_GAME_IN), + PlayerDeliveryRecord::TYPE_BET_REBATE => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_BET_REBATE), + PlayerDeliveryRecord::TYPE_DAMAGE_REBATE => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_DAMAGE_REBATE), + PlayerDeliveryRecord::TYPE_RECHARGE_REWARD => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_RECHARGE_REWARD), + PlayerDeliveryRecord::TYPE_PROFIT => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_PROFIT), + ]); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateTimeRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]); + }); + $grid->quickSearch(); + }); + } +} diff --git a/addons/webman/controller/ChannelPostController.php b/addons/webman/controller/ChannelPostController.php new file mode 100644 index 0000000..bfd4e12 --- /dev/null +++ b/addons/webman/controller/ChannelPostController.php @@ -0,0 +1,96 @@ +model = plugin()->webman->config('database.post_model'); + + } + + /** + * 岗位 + * @group channel + * @auth true + */ + public function index(): Grid + { + return Grid::create(new $this->model, function (Grid $grid) { + $grid->title(admin_trans('post.title')); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->where('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->where('created_at', '<=', $exAdminFilter['created_at_end']); + } + $grid->autoHeight(); + $grid->bordered(true); + $grid->column('name', admin_trans('post.fields.name')); + $grid->column('status', admin_trans('post.fields.status'))->switch([[1 => ''], [0 => '']]); + $grid->sortInput('sort', admin_trans('post.fields.sort')); + $grid->column('created_at', admin_trans('post.fields.create_at')); + $grid->filter(function (Filter $filter) { + $filter->like()->text('name')->placeholder(admin_trans('post.fields.name')); + $filter->eq()->select('status') + ->placeholder(admin_trans('post.fields.status')) + ->options([ + 1 => admin_trans('post.normal'), + 0 => admin_trans('post.disable') + ]); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]);; + }); + $grid->setForm()->modal($this->form()); + $grid->quickSearch(); + }); + } + + /** + * 岗位 + * @group channel + * @auth true + */ + public function form(): Form + { + return Form::create(new $this->model, function (Form $form) { + $form->title(admin_trans('post.title')); + $form->text('name', admin_trans('post.fields.name')) + ->required(); + $form->number('sort', admin_trans('post.fields.sort'))->default(0); + $form->saving(function (Form $form) { + if (!$form->isEdit()) { + $adminPost = new AdminPost(); + $adminPost->name = $form->input('name'); + $adminPost->sort = $form->input('sort'); + $adminPost->department_id = Admin::user()->department_id; + $adminPost->type = AdminDepartment::TYPE_CHANNEL; + } else { + $adminPost = AdminPost::find($form->input('id')); + } + if (!$adminPost->save()) { + return message_error(admin_trans('form.save_error')); + } + return message_success(admin_trans('form.save_success')); + }); + }); + } +} diff --git a/addons/webman/controller/ChannelRechargeController.php b/addons/webman/controller/ChannelRechargeController.php new file mode 100644 index 0000000..389ecb2 --- /dev/null +++ b/addons/webman/controller/ChannelRechargeController.php @@ -0,0 +1,572 @@ +model = plugin()->webman->config('database.channel_recharge_setting_model'); + $this->method = plugin()->webman->config('database.channel_recharge_method_model'); + $this->sepay_model = plugin()->webman->config('database.sepay_recharge_model'); + } + + /** + * 充值账号 + * @group channel + * @auth true + */ + public function index(): Grid + { + return Grid::create(new $this->model, function (Grid $grid) { + $lang = Container::getInstance()->translator->getLocale(); + $channelRechargeMethods = ChannelRechargeMethod::query() + ->where('status', 1) + ->select(['id', 'account', 'currency']) + ->with(['methodLang' => function ($query) use ($lang) { + $query->where('lang', $lang); + }]) + ->get()->toArray(); + foreach ($channelRechargeMethods as &$item) { + $item['name'] = $item['method_lang'][0]['name'] ?? ''; + } + $grid->sidebar('method_id', $channelRechargeMethods) + ->setForm($this->methodForm()); + $grid->title(admin_trans('channel_recharge_setting.title')); + $grid->model()->with(['channel_recharge_method'])->whereHas('channel_recharge_method', function ($query) { + $query->whereNull('deleted_at'); + }); + $grid->autoHeight(); + $grid->bordered(true); + $lang = Container::getInstance()->translator->getLocale(); + $grid->tools([ + Button::create(admin_trans('channel_recharge_setting.first_recharge_setting')) + ->danger() + ->drawer($this->rechargeSetting()) + ]); + $grid->column('id', admin_trans('channel_recharge_setting.fields.id'))->align('center'); + $grid->column('title', admin_trans('channel_recharge_setting.fields.title'))->align('center'); + $grid->column('method_name', admin_trans('channel_recharge_setting.fields.method_name')) + ->display(function ($val, ChannelRechargeSetting $data) use ($lang) { + /** @var ChannelRechargeMethodLang $methodLang */ + $methodLang = $data->channel_recharge_method->methodLang->where('lang', $lang)->first(); + return $methodLang->name ?? ''; + }) + ->align('center') + ->ellipsis(true); + $grid->column('type', admin_trans('player_delivery_record.fields.type')) + ->display(function ($value) { + switch ($value) { + case ChannelRechargeSetting::TYPE_REGULAR: + $tag = Tag::create(admin_trans('channel_recharge_setting.type.' . ChannelRechargeSetting::TYPE_REGULAR))->color('#2db7f5'); + break; + case ChannelRechargeSetting::TYPE_ACTIVITY: + $tag = Tag::create(admin_trans('channel_recharge_setting.type.' . ChannelRechargeSetting::TYPE_ACTIVITY))->color('#3C87C9'); + break; + default: + $tag = ''; + } + return Html::create()->content([ + $tag + ]); + })->align('center')->sortable(); + $grid->column('chip_multiple', admin_trans('channel_recharge_setting.fields.chip_multiple'))->align('center'); + $grid->column('coins_num', admin_trans('channel_recharge_setting.fields.coins_num'))->align('center'); + $grid->column('gift_coins', admin_trans('channel_recharge_setting.fields.gift_coins'))->align('center'); + $grid->column('money', admin_trans('channel_recharge_setting.fields.money'))->align('center'); + $grid->column('user_name', admin_trans('channel_recharge_setting.fields.user_name'))->align('center'); + $grid->column('status', admin_trans('channel_recharge_setting.fields.status'))->switch()->align('center'); + $grid->filter(function (Filter $filter) { + $filter->eq()->number('coins_num')->placeholder(admin_trans('channel_recharge_setting.fields.coins_num')); + $filter->eq()->number('money')->placeholder(admin_trans('channel_recharge_setting.fields.money')); + }); + $grid->quickSearch(function (Builder $builder, $quickSearch) { + $builder->whereHas('channel_recharge_method.methodLang', function ($query) use ($quickSearch) { + $query->where([ + ['name', 'like', '%' . $quickSearch . '%', 'or'], + ['bank_name', 'like', '%' . $quickSearch . '%', 'or'], + ['sub_bank', 'like', '%' . $quickSearch . '%', 'or'], + ['account', 'like', '%' . $quickSearch . '%', 'or'], + ['owner', 'like', '%' . $quickSearch . '%', 'or'], + ]); + }); + }); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->hideDeleteSelection(); + $grid->hideTrashed(); + $grid->addButton()->drawer($this->form()); + $grid->setForm()->drawer($this->form()); + $grid->actions(function (Actions $actions) { + $actions->hideEdit(); + }); + }); + } + + /** + * 充值账号配置 + * @auth true + * @group channel + * @return Form + */ + public function form(): Form + { + /** @var ChannelRechargeMethod $channelRechargeMethod */ + $channelRechargeMethod = ChannelRechargeMethod::query() + ->where('department_id', Admin::user()->department_id) + ->where('type', 2) + ->first(); + if (!$channelRechargeMethod) { + $channelRechargeMethod = [ + 'id' => '', + 'wallet_address' => '', + 'qr_code' => '', + 'rate' => '', + 'status' => '', + ]; + } + return Form::create($channelRechargeMethod, function (Form $form) use ($channelRechargeMethod) { + $form->text('wallet_address', admin_trans('channel_recharge_setting.fields.wallet_address')) + ->value($channelRechargeMethod['wallet_address']) + ->required() + ->maxlength(250); + $form->file('qr_code', admin_trans('channel_recharge_setting.fields.qr_code')) + ->ext('jpg,png,jpeg') + ->value($channelRechargeMethod['qr_code']) + ->type('image') + ->fileSize('1m') + ->required() + ->hideFinder() + ->paste(); + $form->number('rate', admin_trans('channel_recharge_setting.fields.rate')) + ->min(0) + ->max(100) + ->value($channelRechargeMethod['rate']) + ->span(24) + ->style(['width' => '50%']) + ->required() + ->precision(2); + $form->switch('status', admin_trans('channel_recharge_method.fields.status')) + ->value($channelRechargeMethod['status'])->required()->span(11); + $form->colon(false); + $form->removeAttr('labelCol'); + $form->actions()->hideResetButton(); + $form->actions()->submitButton()->content(admin_trans('form.submit')); + $form->layout('vertical'); + $form->saving(function (Form $form) use ($channelRechargeMethod) { + try { + DB::beginTransaction(); + if (!$channelRechargeMethod['id']) { + $channelRechargeMethod = new ChannelRechargeMethod(); + $channelRechargeMethod->type = 2; + $channelRechargeMethod->currency = Admin::user()->department->channel->currency; + $channelRechargeMethod->department_id = Admin::user()->department_id; + $channelRechargeMethod->user_id = Admin::id(); + $channelRechargeMethod->user_name = !empty(Admin::user()) ? Admin::user()->username : ''; + } + $channelRechargeMethod->qr_code = $form->input('qr_code'); + $channelRechargeMethod->wallet_address = $form->input('wallet_address'); + $channelRechargeMethod->status = $form->input('status'); + $channelRechargeMethod->rate = $form->input('rate'); + $channelRechargeMethod->save(); + DB::commit(); + } catch (\Exception $exception) { + DB::rollBack(); + return message_error(admin_trans('form.save_error') . $exception->getMessage()); + } + return message_success(admin_trans('form.save_success')); + }); + }); + } + + /** + * 获取充值方式 + * @return array + */ + public function getRechargeMethod(): array + { + $options = []; + $lang = Container::getInstance()->translator->getLocale(); + $methodList = ChannelRechargeMethod::query()->get(); + /** @var ChannelRechargeMethod $item */ + foreach ($methodList as $item) { + /** @var ChannelRechargeMethodLang $methodLang */ + $methodLang = $item->methodLang->where('lang', $lang)->first(); + $options[$item->id] = $methodLang->name ?? ''; + } + + return $options; + } + + /** + * 充值方式 + * @auth true + * @group channel + * @return Form + */ + public function methodForm(): Form + { + /** @var ChannelRechargeMethod $channelRechargeMethod */ + $channelRechargeMethod = ChannelRechargeMethod::query() + ->where('department_id', Admin::user()->department_id) + ->where('type', 1) + ->first(); + if (!$channelRechargeMethod) { + $channelRechargeMethod = [ + 'id' => '', + 'account' => '', + 'status' => '', + ]; + } + return Form::create($channelRechargeMethod, function (Form $form) use ($channelRechargeMethod) { + $form->row(function (Form $form) use ($channelRechargeMethod) { + $form->text('account', admin_trans('channel_recharge_method.fields.account')) + ->maxlength(100) + ->value($channelRechargeMethod['account']) + ->required() + ->span(11); + $form->push(Divider::create()->content(' ')->style(['margin-left' => '11px'])); + $form->switch('status', admin_trans('channel_recharge_method.fields.status')) + ->value($channelRechargeMethod['status'])->required()->span(11); + }); + $langList = plugin()->webman->config('ui.lang.list'); + $tabs = $form->tabs()->destroyInactiveTabPane(); + $contents = []; + if ($channelRechargeMethod['id']) { + $channelRechargeMethodLang = ChannelRechargeMethodLang::query()->where('method_id', $channelRechargeMethod['id'])->get(); + /** @var ChannelRechargeMethodLang $content */ + foreach ($channelRechargeMethodLang as $content) { + $contents[$content->lang] = [ + 'name' => $content->name, + 'bank_name' => $content->bank_name, + 'sub_bank' => $content->sub_bank, + 'owner' => $content->owner, + 'id' => $content->id, + ]; + } + } + foreach ($langList as $k => $v) { + $tabs->pane($v, function (Form $form) use ($k, $contents) { + $form->row(function (Form $form) use ($k, $contents) { + $form->text("content." . $k . ".name", admin_trans('channel_recharge_method.fields.method_name')) + ->maxlength(120) + ->value($contents[$k]['name'] ?? '') + ->required() + ->span(11); + $form->push(Divider::create()->content(' ')->style(['margin-left' => '11px'])); + $form->text("content." . $k . ".bank_name", admin_trans('channel_recharge_method.fields.bank_name')) + ->value($contents[$k]['bank_name'] ?? '') + ->maxlength(100) + ->required() + ->span(11); + })->style(['width' => '100 % ', 'margin - left' => '1px']); + $form->row(function (Form $form) use ($k, $contents) { + $form->text("content." . $k . ".sub_bank", admin_trans('channel_recharge_method.fields.sub_bank')) + ->value($contents[$k]['sub_bank'] ?? '') + ->maxlength(100) + ->required() + ->span(11); + $form->push(Divider::create()->content(' ')->style(['margin-left' => '11px'])); + $form->text("content." . $k . ".owner", admin_trans('channel_recharge_method.fields.owner')) + ->value($contents[$k]['owner'] ?? '') + ->maxlength(100) + ->required() + ->span(11); + })->style(['width' => '100 % ', 'margin - left' => '1px']); + }); + } + $form->colon(false); + $form->removeAttr('labelCol'); + $form->actions()->hideResetButton(); + $form->actions()->submitButton()->content(admin_trans('form.submit')); + $form->layout('vertical'); + $form->saving(function (Form $form) use ($channelRechargeMethod) { + try { + DB::beginTransaction(); + if ($channelRechargeMethod['id']) { + $channelRechargeMethod->account = $form->input('account'); + $channelRechargeMethod->currency = Admin::user()->department->channel->currency; + } else { + $channelRechargeMethod = new ChannelRechargeMethod(); + $channelRechargeMethod->account = $form->input('account'); + $channelRechargeMethod->currency = Admin::user()->department->channel->currency; + $channelRechargeMethod->department_id = Admin::user()->department_id; + $channelRechargeMethod->user_id = Admin::id(); + $channelRechargeMethod->user_name = !empty(Admin::user()) ? Admin::user()->username : ''; + } + $channelRechargeMethod->status = $form->input('status'); + $channelRechargeMethod->save(); + $contents = $form->input('content'); + foreach ($contents as $key => $content) { + if (empty($content['name'])) { + continue; + } + ChannelRechargeMethodLang::query()->updateOrCreate( + [ + 'lang' => $key, + 'method_id' => $channelRechargeMethod->id, + ], + [ + 'name' => $content['name'], + 'bank_name' => $content['bank_name'] ?? '', + 'sub_bank' => $content['sub_bank'] ?? '', + 'owner' => $content['owner'] ?? '' + ] + ); + } + DB::commit(); + } catch (\Exception $exception) { + DB::rollBack(); + return message_error(admin_trans('form.save_error') . $exception->getMessage()); + } + return message_success(admin_trans('form.save_success')); + }); + }); + } + + /** + * @return Form + */ + public function rechargeSetting(): Form + { + /** @var SystemSetting $systemSetting */ + $systemSetting = SystemSetting::query() + ->where('department_id', Admin::user()->department_id) + ->where('feature', 'first_recharge_setting') + ->first(); + return Form::create($systemSetting ? [ + 'id' => $systemSetting->id, + 'department_id' => $systemSetting->department_id, + 'feature' => $systemSetting->feature, + 'content' => json_decode($systemSetting->content, true), + 'status' => $systemSetting->status, + ] : [], function (Form $form) use ($systemSetting) { + $form->push( + Switches::create('status') + ->options([[1 => admin_trans('admin.open')], [0 => admin_trans('admin.close')]]) + ->field('status') + ->title('状态') + ->url('ex-admin/addons-webman-controller-ActivityController/changeStatus') + ->params([ + 'id' => $systemSetting->id, + ])->style(['margin-bottom' => '14px']) + ); + $form->hasMany('content', '', function (Form $form) { + $form->row(function (Form $form) { + $form->radio('model', admin_trans('first_recharge_setting.fields.model')) + ->button() + ->required() + ->default(SystemSetting::FIRST_RECHARGE_MODEL_ONE) + ->bindAttr('buttonStyle', $form->getBindField('buttonStyle')) + ->options([ + SystemSetting::FIRST_RECHARGE_MODEL_ONE => admin_trans('first_recharge_setting.model.' . SystemSetting::FIRST_RECHARGE_MODEL_ONE), + SystemSetting::FIRST_RECHARGE_MODEL_ADD => admin_trans('first_recharge_setting.model.' . SystemSetting::FIRST_RECHARGE_MODEL_ADD), + ])->when(SystemSetting::FIRST_RECHARGE_MODEL_ADD, function (Form $form) { + $form->text('add_number', admin_trans('first_recharge_setting.fields.add_number')) + ->rule([ + 'integer' => admin_trans('validator.integer'), + 'max:100000' => admin_trans('validator.max', null, ['{max}' => 100000000]), + 'min:1' => admin_trans('validator.min', null, ['{min}' => 1]), + ]) + ->span(24) + ->required(); + })->span(24); + $form->radio('type', admin_trans('first_recharge_setting.fields.type')) + ->button() + ->required() + ->default(SystemSetting::FIRST_RECHARGE_TYPE_VALUE) + ->bindAttr('buttonStyle', $form->getBindField('buttonStyle')) + ->options([ + SystemSetting::FIRST_RECHARGE_TYPE_VALUE => admin_trans('first_recharge_setting.type.' . SystemSetting::FIRST_RECHARGE_TYPE_VALUE), + SystemSetting::FIRST_RECHARGE_TYPE_PERCENT => admin_trans('first_recharge_setting.type.' . SystemSetting::FIRST_RECHARGE_TYPE_PERCENT), + ]) + ->when(SystemSetting::FIRST_RECHARGE_TYPE_VALUE, function (Form $form) { + $form->text('number', admin_trans('first_recharge_setting.fields.number')) + ->rule([ + 'integer' => admin_trans('validator.integer'), + 'max:100000' => admin_trans('validator.max', null, ['{max}' => 100000000]), + 'min:1' => admin_trans('validator.min', null, ['{min}' => 1]), + ]) + ->required() + ->span(24) + ->suffix('coin'); + }) + ->when(SystemSetting::FIRST_RECHARGE_TYPE_PERCENT, function (Form $form) { + $form->text('number', admin_trans('first_recharge_setting.fields.number_percent')) + ->rule([ + 'integer' => admin_trans('validator.integer'), + 'max:100000' => admin_trans('validator.max', null, ['{max}' => 100000000]), + 'min:1' => admin_trans('validator.min', null, ['{min}' => 1]), + ]) + ->required() + ->span(24) + ->suffix('%'); + }); + $form->number('chip_multiple', admin_trans('first_recharge_setting.fields.chip_amount')) + ->min(0) + ->max(100000000) + ->span(24) + ->style(['width' => '100%']) + ->required() + ->precision(2); + })->class(['activity-phase-has-many']); + })->sortField('sort')->defaultRow(1); + $form->layout('vertical'); + $form->saving(function (Form $form) { + $content = $form->input('content'); + $settingContent = []; + foreach ($content as $item) { + $settingContent[] = [ + 'model' => $item['model'], + 'type' => $item['type'], + 'add_number' => $item['add_number'] ?? 0, + 'chip_multiple' => $item['chip_multiple'], + 'number' => $item['number'], + ]; + } + if (!SystemSetting::updateOrCreate( + [ + 'department_id' => Admin::user()->department_id, + 'feature' => 'first_recharge_setting', + ], + [ + 'content' => json_encode($settingContent) + ] + )) { + return message_error(admin_trans('form.save_error')); + } + return message_success(admin_trans('form.save_success')); + }); + }); + } + + /** + * 在线充值 + * @group channel + * @auth true + */ + public function speedPayList(): Grid + { + return Grid::create(new $this->sepay_model(), function (Grid $grid) { + $grid->autoHeight(); + $grid->bordered(true); + $grid->tools([ + Button::create(admin_trans('channel_recharge_setting.manual_recharge_setting')) + ->danger() + ->drawer($this->methodForm()), + Button::create(admin_trans('channel_recharge_setting.usdt_recharge_setting')) + ->danger() + ->drawer($this->form()) + ]); + $grid->model()->where('department_id', Admin::user()->department_id)->orderBy('money'); + $grid->column('id', admin_trans('channel_recharge_setting.fields.id'))->align('center'); + $grid->column('title', admin_trans('channel_recharge_setting.fields.title'))->align('center'); + $grid->column('coins_num', admin_trans('channel_recharge_setting.fields.coins_num'))->align('center'); + $grid->column('first_coins', admin_trans('channel_recharge_setting.fields.first_coins'))->align('center'); + $grid->column('money', admin_trans('channel_recharge_setting.fields.money'))->align('center'); + $grid->column('admin_id', admin_trans('channel_recharge_setting.fields.user_name'))->display(function ($val) { + return AdminUser::query()->find($val)->username; + }) + ->align('center'); + $grid->column('status', admin_trans('channel_recharge_setting.fields.status'))->switch()->align('center'); + $grid->column('created_at', admin_trans('qrcode.qrcode_batch.created_at'))->align('center')->fixed(true); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->hideDeleteSelection(); + $grid->hideTrashed(); + $grid->addButton()->drawer($this->addSpeedPay()); + $grid->actions(function (Actions $actions) { + $actions->hideEdit(); + }); + }); + } + + /** + * 在线充值配置 + * @auth true + * @group channel + * @return Form + */ + public function addSpeedPay(): Form + { + return Form::create(new $this->sepay_model(), function (Form $form) { + $form->text('title', admin_trans('channel_recharge_setting.fields.title'))->maxlength(30)->required(); + $form->number('coins_num', admin_trans('channel_recharge_setting.fields.coins_num')) + ->style(['width' => '100%']) + ->min(1) + ->max(100000000) + ->precision(2) + ->required() + ->rule([ + 'required' => admin_trans('channel_recharge_setting.rul.coins_num'), + 'min:1' => admin_trans('channel_recharge_setting.rul.coins_num_1'), + 'max:100000000' => admin_trans('channel_recharge_setting.rul.coins_num_max_100000000'), + ]) + ->placeholder(admin_trans('channel_recharge_setting.placeholder_coins_num')); + $form->number('first_coins', admin_trans('channel_recharge_setting.fields.first_coins')) + ->style(['width' => '100%']) + ->min(0) + ->max(100000000) + ->precision(2) + ->rule([ + 'required' => admin_trans('channel_recharge_setting.rul.first_coins'), + 'min:0' => admin_trans('channel_recharge_setting.rul.gift_coins_1'), + 'max:100000000' => admin_trans('channel_recharge_setting.rul.gift_coins_max_100000000'), + ]) + ->placeholder(admin_trans('channel_recharge_setting.placeholder_coins_num')); + $form->number('money', admin_trans('channel_recharge_setting.fields.money')) + ->style(['width' => '100%']) + ->min(5) + ->max(20000) + ->precision(2) + ->required() + ->placeholder(admin_trans('channel_recharge_setting.placeholder_money')); + $form->layout('vertical'); + $form->saving(function (Form $form) { + try { + $setting = new SepayRecharge(); + $setting->department_id = Admin::user()->department_id; + $setting->title = $form->input('title'); + $setting->coins_num = $form->input('coins_num'); + $setting->first_coins = $form->input('first_coins'); + $setting->money = $form->input('money'); + $setting->admin_id = Admin::id(); + $setting->save(); + } catch (\Exception $exception) { + return message_error(admin_trans('form.save_error')); + } + return message_success(admin_trans('form.save_success')); + }); + }); + } + +} diff --git a/addons/webman/controller/ChannelRechargeRecordController.php b/addons/webman/controller/ChannelRechargeRecordController.php new file mode 100644 index 0000000..e19ab4c --- /dev/null +++ b/addons/webman/controller/ChannelRechargeRecordController.php @@ -0,0 +1,644 @@ +model = plugin()->webman->config('database.player_recharge_record_model'); + } + + /** + * 渠道充值 + * @group channel + * @auth true + */ + public function index(): Grid + { + return Grid::create(new $this->model(), function (Grid $grid) { + $grid->title(admin_trans('player_recharge_record.title')); + $grid->model()->with(['player', 'channel_recharge_setting'])->whereIn('type', [PlayerRechargeRecord::TYPE_REGULAR, PlayerRechargeRecord::TYPE_ARTIFICIAL, PlayerRechargeRecord::TYPE_ACTIVITY])->orderBy('created_at', 'desc'); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (!empty($exAdminFilter)) { + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->where('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->where('created_at', '<=', $exAdminFilter['created_at_end']); + } + if (isset($exAdminFilter['finish_time_start']) && !empty($exAdminFilter['finish_time_start'])) { + $grid->model()->where('finish_time', '>=', $exAdminFilter['finish_time_start']); + } + if (isset($exAdminFilter['finish_time_end']) && !empty($exAdminFilter['finish_time_end'])) { + $grid->model()->where('finish_time', '<=', $exAdminFilter['finish_time_end']); + } + if (!empty($exAdminFilter['player']['uuid'])) { + $grid->model()->whereHas('player', function ($query) use ($exAdminFilter) { + $query->where('uuid', 'like', '%' . $exAdminFilter['player']['uuid'] . '%'); + }); + } + if (!empty($exAdminFilter['player']['name'])) { + $grid->model()->whereHas('player', function ($query) use ($exAdminFilter) { + $query->where('name', 'like', '%' . $exAdminFilter['player']['name'] . '%'); + }); + } + if (!empty($exAdminFilter['type'])) { + $grid->model()->where('type', $exAdminFilter['type']); + } + if (isset($exAdminFilter['status']) && (!empty($exAdminFilter['status']) || $exAdminFilter['status'] === 0)) { + $grid->model()->where('status', $exAdminFilter['status']); + } + if (!empty($exAdminFilter['tradeno'])) { + $grid->model()->where('tradeno', $exAdminFilter['tradeno']); + } + } + $query = clone $grid->model(); + $totalData = $query->selectRaw( + "ifNull(sum(IF(type = 4, money,0)), 0) as total_artificial_money, + ifNull(sum(IF(type = 1, money,0)), 0) as total_espay_money, + ifNull(sum(IF(payment_method = 'DUITNOWP2P', money,0)), 0) as total_espay_duitnow_money, + ifNull(sum(IF(payment_method = 'P2PDEPOSIT', money,0)), 0) as total_espay_deposit_money, + ifNull(sum(IF(payment_method = 'duitnowqr', money,0)), 0) as total_onepay_duitnow_money, + ifNull(sum(IF(payment_method = 'online_banking', money,0)), 0) as total_onepay_deposit_money, + ifNull(sum(IF(payment_method = 'QR', money,0)), 0) as total_skl_duitnow_money, + ifNull(sum(IF(payment_method = 'P2P', money,0)), 0) as total_skl_deposit_money" + )->first(); + $layout = Layout::create(); + $layout->row(function (Row $row) use ($totalData) { + $row->gutter([10, 0]); + $row->column( + Card::create([ + Row::create()->column(Statistic::create()->title(admin_trans('player_recharge_record.total_data.total_artificial_money')) + ->value(!empty($totalData['total_artificial_money']) ? floatval($totalData['total_artificial_money']) : 0)->style([ + 'font-size' => '15px', + 'text-align' => 'center' + ])), + ])->bodyStyle([ + 'display' => 'flex', + 'align-items' => 'center', + 'height' => '72px' + ])->hoverable()->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px']) + , 8); + $row->column( + Card::create([ + Row::create()->column(Statistic::create()->title(admin_trans('player_recharge_record.total_data.total_espay_money')) + ->value(!empty($totalData['total_espay_money']) ? floatval($totalData['total_espay_money']) : 0)->style([ + 'font-size' => '15px', + 'text-align' => 'center' + ])), + ])->bodyStyle([ + 'display' => 'flex', + 'align-items' => 'center', + 'height' => '72px' + ])->hoverable()->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px']) + , 8); + $row->column( + Card::create([ + Row::create()->column(Statistic::create()->title(admin_trans('player_recharge_record.total_data.total_espay_inmoney')) + ->value(bcadd(bcadd( + bcadd(bcmul($totalData['total_espay_duitnow_money'], 0.97, 3), bcmul($totalData['total_espay_deposit_money'], 0.985, 3), 3), + bcadd(bcmul($totalData['total_onepay_duitnow_money'], 0.984, 3), bcmul($totalData['total_onepay_deposit_money'], 0.986, 3), 3), + 3), bcadd(bcmul($totalData['total_skl_duitnow_money'], 0.987, 3), bcmul($totalData['total_skl_deposit_money'], 0.989, 3), 3), 3)) + ->style([ + 'font-size' => '15px', + 'text-align' => 'center' + ])), + ])->bodyStyle([ + 'display' => 'flex', + 'align-items' => 'center', + 'height' => '72px' + ])->hoverable()->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px']) + , 8); + })->style(['background' => '#fff']); + $grid->header($layout); + $grid->bordered(true); + $grid->autoHeight(); + $grid->column('id', admin_trans('player_recharge_record.fields.id'))->align('center')->fixed(true); + $grid->column('tradeno', admin_trans('player_recharge_record.fields.tradeno'))->copy()->fixed(true); + $grid->column('player.uuid', admin_trans('player.fields.uuid'))->copy()->fixed(true); + $grid->column('player.name', admin_trans('player.fields.name'))->display(function ($val, PlayerRechargeRecord $data) { + $image = isset($data->player->avatar) && !empty($data->player->avatar) ? Avatar::create()->src($data->player->avatar) : Avatar::create()->icon(Icon::create('UserOutlined')); + return Html::create()->content([ + $image, + Html::div()->content($val) + ]); + })->align('center'); + $grid->column('money', admin_trans('player_recharge_record.fields.money'))->display(function ($val, PlayerRechargeRecord $data) { + return bcdiv($val,$data->rate, 2) . ' ' . ($data->currency); + })->align('center'); + $grid->column('inmoney', admin_trans('player_recharge_record.fields.inmoney'))->display(function ($val, PlayerRechargeRecord $data) { + if ($data->payment_method == 'DUITNOWP2P') { + $ratio = 0.97; + } elseif ($data->payment_method == 'P2PDEPOSIT') { + $ratio = 0.985; + } elseif ($data->payment_method == 'duitnowqr') { + $ratio = 0.984; + } elseif ($data->payment_method == 'online_banking') { + $ratio = 0.986; + } elseif ($data->payment_method == 'P2P') { + $ratio = 0.989; + } elseif ($data->payment_method == 'QR') { + $ratio = 0.987; + } else { + $ratio = 1; + } + if ($data->currency == 'USDT') { + return bcdiv($val,$data->rate, 2) . ' ' . ($data->currency); + } + return $data->money * $ratio . ' ' . ($data->currency); + })->align('center'); + $grid->column('coins', admin_trans('player_recharge_record.fields.coins'))->align('center')->sortable(); + $grid->column('gift_coins', admin_trans('player_recharge_record.fields.gift_coins'))->align('center'); + $grid->column('type', admin_trans('player_recharge_record.fields.type'))->display(function ($val) { + switch ($val) { + case PlayerRechargeRecord::TYPE_REGULAR: + return Tag::create(admin_trans('player_recharge_record.type.' . $val)) + ->color('#55acee'); + case PlayerRechargeRecord::TYPE_ACTIVITY: + return Tag::create(admin_trans('player_recharge_record.type.' . $val)) + ->color('#3b5999'); + case PlayerRechargeRecord::TYPE_ARTIFICIAL: + return Tag::create(admin_trans('player_recharge_record.type.' . $val)) + ->color('#cd201f'); + default: + return ''; + } + })->align('center'); + $grid->column('status', admin_trans('player_recharge_record.fields.status'))->display(function ($val) { + switch ($val) { + case PlayerRechargeRecord::STATUS_WAIT: + return Tag::create(admin_trans('player_recharge_record.status_wait')) + ->color('#108ee9'); + case PlayerRechargeRecord::STATUS_RECHARGING: + return Tag::create(admin_trans('player_recharge_record.status_examine')) + ->color('#3b5999'); + case PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS: + return Tag::create(admin_trans('player_recharge_record.status_success')) + ->color('#87d068'); + case PlayerRechargeRecord::STATUS_RECHARGED_FAIL: + return Tag::create(admin_trans('player_recharge_record.status_fail')) + ->color('#f50'); + case PlayerRechargeRecord::STATUS_RECHARGED_CANCEL: + return Tag::create(admin_trans('player_recharge_record.status_cancel')) + ->color('#2db7f5'); + case PlayerRechargeRecord::STATUS_RECHARGED_REJECT: + return Tag::create(admin_trans('player_recharge_record.status_reject')) + ->color('#2db7f5'); + case PlayerRechargeRecord::STATUS_RECHARGED_SYSTEM_CANCEL: + return Tag::create(admin_trans('player_recharge_record.status_system_cancel')) + ->color('#2db7f5'); + default: + return ''; + } + })->align('center'); + $grid->column('remark', admin_trans('player_recharge_record.fields.remark'))->display(function ($value) { + return Str::of($value)->limit(20, ' (...)'); + })->editable( + (new Editable)->textarea('remark') + ->showCount() + ->rows(5) + ->rule(['max:255' => admin_trans('player_recharge_record.fields.remark')]) + )->width('150px')->align('center'); + $grid->column('user_name', admin_trans('player_recharge_record.fields.user_name'))->align('center'); + $grid->column('finish_time', admin_trans('player_recharge_record.fields.finish_time'))->sortable()->align('center'); + $grid->column('created_at', admin_trans('player_recharge_record.fields.created_at'))->sortable()->align('center')->fixed('right'); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->expandFilter(); + $grid->actions(function (Actions $actions) { + $actions->hideDel(); + $actions->hideEdit(); + }); + $grid->filter(function (Filter $filter) { + $filter->like()->text('player.uuid')->placeholder(admin_trans('player.fields.uuid')); + $filter->like()->text('player.name')->placeholder(admin_trans('player.fields.name')); + $filter->eq()->select('type') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('player_recharge_record.fields.type')) + ->options([ + PlayerRechargeRecord::TYPE_REGULAR => admin_trans('player_recharge_record.type.' . PlayerRechargeRecord::TYPE_REGULAR), + PlayerRechargeRecord::TYPE_ARTIFICIAL => admin_trans('player_recharge_record.type.' . PlayerRechargeRecord::TYPE_ARTIFICIAL), + ]); + $filter->eq()->select('status') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('player_recharge_record.fields.status')) + ->options([ + PlayerRechargeRecord::STATUS_WAIT => admin_trans('player_recharge_record.status.' . PlayerRechargeRecord::STATUS_WAIT), + PlayerRechargeRecord::STATUS_RECHARGING => admin_trans('player_recharge_record.status.' . PlayerRechargeRecord::STATUS_RECHARGING), + PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS => admin_trans('player_recharge_record.status.' . PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS), + PlayerRechargeRecord::STATUS_RECHARGED_FAIL => admin_trans('player_recharge_record.status.' . PlayerRechargeRecord::STATUS_RECHARGED_FAIL), + PlayerRechargeRecord::STATUS_RECHARGED_CANCEL => admin_trans('player_recharge_record.status.' . PlayerRechargeRecord::STATUS_RECHARGED_CANCEL), + PlayerRechargeRecord::STATUS_RECHARGED_REJECT => admin_trans('player_recharge_record.status.' . PlayerRechargeRecord::STATUS_RECHARGED_REJECT), + PlayerRechargeRecord::STATUS_RECHARGED_SYSTEM_CANCEL => admin_trans('player_recharge_record.status.' . PlayerRechargeRecord::STATUS_RECHARGED_SYSTEM_CANCEL), + ]); + $filter->like()->text('tradeno')->placeholder(admin_trans('player_recharge_record.fields.tradeno')); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateTimeRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]); + $filter->form()->hidden('finish_time_start'); + $filter->form()->hidden('finish_time_end'); + $filter->form()->dateTimeRange('finish_time_start', 'finish_time_end', '')->placeholder([admin_trans('player_recharge_record.fields.finish_time'), admin_trans('player_recharge_record.fields.finish_time')]); + + }); + }); + } + + /** + * 充值审核 + * @group channel + * @auth true + */ + public function examineList(): Grid + { + return Grid::create(new $this->model(), function (Grid $grid) { + $grid->title(admin_trans('player_recharge_record.examine_title')); + $grid->bordered(true); + $grid->autoHeight(); + $requestFilter = Request::input('ex_admin_filter', []); + $tradeno = Request::input('tradeno', []); + if (!empty($tradeno)) { + $grid->model()->where('tradeno', $tradeno); + } + $grid->model()->with(['player', 'channel_recharge_setting'])->whereIn('type', [PlayerRechargeRecord::TYPE_REGULAR, PlayerRechargeRecord::TYPE_ACTIVITY]) + ->whereIn('status', [PlayerRechargeRecord::STATUS_RECHARGING, PlayerRechargeRecord::STATUS_WAIT, PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS, PlayerRechargeRecord::STATUS_RECHARGED_REJECT, PlayerRechargeRecord::STATUS_RECHARGED_SYSTEM_CANCEL]) + ->whereNull('payment_method') + ->orderBy('created_at', 'desc'); + if (isset($requestFilter['created_at_start']) && !empty($requestFilter['created_at_start'])) { + $grid->model()->where('created_at', '>=', $requestFilter['created_at_start']); + } + if (isset($requestFilter['created_at_end']) && !empty($requestFilter['created_at_end'])) { + $grid->model()->where('created_at', '<=', $requestFilter['created_at_end']); + } + $grid->column('id', admin_trans('player_recharge_record.fields.id'))->align('center'); + $grid->column('tradeno', admin_trans('player_recharge_record.fields.tradeno'))->copy(); + $grid->column('player.uuid', admin_trans('player.fields.uuid'))->copy(); + $grid->column('player.name', admin_trans('player.fields.name'))->display(function ($val, PlayerRechargeRecord $data) { + $image = isset($data->player->avatar) && !empty($data->player->avatar) ? Avatar::create()->src($data->player->avatar) : Avatar::create()->icon(Icon::create('UserOutlined')); + return Html::create()->content([ + $image, + Html::div()->content($val) + ]); + })->align('center'); + $grid->column('money', admin_trans('player_recharge_record.fields.money'))->display(function ($val, PlayerRechargeRecord $data) { + return bcdiv($val,$data->rate, 2) . ' ' . $data->currency; + })->align('center'); + $grid->column('coins', admin_trans('player_recharge_record.fields.coins'))->align('center'); + $grid->column('gift_coins', admin_trans('player_recharge_record.fields.gift_coins'))->align('center'); + $grid->column('status', admin_trans('player_recharge_record.fields.status'))->display(function ($val) { + switch ($val) { + case PlayerRechargeRecord::STATUS_WAIT: + return Tag::create(admin_trans('player_recharge_record.status_wait')) + ->color('#108ee9'); + case PlayerRechargeRecord::STATUS_RECHARGING: + return Tag::create(admin_trans('player_recharge_record.status_examine')) + ->color('#3b5999'); + case PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS: + return Tag::create(admin_trans('player_recharge_record.status_success')) + ->color('#87d068'); + case PlayerRechargeRecord::STATUS_RECHARGED_FAIL: + return Tag::create(admin_trans('player_recharge_record.status_fail')) + ->color('#f50'); + case PlayerRechargeRecord::STATUS_RECHARGED_CANCEL: + return Tag::create(admin_trans('player_recharge_record.status_cancel')) + ->color('#2db7f5'); + case PlayerRechargeRecord::STATUS_RECHARGED_REJECT: + return Tag::create(admin_trans('player_recharge_record.status_reject')) + ->color('#2db7f5'); + case PlayerRechargeRecord::STATUS_RECHARGED_SYSTEM_CANCEL: + return Tag::create(admin_trans('player_recharge_record.status_system_cancel')) + ->color('#2db7f5'); + default: + return ''; + } + })->align('center'); + $grid->column('remark', admin_trans('player_recharge_record.fields.remark'))->display(function ($value) { + return Str::of($value)->limit(20, ' (...)'); + })->editable( + (new Editable)->textarea('remark') + ->showCount() + ->rows(5) + ->rule(['max:255' => admin_trans('player_recharge_record.fields.remark')]) + )->width('150px')->align('center'); + $grid->column('reject_reason', admin_trans('player_recharge_record.fields.reject_reason'))->display(function ($value) { + return Str::of($value)->limit(20, ' (...)'); + })->tip()->width('150px')->align('center'); + $grid->column('created_at', admin_trans('player_recharge_record.fields.created_at'))->sortable()->align('center'); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->expandFilter(); + $grid->actions(function (Actions $actions, PlayerRechargeRecord $data) { + $actions->hideDel(); + $actions->hideEdit(); + $dropdown = Dropdown::create( + Button::create([ + admin_trans('player_recharge_record.btn.action'), Icon::create('DownOutlined')->style(['marginRight' => '5px']) + ]))->trigger(['click']); + + $dropdown->item(admin_trans('player_recharge_record.btn.view_channel_recharge_setting'), 'AppstoreAddOutlined') + ->modal([$this, 'rechargeSetting'], ['setting_id' => $data->setting_id]); + $dropdown->item(admin_trans('player_recharge_record.btn.view_recharge_certificate'), 'far fa-file-image') + ->modal($this->rechargeCertificate([ + 'tradeno' => $data->tradeno, + 'certificate' => $data->certificate, + ]))->title(admin_trans('player_recharge_record.view_recharge_certificate_title', null, ['{tradeno}' => $data->tradeno])); + + $dropdown->item(admin_trans('player_recharge_record.btn.examine_pass'), 'SafetyCertificateOutlined') + ->confirm(admin_trans('player_recharge_record.btn.examine_pass_confirm'), [$this, 'pass'], ['id' => $data->id]); + + $dropdown->item(admin_trans('player_recharge_record.btn.examine_reject'), 'WarningFilled') + ->modal([$this, 'reject'], ['id' => $data->id]); + $actions->prepend( + $dropdown + ); + }); + $grid->filter(function (Filter $filter) { + $filter->like()->text('player.uuid')->placeholder(admin_trans('player.fields.uuid')); + $filter->like()->text('player.name')->placeholder(admin_trans('player.fields.name')); + $filter->eq()->select('status') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('player_recharge_record.fields.status')) + ->options([ + PlayerRechargeRecord::STATUS_WAIT => admin_trans('player_recharge_record.status_wait'), + PlayerRechargeRecord::STATUS_RECHARGING => admin_trans('player_recharge_record.status_examine'), + PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS => admin_trans('player_recharge_record.status_examine_pass'), + PlayerRechargeRecord::STATUS_RECHARGED_REJECT => admin_trans('player_recharge_record.status_examine_reject'), + PlayerRechargeRecord::STATUS_RECHARGED_SYSTEM_CANCEL => admin_trans('player_recharge_record.status_system_cancel'), + ]); + $filter->like()->text('tradeno')->placeholder(admin_trans('player_recharge_record.fields.tradeno')); + $filter->eq()->number('money')->precision(2)->style(['width' => '200px'])->placeholder(admin_trans('player_recharge_record.fields.money')); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateTimeRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]); + }); + }); + } + + /** + * 充值订单审核拒绝 + * @auth true + * @group channel + * @param $id + * @return Form + */ + public function reject($id): Form + { + return Form::create(new $this->model(), function (Form $form) use ($id) { + $form->textarea('reject_reason')->rows(5)->required(); + $form->saving(function (Form $form) use ($id) { + /** @var PlayerRechargeRecord $playerRechargeRecord */ + $playerRechargeRecord = $this->model::find($id); + if (empty($playerRechargeRecord)) { + return message_error(admin_trans('player_recharge_record.not_fount')); + } + if ($playerRechargeRecord->type != PlayerRechargeRecord::TYPE_REGULAR && $playerRechargeRecord->type != PlayerRechargeRecord::TYPE_ACTIVITY) { + return message_error(admin_trans('player_recharge_record.recharge_record_error')); + } + switch ($playerRechargeRecord->status) { + case PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS: + return message_warning(admin_trans('player_recharge_record.recharge_record_has_pass')); + case PlayerRechargeRecord::STATUS_RECHARGED_FAIL: + return message_warning(admin_trans('player_recharge_record.recharge_record_has_fail')); + case PlayerRechargeRecord::STATUS_RECHARGED_CANCEL: + return message_warning(admin_trans('player_recharge_record.recharge_record_has_cancel')); + case PlayerRechargeRecord::STATUS_RECHARGED_REJECT: + return message_warning(admin_trans('player_recharge_record.recharge_record_has_reject')); + case PlayerRechargeRecord::STATUS_RECHARGED_SYSTEM_CANCEL: + return message_warning(admin_trans('player_recharge_record.recharge_record_has_system_cancel')); + } + try { + // 生成订单 + $playerRechargeRecord->status = PlayerRechargeRecord::STATUS_RECHARGED_REJECT; + $playerRechargeRecord->reject_reason = $form->input('reject_reason'); + $playerRechargeRecord->finish_time = date('Y-m-d H:i:s'); + $playerRechargeRecord->user_id = Admin::id() ?? 0; + $playerRechargeRecord->user_name = !empty(Admin::user()) ? Admin::user()->username : ''; + if ($playerRechargeRecord->save()) { + saveChannelFinancialRecord($playerRechargeRecord, ChannelFinancialRecord::ACTION_RECHARGE_REJECT); + } + } catch (\Exception $e) { + return message_error(admin_trans('player_recharge_record.action_error')); + } + return message_success(admin_trans('player_recharge_record.action_success')); + }); + }); + } + + /** + * 充值订单审核通过 + * @param $id + * @auth true + * @group channel + * @return Msg + */ + public function pass($id): Msg + { + /** @var PlayerRechargeRecord $playerRechargeRecord */ + $playerRechargeRecord = $this->model::find($id); + if (empty($playerRechargeRecord)) { + return message_error(admin_trans('player_recharge_record.not_fount')); + } + if ($playerRechargeRecord->type != PlayerRechargeRecord::TYPE_REGULAR && $playerRechargeRecord->type != PlayerRechargeRecord::TYPE_ACTIVITY) { + return message_error(admin_trans('player_recharge_record.recharge_record_error')); + } + switch ($playerRechargeRecord->status) { + case PlayerRechargeRecord::STATUS_WAIT: + return message_warning(admin_trans('player_recharge_record.recharge_record_not_complete')); + case PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS: + return message_warning(admin_trans('player_recharge_record.recharge_record_has_pass')); + case PlayerRechargeRecord::STATUS_RECHARGED_FAIL: + return message_warning(admin_trans('player_recharge_record.recharge_record_has_fail')); + case PlayerRechargeRecord::STATUS_RECHARGED_CANCEL: + return message_warning(admin_trans('player_recharge_record.recharge_record_has_cancel')); + case PlayerRechargeRecord::STATUS_RECHARGED_REJECT: + return message_warning(admin_trans('player_recharge_record.recharge_record_has_reject')); + case PlayerRechargeRecord::STATUS_RECHARGED_SYSTEM_CANCEL: + return message_warning(admin_trans('player_recharge_record.recharge_record_has_system_cancel')); + } + /** @var Channel $channel */ + $channel = Channel::where('department_id', Admin::user()->department_id)->first(); + if (empty($channel)) { + return message_error(admin_trans('channel.not_fount')); + } + DB::beginTransaction(); + try { + $firstRecharge = PlayerRechargeRecord::query() + ->where('player_id', $playerRechargeRecord->player_id) + ->where('status', 2) + ->where('setting_id', '>', 0) + ->doesntExist(); + if (!$firstRecharge) { + $playerRechargeRecord->gift_coins = 0; + } + $beforeGameAmount = $playerRechargeRecord->player->wallet->money; + // 生成订单 + $playerRechargeRecord->status = PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS; + $playerRechargeRecord->finish_time = date('Y-m-d H:i:s'); + $playerRechargeRecord->user_id = Admin::id() ?? 0; + $playerRechargeRecord->user_name = !empty(Admin::user()) ? Admin::user()->username : ''; + $allCoins = bcadd($playerRechargeRecord->coins, $playerRechargeRecord->gift_coins, 2); + $playerRechargeRecord->player->wallet->money = bcadd($playerRechargeRecord->player->wallet->money, $allCoins, 2); + $playerRechargeRecord->player->player_extend->recharge_amount = bcadd($playerRechargeRecord->player->player_extend->recharge_amount, $allCoins, 2); + + // 寫入金流明細 + $playerDeliveryRecord = new PlayerDeliveryRecord; + $playerDeliveryRecord->player_id = $playerRechargeRecord->player_id; + $playerDeliveryRecord->department_id = $playerRechargeRecord->department_id; + $playerDeliveryRecord->target = $playerRechargeRecord->getTable(); + $playerDeliveryRecord->target_id = $playerRechargeRecord->id; + $playerDeliveryRecord->type = PlayerDeliveryRecord::TYPE_RECHARGE; + $playerDeliveryRecord->source = 'self_recharge'; + $playerDeliveryRecord->amount = $allCoins; + $playerDeliveryRecord->amount_before = $beforeGameAmount; + $playerDeliveryRecord->amount_after = $playerRechargeRecord->player->wallet->money; + $playerDeliveryRecord->tradeno = $playerRechargeRecord->tradeno ?? ''; + $playerDeliveryRecord->remark = $playerRechargeRecord->remark ?? ''; + $playerDeliveryRecord->save(); + // 更新渠道信息 + $channel->recharge_amount = bcadd($channel->recharge_amount, $allCoins, 2); + $channel->save(); + $playerRechargeRecord->push(); + // 記錄財務操作 + saveChannelFinancialRecord($playerRechargeRecord, ChannelFinancialRecord::ACTION_RECHARGE_PASS); + DB::commit(); + sendSocketMessage('private-recharge_withdrawal', [ + 'msg_type' => 'withdrawal', + 'player_id' => $playerRechargeRecord->player_id, + 'amount' => $playerRechargeRecord->player->wallet->money, + ]); + } catch (\Exception $e) { + DB::rollBack(); + Log::error('充值错误', [$e->getTrace()]); + return message_error(admin_trans('player_recharge_record.action_error') . $e->getMessage() . $e->getLine()); + } + return message_success(admin_trans('player_recharge_record.action_success'))->refresh(); + } + + + /** + * 查看付款凭证 + * @auth true + * @group channel + * @param $data + * @return Detail + */ + public function rechargeCertificate($data): Detail + { + return Detail::create($data, function (Detail $detail) { + $detail->item('certificate')->display(function ($val) { + if (!empty($val)) { + $image = Image::create() + ->width(100) + ->height(100) + ->style(['objectFit' => 'cover']) + ->src($val); + } + return Html::create()->content([ + $image ?? EmptyStatus::create()->style(['margin' => '0 160px !important']) + ])->style(['margin' => '0 auto']); + }); + })->column(1); + } + + /** + * 查看充值账号配置 + * @auth true + * @group channel + * @param $setting_id + * @return Detail + */ + public function rechargeSetting($setting_id): Detail + { + $lang = Container::getInstance()->translator->getLocale(); + /** @var ChannelRechargeSetting $data */ + $data = ChannelRechargeSetting::find($setting_id); + /** @var ChannelRechargeMethodLang $methodLang */ + $methodLang = $data->channel_recharge_method->methodLang->where('lang', $lang)->first(); + return Detail::create([ + 'bank_name' => $methodLang->bank_name ?? '', + 'sub_bank' => $methodLang->sub_bank ?? '', + 'owner' => $methodLang->owner ?? '', + 'account' => $data->channel_recharge_method->account, + ], function (Detail $detail) { + $detail->item('bank_name', admin_trans('channel_recharge_method.fields.bank_name')); + $detail->item('sub_bank', admin_trans('channel_recharge_method.fields.sub_bank')); + $detail->item('owner', admin_trans('channel_recharge_method.fields.owner')); + $detail->item('account', admin_trans('channel_recharge_method.fields.account')); + })->column(2); + } + + /** + * 筛选玩家下拉 + * @return mixed + */ + public function getPlayerOptions() + { + $request = Request::input(); + $player = Player::orderBy('created_at', 'desc') + ->forPage(1, 20); + if (!empty($request['search'])) { + $player->where('phone', 'like', '%' . $request['search'] . '%'); + } + $playerList = $player->get(); + $data = []; + /** @var Player $player */ + foreach ($playerList as $player) { + $data[] = [ + 'value' => $player->id, + 'label' => $player->phone, + ]; + } + return Response::success($data); + } +} diff --git a/addons/webman/controller/ChannelWithdrawRecordController.php b/addons/webman/controller/ChannelWithdrawRecordController.php new file mode 100644 index 0000000..a8a5f09 --- /dev/null +++ b/addons/webman/controller/ChannelWithdrawRecordController.php @@ -0,0 +1,846 @@ +model = plugin()->webman->config('database.player_withdraw_record_model'); + $this->rechargeModel = plugin()->webman->config('database.player_recharge_record_model'); + } + + /** + * 提现审核 + * @group channel + * @auth true + */ + public function examineList(): Grid + { + return Grid::create(new $this->model(), function (Grid $grid) { + $grid->title(admin_trans('player_withdraw_record.examine_title')); + $grid->bordered(true); + $grid->autoHeight(); + $tradeno = Request::input('tradeno', []); + if (!empty($tradeno)) { + $grid->model()->where('tradeno', $tradeno); + } + $grid->model()->with(['player']) + ->where('type', PlayerWithdrawRecord::TYPE_SELF) + ->orWhere('status',PlayerWithdrawRecord::STATUS_WAIT) + ->orderBy('created_at', 'desc') + ->orderBy('status', 'asc'); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (!empty($exAdminFilter)) { + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->where('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->where('created_at', '<=', $exAdminFilter['created_at_end']); + } + } + $grid->column('id', admin_trans('player_withdraw_record.fields.id'))->align('center'); + $grid->column('tradeno', admin_trans('player_withdraw_record.fields.tradeno'))->copy(); + $grid->column('player.uuid', admin_trans('player.fields.uuid'))->copy(); + $grid->column('player.name', admin_trans('player_withdraw_record.fields.player'))->display(function ($val, PlayerWithdrawRecord $data) { + if (!empty($data->player)) { + $image = isset($data->player->avatar) && !empty($data->player->avatar) ? Avatar::create()->src($data->player->avatar) : Avatar::create()->icon(Icon::create('UserOutlined')); + return Html::create()->content([ + $image, + Html::div()->content($val) + ]); + } + return ''; + })->align('center'); + $grid->column('money', admin_trans('player_withdraw_record.fields.money'))->display(function ($val, PlayerWithdrawRecord $data) { + return bcdiv($val,$data->rate, 2) . ' ' . ($data->currency == 'TALK' ? 'Q币' : $data->currency); + })->align('center'); + $grid->column('coins', admin_trans('player_withdraw_record.fields.coins'))->align('center'); + $grid->column('type', admin_trans('player_withdraw_record.fields.type'))->display(function ($val) { + switch ($val) { + case PlayerWithdrawRecord::TYPE_SELF: + return Tag::create(admin_trans('player_withdraw_record.type.' . $val)) + ->color('#3b5999'); + default: + return ''; + } + })->align('center'); + $grid->column('withdraw_setting_info', + admin_trans('player_withdraw_record.player_bank'))->display(function ( + $val, + PlayerWithdrawRecord $data + ) { + $info = []; + switch ($data->type) { + case PlayerWithdrawRecord::TYPE_USDT: + $info[] = Html::markdown('- ' . admin_trans('channel_recharge_setting.fields.wallet_address') . ': ' . $data->wallet_address); + $info[] = Html::div()->content(Image::create() + ->width(40) + ->src($data->qr_code)); + break; + case PlayerWithdrawRecord::TYPE_SELF: + $info[] = Html::markdown('- ' . admin_trans('player_withdraw_record.fields.account_name') . ': ' . $data->account_name); + $info[] = Html::markdown('- ' . admin_trans('player_withdraw_record.fields.bank_name') . ': ' . $data->bank_name); + $info[] = Html::markdown('- ' . admin_trans('player_withdraw_record.fields.account') . ': ' . $data->account); + break; + } + return Html::create()->content($info); + })->align('left'); + $grid->column('status', admin_trans('player_withdraw_record.fields.status')) + ->display(function ($value, PlayerWithdrawRecord $data) { + $rejectReason = $data->reject_reason; + switch ($value) { + case PlayerWithdrawRecord::STATUS_SUCCESS: + $tag = Tag::create(admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_SUCCESS))->color('#87d068'); + break; + case PlayerWithdrawRecord::STATUS_WAIT: + $tag = Tag::create(admin_trans('player_withdraw_record.status_wait'))->color('#108ee9'); + break; + case PlayerWithdrawRecord::STATUS_FAIL: + $tag = Tag::create(admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_FAIL))->color('#f50'); + break; + case PlayerWithdrawRecord::STATUS_PENDING_REJECT: + $tag = Tag::create(admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_PENDING_REJECT))->color('#cd201f'); + break; + case PlayerWithdrawRecord::STATUS_PENDING_PAYMENT: + $tag = Tag::create(admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_PENDING_PAYMENT))->color('#3b5999'); + break; + case PlayerWithdrawRecord::STATUS_CANCEL: + case PlayerWithdrawRecord::STATUS_SYSTEM_CANCEL: + $tag = Tag::create(admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_CANCEL))->color('#2db7f5'); + break; + default: + $tag = ''; + } + if (!empty($rejectReason)) { + return ToolTip::create(Badge::create( + $tag + )->count('!')->title(''))->title($rejectReason)->color('orange'); + } else { + return $tag; + } + })->align('center')->sortable(); + $grid->column('created_at', admin_trans('player_withdraw_record.fields.created_at'))->sortable()->align('center'); + $grid->column('remark', admin_trans('player_withdraw_record.fields.remark'))->display(function ($value) { + return Str::of($value)->limit(20, ' (...)'); + })->editable( + (new Editable)->textarea('remark') + ->showCount() + ->rows(5) + ->rule(['max:255' => admin_trans('player_withdraw_record.fields.remark')]) + )->width('150px')->align('center'); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->expandFilter(); + $grid->actions(function (Actions $actions, PlayerWithdrawRecord $data) { + $actions->hideDel(); + $actions->hideEdit(); + $dropdown = Dropdown::create( + Button::create([ + admin_trans('player_withdraw_record.btn.action'), Icon::create('DownOutlined')->style(['marginRight' => '5px']) + ]))->trigger(['click']); + + $dropdown->item(admin_trans('player_withdraw_record.btn.view_channel_recharge_list'), 'AppstoreAddOutlined') + ->modal($this->viewRechargeList($data->player_id))->width('70%'); + + $dropdown->item(admin_trans('player_withdraw_record.btn.examine_pass'), 'SafetyCertificateOutlined') + ->confirm(admin_trans('player_withdraw_record.btn.examine_pass_confirm'), [$this, 'pass'], ['id' => $data->id])->gridRefresh(); + + $dropdown->item(admin_trans('player_withdraw_record.btn.examine_reject'), 'WarningFilled') + ->modal([$this, 'reject'], ['id' => $data->id]); + $actions->prepend( + $dropdown + ); + }); + $grid->filter(function (Filter $filter) { + $filter->like()->text('player.uuid')->placeholder(admin_trans('player.fields.uuid')); + $filter->like()->text('player.name')->placeholder(admin_trans('player.fields.name')); + $filter->eq()->select('status') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('player_withdraw_record.fields.status')) + ->options([ + PlayerWithdrawRecord::STATUS_WAIT => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_WAIT), + PlayerWithdrawRecord::STATUS_SUCCESS => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_SUCCESS), + PlayerWithdrawRecord::STATUS_FAIL => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_FAIL), + PlayerWithdrawRecord::STATUS_PENDING_PAYMENT => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_PENDING_PAYMENT), + PlayerWithdrawRecord::STATUS_PENDING_REJECT => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_PENDING_REJECT), + PlayerWithdrawRecord::STATUS_CANCEL => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_CANCEL), + PlayerWithdrawRecord::STATUS_SYSTEM_CANCEL => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_SYSTEM_CANCEL), + ]); + $filter->like()->text('tradeno')->placeholder(admin_trans('player_withdraw_record.fields.tradeno')); + $filter->eq()->number('money')->precision(2)->style(['width' => '150px'])->placeholder(admin_trans('player_withdraw_record.fields.money')); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateTimeRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('player_withdraw_record.fields.created_at'), admin_trans('player_withdraw_record.fields.created_at')]); + }); + }); + } + + /** + * 提现打款 + * @group channel + * @auth true + */ + public function paymentList(): Grid + { + return Grid::create(new $this->model(), function (Grid $grid) { + $grid->title(admin_trans('player_withdraw_record.payment_title')); + $grid->bordered(true); + $grid->autoHeight(); + $grid->model()->with(['player']) + ->Where('status', PlayerWithdrawRecord::STATUS_PENDING_PAYMENT) + ->orderBy('created_at', 'desc'); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (!empty($exAdminFilter)) { + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->where('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->where('created_at', '<=', $exAdminFilter['created_at_end']); + } + } + $grid->column('id', admin_trans('player_withdraw_record.fields.id'))->align('center'); + $grid->column('tradeno', admin_trans('player_withdraw_record.fields.tradeno'))->copy(); + $grid->column('player.uuid', admin_trans('player.fields.uuid'))->copy(); + $grid->column('player.name', admin_trans('player_withdraw_record.fields.player'))->display(function ($val, PlayerWithdrawRecord $data) { + if (!empty($data->player)) { + $image = isset($data->player->avatar) && !empty($data->player->avatar) ? Avatar::create()->src($data->player->avatar) : Avatar::create()->icon(Icon::create('UserOutlined')); + return Html::create()->content([ + $image, + Html::div()->content($val) + ]); + } + return ''; + })->align('center'); + $grid->column('money', admin_trans('player_withdraw_record.fields.money'))->display(function ($val, PlayerWithdrawRecord $data) { + return bcdiv($val,$data->rate, 2) . ' ' . ( $data->currency); + })->align('center')->sortable(); + $grid->column('coins', admin_trans('player_withdraw_record.fields.coins'))->align('center'); + $grid->column('type', admin_trans('player_withdraw_record.fields.type'))->display(function ($val) { + return Tag::create(admin_trans('player_withdraw_record.type.' . $val)) + ->color('#3b5999'); + })->align('center'); + $grid->column('withdraw_setting_info', + admin_trans('player_withdraw_record.player_bank'))->display(function ( + $val, + PlayerWithdrawRecord $data + ) { + $info = []; + switch ($data->type) { + case PlayerWithdrawRecord::TYPE_USDT: + $info[] = Html::markdown('- ' . admin_trans('channel_recharge_setting.fields.wallet_address') . ': ' . $data->wallet_address); + $info[] = Html::div()->content(Image::create() + ->width(40) + ->src($data->qr_code)); + break; + case PlayerWithdrawRecord::TYPE_SELF: + $info[] = Html::markdown('- ' . admin_trans('player_withdraw_record.fields.account_name') . ': ' . $data->account_name); + $info[] = Html::markdown('- ' . admin_trans('player_withdraw_record.fields.bank_name') . ': ' . $data->bank_name); + $info[] = Html::markdown('- ' . admin_trans('player_withdraw_record.fields.account') . ': ' . $data->account); + break; + } + return Html::create()->content($info); + })->align('left'); + $grid->column('status', admin_trans('player_withdraw_record.fields.status')) + ->display(function () { + return Html::create()->content([ + Tag::create(admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_PENDING_PAYMENT))->color('#3b5999') + ]); + })->sortable(); + $grid->column('created_at', admin_trans('player_withdraw_record.fields.created_at'))->sortable()->align('center'); + $grid->column('remark', admin_trans('player_withdraw_record.fields.remark'))->display(function ($value) { + return Str::of($value)->limit(20, ' (...)'); + })->tip()->width('150px')->align('center'); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->expandFilter(); + $grid->actions(function (Actions $actions, PlayerWithdrawRecord $data) { + $actions->hideDel(); + $actions->hideEdit(); + $actions->prepend( + Button::create(admin_trans('player_withdraw_record.btn.complete_payment')) + ->type('danger') + ->modal($this->payment($data->id)) + ); + }); + $grid->filter(function (Filter $filter) { + $filter->like()->text('player.uuid')->placeholder(admin_trans('player.fields.uuid')); + $filter->like()->text('player.name')->placeholder(admin_trans('player.fields.name')); + $filter->like()->text('tradeno')->placeholder(admin_trans('player_withdraw_record.fields.tradeno')); + $filter->eq()->number('money')->precision(2)->style(['width' => '150px'])->placeholder(admin_trans('player_withdraw_record.fields.money')); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateTimeRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('player_withdraw_record.fields.created_at'), admin_trans('player_withdraw_record.fields.created_at')]); + }); + }); + } + + /** + * 提交打款凭证 + * @auth true + * @group channel + * @param $id + * @return Form + */ + public function payment($id): Form + { + return Form::create(new $this->model(), function (Form $form) use ($id) { + $form->file('certificate') + ->ext('jpg,png,jpeg') + ->type('image') + ->fileSize('2m') + ->hideFinder() + ->paste() + ->style(['margin-left' => '35%', 'margin-bottom' => '16px']) + ->help(Html::create()->content(admin_trans('player_withdraw_record.certificate_help'))->style([ + 'margin-left' => '135px', + 'display' => 'block', + 'width' => '235px' + ])); + $form->saving(function (Form $form) use ($id) { + if (empty($form->input('certificate'))) { + return message_warning(admin_trans('player_withdraw_record.certificate_required')); + } + /** @var PlayerWithdrawRecord $playerWithdrawRecord */ + $playerWithdrawRecord = $this->model::find($id); + if (empty($playerWithdrawRecord)) { + return message_error(admin_trans('player_withdraw_record.not_fount')); + } + switch ($playerWithdrawRecord->status) { + case PlayerWithdrawRecord::STATUS_WAIT: + return message_warning(admin_trans('player_withdraw_record.withdraw_record_has_not_examine')); + case PlayerWithdrawRecord::STATUS_SUCCESS: + return message_warning(admin_trans('player_withdraw_record.withdraw_record_has_complete')); + case PlayerWithdrawRecord::STATUS_FAIL: + return message_warning(admin_trans('player_withdraw_record.withdraw_record_has_fail')); + case PlayerWithdrawRecord::STATUS_CANCEL: + return message_warning(admin_trans('player_withdraw_record.withdraw_record_has_cancel')); + case PlayerWithdrawRecord::STATUS_PENDING_REJECT: + return message_warning(admin_trans('player_withdraw_record.withdraw_record_has_reject')); + case PlayerWithdrawRecord::STATUS_SYSTEM_CANCEL: + return message_warning(admin_trans('player_withdraw_record.withdraw_record_has_system_cancel')); + } + if ($playerWithdrawRecord->status != PlayerWithdrawRecord::STATUS_PENDING_PAYMENT) { + return message_error(admin_trans('player_withdraw_record.withdraw_record_status_error')); + } + /** @var Channel $channel */ + $channel = Channel::where('department_id', Admin::user()->department_id)->first(); + if (empty($channel)) { + return message_error(admin_trans('channel.not_fount')); + } + try { + // 更新订单 + $playerWithdrawRecord->certificate = $form->input('certificate'); + $playerWithdrawRecord->status = PlayerWithdrawRecord::STATUS_SUCCESS; + $playerWithdrawRecord->finish_time = date('Y-m-d H:i:s'); + if ($playerWithdrawRecord->save()) { + saveChannelFinancialRecord($playerWithdrawRecord, ChannelFinancialRecord::ACTION_WITHDRAW_PAYMENT); + // 更新渠道数据 + $channel->withdraw_amount = bcadd($channel->withdraw_amount, $playerWithdrawRecord->coins, 2); + $channel->save(); + } + } catch (\Exception $e) { + return message_error(admin_trans('player_recharge_record.action_error')); + } + + return message_success(admin_trans('player_withdraw_record.action_success')); + }); + }); + } + + /** + * 查看充值 + * @group channel + * @auth true + */ + public function viewRechargeList($playerId): Grid + { + return Grid::create(new $this->rechargeModel(), function (Grid $grid) use ($playerId) { + $grid->title(admin_trans('player_recharge_record.title')); + $grid->model()->where('status', PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS)->where('player_id', $playerId)->orderBy('created_at', 'desc'); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (!empty($exAdminFilter)) { + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->where('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->where('created_at', '<=', $exAdminFilter['created_at_end']); + } + if (isset($exAdminFilter['finish_time_start']) && !empty($exAdminFilter['finish_time_start'])) { + $grid->model()->where('finish_time', '>=', $exAdminFilter['finish_time_start']); + } + if (isset($exAdminFilter['finish_time_end']) && !empty($exAdminFilter['finish_time_end'])) { + $grid->model()->where('finish_time', '<=', $exAdminFilter['finish_time_end']); + } + } + $grid->column('tradeno', admin_trans('player_recharge_record.fields.tradeno'))->align('center'); + $grid->column('player.uuid', admin_trans('player.fields.uuid'))->align('center'); + $grid->column('player.name', admin_trans('player_recharge_record.fields.player'))->display(function ($val, PlayerRechargeRecord $data) { + if (!empty($data->player)) { + $image = isset($data->player->avatar) && !empty($data->player->avatar) ? Avatar::create()->src($data->player->avatar) : Avatar::create()->icon(Icon::create('UserOutlined')); + return Html::create()->content([ + $image, + Html::div()->content($val) + ]); + } + return ''; + })->align('center'); + $grid->column('money', admin_trans('player_recharge_record.fields.money'))->display(function ($val, PlayerRechargeRecord $data) { + return $val . ' ' . ($data->currency == 'TALK' ? admin_trans('player_recharge_record.talk_currency') : $data->currency); + })->align('center'); + $grid->column('coins', admin_trans('player_recharge_record.fields.coins'))->align('center'); + $grid->column('status', admin_trans('player_recharge_record.fields.status'))->display(function ($val) { + switch ($val) { + case PlayerRechargeRecord::STATUS_WAIT: + return Tag::create(admin_trans('player_recharge_record.status.' . $val)) + ->color('#108ee9'); + case PlayerRechargeRecord::STATUS_RECHARGING: + return Tag::create(admin_trans('player_recharge_record.status.' . $val)) + ->color('#3b5999'); + case PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS: + return Tag::create(admin_trans('player_recharge_record.status.' . $val)) + ->color('#87d068'); + case PlayerRechargeRecord::STATUS_RECHARGED_FAIL: + return Tag::create(admin_trans('player_recharge_record.status.' . $val)) + ->color('#f50'); + case PlayerRechargeRecord::STATUS_RECHARGED_CANCEL: + return Tag::create(admin_trans('player_recharge_record.status.' . $val)) + ->color('#2db7f5'); + default: + return ''; + } + })->align('center'); + $grid->column('remark', admin_trans('player_recharge_record.fields.remark'))->display(function ($value) { + return Str::of($value)->limit(20, ' (...)'); + })->editable( + (new Editable)->textarea('remark') + ->showCount() + ->rows(5) + ->rule(['max:255' => admin_trans('player_recharge_record.fields.remark')]) + )->width('150px')->align('center'); + $grid->column('user_name', admin_trans('player_recharge_record.fields.user_name'))->align('center'); + $grid->column('finish_time', admin_trans('player_recharge_record.fields.finish_time'))->sortable()->align('center'); + $grid->column('created_at', admin_trans('player_recharge_record.fields.created_at'))->sortable()->align('center'); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->actions(function (Actions $actions) { + $actions->hideDel(); + $actions->hideEdit(); + }); + $grid->filter(function (Filter $filter) { + $filter->like()->text('tradeno')->placeholder(admin_trans('player_recharge_record.fields.tradeno')); + $filter->eq()->number('money')->precision(2)->style(['width' => '150px'])->placeholder(admin_trans('player_recharge_record.fields.money')); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateTimeRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]); + $filter->form()->hidden('finish_time_start'); + $filter->form()->hidden('finish_time_end'); + $filter->form()->dateTimeRange('finish_time_start', 'finish_time_end', '')->placeholder([admin_trans('player_recharge_record.fields.finish_time'), admin_trans('player_recharge_record.fields.finish_time')]); + }); + $grid->expandFilter(); + }); + } + + /** + * 提现订单审核拒绝 + * @auth true + * @group channel + * @param $id + * @return Form + */ + public function reject($id): Form + { + return Form::create(new $this->model(), function (Form $form) use ($id) { + $form->textarea('reject_reason')->rows(5)->required(); + $form->saving(function (Form $form) use ($id) { + /** @var PlayerWithdrawRecord $playerWithdrawRecord */ + $playerWithdrawRecord = $this->model::find($id); + if (empty($playerWithdrawRecord)) { + return message_error(admin_trans('player_withdraw_record.not_fount')); + } + switch ($playerWithdrawRecord->status) { + case PlayerWithdrawRecord::STATUS_SUCCESS: + return message_warning(admin_trans('player_withdraw_record.withdraw_record_has_complete')); + case PlayerWithdrawRecord::STATUS_FAIL: + return message_warning(admin_trans('player_withdraw_record.withdraw_record_has_fail')); + case PlayerWithdrawRecord::STATUS_CANCEL: + return message_warning(admin_trans('player_withdraw_record.withdraw_record_has_cancel')); + case PlayerWithdrawRecord::STATUS_PENDING_REJECT: + return message_warning(admin_trans('player_withdraw_record.withdraw_record_has_reject')); + case PlayerWithdrawRecord::STATUS_SYSTEM_CANCEL: + return message_warning(admin_trans('player_withdraw_record.withdraw_record_has_system_cancel')); + case PlayerWithdrawRecord::STATUS_PENDING_PAYMENT: + return message_warning(admin_trans('player_withdraw_record.withdraw_record_has_pass')); + } + if ($playerWithdrawRecord->status != PlayerWithdrawRecord::STATUS_WAIT) { + return message_error(admin_trans('player_withdraw_record.withdraw_record_status_error')); + } + try { + if (withdrawBack($playerWithdrawRecord, $form->input('reject_reason'))) { + saveChannelFinancialRecord($playerWithdrawRecord, ChannelFinancialRecord::ACTION_WITHDRAW_REJECT); + } + } catch (\Exception $e) { + return message_error(admin_trans('player_withdraw_record.action_error')); + } + return message_success(admin_trans('player_withdraw_record.action_success')); + }); + }); + } + + /** + * 提现订单审核通过 + * @param $id + * @auth true + * @group channel + * @return Msg + */ + public function pass($id): Msg + { + /** @var PlayerWithdrawRecord $playerWithdrawRecord */ + $playerWithdrawRecord = $this->model::find($id); + if (empty($playerWithdrawRecord)) { + return message_error(admin_trans('player_withdraw_record.not_fount')); + } + + switch ($playerWithdrawRecord->status) { + case PlayerWithdrawRecord::STATUS_SUCCESS: + return message_warning(admin_trans('player_withdraw_record.withdraw_record_has_complete')); + case PlayerWithdrawRecord::STATUS_FAIL: + return message_warning(admin_trans('player_withdraw_record.withdraw_record_has_fail')); + case PlayerWithdrawRecord::STATUS_CANCEL: + return message_warning(admin_trans('player_withdraw_record.withdraw_record_has_cancel')); + case PlayerWithdrawRecord::STATUS_PENDING_REJECT: + return message_warning(admin_trans('player_withdraw_record.withdraw_record_has_reject')); + case PlayerWithdrawRecord::STATUS_SYSTEM_CANCEL: + return message_warning(admin_trans('player_withdraw_record.withdraw_record_has_system_cancel')); + case PlayerWithdrawRecord::STATUS_PENDING_PAYMENT: + return message_warning(admin_trans('player_withdraw_record.withdraw_record_has_pass')); + } + if ($playerWithdrawRecord->status != PlayerWithdrawRecord::STATUS_WAIT) { + return message_error(admin_trans('player_withdraw_record.withdraw_record_status_error')); + } + try { + if ($playerWithdrawRecord->type == PlayerWithdrawRecord::TYPE_SKLPAYOUT) { + $params = [ + 'amount' => $playerWithdrawRecord->coins, + 'bankCode' => $playerWithdrawRecord->bank_code, + 'bankAccountNo' => $playerWithdrawRecord->account, + 'bankAccountName' => $playerWithdrawRecord->account_name, + 'orderNo' => $playerWithdrawRecord->tradeno, + ]; + $res = (new SklPayServices())->payout($params); + if ($res['code'] == 'success') { + // 更新订单 + $playerWithdrawRecord->user_id = Admin::id() ?? 0; + $playerWithdrawRecord->user_name = !empty(Admin::user()) ? Admin::user()->username : ''; + $notice = new Notice(); + $notice->department_id = $playerWithdrawRecord->player->department_id; + $notice->player_id = $playerWithdrawRecord->player_id; + $notice->source_id = $playerWithdrawRecord->id; + $notice->type = Notice::TYPE_WITHDRAW; + $notice->receiver = Notice::RECEIVER_PLAYER; + $notice->is_private = 1; + $notice->title = '下分成功'; + $notice->content = '本次申请已成功处理,下分 ' . $playerWithdrawRecord->money . ' ,请查收。 '; + $notice->save(); + if ($playerWithdrawRecord->save()) { + saveChannelFinancialRecord($playerWithdrawRecord, ChannelFinancialRecord::ACTION_WITHDRAW_PASS); + } + } else { + return message_error($res['message']); + } + } elseif (in_array($playerWithdrawRecord->type, [PlayerWithdrawRecord::TYPE_SELF, PlayerWithdrawRecord::TYPE_USDT])) { + $playerWithdrawRecord->status = PlayerWithdrawRecord::STATUS_PENDING_PAYMENT; + $playerWithdrawRecord->user_id = Admin::id() ?? 0; + $playerWithdrawRecord->user_name = !empty(Admin::user()) ? Admin::user()->username : ''; + if ($playerWithdrawRecord->save()) { + saveChannelFinancialRecord($playerWithdrawRecord, ChannelFinancialRecord::ACTION_WITHDRAW_PASS); + } + } + + } catch (\Exception $e) { + return message_error(admin_trans('player_withdraw_record.action_error')); + } + return message_success(admin_trans('player_withdraw_record.action_success')); + } + + /** + * 提现 + * @group channel + * @auth true + */ + public function index(): Grid + { + return Grid::create(new $this->model(), function (Grid $grid) { + $grid->title(admin_trans('player_withdraw_record.payment_title')); + $grid->model()->with(['player'])->orderBy('created_at', 'desc'); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (!empty($exAdminFilter)) { + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->where('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->where('created_at', '<=', $exAdminFilter['created_at_end']); + } + if (isset($exAdminFilter['finish_time_start']) && !empty($exAdminFilter['finish_time_start'])) { + $grid->model()->where('finish_time', '>=', $exAdminFilter['finish_time_start']); + } + if (isset($exAdminFilter['finish_time_end']) && !empty($exAdminFilter['finish_time_end'])) { + $grid->model()->where('finish_time', '<=', $exAdminFilter['finish_time_end']); + } + if (!empty($exAdminFilter['player']['uuid'])) { + $grid->model()->whereHas('player', function ($query) use ($exAdminFilter) { + $query->where('uuid', 'like', '%' . $exAdminFilter['player']['uuid'] . '%'); + }); + } + if (!empty($exAdminFilter['player']['name'])) { + $grid->model()->whereHas('player', function ($query) use ($exAdminFilter) { + $query->where('name', 'like', '%' . $exAdminFilter['player']['name'] . '%'); + }); + } + if (!empty($exAdminFilter['type'])) { + $grid->model()->where('type', $exAdminFilter['type']); + } + if (!empty($exAdminFilter['status'])) { + $grid->model()->where('status', $exAdminFilter['status']); + } + if (!empty($exAdminFilter['tradeno'])) { + $grid->model()->where('tradeno', $exAdminFilter['tradeno']); + } + } + $query = clone $grid->model(); + $totalData = $query->selectRaw( + 'ifNull(sum(money), 0) as total_money, + ifNull(sum(IF(type = 6, money,0)), 0) as total_skl_money' + )->first(); + $layout = Layout::create(); + $layout->row(function (Row $row) use ($totalData) { + $row->gutter([10, 0]); + $row->column( + Card::create([ + Row::create()->column(Statistic::create()->title(admin_trans('player_withdraw_record.total_money')) + ->value($totalData['total_money']) + ->style([ + 'font-size' => '15px', + 'text-align' => 'center' + ])), + ])->bodyStyle([ + 'display' => 'flex', + 'align-items' => 'center', + 'height' => '72px' + ])->hoverable()->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px']) + , 8); + $row->column( + Card::create([ + Row::create()->column(Statistic::create()->title(admin_trans('player_withdraw_record.total_inmoney')) + ->value(bcadd(bcsub($totalData['total_money'], $totalData['total_skl_money'], 3), bcmul($totalData['total_skl_money'], 1.008, 3), 3)) + ->style([ + 'font-size' => '15px', + 'text-align' => 'center' + ])), + ])->bodyStyle([ + 'display' => 'flex', + 'align-items' => 'center', + 'height' => '72px' + ])->hoverable()->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px']) + , 8); + })->style(['background' => '#fff']); + $grid->header($layout); + $grid->bordered(true); + $grid->autoHeight(); + $grid->column('id', admin_trans('player_withdraw_record.fields.id'))->align('center')->fixed(true); + $grid->column('tradeno', admin_trans('player_withdraw_record.fields.tradeno'))->copy()->fixed(true); + $grid->column('player.uuid', admin_trans('player.fields.uuid'))->copy()->fixed(true); + $grid->column('player.name', admin_trans('player_withdraw_record.fields.player'))->display(function ($val, PlayerWithdrawRecord $data) { + if (!empty($data->player)) { + $image = isset($data->player->avatar) && !empty($data->player->avatar) ? Avatar::create()->src($data->player->avatar) : Avatar::create()->icon(Icon::create('UserOutlined')); + return Html::create()->content([ + $image, + Html::div()->content($val) + ]); + } + return ''; + })->align('center'); + $grid->column('money', admin_trans('player_withdraw_record.fields.money'))->display(function ($val, PlayerWithdrawRecord $data) { + return bcdiv($val,$data->rate, 2) . ' ' . ($data->currency == 'TALK' ? 'Q币' : $data->currency); + })->align('center')->sortable(); + $grid->column('inmoney', admin_trans('player_recharge_record.fields.inmoney'))->display(function ($val, PlayerWithdrawRecord $data) { + if ($data->type == PlayerWithdrawRecord::TYPE_ESPAYOUT) { + $ratio = 1.005; + } elseif ($data->type == PlayerWithdrawRecord::TYPE_ONEPAYOUT){ + $ratio = 1.008; + } elseif ($data->type == PlayerWithdrawRecord::TYPE_SKLPAYOUT){ + $ratio = 1.008; + } else { + $ratio = 1; + } + if ($data->currency == 'USDT') { + return bcdiv($val,$data->rate, 2) . ' ' . ($data->currency); + } + return $data->money * $ratio . ' ' . ($data->currency); + })->align('center'); + $grid->column('coins', admin_trans('player_withdraw_record.fields.coins'))->align('center'); + $grid->column('type', admin_trans('player_withdraw_record.fields.type'))->display(function ($val) { + switch ($val) { + case PlayerWithdrawRecord::TYPE_SELF: + return Tag::create(admin_trans('player_withdraw_record.type.' . $val)) + ->color('#3b5999'); + case PlayerWithdrawRecord::TYPE_ARTIFICIAL: + return Tag::create(admin_trans('player_withdraw_record.type.' . $val)) + ->color('#cd201f'); + case PlayerWithdrawRecord::TYPE_USDT: + return Tag::create(admin_trans('player_withdraw_record.type.' . $val)) + ->color('#2db7f5'); + case PlayerWithdrawRecord::TYPE_SKLPAYOUT: + return Tag::create(admin_trans('player_withdraw_record.type.' . $val)) + ->color('#108ee9'); + default: + return ''; + } + })->align('center'); + $grid->column('withdraw_setting_info', + admin_trans('player_withdraw_record.player_bank'))->display(function ( + $val, + PlayerWithdrawRecord $data + ) { + $info = []; + switch ($data->type) { + case PlayerWithdrawRecord::TYPE_USDT: + $info[] = Html::markdown('- ' . admin_trans('channel_recharge_setting.fields.wallet_address') . ': ' . $data->wallet_address); + $info[] = Html::div()->content(Image::create() + ->width(40) + ->src($data->qr_code)); + break; + case PlayerWithdrawRecord::TYPE_SELF: + $info[] = Html::markdown('- ' . admin_trans('player_withdraw_record.fields.account_name') . ': ' . $data->account_name); + $info[] = Html::markdown('- ' . admin_trans('player_withdraw_record.fields.bank_name') . ': ' . $data->bank_name); + $info[] = Html::markdown('- ' . admin_trans('player_withdraw_record.fields.account') . ': ' . $data->account); + break; + } + return Html::create()->content($info); + })->align('left'); + $grid->column('status', admin_trans('player_withdraw_record.fields.status')) + ->display(function ($value, PlayerWithdrawRecord $data) { + $rejectReason = $data->reject_reason; + switch ($value) { + case PlayerWithdrawRecord::STATUS_SUCCESS: + $tag = Tag::create(admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_SUCCESS))->color('#87d068'); + break; + case PlayerWithdrawRecord::STATUS_WAIT: + $tag = Tag::create(admin_trans('player_withdraw_record.status_wait'))->color('#108ee9'); + break; + case PlayerWithdrawRecord::STATUS_FAIL: + $tag = Tag::create(admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_FAIL))->color('#f50'); + break; + case PlayerWithdrawRecord::STATUS_PENDING_REJECT: + $tag = Tag::create(admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_PENDING_REJECT))->color('#cd201f'); + break; + case PlayerWithdrawRecord::STATUS_PENDING_PAYMENT: + $tag = Tag::create(admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_PENDING_PAYMENT))->color('#3b5999'); + break; + case PlayerWithdrawRecord::STATUS_CANCEL: + case PlayerWithdrawRecord::STATUS_SYSTEM_CANCEL: + $tag = Tag::create(admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_CANCEL))->color('#2db7f5'); + break; + default: + $tag = ''; + } + if (!empty($rejectReason)) { + return ToolTip::create(Badge::create( + $tag + )->count('!')->title(''))->title($rejectReason)->color('orange'); + } else { + return $tag; + } + })->align('center')->sortable(); + $grid->column('finish_time', admin_trans('player_withdraw_record.fields.finish_time'))->sortable()->align('center'); + $grid->column('created_at', admin_trans('player_withdraw_record.fields.created_at'))->sortable()->align('center'); + $grid->column('remark', admin_trans('player_withdraw_record.fields.remark'))->display(function ($value) { + return Str::of($value)->limit(20, ' (...)'); + })->tip()->width('150px')->align('center'); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->expandFilter(); + $grid->actions(function (Actions $actions) { + $actions->hideDel(); + $actions->hideEdit(); + }); + $grid->filter(function (Filter $filter) { + $filter->like()->text('player.uuid')->placeholder(admin_trans('player.fields.uuid')); + $filter->like()->text('player.name')->placeholder(admin_trans('player.fields.name')); + $filter->eq()->select('status') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('player_withdraw_record.fields.status')) + ->options([ + PlayerWithdrawRecord::STATUS_WAIT => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_WAIT), + PlayerWithdrawRecord::STATUS_SUCCESS => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_SUCCESS), + PlayerWithdrawRecord::STATUS_FAIL => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_FAIL), + PlayerWithdrawRecord::STATUS_PENDING_PAYMENT => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_PENDING_PAYMENT), + PlayerWithdrawRecord::STATUS_PENDING_REJECT => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_PENDING_REJECT), + PlayerWithdrawRecord::STATUS_CANCEL => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_CANCEL), + PlayerWithdrawRecord::STATUS_SYSTEM_CANCEL => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_SYSTEM_CANCEL), + ]); + $filter->eq()->select('type') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('player_withdraw_record.fields.type')) + ->options([ + PlayerWithdrawRecord::TYPE_ESPAYOUT => admin_trans('player_withdraw_record.type.' . PlayerWithdrawRecord::TYPE_ESPAYOUT), + PlayerWithdrawRecord::TYPE_ONEPAYOUT => admin_trans('player_withdraw_record.type.' . PlayerWithdrawRecord::TYPE_ONEPAYOUT), + PlayerWithdrawRecord::TYPE_SKLPAYOUT => admin_trans('player_withdraw_record.type.' . PlayerWithdrawRecord::TYPE_SKLPAYOUT), + PlayerWithdrawRecord::TYPE_ARTIFICIAL => admin_trans('player_withdraw_record.type.' . PlayerWithdrawRecord::TYPE_ARTIFICIAL), + ]); + $filter->like()->text('tradeno')->placeholder(admin_trans('player_withdraw_record.fields.tradeno')); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateTimeRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('player_withdraw_record.fields.created_at'), admin_trans('player_withdraw_record.fields.created_at')]); + $filter->form()->hidden('finish_time_start'); + $filter->form()->hidden('finish_time_end'); + $filter->form()->dateTimeRange('finish_time_start', 'finish_time_end', '')->placeholder([admin_trans('player_withdraw_record.fields.finish_time'), admin_trans('player_withdraw_record.fields.finish_time')]); + }); + }); + } +} diff --git a/addons/webman/controller/ConfigController.php b/addons/webman/controller/ConfigController.php new file mode 100644 index 0000000..2d28a75 --- /dev/null +++ b/addons/webman/controller/ConfigController.php @@ -0,0 +1,33 @@ +title(admin_trans('config.title')); + $form->layout('vertical'); + $form->image('web_logo', admin_trans('config.logo'))->size(80, 80); + $form->text('web_name', admin_trans('config.name')); + $form->text('web_miitbeian', admin_trans('config.miitbeian')); + $form->text('web_copyright', admin_trans('config.copyright')); + }); + } +} diff --git a/addons/webman/controller/CurrencyController.php b/addons/webman/controller/CurrencyController.php new file mode 100644 index 0000000..2dccc02 --- /dev/null +++ b/addons/webman/controller/CurrencyController.php @@ -0,0 +1,88 @@ +model = plugin()->webman->config('database.currency_model'); + + } + + /** + * 货币 + * @auth true + */ + public function index(): Grid + { + return Grid::create(new $this->model, function (Grid $grid) { + $grid->title(admin_trans('currency.title')); + $grid->bordered(); + $grid->autoHeight(); + $grid->column('id', admin_trans('currency.fields.id'))->align('center'); + $grid->column('name', admin_trans('currency.fields.name'))->display(function ($val, Currency $data) { + return admin_trans('currency.currency_name' . '.' . $data->identifying); + })->align('center'); + $grid->column('identifying', admin_trans('currency.fields.identifying'))->align('center'); + $grid->column('ratio', admin_trans('currency.fields.ratio'))->display(function ($val) { + return floatval($val); + })->append(' ' . admin_trans('currency.game_coins'))->align('center'); + $grid->column('status', admin_trans('currency.fields.status'))->switch([[1 => ''], [0 => '']])->align('center');; + $grid->column('admin_user.username', admin_trans('admin.fields.username'))->align('center'); + $grid->column('created_at', admin_trans('currency.fields.create_at'))->align('center'); + $grid->setForm()->modal($this->form()); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->actions(function (Actions $actions) { + $actions->hideDel(); + }); + }); + } + + /** + * 货币 + * @auth true + */ + public function form(): Form + { + return Form::create(new $this->model, function (Form $form) { + $disabledValue = Arr::pluck($this->model::select('identifying')->get()->toArray(), 'identifying'); + $form->title(admin_trans('currency.title')); + $form->select('identifying', admin_trans('currency.fields.identifying')) + ->disabled($form->isEdit()) + ->options(plugin()->webman->config('currency')) + ->disabledValue($disabledValue) + ->required(); + $form->number('ratio', admin_trans('currency.fields.ratio') . '=') + ->min(0) + ->max(1000000) + ->precision(4) + ->required() + ->style(['width' => '100%']) + ->addonAfter(admin_trans('currency.game_coins')); + $form->input('admin_id', Admin::id()); + $form->saving(function (Form $form) { + if (!$form->isEdit()) { + $identifying = $form->input('identifying'); + if ($this->model::where('identifying', $identifying)->first()) { + return message_error(admin_trans('currency.currency_has_exists')); + } + } + }); + }); + } +} diff --git a/addons/webman/controller/DepartmentController.php b/addons/webman/controller/DepartmentController.php new file mode 100644 index 0000000..3bd83d7 --- /dev/null +++ b/addons/webman/controller/DepartmentController.php @@ -0,0 +1,100 @@ +model = plugin()->webman->config('database.department_model'); + + } + + /** + * 部门 + * @auth true + */ + public function index(): Grid + { + return Grid::create(new $this->model, function (Grid $grid) { + $grid->title(admin_trans('department.title')); + $grid->model()->where('type', AdminDepartment::TYPE_DEPARTMENT); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (!empty($exAdminFilter)) { + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->whereDate('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->whereDate('created_at', '<=', $exAdminFilter['created_at_end']); + } + } + $grid->autoHeight(); + $grid->tree(); + $grid->column('name', admin_trans('department.fields.name')); + $grid->column('leader', admin_trans('department.fields.leader')); + $grid->column('mobile', admin_trans('department.fields.mobile')); + $grid->column('status', admin_trans('department.fields.status'))->switch([[1=>''],[0=>'']]); + $grid->sortInput('sort', admin_trans('department.fields.sort')); + $grid->column('created_at', admin_trans('department.fields.create_at')); + $grid->filter(function (Filter $filter) { + $filter->like()->text('name')->placeholder(admin_trans('department.fields.name')); + $filter->like()->text('leader')->placeholder(admin_trans('department.fields.leader')); + $filter->like()->text('mobile')->placeholder(admin_trans('department.fields.mobile')); + $filter->eq()->select('status')->placeholder(admin_trans('department.fields.status'))->options([ + 1 => admin_trans('department.normal'), + 0 => admin_trans('department.disable') + ]); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]); + }); + $grid->setForm()->modal($this->form()); + }); + } + + /** + * 部门 + * @auth true + */ + public function form(): Form + { + return Form::create(new $this->model, function (Form $form) { + $form->title(admin_trans('department.title')); + $form->treeSelect('pid', admin_trans('department.fields.pid')) + ->options($this->model::where('type', AdminDepartment::TYPE_DEPARTMENT)->get()->toArray()); + $form->text('name', admin_trans('department.fields.name')) + ->required(); + $form->text('leader', admin_trans('department.fields.leader')); + $form->text('mobile', admin_trans('department.fields.mobile')) + ->ruleMobile(); + $form->number('sort', admin_trans('department.fields.sort'))->default(0); + + $form->saving(function (Form $form) { + if ($form->isEdit() && $form->input('id') == $form->input('pid')) { + return message_error(admin_trans('department.parent_id_repeat')); + } + }); + $form->saved(function (Form $form) { + $path = $this->model::where('id',$form->input('pid'))->value('path'); + $paths = explode(',',$path); + $paths= array_filter($paths); + $model = $form->driver()->model(); + $paths[] = $model->id; + $model->path = implode(',',$paths); + $model->save(); + }); + }); + } +} diff --git a/addons/webman/controller/GameController.php b/addons/webman/controller/GameController.php new file mode 100644 index 0000000..d1cdfd7 --- /dev/null +++ b/addons/webman/controller/GameController.php @@ -0,0 +1,376 @@ +game = plugin()->webman->config('database.game_model'); + $this->prize = plugin()->webman->config('database.prize_model'); + } + + /** + * 游戏列表 + * @auth true + * @return Grid + */ + public function index(): Grid + { + return Grid::create(new $this->game(), function (Grid $grid) { + $grid->title(admin_trans('game.title')); + if (plugin()->webman->config('admin_auth_id') != Admin::id()){ + $grid->model()->where('status', 1); + } + $grid->model()->orderBy('status', 'desc')->orderBy('id', 'asc'); + $grid->bordered(true); + $grid->autoHeight(); + $grid->column('id', admin_trans('game.fields.id'))->align('center'); + $grid->column('logo', 'LOGO')->display(function ($val, $data) { + $image = Image::create() + ->width(50) + ->height(50) + ->style(['border-radius' => '50%', 'objectFit' => 'cover']) + ->src($data['logo']); + return Html::create()->content([ + $image, + ]); + })->align('center'); + $grid->column('name', admin_trans('game.fields.name'))->align('center'); + $grid->column('game_image', admin_trans('game.fields.game_image'))->display(function ($val, $data) { + $image = Image::create() + ->width(50) + ->height(50) + ->style(['border-radius' => '50%', 'objectFit' => 'cover']) + ->src($data['game_image']); + return Html::create()->content([ + $image, + ]); + })->align('center'); + $grid->column('consume', admin_trans('game.fields.consume'))->align('center'); + $grid->column('prize_num', admin_trans('game.fields.prize_num'))->align('center'); + $grid->column('description', admin_trans('game.fields.description'))->align('center'); + $grid->column('game_url', admin_trans('game.fields.game_url'))->align('center'); + if (plugin()->webman->config('admin_auth_id') != Admin::id()){ + $grid->column('status', admin_trans('game_platform.fields.status'))->switch()->align('center'); + } + $grid->column('updated_at', admin_trans('game.fields.updated_at'))->align('center'); + $grid->expandFilter(); + $grid->setForm()->drawer($this->form()); + $grid->actions(function (Actions $actions, $data) { + $actions->hideDel(); + $actions->prepend( + Button::create(admin_trans('game.enter_game'))->ajax([$this, 'enterGame'], + ['id' => $data['id']]) + ); + $actions->prepend( + Button::create(admin_trans('game.view_prize'))->modal([$this, 'getPrizeList'], + ['id' => $data['id']])->width('100%') + ); + })->align('center'); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->hideAdd(); + $grid->hideTrashed(); + }); + } + + /** + * 进入游戏 + * @param $id + * @auth true + * @return Notification + */ + public function enterGame($id): Notification + { + $game = Game::query()->where('id', $id)->first(); + $url = $game->test_url; + return notification_success(admin_trans('admin.success'), + admin_trans('game_platform.action_success'))->redirect($url); + } + + /** + * 游戏详情 + * @auth true + * @return Form + */ + public function form(): Form + { + return Form::create(new $this->game(), function (Form $form) { + $form->title(admin_trans('prize.title')); + $form->text('name', admin_trans('game.fields.name'))->required()->maxlength(50); + $form->image('logo', admin_trans('game.fields.logo'))->required(); + $form->image('game_image', admin_trans('game.fields.game_image'))->required(); + $form->number('consume', admin_trans('game.fields.consume'))->required(); + $form->number('prize_num', admin_trans('game.fields.prize_num'))->required(); + $form->textarea('description', admin_trans('game.fields.description'))->maxlength(500)->bindAttr('rows', 10); + $form->text('game_url', admin_trans('game.fields.game_url'))->required()->maxlength(500); + $form->switch('status', admin_trans('game_platform.fields.status'))->required()->span(11); + $form->layout('vertical'); + }); + } + + /** + * 查看奖品 + * @param $id + * @return Grid + * @auth true + */ + public function getPrizeList($id): Grid + { + return Grid::create(new $this->prize(), function (Grid $grid) use($id) { + $grid->title(admin_trans('prize.title')); + $grid->model()->where('game_id', $id)->orderBy('probability'); + $grid->bordered(true); + $grid->autoHeight(); + $grid->column('id', admin_trans('prize.fields.id'))->align('center')->width('5%'); + $grid->column('name', admin_trans('prize.fields.name'))->align('center')->width('10%'); + $grid->column('pic', admin_trans('prize.fields.pic'))->display(function ($val, $data) { + $image = Image::create() + ->width(50) + ->height(50) + ->src($data['pic']); + return Html::create()->content([ + $image, + ]); + })->align('center'); + $grid->column('probability', admin_trans('prize.fields.probability'))->align('center')->width('10%'); + $grid->column('total_stock', admin_trans('prize.fields.total_stock'))->align('center')->width('8%'); + $grid->column('daily_stock', admin_trans('prize.fields.daily_stock'))->align('center')->width('8%'); + $grid->column('total_remaining', admin_trans('prize.fields.total_remaining'))->align('center')->width('8%'); + $grid->column('daily_remaining', admin_trans('prize.fields.daily_remaining'))->align('center')->width('8%'); + $grid->column('description', admin_trans('prize.fields.description'))->align('center')->width('20%'); + if (plugin()->webman->config('admin_auth_id') != Admin::id()) { + $grid->column('status', admin_trans('prize.fields.status'))->switch()->align('center')->width('8%'); + } + $grid->column('admin_name', admin_trans('prize.fields.admin_name'))->align('center')->width('8%'); + $grid->column('updated_at', admin_trans('prize.fields.updated_at'))->align('center')->width('8%'); + $grid->expandFilter(); + $grid->setForm()->drawer($this->editPrize($id)); + $grid->actions(function (Actions $actions, $data) { + $actions->hideDel(); + $actions->hideEdit(); + $actions->prepend( + Button::create(admin_trans('prize.replenish_daily_stock'))->ajax([$this, 'replenishDailyStock'], + ['id' => $data['id']]) + ); + })->align('center'); + $grid->hideDelete(); + $grid->hideAdd(); + $grid->hideSelection(); + $grid->hideTrashed(); + }); + } + + /** + * 补充每日库存 + * @param $id + * @auth true + * @return Msg + */ + public function replenishDailyStock($id): Msg + { + /** @var Prize $prize */ + $prize = Prize::query()->where('id', $id)->first(); + + if ($prize->daily_remaining < $prize->daily_stock) { + $diff = $prize->daily_stock - $prize->daily_remaining; + $prize->daily_remaining = $prize->daily_stock; + $prize->total_remaining = $prize->total_remaining + $diff; + $prize->total_stock = $prize->total_stock + $diff; + } + $prize->save(); + return message_success(admin_trans('prize.action_success')); + } + + /** + * 奖品详情 + * @auth true + * @param $gameId + * @return Form + */ + public function editPrize($gameId): Form + { + return Form::create(new $this->prize(), function (Form $form) use ($gameId) { + $form->title(admin_trans('prize.title')); + $form->text('name', admin_trans('prize.fields.name'))->required()->maxlength(50); + $form->image('pic', admin_trans('prize.fields.pic')); + $form->hidden('game_id')->default($gameId); + $form->number('probability', admin_trans('prize.fields.probability'))->min(1)->max(999)->required(); + $form->number('total_stock', admin_trans('prize.fields.total_stock'))->min(1)->max(100000)->required(); + $form->number('daily_stock', admin_trans('prize.fields.daily_stock'))->min(1)->max(100000) + ->help(admin_trans('prize.daily_stock_help'))->required(); + $form->textarea('description', admin_trans('prize.fields.description'))->maxlength(500)->bindAttr('rows', 10); + $form->switch('status', admin_trans('prize.fields.status'))->default(true)->required()->span(11); + $form->layout('vertical'); + $form->saving(function (Form $form) { + try { + if (!$form->isEdit()) { + $prize = new Prize(); + $prize->game_id = $form->input('game_id'); + $prize->total_remaining = $form->input('total_stock'); + $prize->daily_remaining = $form->input('daily_stock'); + } else { + $prizeId = $form->driver()->get('id'); + $prize = Prize::query()->find($prizeId); + } + $prize->name = $form->input('name'); + $prize->pic = $form->input('pic'); + $prize->probability = $form->input('probability'); + $prize->total_stock = $form->input('total_stock'); + $prize->daily_stock = $form->input('daily_stock'); + if ($prize->daily_stock > $prize->total_stock) { + return message_error(admin_trans('prize.daily_stock_help')); + } + $prize->description = $form->input('description'); + $prize->status = $form->input('status'); + $prize->admin_id = Admin::id(); + $prize->admin_name = !empty(Admin::user()) ? Admin::user()->toArray()['username'] : trans('system_automatic', [], 'message'); + $prize->save(); + } catch (\Exception $e) { + return message_error(admin_trans('form.save_fail')); + } + return message_success(admin_trans('form.save_success')); + }); + }); + } + + /** + * 筛选游戏平台 + * @return mixed + */ + public function getGamePlatformOptions() + { + $request = Request::input(); + $gamePlatform = GamePlatform::query()->orderBy('created_at', 'desc'); + if (!empty($request['search'])) { + $gamePlatform->where('name', 'like', '%' . $request['search'] . '%'); + } + $channelList = $gamePlatform->get(); + $data = []; + /** @var GamePlatform $gamePlatform */ + foreach ($channelList as $gamePlatform) { + $data[] = [ + 'value' => $gamePlatform->id, + 'label' => $gamePlatform->name, + ]; + } + return Response::success($data); + } + + /** + * 游戏类型列表 + * @auth true + */ + public function serviceList(): Grid + { + return Grid::create(new GameType(), function (Grid $grid) { + $grid->title(admin_trans('game_type.title')); + $grid->autoHeight(); + $grid->bordered(true); + $grid->column('game_type', admin_trans('game_type.fields.game_type'))->display(function ($val) { + return $val ? admin_trans('game_type.game_type.' . $val) : admin_trans('game_type.nu_set'); + })->align('center'); + + $grid->column('ratio', admin_trans('game_type.fields.ratio'))->display(function ($value) { + return $value . '%'; + })->editable( + (new Editable)->number('ratio') + ->min(1) + ->max(100) + ->addonAfter('%') + )->align('center')->ellipsis(true); + + $grid->column('updated_at', admin_trans('game_type.fields.updated_at'))->align('center')->display(function ($val) { + return $val ? date('Y-m-d H:i:s', strtotime($val)) : ''; + })->ellipsis(true); + $grid->actions(function (Action $actions) { + $actions->hideDel(); + $actions->hideEdit(); + }); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->hideAdd(); + }); + } + + /** + * 游戏类型 + * @auth true + */ + public function serviceForm(): Form + { + return Form::create(new GamePlatform, function (Form $form) { + $form->title(admin_trans('game_platform.game_platform')); + $form->text('name', admin_trans('game_platform.fields.name')); + $form->text('title', admin_trans('game_platform.fields.title')); + $form->number('service_ratio', admin_trans('game_platform.fields.service_ratio'))->addonAfter('%'); + + $form->layout('vertical'); + $form->saving(function (Form $form) { + if (!$form->isEdit()) { + return message_error(admin_trans('game_platform.save_error')); + DB::beginTransaction(); + try { + $gamePlatform = new GamePlatform(); + $gamePlatform->name = $form->input('name'); + $gamePlatform->title = $form->input('title'); + $gamePlatform->service_ratio = $form->input('service_ratio'); + $gamePlatform->status = 1; + $gamePlatform->save(); + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return message_error($e->getMessage()); + } + return message_success(admin_trans('game_platform.save_success')); + } else { + $gamePlatform = GamePlatform::find($form->input('id')); + if (empty($gamePlatform)) { + return message_error(admin_trans('game_platform.not_fount')); + } + DB::beginTransaction(); + try { + $gamePlatform->name = $form->input('name'); + $gamePlatform->title = $form->input('title'); + $gamePlatform->service_ratio = $form->input('service_ratio'); + $gamePlatform->save(); + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return message_error($e->getMessage()); + } + return message_success(admin_trans('game_platform.save_success')); + } + }); + }); + } +} diff --git a/addons/webman/controller/IndexController.php b/addons/webman/controller/IndexController.php new file mode 100644 index 0000000..d0067cf --- /dev/null +++ b/addons/webman/controller/IndexController.php @@ -0,0 +1,313 @@ +rechargeData(); + $withdrawData = $this->withdrawData(); + $playerData = $this->playerData(); + $loginData = $this->loginData(); + $layout = Layout::create(); + $layout->row(function (Row $row) use ($rechargeData, $withdrawData, $playerData, $loginData) { + $row->gutter([10, 10]); + $row->column( + Card::create([ + Row::create()->column(Icon::create('fas fa-money-bill')->style(['fontSize' => '45px', 'color' => '#409eff', 'marginRight' => '20px']), 4), + Row::create()->column(Statistic::create()->title(admin_trans('data_center.recharge_all'))->value(floatval($rechargeData['all']))->style(['fontSize' => '45px', 'text-align' => 'center']), 6), + Divider::create()->type('vertical')->style(['height' => '4.9em']), + Row::create()->column(Statistic::create()->title(admin_trans('data_center.recharge_activity'))->value(floatval($rechargeData['activity']))->style(['fontSize' => '45px', 'text-align' => 'center']), 6), + Divider::create()->type('vertical')->style(['height' => '4.9em']), + Row::create()->column(Statistic::create()->title(admin_trans('data_center.recharge_regular'))->value(floatval($rechargeData['regular']))->style(['fontSize' => '45px', 'text-align' => 'center']), 6), + ])->bodyStyle(['display' => 'flex', 'align-items' => 'center'])->hoverable()->extra(Icon::create('MoreOutlined') + ->redirect('ex-admin/addons-webman-controller-RechargeRecordController/index')) + ->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px']) + , 12); + + $row->column( + Card::create([ + Row::create()->column(Icon::create('fas fa-money-bill-alt')->style(['fontSize' => '45px', 'color' => '#ff9800', 'marginRight' => '20px']), 6), + Row::create()->column(Statistic::create()->title(admin_trans('data_center.withdraw_all')) + ->value(floatval($withdrawData['all']))->style(['fontSize' => '45px', 'text-align' => 'center']), 8), + Divider::create()->type('vertical')->style(['height' => '4.9em']), + Row::create()->column(Statistic::create()->title(admin_trans('data_center.withdraw_self')) + ->value(floatval($withdrawData['self']))->style(['fontSize' => '45px', 'text-align' => 'center']), 8), + ])->bodyStyle(['display' => 'flex', 'align-items' => 'center'])->hoverable()->extra(Icon::create('MoreOutlined') + ->redirect('ex-admin/addons-webman-controller-WithdrawRecordController/index')) + ->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px']) + , 12); + + $row->column( + Card::create([ + Row::create()->column(Icon::create('fas fa-user')->style(['fontSize' => '45px', 'color' => '#409eff', 'marginRight' => '20px']), 6), + Row::create()->column(Statistic::create()->title(admin_trans('data_center.today_add_player')) + ->value($playerData['today'])->style(['fontSize' => '45px', 'text-align' => 'center']), 8), + Divider::create()->type('vertical')->style(['height' => '4.9em']), + Row::create()->column(Statistic::create()->title(admin_trans('data_center.player_all')) + ->value($playerData['all'])->style(['fontSize' => '45px', 'text-align' => 'center']), 8), + ])->bodyStyle(['display' => 'flex', 'align-items' => 'center'])->hoverable()->extra(Icon::create('MoreOutlined') + ->redirect('ex-admin/addons-webman-controller-PlayerController/index')) + ->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px']) + , 12); + $row->column( + Card::create([ + Row::create()->column(Icon::create('fas fa-user')->style(['fontSize' => '45px', 'color' => '#e91e63', 'marginRight' => '20px']), 6), + Row::create()->column(Statistic::create()->title(admin_trans('data_center.today_active_player')) + ->value($loginData['today'])->style(['fontSize' => '45px', 'text-align' => 'center']), 8) + ->redirect('ex-admin/addons-webman-controller-PlayerController/index',['active_player' => 1]), + Divider::create()->type('vertical')->style(['height' => '4.9em']), + Row::create()->column(Statistic::create()->title(admin_trans('data_center.mouth_active_player')) + ->value($loginData['month'])->style(['fontSize' => '45px', 'text-align' => 'center']), 8) + ->redirect('ex-admin/addons-webman-controller-PlayerController/index',['active_player' => 2]) + ])->bodyStyle(['display' => 'flex', 'align-items' => 'center'])->hoverable() + , 12); + $row->column(Card::create($this->rechargeChart())->hoverable(), 24); + $row->column(Card::create($this->withdrawChart())->hoverable(), 12); + $row->column(Card::create($this->playerChart())->hoverable(), 12); + }); + + return $layout; + } + + /** + * 获取活跃玩家数据 + * @return array + */ + public function loginData(): array + { + return [ + 'month' => PlayerLoginRecord::whereYear('created_at', date('Y'))->whereMonth('created_at', date('m'))->distinct('player_id')->count(), + 'today' => PlayerLoginRecord::whereDate('created_at', date('Y-m-d'))->distinct('player_id')->count(), + ]; + } + + /** + * 获取玩家数据 + * @return array + */ + public function playerData(): array + { + return [ + 'all' => Player::count('*'), + 'today' => Player::whereDate('created_at', date('Y-m-d'))->count(), + ]; + } + + /** + * 获取充值数据 + * @return array + */ + public function rechargeData(): array + { + return [ + 'all' => PlayerRechargeRecord::where('status', PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS)->whereIn('type', [PlayerRechargeRecord::TYPE_REGULAR, PlayerRechargeRecord::TYPE_ACTIVITY, PlayerRechargeRecord::TYPE_ARTIFICIAL])->sum('coins'), + 'activity' => PlayerRechargeRecord::where('status', PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS)->where('type', PlayerRechargeRecord::TYPE_ACTIVITY)->sum('coins'), + 'regular' => PlayerRechargeRecord::where('status', PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS)->where('type', PlayerRechargeRecord::TYPE_REGULAR)->sum('coins'), + 'artificial' => PlayerRechargeRecord::where('status', PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS)->where('type', PlayerRechargeRecord::TYPE_ARTIFICIAL)->sum('coins'), + ]; + } + + /** + * 获取提现数据 + * @return array + */ + public function withdrawData(): array + { + return [ + 'all' => PlayerWithdrawRecord::where('status', PlayerWithdrawRecord::STATUS_SUCCESS)->sum('coins'), + 'self' => PlayerWithdrawRecord::where('status', PlayerWithdrawRecord::STATUS_SUCCESS)->where('type', PlayerWithdrawRecord::TYPE_SELF)->sum('coins'), + 'artificial' => PlayerWithdrawRecord::where('status', PlayerWithdrawRecord::STATUS_SUCCESS)->where('type', PlayerWithdrawRecord::TYPE_ARTIFICIAL)->sum('coins'), + ]; + } + + + /** + * 充值趋势图 + * @return LineChart + */ + public function rechargeChart(): LineChart + { + $range = Carbon::now()->subDays(15)->format('Y-m-d'); + $data = PlayerRechargeRecord::whereDate('created_at', '>=', $range) + ->where('status', PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS) + ->whereIn('type', [PlayerRechargeRecord::TYPE_REGULAR, PlayerRechargeRecord::TYPE_ACTIVITY, PlayerRechargeRecord::TYPE_ARTIFICIAL]) + ->groupBy('date') + ->orderBy('date', 'DESC') + ->get([ + DB::raw('Date(`created_at`) as date'), + DB::raw('SUM(`coins`) as value') + ]) + ->toArray(); + $data = $data ? array_column($data, 'value', 'date') : []; + $xAxis = []; + $yAxis = []; + for ($i = 14; $i >= 0; $i--) { + $date = Carbon::now()->subDays($i)->format('Y-m-d'); + $xAxis[] = $date; + $yAxis[] = $data[$date] ?? 0; + } + return LineChart::create() + ->height('280px') + ->hideDateFilter() + ->header(Html::create(admin_trans('data_center.recharge_chart'))->tag('h2')->style(['text-align' => 'center'])) + ->xAxis($xAxis) + ->data(admin_trans('data_center.recharge_amount'), $yAxis); + } + + /** + * 提现趋势图 + * @return LineChart + */ + public function withdrawChart(): LineChart + { + $range = Carbon::now()->subDays(15)->format('Y-m-d'); + $data = PlayerWithdrawRecord::whereDate('created_at', '>=', $range) + ->where('status', PlayerWithdrawRecord::STATUS_SUCCESS) + ->groupBy('date') + ->orderBy('date', 'DESC') + ->get([ + DB::raw('Date(`created_at`) as date'), + DB::raw('SUM(`coins`) as value') + ]) + ->toArray(); + $data = $data ? array_column($data, 'value', 'date') : []; + $xAxis = []; + $yAxis = []; + + for ($i = 14; $i >= 0; $i--) { + $date = Carbon::now()->subDays($i)->format('Y-m-d'); + $xAxis[] = $date; + $yAxis[] = $data[$date] ?? 0; + } + + return LineChart::create() + ->height('280px') + ->hideDateFilter() + ->header(Html::create(admin_trans('data_center.withdraw_chart'))->tag('h2')->style(['text-align' => 'center'])) + ->xAxis($xAxis) + ->data(admin_trans('data_center.withdraw_amount'), $yAxis); + } + + /** + * 上传 + * @return Response|void + */ + public function myEditorUpload() + { + $file = request()->file('file'); + if ($file && $file->isValid()) { + $size = $file->getSize(); + if ($file->getSize() >= 1024 * 1024) { + return jsonFailResponse(trans('image_upload_size_fail', ['{size}' => '1M'], 'message')); + } + $extension = $file->getUploadExtension(); + if (!in_array($extension, ['png', 'jpg', 'jpeg'])) { + return jsonFailResponse(trans('image_upload_size_fail', ['{size}' => '1M'], 'message')); + } + $uploadName = $file->getUploadName(); + $basePath = public_path() . '/storage/' . date('Ymd') . DIRECTORY_SEPARATOR; + $baseUrl = env('APP_URL', 'http://127.0.0.1:8787') . '/storage/' . date('Ymd') . '/'; + $uniqueId = hash_file('md5', $file->getPathname()); + $saveFilename = $uniqueId . '.' . $file->getUploadExtension(); + $savePath = $basePath . $saveFilename; + $file->move($savePath); + + return jsonSuccessResponse('success', [ + 'origin_name' => $uploadName, + 'save_name' => $saveFilename, + 'save_path' => $savePath, + 'url' => $baseUrl . $saveFilename, + 'unique_id' => $uniqueId, + 'size' => $size, + 'mime_type' => $file->getUploadMimeType(), + 'extension' => $extension, + ]); + } + } + + /** + * 新增玩家 + * @return BarChart + */ + public function playerChart(): BarChart + { + $range = Carbon::now()->subDays(15)->format('Y-m-d'); + $data = Player::whereDate('created_at', '>=', $range) + ->groupBy('date') + ->orderBy('date', 'DESC') + ->get([ + DB::raw('Date(`created_at`) as date'), + DB::raw('COUNT(`id`) as value') + ]) + ->toArray(); + $data = $data ? array_column($data, 'value', 'date') : []; + $xAxis = []; + $yAxis = []; + for ($i = 14; $i >= 0; $i--) { + $date = Carbon::now()->subDays($i)->format('Y-m-d'); + $xAxis[] = $date; + $yAxis[] = $data[$date] ?? 0; + } + return BarChart::create() + ->height('280px') + ->hideDateFilter() + ->header(Html::create(admin_trans('data_center.player_chart'))->tag('h2')->style(['text-align' => 'center'])) + ->xAxis($xAxis) + ->data(admin_trans('data_center.player_amount'), $yAxis); + } + + /** + * 活動圖片上傳 + * @return Msg|Response + */ + public function activityUpload() + { + $file = request()->file('file'); + if ($file && $file->isValid()) { + if ($file->getSize() >= 1024 * 1024 * 5) { + return message_error(trans('image_upload_size_fail', ['{size}' => '5M'], 'message')); + } + $extension = $file->getUploadExtension(); + if (!in_array($extension, ['png', 'jpg', 'jpeg'])) { + return message_error(trans('image_upload_fail', [], 'message')); + } + $basePath = public_path() . '/storage/' . date('Ymd') . DIRECTORY_SEPARATOR; + $baseUrl = env('APP_URL', 'http://127.0.0.1:8787') . '/storage/' . date('Ymd') . '/'; + $uniqueId = hash_file('md5', $file->getPathname()); + $saveFilename = $uniqueId . '.' . $file->getUploadExtension(); + $savePath = $basePath . $saveFilename; + $file->move($savePath); + + return jsonSuccessResponse('success', [$baseUrl . $saveFilename]); + } else { + return message_error(trans('image_upload_fail', [], 'message')); + } + } +} \ No newline at end of file diff --git a/addons/webman/controller/MenuController.php b/addons/webman/controller/MenuController.php new file mode 100644 index 0000000..5b3d092 --- /dev/null +++ b/addons/webman/controller/MenuController.php @@ -0,0 +1,126 @@ +model = plugin()->webman->config('database.menu_model'); + } + + /** + * 系统菜单 + * @auth true + * @return Card + */ + public function index(): Card + { + return Card::create(Tabs::create() + ->destroyInactiveTabPane() + ->pane(admin_trans('menu.type.' . AdminDepartment::TYPE_DEPARTMENT), $this->menuList()) + ->pane(admin_trans('menu.type.' . AdminDepartment::TYPE_CHANNEL), $this->menuList(AdminDepartment::TYPE_CHANNEL)) + ->type('card') + ); + } + + /** + * 系统菜单 + * @param int $type 菜单类型 + * @return Grid + */ + public function menuList(int $type = AdminDepartment::TYPE_DEPARTMENT):Grid + { + return Grid::create(new $this->model(),function (Grid $grid) use($type){ + $grid->title(admin_trans('menu.title')); + $grid->model()->where('type', $type)->orderBy('sort'); + $grid->autoHeight(); + $grid->tree(); + $grid->column('name', admin_trans('menu.fields.name'))->display(function ($value, $data) { + return Html::create([ + Icon::create($data['icon']), + ' ', + $value + ]); + }); + $grid->column('url', admin_trans('menu.fields.url'))->display(function ($value) { + if (empty($value) || $value == '#') { + return $value; + } + return Html::create($value)->tag('a')->redirect($value); + }); + $grid->column('status', admin_trans('menu.fields.status'))->switch(); + $grid->column('open', admin_trans('menu.fields.open'))->switch(); + $grid->sortInput(); + $grid->quickSearch(); + $grid->setForm()->modal($this->form()); + $grid->updated(function (){ + return message_success(admin_trans('grid.update_success'))->refreshMenu(); + }); + $grid->deleted(function (){ + return message_success(admin_trans('grid.update_success'))->refreshMenu(); + }); + }); + } + + /** + * 系统菜单 + * @auth true + * @param int $pid + * @return Form + */ + public function form(int $pid = 0): Form + { + return Form::create(new $this->model,function (Form $form) use($pid){ + $form->title(admin_trans('menu.title')); + $form->text('name', admin_trans('menu.fields.name'))->required(); + $form->radio('type', admin_trans('menu.fields.type')) + ->default(AdminDepartment::TYPE_DEPARTMENT) + ->disabled($form->isEdit()) + ->options([ + AdminDepartment::TYPE_DEPARTMENT => admin_trans('menu.type.' . AdminDepartment::TYPE_DEPARTMENT), + AdminDepartment::TYPE_CHANNEL => admin_trans('menu.type.' . AdminDepartment::TYPE_CHANNEL) + ])->when('==', AdminDepartment::TYPE_DEPARTMENT, function (Form $form) use($pid){ + $menus = $this->model::where('type', AdminDepartment::TYPE_DEPARTMENT)->get()->toArray(); + array_unshift($menus, ['id' => 0, 'name' => admin_trans('menu.fields.top'), 'pid' => -1]); + $form->treeSelect('pid', admin_trans('menu.fields.pid')) + ->default($pid) + ->options($menus) + ->required(); + + })->when('==', AdminDepartment::TYPE_CHANNEL, function (Form $form) use($pid){ + $menus = $this->model::where('type', AdminDepartment::TYPE_CHANNEL)->get()->toArray(); + array_unshift($menus, ['id' => 0, 'name' => admin_trans('menu.fields.top'), 'pid' => -1]); + $form->treeSelect('pid', admin_trans('menu.fields.pid')) + ->default($pid) + ->options($menus) + ->required(); + }); + $form->autoComplete('url', admin_trans('menu.fields.url')) + ->groupOptions(Arr::tree(Admin::node()->all()),'children','title','url'); + $form->icon('icon', admin_trans('menu.fields.icon')) + ->default('far fa-circle') + ->required(); + $form->number('sort', admin_trans('menu.fields.sort')) + ->default($this->model::where('pid', $pid)->max('sort') + 1); + $form->saved(function(){ + return message_success(admin_trans('form.save_success'))->refreshMenu(); + }); + }); + } +} diff --git a/addons/webman/controller/PlayGameRecordController.php b/addons/webman/controller/PlayGameRecordController.php new file mode 100644 index 0000000..3623961 --- /dev/null +++ b/addons/webman/controller/PlayGameRecordController.php @@ -0,0 +1,97 @@ +model = plugin()->webman->config('database.draw_records_model'); + + } + + /** + * 玩家游戏记录 + * @auth true + */ + public function index(): Grid + { + return Grid::create(new $this->model, function (Grid $grid) { + $grid->title(admin_trans('play_game_record.title')); + $grid->model()->orderBy('created_at', 'desc'); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->whereDate('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->whereDate('created_at', '<=', $exAdminFilter['created_at_end']); + } + $grid->autoHeight(); + $grid->bordered(true); + $grid->hideAction(); + $grid->hideDelete(); + $grid->hideDeleteSelection(); + $grid->hideSelection(); + $grid->column('id', admin_trans('play_game_record.fields.id'))->fixed(true)->align('center'); + $grid->column('player.name', admin_trans('player.fields.name'))->display(function ($val, DrawRecord $data) { + $image = !empty($data->player->avatar) ? Avatar::create()->src(is_numeric($data->player->avatar) ? config('def_avatar.' . $data->player->avatar) : $data->player->avatar) : Avatar::create()->icon(Icon::create('UserOutlined')); + return Html::create()->content([ + $image, + Html::div()->content($val), + ]); + })->fixed(true)->align('center'); + $grid->column('channel.name', admin_trans('channel.fields.name'))->align('center'); + $grid->column('game_type', admin_trans('game.fields.game_type'))->display(function ($val) { + return $val ? admin_trans('game.game_type.' . $val) : admin_trans('game.nu_set'); + })->align('center'); + $grid->column('prize_name', admin_trans('prize.fields.name'))->align('center'); + $grid->column('prize_type', admin_trans('prize.fields.type'))->display(function ($val) { + return $val ? admin_trans('prize.prize_type.' . $val) : admin_trans('prize.nu_set'); + })->align('center'); + $grid->column('created_at', admin_trans('play_game_record.fields.create_at'))->align('center'); + $grid->filter(function (Filter $filter) { + $filter->like()->text('player.name')->placeholder(admin_trans('player.fields.name')); + $filter->eq()->select('game_type') + ->placeholder(admin_trans('play_game_record.fields.game_type')) + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->options([ + Game::GAME_TYPE_EGG => admin_trans('game.game_type.' . Game::GAME_TYPE_EGG), + Game::GAME_TYPE_TURNTABLE => admin_trans('game.game_type.' . Game::GAME_TYPE_TURNTABLE), + Game::GAME_TYPE_BLINDBOX => admin_trans('game.game_type.' . Game::GAME_TYPE_BLINDBOX), + Game::GAME_TYPE_TICKET => admin_trans('game.game_type.' . Game::GAME_TYPE_TICKET), + Game::GAME_TYPE_LOTTERY => admin_trans('game.game_type.' . Game::GAME_TYPE_LOTTERY), + Game::GAME_TYPE_DICE => admin_trans('game.game_type.' . Game::GAME_TYPE_DICE), + ]); + $filter->eq()->select('department_id') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('channel.fields.department_name')) + ->remoteOptions(admin_url(['addons-webman-controller-ChannelController', 'getDepartmentOptions'])); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]); + }); + $grid->quickSearch(); + }); + } +} diff --git a/addons/webman/controller/PlayerController.php b/addons/webman/controller/PlayerController.php new file mode 100644 index 0000000..c27f08a --- /dev/null +++ b/addons/webman/controller/PlayerController.php @@ -0,0 +1,1355 @@ +model = plugin()->webman->config('database.player_model'); + $this->playerTag = plugin()->webman->config('database.player_tag_model'); + $this->withdraw = plugin()->webman->config('database.player_withdraw_record_model'); + $this->recharge = plugin()->webman->config('database.player_recharge_record_model'); + $this->playerChipRecord = plugin()->webman->config('database.player_chip_record_model'); + $this->playerDeliveryRecord = plugin()->webman->config('database.player_delivery_record_model'); + $this->playerLevel = plugin()->webman->config('database.player_level_model'); + } + + /** + * 玩家 + * @auth true + * @return Grid + */ + public function index(): Grid + { + return Grid::create(new $this->model(), function (Grid $grid) { + $grid->title(admin_trans('player.title')); + $requestFilter = Request::input('ex_admin_filter', []); + if (!empty($requestFilter)) { + if (isset($requestFilter['created_at_start']) && !empty($requestFilter['created_at_start'])) { + $grid->model()->where('player.created_at', '>=', $requestFilter['created_at_start']); + } + if (isset($requestFilter['created_at_end']) && !empty($requestFilter['created_at_end'])) { + $grid->model()->where('player.created_at', '<=', $requestFilter['created_at_end']); + } + } + $activePlayer = Request::input('active_player') ?? null; + if (!empty($activePlayer)){ + $grid->model()->whereHas('the_last_player_login_record', function ($query) use ($activePlayer) { + if ($activePlayer == 1){ + $query->whereDate('created_at', date('Y-m-d')); + } else { + $query->whereYear('created_at', date('Y')) + ->whereMonth('created_at', date('m')); + } + }); + } + $subQuery = PlayerDeliveryRecord::select('player_id', Db::raw('sum(amount) as amount')) + ->whereNotIn('type', [1,2,3,4,5,9,10]) + ->groupBy('player_id'); + $grid->model()->with(['player_register_record', 'channel', 'the_last_player_login_record']) + ->select([ + 'player.*', + 'player_extend.recharge_amount', + 'player_extend.withdraw_amount', + 'player_platform_cash.money as money', + 'record.amount as present_coins' + ]) + ->leftjoin('player_extend', 'player.id', '=', 'player_extend.player_id') + ->leftjoin('player_platform_cash', 'player.id', '=', 'player_platform_cash.player_id') + ->leftjoinSub($subQuery, 'record', function ($join) { + $join->on('player.id', '=', 'record.player_id'); + }) + ->orderBy('player.id', 'desc'); + $grid->autoHeight(); + $grid->bordered(true); + $grid->column('id', admin_trans('player.fields.id'))->fixed(true)->align('center'); + $grid->column('name', admin_trans('player.fields.name'))->display(function ($val, Player $data) { + $image = $data->avatar ? Avatar::create()->src(is_numeric($data->avatar) ? config('def_avatar.' . $data->avatar) : $data->avatar) : Avatar::create()->icon(Icon::create('UserOutlined')); + return Html::create()->content([ + $image, + Html::div()->content($val), + ]); + })->fixed(true)->align('center'); + $grid->column('uuid', admin_trans('player.fields.uuid'))->fixed(true)->ellipsis(true)->align('center'); + $grid->column('phone', admin_trans('player.fields.phone'))->fixed(true)->ellipsis(true)->align('center'); + $grid->column('money', admin_trans('player_platform_cash.platform_name.' . PlayerPlatformCash::PLATFORM_SELF))->display(function ($val, Player $data) { + return Tag::create($val)->color('orange')->style(['cursor' => 'pointer'])->modal([$this, 'playerRecord'], ['id' => $data->id])->width('70%')->title($data->name . ' ' . $data->uuid); + })->ellipsis(true)->align('center')->sortable(); + $grid->column('player_extend.recharge_amount', admin_trans('player_extend.fields.recharge_amount'))->ellipsis(true)->align('center')->sortable(); + $grid->column('player_extend.withdraw_amount', admin_trans('player_extend.fields.withdraw_amount'))->ellipsis(true)->align('center')->sortable(); + $grid->column('status', admin_trans('player.fields.status'))->switch()->ellipsis(true)->align('center'); + $grid->column('player.created_at', admin_trans('player.fields.created_at'))->display(function ($val, Player $data) { + return Html::create()->content([ + Html::div()->content(date('Y-m-d H:i:s', strtotime($data->created_at))), + Html::div()->content($data->player_register_record->ip ?? ''), + Html::div()->content($data->player_register_record->country_name ?? ''), + ]); + })->ellipsis(true)->align('center')->sortable(); + $grid->column('last_login', admin_trans('player.fields.player_login_record'))->display(function ($val, Player $data) { + return Html::create()->content([ + Html::div()->content($val ?? (!empty($data->the_last_player_login_record->created_at) ? date('Y-m-d H:i:s', strtotime($data->the_last_player_login_record->created_at)) : '')), + Html::div()->content($data->the_last_player_login_record->ip ?? ''), + Html::div()->content($data->the_last_player_login_record->country_name ?? ''), + ]); + })->ellipsis(true)->align('center')->sortable(); + $grid->filter(function (Filter $filter) { + $filter->like()->text('uuid')->placeholder(admin_trans('player.fields.uuid')); + $filter->like()->text('name')->placeholder(admin_trans('player.fields.name')); + $filter->like()->text('phone')->placeholder(admin_trans('player.fields.phone')); + $filter->eq()->select('department_id') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('player.fields.department_id')) + ->remoteOptions(admin_url(['addons-webman-controller-ChannelController', 'getDepartmentOptions'])); + $filter->eq()->select('level') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('player.fields.level')) + ->options(playerLevelOptions()); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateTimeRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]); + }); + $grid->expandFilter(); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->tools([ + $grid->addButton()->modal($this->form()), + Button::create(admin_trans('player.level_setting')) + ->danger() + ->style(['margin-left' => '10px']) + ->drawer($this->levelSetting()) + ] + ); + $grid->actions(function (Actions $actions, Player $data) { + $actions->edit()->modal($this->form())->width('60%'); + $actions->hideDel(); + $dropdown = $actions->dropdown(); + $dropdown->prepend(admin_trans('admin.reset_password'), 'fas fa-key') + ->modal($this->resetPassword($data->id)); + $dropdown->append(admin_trans('player.wallet.player_wallet'), 'MoneyCollectFilled') + ->modal($this->playerWallet([ + 'id' => $data->id, + 'money' => $data->wallet->money ?? 0, + ]))->width('600px'); + $dropdown->append(admin_trans('player.wallet.artificial_recharge'), 'TransactionOutlined') + ->modal($this->artificialRecharge([ + 'id' => $data->id, + 'money' => $data->wallet->money ?? 0, + ]))->width('600px')->title(Html::create(admin_trans('player.wallet.artificial_recharge'))->content( + ToolTip::create(Icon::create('QuestionCircleOutlined')->style(['marginLeft' => '5px', 'cursor' => 'pointer']))->title(admin_trans('player.wallet.artificial_recharge_tip')) + )); + $dropdown->append(admin_trans('player.wallet.artificial_withdrawal'), 'PayCircleOutlined') + ->modal($this->artificialWithdrawal([ + 'id' => $data->id, + 'money' => $data->wallet->money ?? 0, + ]))->width('600px')->title(Html::create(admin_trans('player.wallet.artificial_withdrawal'))->content( + ToolTip::create(Icon::create('QuestionCircleOutlined')->style(['marginLeft' => '5px', 'cursor' => 'pointer']))->title(admin_trans('player.wallet.artificial_withdrawal_tip')) + )); + }); + $grid->updateing(function ($ids, $data) { + if (isset($ids[0]) && isset($data['player_extend'])) { + if (PlayerExtend::updateOrCreate( + ['player_id' => $ids[0]], + $data['player_extend'] + )) { + return message_success(admin_trans('player.remark_edit_success')); + } + } + }); + }); + } + + /** + * @return Form + */ + public function levelSetting(): Form + { + $list = PlayerLevel::query()->orderBy('level')->get(); + $data = []; + /** @var PlayerLevel $playerLevel */ + foreach ($list as $playerLevel) { + $data['id'][$playerLevel->level] = $playerLevel->id; + $data['level'][$playerLevel->level] = $playerLevel->level; + $data['recharge_amount'][$playerLevel->level] = $playerLevel->recharge_amount; + $data['chip_multiple'][$playerLevel->level] = $playerLevel->chip_multiple; + $data['bet_rebate_ratio'][$playerLevel->level] = $playerLevel->bet_rebate_ratio; + $data['damage_rebate_ratio'][$playerLevel->level] = $playerLevel->damage_rebate_ratio; + $data['content'][$playerLevel->level] = json_decode($playerLevel->content, true); + } + return Form::create($data, function (Form $form) { + $form->labelWidth('200'); + $form->layout('vertical'); + $langList = plugin()->webman->config('ui.lang.list'); + $tabs = $form->tabs() + ->tabPosition('left') + ->destroyInactiveTabPane(); + for ($i = 1; $i <= 13; $i++) { + $tabs->pane(admin_trans('player.level.' . $i), function (Form $form) use ($i, $langList) { + $tabs = $form->tabs()->destroyInactiveTabPane(); + foreach ($langList as $k => $v) { + $tabs->pane($v, function (Form $form) use ($k, $i) { + $form->text("content." . $i . '.' . $k . ".level_name", admin_trans('player_level.level_name')) + ->required()->maxlength(20) + ->help(admin_trans('player_level.help.level_name')); + $form->textarea("content." . $i . '.' . $k . ".content", admin_trans('player_level.level_content')) + ->rows(5) + ->required()->showCount()->maxlength(500) + ->help(admin_trans('player_level.help.level_content')); + }); + } + $form->hidden('id.' . $i); + $form->hidden('level.' . $i)->value($i); + $form->number('recharge_amount.' . $i, admin_trans('player_level.recharge_amount')) + ->min(0) + ->max(1000000000) + ->precision(0) + ->style(['width' => '300px']) + ->default(0) + ->required() + ->controls(false) + ->help(admin_trans('player_level.help.recharge_amount', null, ['{max_amount}' => 1000000000])); + $form->number('chip_multiple.' . $i, admin_trans('player_level.chip_multiple')) + ->min(0) + ->max(10000) + ->precision(2) + ->style(['width' => '300px']) + ->controls(false) + ->default(0) + ->required() + ->addonAfter('%') + ->help(admin_trans('player_level.help.chip_multiple', null, ['{max_multiple}' => 10000])); + $form->number('bet_rebate_amount.' . $i, admin_trans('player_level.bet_rebate_amount')) + ->min(0) + ->max(1000000000) + ->precision(0) + ->style(['width' => '300px']) + ->controls(false) + ->default(0) + ->required() + ->help(admin_trans('player_level.help.bet_rebate_amount', null, ['{max_amount}' => 1000000000])); + $form->number('bet_rebate_ratio.' . $i, admin_trans('player_level.bet_rebate_ratio')) + ->min(0) + ->max(100) + ->precision(2) + ->style(['width' => '300px']) + ->controls(false) + ->addonAfter('%') + ->default(0) + ->required() + ->help(admin_trans('player_level.help.bet_rebate_ratio', null, ['{max_ratio}' => 100])); + $form->number('damage_rebate_ratio.' . $i, admin_trans('player_level.damage_rebate_ratio')) + ->min(0) + ->max(100) + ->precision(2) + ->style(['width' => '300px']) + ->controls(false) + ->addonAfter('%') + ->default(0) + ->required() + ->help(admin_trans('player_level.help.damage_rebate_ratio', null, ['{max_ratio}' => 100])); + }); + } + $form->saving(function (Form $form) { + $idArr = $form->input('id'); + $levelArr = $form->input('level'); + $rechargeAmountArr = $form->input('recharge_amount'); + $chipMultipleArr = $form->input('chip_multiple'); + $betRebateAmountArr = $form->input('bet_rebate_amount'); + $betRebateRatioArr = $form->input('bet_rebate_ratio'); + $damageRebateRatioArr = $form->input('damage_rebate_ratio'); + $content = $form->input('content'); + DB::beginTransaction(); + try { + foreach ($idArr as $key => $item) { + if (empty($rechargeAmountArr[$key])) { + throw new \Exception(admin_trans('player_level.recharge_amount_not_found', null, ['{level}' => admin_trans('player_level.level') . $key])); + } + if (!empty($item)) { + $playerLevel = PlayerLevel::query()->find($item); + } else { + $playerLevel = new PlayerLevel(); + } + $playerLevel->level = $levelArr[$key]; + $playerLevel->content = json_encode($content[$key]); + $playerLevel->recharge_amount = $rechargeAmountArr[$key]; + $playerLevel->chip_multiple = $chipMultipleArr[$key]; + $playerLevel->bet_rebate_amount = $betRebateAmountArr[$key]; + $playerLevel->bet_rebate_ratio = $betRebateRatioArr[$key]; + $playerLevel->damage_rebate_ratio = $damageRebateRatioArr[$key]; + if ($key > 1 && $rechargeAmountArr[$key] <= $rechargeAmountArr[$key - 1]) { + throw new \Exception(admin_trans('player_level.recharge_amount_must_gt_upper', null, ['{level}' => admin_trans('player_level.level') . $key])); + } + if ($key > 1 && $key < 7 && $rechargeAmountArr[$key] >= $rechargeAmountArr[$key + 1]) { + throw new \Exception(admin_trans('player_level.recharge_amount_must_lt_next', null, ['{level}' => admin_trans('player_level.level') . $key])); + } + + $playerLevel->save(); + } + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return message_error($e->getMessage()); + } + return message_success(admin_trans('form.save_success')); + }); + }); + } + + /** + * 人工提现 + * @auth true + * @param $data + * @return Form + */ + public function artificialWithdrawal($data): Form + { + return Form::create(new $this->model, function (Form $form) use ($data) { + $form->number('coins', admin_trans('player_withdraw_record.fields.coins')) + ->min(0) + ->max(100000000) + ->precision(2) + ->style(['width' => '100%']) + ->addonBefore(admin_trans('player.wallet.wallet') . ' ' . $data['money'] ?? 0) + ->required(); + $form->number('money', admin_trans('player_withdraw_record.fields.money')) + ->min(0) + ->max(100000000) + ->precision(2) + ->style(['width' => '100%']); + $form->text('currency', admin_trans('player_withdraw_record.fields.currency'))->maxlength(10); + $form->text('bank_name', admin_trans('player_withdraw_record.fields.bank_name'))->maxlength(50); + $form->text('account', admin_trans('player_withdraw_record.fields.account'))->maxlength(50); + $form->text('account_name', admin_trans('player_withdraw_record.fields.account_name'))->maxlength(50); + $form->textarea('remark', admin_trans('player_withdraw_record.fields.remark'))->maxlength(255)->bindAttr('rows', 4); + $form->layout('vertical'); + $form->hidden('id')->value($data['id']); + $form->saving(function (Form $form) { + /** @var Player $player */ + $player = Player::where('id', $form->input('id'))->whereNull('deleted_at')->first(); + if (empty($player)) { + return message_error(admin_trans('player.not_fount')); + } + if ($player->status == 0) { + return message_error(admin_trans('player.disable')); + } + if ($player->wallet->money < $form->input('coins')) { + return message_error(admin_trans('player.insufficient_balance')); + } + DB::beginTransaction(); + try { + $beforeGameAmount = $player->wallet->money; + // 生成订单 + $playerWithdrawRecord = new PlayerWithdrawRecord(); + $playerWithdrawRecord->player_id = $player->id; + $playerWithdrawRecord->talk_user_id = $player->talk_user_id; + $playerWithdrawRecord->department_id = $player->department_id; + $playerWithdrawRecord->tradeno = createOrderNo(); + $playerWithdrawRecord->player_name = $player->name ?? ''; + $playerWithdrawRecord->player_phone = $player->phone ?? ''; + $playerWithdrawRecord->money = $form->input('money') ?? 0; + $playerWithdrawRecord->coins = $form->input('coins') ?? 0; + $playerWithdrawRecord->fee = 0; + $playerWithdrawRecord->inmoney = bcsub($playerWithdrawRecord->money, $playerWithdrawRecord->fee, 2); // 实际提现金额 + $playerWithdrawRecord->currency = $form->input('currency') ?? 0; + $playerWithdrawRecord->bank_name = $form->input('bank_name') ?? 0; + $playerWithdrawRecord->account = $form->input('account') ?? 0; + $playerWithdrawRecord->account_name = $form->input('account_name') ?? 0; + $playerWithdrawRecord->type = PlayerWithdrawRecord::TYPE_ARTIFICIAL; + $playerWithdrawRecord->status = PlayerWithdrawRecord::STATUS_SUCCESS; + $playerWithdrawRecord->finish_time = date('Y-m-d H:i:s'); + $playerWithdrawRecord->save(); + // 玩家钱包扣减 + $player->wallet->money = bcsub($player->wallet->money, $playerWithdrawRecord->coins, 2); + // 更新玩家统计 + $player->player_extend->withdraw_amount = bcadd($player->player_extend->withdraw_amount, $playerWithdrawRecord->coins, 2); + $player->push(); + //寫入金流明細 + $playerDeliveryRecord = new PlayerDeliveryRecord; + $playerDeliveryRecord->player_id = $playerWithdrawRecord->player_id; + $playerDeliveryRecord->department_id = $playerWithdrawRecord->department_id; + $playerDeliveryRecord->target = $playerWithdrawRecord->getTable(); + $playerDeliveryRecord->target_id = $playerWithdrawRecord->id; + $playerDeliveryRecord->type = PlayerDeliveryRecord::TYPE_WITHDRAWAL; + $playerDeliveryRecord->source = 'artificial_withdrawal'; + $playerDeliveryRecord->amount = $playerWithdrawRecord->coins; + $playerDeliveryRecord->amount_before = $beforeGameAmount; + $playerDeliveryRecord->amount_after = $player->wallet->money; + $playerDeliveryRecord->tradeno = $playerWithdrawRecord->tradeno ?? ''; + $playerDeliveryRecord->remark = $playerWithdrawRecord->remark ?? ''; + $playerDeliveryRecord->save(); + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return message_error(admin_trans('player.artificial_withdrawal_error')); + } + return message_success(admin_trans('player.artificial_withdrawal_success')); + }); + }); + } + + /** + * 人工充值 + * @auth true + * @param $data + * @return Form + */ + public function artificialRecharge($data): Form + { + return Form::create(new $this->model, function (Form $form) use ($data) { + $form->number('coins', admin_trans('player_recharge_record.fields.coins')) + ->min(0) + ->max(100000000) + ->precision(2) + ->style(['width' => '100%']) + ->addonBefore(admin_trans('player.wallet.wallet') . ' ' . $data['money'] ?? 0) + ->required(); + $form->number('money', admin_trans('player_recharge_record.fields.money')) + ->min(0) + ->max(100000000) + ->precision(2) + ->style(['width' => '100%']); + $form->text('currency', admin_trans('player_recharge_record.fields.currency'))->maxlength(10); + $form->textarea('remark', admin_trans('player_recharge_record.fields.remark'))->maxlength(255)->bindAttr('rows', 4); + $form->layout('vertical'); + $form->hidden('id')->value($data['id']); + $form->saving(function (Form $form) { + /** @var Player $player */ + $player = Player::where('id', $form->input('id'))->whereNull('deleted_at')->first(); + if (empty($player)) { + return message_error(admin_trans('player.not_fount')); + } + if ($player->status == 0) { + return message_error(admin_trans('player.disable')); + } + DB::beginTransaction(); + try { + $beforeGameAmount = $player->wallet->money; + // 生成订单 + $playerRechargeRecord = new PlayerRechargeRecord(); + $playerRechargeRecord->player_id = $player->id; + $playerRechargeRecord->department_id = $player->department_id; + $playerRechargeRecord->tradeno = createOrderNo(); + $playerRechargeRecord->player_name = $player->name ?? ''; + $playerRechargeRecord->money = $form->input('money') ?? 0; + $playerRechargeRecord->inmoney = $form->input('money') ?? 0; + $playerRechargeRecord->currency = $form->input('currency') ?? ''; + $playerRechargeRecord->type = PlayerRechargeRecord::TYPE_ARTIFICIAL; + $playerRechargeRecord->coins = $form->input('coins'); + $playerRechargeRecord->status = PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS; + $playerRechargeRecord->remark = $form->input('remark'); + $playerRechargeRecord->finish_time = date('Y-m-d H:i:s'); + $playerRechargeRecord->user_id = Admin::id() ?? 0; + $playerRechargeRecord->user_name = !empty(Admin::user()) ? Admin::user()->toArray()['username'] : ''; + $playerRechargeRecord->save(); + $player->wallet->money = bcadd($player->wallet->money, $playerRechargeRecord->coins, 2); + $player->player_extend->recharge_amount = bcadd($player->player_extend->recharge_amount, $playerRechargeRecord->coins, 2); + $player->push(); + + //寫入金流明細 + $playerDeliveryRecord = new PlayerDeliveryRecord; + $playerDeliveryRecord->player_id = $playerRechargeRecord->player_id; + $playerDeliveryRecord->department_id = $playerRechargeRecord->department_id; + $playerDeliveryRecord->target = $playerRechargeRecord->getTable(); + $playerDeliveryRecord->target_id = $playerRechargeRecord->id; + $playerDeliveryRecord->type = PlayerDeliveryRecord::TYPE_RECHARGE; + $playerDeliveryRecord->source = 'artificial_recharge'; + $playerDeliveryRecord->amount = $playerRechargeRecord->coins; + $playerDeliveryRecord->amount_before = $beforeGameAmount; + $playerDeliveryRecord->amount_after = $player->wallet->money; + $playerDeliveryRecord->tradeno = $playerRechargeRecord->tradeno ?? ''; + $playerDeliveryRecord->remark = $playerRechargeRecord->remark ?? ''; + $playerDeliveryRecord->save(); + + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return message_error(admin_trans('player.artificial_recharge_error')); + } + return message_success(admin_trans('player.artificial_recharge_success')); + }); + }); + } + + + /** + * 处理标签 + * @param array $value + * @return Html + */ + public function handleTagIds(array $value): Html + { + $options = $this->getPlayerTagOptions($value); + $html = Html::create(); + foreach ($options as $option) { + $html->content( + Tag::create($option) + ->color('success') + ); + } + return $html; + } + + /** + * 获取玩家标签选项(筛选id) + * @param array $ids + * @return array + */ + public function getPlayerTagOptions(array $ids = []): array + { + $idsStr = json_encode($ids); + $cacheKey = md5("player_tag_options_ids_$idsStr"); + if (Cache::has($cacheKey)) { + return Cache::get($cacheKey); + } else { + if (!empty($ids)) { + $data = (new PlayerTag())->whereIn('id', $ids)->select(['name', 'id'])->get()->toArray(); + $data = $data ? array_column($data, 'name', 'id') : []; + Cache::set($cacheKey, $data, 24 * 60 * 60); + + return $data; + } + return []; + } + } + + /** + * 获取玩家标签(筛选id) + * @return array + */ + public function getPlayerTagOptionsFilter(): array + { + $cacheKey = "doc_player_tag_options_filter"; + if (Cache::has($cacheKey)) { + return Cache::get($cacheKey); + } else { + $data = (new PlayerTag())->select(['name', 'id'])->get()->toArray(); + $data = $data ? array_column($data, 'name', 'id') : []; + Cache::set($cacheKey, $data, 24 * 60 * 60); + + return $data; + } + } + + /** + * 玩家标签修改保存 + * @return Form + */ + public function playerTagForm(): Form + { + return Form::create(new $this->playerTag, function (Form $form) { + $form->text('name', '名称'); + $form->saving(function (Form $form) { + if ($form->isEdit()) { + $id = $form->driver()->get('id'); + /** @var PlayerTag $tag */ + $tag = PlayerTag::find($id); + $tag->name = $form->input('name'); + $tag->save(); + } else { + $tag = new PlayerTag(); + $tag->name = $form->input('name'); + $tag->save(); + } + return message_success(admin_trans('form.save_success'))->refreshMenu(); + }); + }); + } + + /** + * 玩家信息 + * @auth true + * @return Form + */ + public function form(): Form + { + $options = []; + foreach (config('def_avatar') as $key => $item) { + $options[$key] = Avatar::create()->style(['padding' => '1px'])->src($item)->shape('square'); + } + return Form::create(new $this->model(), function (Form $form) use ($options) { + if ($form->isEdit()) { + $form->title(admin_trans('player.details')); + $form->row(function (Form $form) use ($options) { + $form->column(function (Form $form) use ($options) { + $form->text('phone', admin_trans('player.fields.phone'))->maxlength(50)->ruleNumber()->disabled(true); + $form->text('name', admin_trans('player.fields.name'))->maxlength(50); + $form->radio('avatar_type', admin_trans('player.avatar_type')) + ->button() + ->default(is_numeric($form->driver()->get('avatar')) ? 2 : 1) + ->options([ + 1 => admin_trans('player.upload_avatar'), + 2 => admin_trans('player.def_avatar') + ]) + ->when(1, function (Form $form) { + $form->image('avatar', admin_trans('player.fields.avatar'))->value(is_numeric($form->driver()->get('avatar')) ? '' : $form->driver()->get('avatar'))->ext('jpg,png,jpeg')->fileSize('1m'); + })->when(2, function (Form $form) use ($options) { + $form->radio('def_avatar', admin_trans('player.def_avatar')) + ->default(1) + ->options($options); + }); + $form->text('player_extend.id_number', admin_trans('player_extend.fields.id_number'))->ruleAlphaNum()->maxlength(20); + $form->desc('the_last_player_login_record.created_at', admin_trans('player.fields.login_at'))->value($form->input('the_last_player_login_record.created_at') ? date('Y-m-d H:i:s', strtotime($form->input('the_last_player_login_record.created_at'))) : ''); + $form->desc('created_at', admin_trans('player.fields.created_at'))->value($form->input('created_at') ? date('Y-m-d H:i:s', strtotime($form->input('created_at'))) : ''); + $form->desc('player_register_record.ip', admin_trans('player.fields.register_ip')); + $form->desc('player_register_record.register_domain', admin_trans('player.fields.register_domain')); + })->span(12); + + $form->column(function (Form $form) { + $form->text('player_extend.address', admin_trans('player_extend.fields.address'))->maxlength(255); + $form->date('player_extend.birthday', admin_trans('player_extend.fields.birthday')); + $form->text('player_extend.email', admin_trans('player_extend.fields.email'))->ruleEmail()->maxlength(20); + $form->text('player_extend.line', admin_trans('player_extend.fields.line'))->ruleAlphaNum()->maxlength(20); + $form->textarea('player_extend.remark', admin_trans('player_extend.fields.remark')) + ->showCount() + ->rule(['max:255' => admin_trans('player_extend.fields.remark')]); + $playerBank = PlayerBank::query()->where('player_id', $form->driver()->get('id'))->get()->toArray(); + foreach ($playerBank as $key => $item) { + $form->row(function (Form $form) use ($item, $key) { + $form->text('bank_name'.$key, admin_trans('player.bank_name')) + ->value($item['bank_name'] ?? 0) + ->disabled(true); + $form->text('account_name'.$key, admin_trans('player.account_name')) + ->value($item['account_name'] ?? 0) + ->disabled(true); + $form->text('account'.$key, admin_trans('player.account')) + ->value($item['account'] ?? 0) + ->disabled(true); + }); + } + })->span(12); + }); + } else { + $form->title(admin_trans('player.add_player')); + $form->text('phone', admin_trans('player.fields.phone'))->maxlength(50)->ruleAlphaNum()->required(); + $form->radio('avatar_type', admin_trans('player.avatar_type')) + ->button() + ->default(2) + ->options([ + 1 => admin_trans('player.upload_avatar'), + 2 => admin_trans('player.def_avatar') + ]) + ->when(1, function (Form $form) { + $form->image('avatar', admin_trans('player.fields.avatar'))->ext('jpg,png,jpeg')->fileSize('1m'); + })->when(2, function (Form $form) use ($options) { + $form->radio('def_avatar', admin_trans('player.def_avatar')) + ->default(1) + ->options($options); + }); + $form->select('country_code', admin_trans('player.fields.country_code'))->options([ + PhoneSmsLog::COUNTRY_CODE_MY => PhoneSmsLog::COUNTRY_CODE_MY, + ])->required(); + $form->select('department_id', admin_trans('player.fields.department_id'))->remoteOptions(admin_url(['addons-webman-controller-ChannelController', 'getDepartmentOptions']))->required(); + $form->text('name', admin_trans('player.fields.name'))->maxlength(50)->required(); + $form->password('password', admin_trans('player.new_password')) + ->rule([ + 'confirmed' => admin_trans('player.password_confim_validate'), + 'min:6' => admin_trans('player.password_min_number') + ]) + ->value('') + ->required(); + $form->password('password_confirmation', admin_trans('player.confim_password')) + ->required(); + } + $form->saved(function () { + return message_success(admin_trans('player.save_player_info_success')); + }); + $form->saving(function (Form $form) { + if ($form->isEdit()) { + $orgData = $form->driver()->get(); + /** @var Player $player */ + $player = Player::find($orgData['id']); + if (empty($player)) { + return message_error(admin_trans('player.not_fount')); + } + DB::beginTransaction(); + try { + $player->name = $form->input('name'); + $player->avatar = $form->input('avatar_type') == 1 ? $form->input('avatar') : $form->input('def_avatar'); + $player->save(); + PlayerExtend::query()->updateOrCreate(['player_id' => $orgData['id']], [ + 'address' => $form->input('player_extend.address'), + 'birthday' => $form->input('player_extend.birthday'), + 'id_number' => $form->input('player_extend.id_number'), + 'email' => $form->input('player_extend.email'), + 'line' => $form->input('player_extend.line'), + 'remark' => $form->input('player_extend.remark'), + 'player_id' => $orgData['id']]); + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return message_error($e->getMessage()); + } + return message_success(admin_trans('player.save_player_info_success')); + } else { + $phone = $form->input('phone'); + $password = $form->input('password'); + $country_code = $form->input('country_code'); + /** @var $player Player */ + $player = Player::query()->where('phone', $country_code.$phone)->first(); + if (!empty($player)) { + return message_error(admin_trans('player.phone_has_register')); + } + /** @var Channel $channel */ + $channel = Channel::where('department_id', $form->input('department_id'))->first(); + if (empty($channel)) { + return jsonFailResponse(trans('channel_not_found', [], 'message')); + } + DB::beginTransaction(); + try { + $player = new Player(); + $player->phone = $country_code.$phone; + $player->name = $form->input('name'); + if ($form->input('avatar_type') == 1) { + $player->avatar = $form->input('avatar') ?? config('def_avatar.1'); + } + if ($form->input('avatar_type') == 2) { + $player->avatar = $form->input('def_avatar') ?? config('def_avatar.1'); + } + $player->country_code = $country_code; + $player->type = Player::TYPE_PLAYER; + $player->currency = $channel->currency; + $player->department_id = $channel->department_id; + $player->password = $password; + $player->uuid = gen_uuid(); + $player->recommend_code = createCode(); + $player->save(); + + addPlayerExtend($player, [ + 'email' => $data['email'] ?? '' + ]); + addRegisterRecord($player->id, PlayerRegisterRecord::TYPE_ADMIN, $player->department_id); + + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return message_error($e->getMessage()); + } + return message_success(admin_trans('player.save_player_info_success')); + } + }); + }); + } + + /** + * 重置密码 + * @auth true + * @param $id + * @return Form + */ + public function resetPassword($id): Form + { + return Form::create(new $this->model, function (Form $form) { + $form->password('password', admin_trans('player.new_password')) + ->rule([ + 'confirmed' => admin_trans('player.password_confim_validate'), + 'min:6' => admin_trans('player.password_min_number') + ]) + ->value('') + ->required(); + $form->password('password_confirmation', admin_trans('player.confim_password')) + ->required(); + }); + } + + /** + * 玩家钱包 + * @auth true + * @param $data + * @return Form + */ + public function playerWallet($data): Form + { + return Form::create(new $this->model, function (Form $form) use ($data) { + $form->hidden('id')->default($data['id']); + $form->row(function (Form $form) { + $type = $form->getBindField('type'); + $form->radio('type', admin_trans('player.wallet.type')) + ->button() + ->disabled($form->isEdit()) + ->default(PlayerMoneyEditLog::TYPE_INCREASE) + ->options([ + admin_trans('player.wallet.deduct'), + admin_trans('player.wallet.increase'), + ])->required()->span(7); + $form->hidden('type')->bindAttr('value', $type) + ->when(PlayerMoneyEditLog::TYPE_DEDUCT, function (Form $form) { + $form->select('deduct_action', admin_trans('player.wallet.action')) + ->remoteOptions(admin_url([$this, 'getTranOptions'], ['type' => PlayerMoneyEditLog::TYPE_DEDUCT])) + ->required()->span(16)->style(['margin-left' => '22px']); + })->when(PlayerMoneyEditLog::TYPE_INCREASE, function (Form $form) { + $form->select('increase_action', admin_trans('player.wallet.action')) + ->remoteOptions(admin_url([$this, 'getTranOptions'], ['type' => PlayerMoneyEditLog::TYPE_INCREASE])) + ->required()->span(16)->style(['margin-left' => '22px']); + }); + }); + $form->number('money', admin_trans('player.wallet.money'))->min(0)->max(100000000)->precision(2)->style(['width' => '100%'])->addonBefore(admin_trans('player.wallet.wallet') . ' ' . $data['money'] ?? 0)->required(); + $form->textarea('remark', admin_trans('player.wallet.textarea'))->maxlength(255)->bindAttr('rows', 4)->required(); + $form->actions()->hideResetButton(); + $form->saving(function (Form $form) use ($data) { + return $this->store([ + 'id' => $form->input('id'), + 'type' => $form->input('type'), + 'deduct_action' => $form->input('deduct_action'), + 'increase_action' => $form->input('increase_action'), + 'money' => $form->input('money'), + 'remark' => $form->input('remark'), + ]); + }); + $form->layout('vertical'); + }); + } + + /** + * 钱包操作 + * @param $data + * @return Msg + */ + public function store($data): Msg + { + try { + DB::beginTransaction(); + playerManualSystem($data); + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return message_error(admin_trans('player.wallet.wallet_operation_failed')); + } + + return message_success(admin_trans('player.wallet.wallet_operation_success')); + } + + + /** + * 钱包操作类型 + * @param $type + * @return mixed + */ + public function getTranOptions($type) + { + $options = []; + if ($type == PlayerMoneyEditLog::TYPE_INCREASE) { + $transactionType = [ + PlayerMoneyEditLog::ACTIVITY_GIVE, + PlayerMoneyEditLog::ADMIN_INCREASE, + PlayerMoneyEditLog::OTHER + ]; + } else { + $transactionType = [ + PlayerMoneyEditLog::ADMIN_DEDUCT, + PlayerMoneyEditLog::OTHER + ]; + } + + foreach ($transactionType as $item) { + $options[] = [ + 'value' => $item, + 'label' => admin_trans('player.wallet.wallet_type.' . $item), + ]; + } + + return Response::success($options); + } + + /** + * 玩家记录 + * @param $id + * @auth true + * @return Card + */ + public function playerRecord($id): Card + { + $tabs = Tabs::create() + ->pane(admin_trans('player.player_recharge_record'), $this->rechargeRecord($id)) + ->pane(admin_trans('player.player_withdraw_record'), $this->withdrawalRecords($id)) + ->pane(admin_trans('player.player_delivery_record'), $this->playerDeliveryRecord($id)); + + return Card::create($tabs); + } + + /** + * 提现记录 + * @param $id + * @return Grid + */ + public function withdrawalRecords($id): Grid + { + return Grid::create(new $this->withdraw(), function (Grid $grid) use ($id) { + $grid->title(admin_trans('player_withdraw_record.title')); + $grid->model()->with(['channel'])->where('player_id', $id)->where('status', PlayerWithdrawRecord::STATUS_SUCCESS)->orderBy('created_at', 'desc'); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (!empty($exAdminFilter)) { + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->where('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->where('created_at', '<=', $exAdminFilter['created_at_end']); + } + if (isset($exAdminFilter['finish_time_start']) && !empty($exAdminFilter['finish_time_start'])) { + $grid->model()->where('finish_time', '>=', $exAdminFilter['finish_time_start']); + } + if (isset($exAdminFilter['finish_time_end']) && !empty($exAdminFilter['finish_time_end'])) { + $grid->model()->where('finish_time', '<=', $exAdminFilter['finish_time_end']); + } + } + $grid->bordered(); + $grid->autoHeight(); + $grid->column('id', admin_trans('player_withdraw_record.fields.id'))->align('center'); + $grid->column('player_phone', admin_trans('player_withdraw_record.fields.player_phone'))->display(function ($val, PlayerWithdrawRecord $data) { + $image = (isset($data->player->avatar) && !empty($data->player->avatar)) ? Avatar::create()->src($data->player->avatar) : Avatar::create()->icon(Icon::create('UserOutlined')); + return Html::create()->content([ + $image, + Html::div()->content($val) + ]); + })->align('center'); + $grid->column('tradeno', admin_trans('player_withdraw_record.fields.tradeno'))->copy()->align('center'); + $grid->column('money', admin_trans('player_withdraw_record.fields.money'))->display(function ($val, PlayerWithdrawRecord $data) { + return $val . ' ' . ($data->currency == 'TALK' ? 'Q币' : $data->currency); + })->align('center'); + $grid->column('coins', admin_trans('player_withdraw_record.fields.coins'))->align('center'); + $grid->column(function (Grid $grid) { + $grid->column('bank_name', admin_trans('player_withdraw_record.fields.bank_name'))->copy()->align('center'); + $grid->column('account_name', admin_trans('player_withdraw_record.fields.account_name'))->copy()->align('center'); + $grid->column('account', admin_trans('player_withdraw_record.fields.account'))->copy()->align('center'); + }, admin_trans('player_withdraw_record.player_bank')); + $grid->column('type', admin_trans('player_withdraw_record.fields.type'))->display(function ($val) { + switch ($val) { + case PlayerWithdrawRecord::TYPE_SELF: + return Tag::create(admin_trans('player_withdraw_record.type.' . $val)) + ->color('#3b5999'); + case PlayerWithdrawRecord::TYPE_ARTIFICIAL: + return Tag::create(admin_trans('player_withdraw_record.type.' . $val)) + ->color('#cd201f'); + default: + return ''; + } + })->align('center'); + $grid->column('status', admin_trans('player_withdraw_record.fields.status')) + ->display(function () { + return Tag::create(admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_SUCCESS))->color('#87d068'); + })->align('center')->sortable(); + $grid->column('channel.name', admin_trans('player_withdraw_record.fields.department_id'))->align('center'); + $grid->column('finish_time', admin_trans('player_withdraw_record.fields.finish_time'))->sortable()->align('center'); + $grid->column('created_at', admin_trans('player_withdraw_record.fields.created_at'))->sortable()->align('center'); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->actions(function (Actions $actions) { + $actions->hideDel(); + $actions->hideEdit(); + }); + $grid->filter(function (Filter $filter) { + $filter->like()->text('tradeno')->placeholder(admin_trans('player_withdraw_record.fields.tradeno')); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateTimeRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]); + $filter->form()->hidden('finish_time_start'); + $filter->form()->hidden('finish_time_end'); + $filter->form()->dateTimeRange('finish_time_start', 'finish_time_end', '')->placeholder([admin_trans('player_withdraw_record.fields.finish_time'), admin_trans('player_withdraw_record.fields.finish_time')]); + }); + $grid->quickSearch(); + }); + } + + /** + * 钱包操作 + * @param $id + * @return Grid + */ + public function playerDeliveryRecord($id): Grid + { + return Grid::create(new $this->playerDeliveryRecord, function (Grid $grid) use ($id) { + $lang = Container::getInstance()->translator->getLocale(); + $grid->title(admin_trans('promoter_profit_record.player_activity_phase_record_title')); + $grid->model() + ->where('player_id', $id) + ->whereIn('type', [ + PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD, + PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT, + ]) + ->orderBy('id', 'desc'); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (!empty($exAdminFilter)) { + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->where('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->where('created_at', '<=', $exAdminFilter['created_at_end']); + } + } + $grid->autoHeight(); + $grid->bordered(true); + $grid->column('id', admin_trans('player_delivery_record.fields.id'))->align('center'); + $grid->column('source', admin_trans('player_delivery_record.fields.source'))->display(function ($val, PlayerDeliveryRecord $data) use ($lang) { + switch ($data->type) { + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD: + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT: + return Tag::create(trans($val, [], 'message', $lang))->color('red'); + default: + return ''; + } + })->align('center'); + $grid->column('type', admin_trans('player_delivery_record.fields.type')) + ->display(function ($value) { + switch ($value) { + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD))->color('#2db7f5'); + break; + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT))->color('#108ee9'); + break; + default: + $tag = ''; + } + return Html::create()->content([ + $tag + ]); + })->align('center')->sortable(); + $grid->column('amount', admin_trans('player_delivery_record.fields.amount'))->display(function ($val, PlayerDeliveryRecord $data) { + if ($data->amount == 0) { + return Html::create()->content([$val])->style(['color' => 'green']); + } + switch ($data->type) { + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT: + return Html::create()->content(['-' . $val])->style(['color' => '#cd201f']); + default: + return Html::create()->content(['+' . $val])->style(['color' => 'green']); + } + })->align('center'); + $grid->column('user_name', admin_trans('player_delivery_record.fields.user_name'))->display(function ($val, PlayerDeliveryRecord $data) { + $name = '--'; + if (in_array($data->type, [PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD, PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT])) { + $name = $data->user_name ?? '管理员'; + } + return Html::create()->content([ + Html::div()->content($name), + ]); + }); + $grid->column('created_at', admin_trans('player_delivery_record.fields.created_at'))->align('center')->ellipsis(true); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->hideTrashed(); + $grid->actions(function (Actions $actions) { + $actions->hideDel(); + }); + $grid->filter(function (Filter $filter) { + $filter->eq()->select('type') + ->placeholder(admin_trans('player_delivery_record.fields.type')) + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->options([ + PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD), + PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT), + ]); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateTimeRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]); + }); + }); + } + + /** + * 充值记录 + * @param $id + * @return Grid + */ + public function rechargeRecord($id): Grid + { + return Grid::create(new $this->recharge(), function (Grid $grid) use ($id) { + $grid->title(admin_trans('player_recharge_record.title')); + $grid->bordered(); + $grid->autoHeight(); + $grid->model()->with(['channel', 'channel_recharge_setting'])->where('player_id', $id)->where('status', PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS)->orderBy('created_at', 'desc'); + $grid->column('id', admin_trans('player_recharge_record.fields.id'))->align('center'); + $grid->column('player_phone', admin_trans('player_recharge_record.fields.player_phone'))->display(function ($val, PlayerRechargeRecord $data) { + $image = (isset($data->player->avatar) && !empty($data->player->avatar)) ? Avatar::create()->src($data->player->avatar) : Avatar::create()->icon(Icon::create('UserOutlined')); + return Html::create()->content([ + $image, + Html::div()->content($val) + ]); + })->align('center'); + $grid->column('tradeno', admin_trans('player_recharge_record.fields.tradeno'))->copy()->align('center'); + $grid->column('channel.name', admin_trans('player_recharge_record.fields.department_id'))->align('center'); + $grid->column('type', admin_trans('player_recharge_record.fields.type'))->display(function ($val) { + switch ($val) { + case PlayerRechargeRecord::TYPE_ACTIVITY: + return Tag::create(admin_trans('player_recharge_record.type.' . $val)) + ->color('#55acee'); + case PlayerRechargeRecord::TYPE_REGULAR: + return Tag::create(admin_trans('player_recharge_record.type.' . $val)) + ->color('#3b5999'); + case PlayerRechargeRecord::TYPE_ARTIFICIAL: + return Tag::create(admin_trans('player_recharge_record.type.' . $val)) + ->color('#cd201f'); + default: + return ''; + } + })->align('center'); + $grid->column('money', admin_trans('player_recharge_record.fields.money'))->display(function ($val, PlayerRechargeRecord $data) { + return $val . ' ' . ($data->currency == 'TALK' ? 'Q币' : $data->currency); + })->align('center'); + $grid->column('coins', admin_trans('player_recharge_record.fields.coins'))->align('center'); + $grid->column(function (Grid $grid) { + $grid->column('bank_name', admin_trans('channel_recharge_method.fields.bank_name'))->copy()->align('center'); + $grid->column('sub_bank', admin_trans('channel_recharge_method.fields.sub_bank'))->copy()->align('center'); + $grid->column('owner', admin_trans('channel_recharge_method.fields.owner'))->copy()->align('center'); + $grid->column('account', admin_trans('channel_recharge_method.fields.account'))->copy()->align('center'); + }, admin_trans('channel_recharge_setting.recharge_setting_info')); + $grid->column('status', admin_trans('player_recharge_record.fields.status'))->display(function () { + return Tag::create(admin_trans('player_recharge_record.status_success'))->color('#87d068'); + })->align('center'); + $grid->column('finish_time', admin_trans('player_recharge_record.fields.finish_time'))->sortable()->align('center'); + $grid->column('created_at', admin_trans('player_recharge_record.fields.created_at'))->sortable()->align('center'); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->actions(function (Actions $actions) { + $actions->hideDel(); + $actions->hideEdit(); + }); + $grid->filter(function (Filter $filter) { + $filter->eq()->select('type') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('player_recharge_record.fields.type')) + ->options([ + PlayerRechargeRecord::TYPE_REGULAR => admin_trans('player_recharge_record.type.' . PlayerRechargeRecord::TYPE_REGULAR), + PlayerRechargeRecord::TYPE_ACTIVITY => admin_trans('player_recharge_record.type.' . PlayerRechargeRecord::TYPE_ACTIVITY), + PlayerRechargeRecord::TYPE_ARTIFICIAL => admin_trans('player_recharge_record.type.' . PlayerRechargeRecord::TYPE_ARTIFICIAL), + ]); + $filter->like()->text('tradeno')->placeholder(admin_trans('player_recharge_record.fields.tradeno')); + $filter->between()->dateTimeRange('created_at')->placeholder([admin_trans('player_recharge_record.fields.created_at'), admin_trans('player_recharge_record.fields.created_at')]); + $filter->between()->dateTimeRange('finish_time')->placeholder([admin_trans('player_recharge_record.fields.finish_time'), admin_trans('player_recharge_record.fields.finish_time')]); + + }); + $grid->quickSearch(); + }); + } + + + /** + * 打码量记录 + * @param $id + * @return Grid + */ + public function playerChipRecord($id): Grid + { + return Grid::create(new $this->playerChipRecord(), function (Grid $grid) use ($id) { + $grid->title(admin_trans('player_chip_record.title')); + $grid->bordered(); + $grid->autoHeight(); + $grid->model()->with(['channel', 'player']) + ->where('player_id', $id) + ->orderBy('created_at', 'desc'); + $exAdminFilter = Request::input('ex_admin_filter', []); + $query = clone $grid->model(); + $totalData = $query->where(function ($query) use($exAdminFilter) { + if(!empty($exAdminFilter['created_at'])) { + $query->whereBetween('created_at', $exAdminFilter['created_at']); + } + })->sum('chip_amount'); + $layout = Layout::create(); + $layout->row(function (Row $row) use ($totalData) { + $row->gutter([10, 0]); + $row->column( + Card::create([ + Row::create()->column(Statistic::create()->value($totalData) + ->prefix(admin_trans('player_chip_record.fields.chip_amount')) + ->valueStyle([ + 'font-size' => '14px', + 'font-weight' => '500', + 'text-align' => 'center' + ])), + ])->bodyStyle([ + 'display' => 'flex', + 'align-items' => 'center', + 'height' => '30px', + 'padding' => '0px' + ])->hoverable()->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px']) + , 4); + })->style(['background' => '#fff']); + $grid->tools([ + $layout + ]); + $grid->column('id', admin_trans('player_chip_record.fields.id'))->align('center'); + $grid->column('channel.name', admin_trans('channel.fields.name'))->align('center'); + $grid->column('chip_amount', admin_trans('player_chip_record.fields.chip_amount'))->display(function ($val, PlayerChipRecord $data) { + if ($val == 0) { + return Html::create()->content(['+' . $val])->style(['color' => 'green']); + } + switch ($data->type) { + case PlayerChipRecord::TYPE_DEC: + return Html::create()->content(['-' . $val])->style(['color' => '#cd201f']); + default: + return Html::create()->content(['+' . $val])->style(['color' => 'green']); + } + })->align('center'); + $grid->column('must_chip_amount', admin_trans('player_chip_record.fields.must_chip_amount'))->display(function ($val, PlayerChipRecord $data) { + if ($val == 0) { + return Html::create()->content(['+' . $val])->style(['color' => 'green']); + } + switch ($data->type) { + case PlayerChipRecord::TYPE_DEC: + return Html::create()->content(['-' . $val])->style(['color' => '#cd201f']); + default: + return Html::create()->content(['+' . $val])->style(['color' => 'green']); + } + })->align('center'); + $grid->column('record_type', admin_trans('player_chip_record.fields.record_type'))->display(function ($val) { + switch ($val) { + case PlayerChipRecord::RECORD_TYPE_SIGN: + case PlayerChipRecord::RECORD_TYPE_RECHARGE: + case PlayerChipRecord::RECORD_TYPE_FIRST_RECHARGE_REWARD: + $tag = Tag::create(admin_trans('player_chip_record.record_type.' . $val)) + ->color('#55acee'); + break; + case PlayerChipRecord::RECORD_TYPE_ACTIVITY: + case PlayerChipRecord::RECORD_TYPE_GAME: + case PlayerChipRecord::RECORD_TYPE_BET_REBATE: + $tag = Tag::create(admin_trans('player_chip_record.record_type.' . $val)) + ->color('#3b5999'); + break; + case PlayerChipRecord::RECORD_TYPE_COMMISSION: + case PlayerChipRecord::RECORD_TYPE_BANKRUPTCY: + $tag = Tag::create(admin_trans('player_chip_record.record_type.' . $val)) + ->color('#cd201f'); + break; + default: + return ''; + } + return Html::create()->content([ + $tag, + ]); + })->align('center'); + $grid->column('amount', admin_trans('player_chip_record.fields.amount'))->align('center'); + $grid->column('created_at', admin_trans('player_chip_record.fields.created_at'))->sortable()->align('center'); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->actions(function (Actions $actions) { + $actions->hideDel(); + $actions->hideEdit(); + }); + $grid->filter(function (Filter $filter) { + $filter->eq()->select('record_type') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('player_chip_record.fields.record_type')) + ->options([ + PlayerChipRecord::RECORD_TYPE_SIGN => admin_trans('player_chip_record.record_type.' . PlayerChipRecord::RECORD_TYPE_SIGN), + PlayerChipRecord::RECORD_TYPE_RECHARGE => admin_trans('player_chip_record.record_type.' . PlayerChipRecord::RECORD_TYPE_RECHARGE), + PlayerChipRecord::RECORD_TYPE_ACTIVITY => admin_trans('player_chip_record.record_type.' . PlayerChipRecord::RECORD_TYPE_ACTIVITY), + PlayerChipRecord::RECORD_TYPE_GAME => admin_trans('player_chip_record.record_type.' . PlayerChipRecord::RECORD_TYPE_GAME), + PlayerChipRecord::RECORD_TYPE_COMMISSION => admin_trans('player_chip_record.record_type.' . PlayerChipRecord::RECORD_TYPE_COMMISSION), + PlayerChipRecord::RECORD_TYPE_BANKRUPTCY => admin_trans('player_chip_record.record_type.' . PlayerChipRecord::RECORD_TYPE_BANKRUPTCY), + PlayerChipRecord::RECORD_TYPE_BET_REBATE => admin_trans('player_chip_record.record_type.' . PlayerChipRecord::RECORD_TYPE_BET_REBATE), + PlayerChipRecord::RECORD_TYPE_FIRST_RECHARGE_REWARD => admin_trans('player_chip_record.record_type.' . PlayerChipRecord::RECORD_TYPE_FIRST_RECHARGE_REWARD), + ]); + $filter->between()->dateTimeRange('created_at')->placeholder([admin_trans('player_chip_record.fields.created_at'), admin_trans('player_chip_record.fields.created_at')]); + + }); + $grid->quickSearch(); + }); + } + + /** + * 取消转账 + * @param $id + * @auth true + * @return Msg + */ + public function cancelTransfer($id): Msg + { + /** @var PlayerWalletTransfer $playerWalletTransfer */ + $playerWalletTransfer = PlayerWalletTransfer::query()->where('player_id', $id)->orderBy('id', 'desc')->first(); + /** @var Player $player */ + $player = Player::query()->find($id); + if (!empty($playerWalletTransfer) && $playerWalletTransfer->type == PlayerWalletTransfer::TYPE_OUT) { + $playerWalletTransferOut = new PlayerWalletTransfer(); + $playerWalletTransferOut->player_id = $player->id; + $playerWalletTransferOut->platform_id = $playerWalletTransfer->platform_id; + $playerWalletTransferOut->department_id = $player->department_id; + $playerWalletTransferOut->type = PlayerWalletTransfer::TYPE_IN; + $playerWalletTransferOut->amount = 0; + $playerWalletTransferOut->reward = 0; + $playerWalletTransferOut->platform_no = 'cancelTransfer'; + $playerWalletTransferOut->tradeno = createOrderNo(); + $playerWalletTransferOut->save(); + $playerDeliveryRecord = new PlayerDeliveryRecord; + $playerDeliveryRecord->type = PlayerDeliveryRecord::TYPE_CANCELTRANSFER; + //寫入金流明細 + $playerDeliveryRecord->player_id = $playerWalletTransferOut->player_id; + $playerDeliveryRecord->department_id = $playerWalletTransferOut->department_id; + $playerDeliveryRecord->target = $playerWalletTransferOut->getTable(); + $playerDeliveryRecord->target_id = $playerWalletTransferOut->id; + $playerDeliveryRecord->source = 'cancel_transfer'; + $playerDeliveryRecord->amount = $playerWalletTransferOut->amount; + $playerDeliveryRecord->amount_before = $player->wallet->money; + $playerDeliveryRecord->amount_after = $player->wallet->money; + $playerDeliveryRecord->tradeno = ''; + $playerDeliveryRecord->remark = '管理员取消转账,平台ID:' . $playerWalletTransfer->platform_id; + $playerDeliveryRecord->save(); + return message_success(admin_trans('player.action_success')); + } + return message_error(admin_trans('player.action_error')); + } +} diff --git a/addons/webman/controller/PlayerDeliveryRecordController.php b/addons/webman/controller/PlayerDeliveryRecordController.php new file mode 100644 index 0000000..488404b --- /dev/null +++ b/addons/webman/controller/PlayerDeliveryRecordController.php @@ -0,0 +1,204 @@ +model = plugin()->webman->config('database.player_delivery_record_model'); + } + + /** + * 玩家账变 + * @auth true + */ + public function index(): Grid + { + $lang = Container::getInstance()->translator->getLocale(); + return Grid::create(new $this->model(), function (Grid $grid) use ($lang) { + $grid->title(admin_trans('player_delivery_record.title')); + $grid->model()->with(['player'])->orderBy('created_at', 'desc'); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->where('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->where('created_at', '<=', $exAdminFilter['created_at_end']); + } + if (isset($exAdminFilter['search_source']) && !empty($exAdminFilter['search_source'])) { + $searchSource = $exAdminFilter['search_source']; + $grid->model()->where(function ($query) use ($searchSource) { + $query->where([ + ['source', 'like', '%' . $searchSource . '%', 'and'], + ]); + }); + } + $grid->autoHeight(); + $grid->column('player.uuid', admin_trans('player.fields.uuid'))->align('center'); + $grid->column('player.name', admin_trans('player.fields.name'))->display(function ($val, PlayerDeliveryRecord $data) { + $image = $data->player->avatar ? Avatar::create()->src(is_numeric($data->player->avatar) ? config('def_avatar.' . $data->player->avatar) : $data->player->avatar) : Avatar::create()->icon(Icon::create('UserOutlined')); + return Html::create()->content([ + $image, + Html::div()->content($data->player->name), + ]); + })->align('center')->filter( + FilterColumn::like()->text('player.phone') + ); + $grid->column('source', admin_trans('player_delivery_record.fields.source'))->display(function ($val, PlayerDeliveryRecord $data) use ($lang) { + switch ($data->type) { + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD: + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT: + case PlayerDeliveryRecord::TYPE_RECHARGE: + case PlayerDeliveryRecord::TYPE_WITHDRAWAL: + case PlayerDeliveryRecord::TYPE_WITHDRAWAL_BACK: + return Tag::create(trans($val, [], 'message', $lang))->color('red'); + case PlayerDeliveryRecord::TYPE_REGISTER_PRESENT: + return Tag::create(trans($val, [], 'message', $lang))->color('blue'); + case PlayerDeliveryRecord::TYPE_COMMISSION: + case PlayerDeliveryRecord::TYPE_GAME_OUT: + return Tag::create(trans($val, [], 'message', $lang))->color('purple'); + case PlayerDeliveryRecord::TYPE_SIGN: + case PlayerDeliveryRecord::TYPE_GAME_IN: + case PlayerDeliveryRecord::TYPE_BET_REBATE: + case PlayerDeliveryRecord::TYPE_DAMAGE_REBATE: + case PlayerDeliveryRecord::TYPE_RECHARGE_REWARD: + case PlayerDeliveryRecord::TYPE_PROFIT: + return Tag::create(trans($val, [], 'message', $lang))->color('orange'); + default: + return ''; + } + })->align('center'); + $grid->column('type', admin_trans('player_delivery_record.fields.type')) + ->display(function ($value) { + switch ($value) { + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD))->color('#2db7f5'); + break; + case PlayerDeliveryRecord::TYPE_RECHARGE: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_RECHARGE))->color('#3C87C9'); + break; + case PlayerDeliveryRecord::TYPE_WITHDRAWAL: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_WITHDRAWAL))->color('#C98341'); + break; + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT))->color('#108ee9'); + break; + case PlayerDeliveryRecord::TYPE_WITHDRAWAL_BACK: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_WITHDRAWAL_BACK))->color('#CC6600'); + break; + case PlayerDeliveryRecord::TYPE_COMMISSION: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_COMMISSION))->color('#3C87C9'); + break; + case PlayerDeliveryRecord::TYPE_REGISTER_PRESENT: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_REGISTER_PRESENT))->color('#3C87C9'); + break; + case PlayerDeliveryRecord::TYPE_SIGN: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_SIGN))->color('#CC6600'); + break; + case PlayerDeliveryRecord::TYPE_GAME_IN: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_GAME_IN))->color('#CC6600'); + break; + case PlayerDeliveryRecord::TYPE_GAME_OUT: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_GAME_OUT))->color('#3C87C9'); + break; + case PlayerDeliveryRecord::TYPE_BET_REBATE: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_BET_REBATE))->color('#C98341'); + break; + case PlayerDeliveryRecord::TYPE_DAMAGE_REBATE: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_DAMAGE_REBATE))->color('#3C87C9'); + break; + case PlayerDeliveryRecord::TYPE_RECHARGE_REWARD: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_RECHARGE_REWARD))->color('#3C87C9'); + break; + case PlayerDeliveryRecord::TYPE_PROFIT: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_PROFIT))->color('#3C87C9'); + break; + case PlayerDeliveryRecord::TYPE_CANCELTRANSFER: + $tag = Tag::create(admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_CANCELTRANSFER))->color('#3C87C9'); + break; + default: + $tag = ''; + } + return Html::create()->content([ + $tag + ]); + })->align('center')->sortable(); + $grid->column('amount', admin_trans('player_delivery_record.fields.amount'))->display(function ($val, PlayerDeliveryRecord $data) { + switch ($data->type) { + case PlayerDeliveryRecord::TYPE_WITHDRAWAL: + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT: + return Html::create()->content(['-' . $val])->style(['color' => '#cd201f']); + default: + return Html::create()->content(['+' . $val])->style(['color' => 'green']); + } + })->align('center'); + $grid->column('amount_after', admin_trans('player_delivery_record.fields.amount_after'))->align('center'); + $grid->column('amount_before', admin_trans('player_delivery_record.fields.amount_before'))->align('center'); + $grid->column('user_name', admin_trans('player_delivery_record.fields.user_name'))->display(function ($val, PlayerDeliveryRecord $data) { + $name = '玩家'; + if (in_array($data->type, [PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD, PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT])) { + $name = $data->user_name ?? '管理员'; + } + return Html::create()->content([ + Html::div()->content($name), + ]); + }); + $grid->column('created_at', admin_trans('player_delivery_record.fields.created_at'))->sortable()->align('center'); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->actions(function (Actions $actions) { + $actions->hideDel(); + $actions->hideEdit(); + }); + $grid->filter(function (Filter $filter) { + $filter->like()->text('player.uuid')->placeholder(admin_trans('player.fields.uuid')); + $filter->like()->text('player.name')->placeholder(admin_trans('player.fields.name')); + $filter->like()->text('search_source')->placeholder(admin_trans('player_delivery_record.fields.source')); + $filter->eq()->select('type') + ->placeholder(admin_trans('player_delivery_record.fields.type')) + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->options([ + PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD), + PlayerDeliveryRecord::TYPE_RECHARGE => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_RECHARGE), + PlayerDeliveryRecord::TYPE_WITHDRAWAL => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_WITHDRAWAL), + PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT), + PlayerDeliveryRecord::TYPE_WITHDRAWAL_BACK => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_WITHDRAWAL_BACK), + PlayerDeliveryRecord::TYPE_REGISTER_PRESENT => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_REGISTER_PRESENT), + PlayerDeliveryRecord::TYPE_COMMISSION => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_COMMISSION), + PlayerDeliveryRecord::TYPE_SIGN => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_SIGN), + PlayerDeliveryRecord::TYPE_GAME_OUT => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_GAME_OUT), + PlayerDeliveryRecord::TYPE_GAME_IN => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_GAME_IN), + PlayerDeliveryRecord::TYPE_BET_REBATE => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_BET_REBATE), + PlayerDeliveryRecord::TYPE_DAMAGE_REBATE => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_DAMAGE_REBATE), + PlayerDeliveryRecord::TYPE_RECHARGE_REWARD => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_RECHARGE_REWARD), + PlayerDeliveryRecord::TYPE_PROFIT => admin_trans('player_delivery_record.type.' . PlayerDeliveryRecord::TYPE_PROFIT), + ]); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateTimeRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]); + + }); + $grid->quickSearch(); + }); + } +} diff --git a/addons/webman/controller/PostController.php b/addons/webman/controller/PostController.php new file mode 100644 index 0000000..f81148a --- /dev/null +++ b/addons/webman/controller/PostController.php @@ -0,0 +1,74 @@ +model = plugin()->webman->config('database.post_model'); + + } + + /** + * 岗位 + * @auth true + */ + public function index(): Grid + { + return Grid::create(new $this->model, function (Grid $grid) { + $grid->title(admin_trans('post.title')); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->whereDate('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->whereDate('created_at', '<=', $exAdminFilter['created_at_end']); + } + $grid->autoHeight(); + $grid->column('name', admin_trans('post.fields.name')); + $grid->column('status', admin_trans('post.fields.status'))->switch([[1 => ''], [0 => '']]); + $grid->sortInput('sort', admin_trans('post.fields.sort')); + $grid->column('created_at', admin_trans('post.fields.create_at')); + $grid->filter(function (Filter $filter) { + $filter->like()->text('name')->placeholder(admin_trans('post.fields.name')); + $filter->eq()->select('status') + ->placeholder(admin_trans('post.fields.status')) + ->options([ + 1 => admin_trans('post.normal'), + 0 => admin_trans('post.disable') + ]); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]); + }); + $grid->setForm()->modal($this->form()); + $grid->quickSearch(); + }); + } + + /** + * 岗位 + * @auth true + */ + public function form(): Form + { + return Form::create(new $this->model, function (Form $form) { + $form->title(admin_trans('post.title')); + $form->text('name', admin_trans('post.fields.name')) + ->required(); + $form->number('sort', admin_trans('post.fields.sort'))->default(0); + }); + } +} diff --git a/addons/webman/controller/RechargeRecordController.php b/addons/webman/controller/RechargeRecordController.php new file mode 100644 index 0000000..95138d2 --- /dev/null +++ b/addons/webman/controller/RechargeRecordController.php @@ -0,0 +1,400 @@ +model = plugin()->webman->config('database.player_recharge_record_model'); + } + + /** + * 充值 + * @auth true + */ + public function index(): Grid + { + return Grid::create(new $this->model(), function (Grid $grid) { + $grid->title(admin_trans('player_recharge_record.title')); + $grid->model()->with(['player', 'channel', 'channel_recharge_setting', 'player.player_extend'])->orderBy('created_at', 'desc'); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (!empty($exAdminFilter)) { + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->where('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->where('created_at', '<=', $exAdminFilter['created_at_end']); + } + if (isset($exAdminFilter['finish_time_start']) && !empty($exAdminFilter['finish_time_start'])) { + $grid->model()->where('finish_time', '>=', $exAdminFilter['finish_time_start']); + } + if (isset($exAdminFilter['finish_time_end']) && !empty($exAdminFilter['finish_time_end'])) { + $grid->model()->where('finish_time', '<=', $exAdminFilter['finish_time_end']); + } + if (!empty($exAdminFilter['player']['uuid'])) { + $grid->model()->whereHas('player', function ($query) use ($exAdminFilter) { + $query->where('uuid', 'like', '%' . $exAdminFilter['player']['uuid'] . '%'); + }); + } + if (!empty($exAdminFilter['player']['name'])) { + $grid->model()->whereHas('player', function ($query) use ($exAdminFilter) { + $query->where('name', 'like', '%' . $exAdminFilter['player']['name'] . '%'); + }); + } + if (!empty($exAdminFilter['department_id'])) { + $grid->model()->where('department_id', $exAdminFilter['department_id']); + } + if (!empty($exAdminFilter['type'])) { + $grid->model()->where('type', $exAdminFilter['type']); + } + if (isset($exAdminFilter['status']) && (!empty($exAdminFilter['status']) || $exAdminFilter['status'] === 0)) { + $grid->model()->where('status', $exAdminFilter['status']); + } + if (!empty($exAdminFilter['tradeno'])) { + $grid->model()->where('tradeno', $exAdminFilter['tradeno']); + } + } + $query = clone $grid->model(); + $totalData = $query->selectRaw( + "ifNull(sum(IF(type = 4, money,0)), 0) as total_artificial_money, + ifNull(sum(IF(type = 1, money,0)), 0) as total_espay_money, + ifNull(sum(IF(payment_method = 'DUITNOWP2P', money,0)), 0) as total_espay_duitnow_money, + ifNull(sum(IF(payment_method = 'P2PDEPOSIT', money,0)), 0) as total_espay_deposit_money, + ifNull(sum(IF(payment_method = 'duitnowqr', money,0)), 0) as total_onepay_duitnow_money, + ifNull(sum(IF(payment_method = 'online_banking', money,0)), 0) as total_onepay_deposit_money, + ifNull(sum(IF(payment_method = 'QR', money,0)), 0) as total_skl_duitnow_money, + ifNull(sum(IF(payment_method = 'P2P', money,0)), 0) as total_skl_deposit_money" + )->first(); + $layout = Layout::create(); + $layout->row(function (Row $row) use ($totalData) { + $row->gutter([10, 0]); + $row->column( + Card::create([ + Row::create()->column(Statistic::create()->title(admin_trans('player_recharge_record.total_data.total_artificial_money')) + ->value(!empty($totalData['total_artificial_money']) ? floatval($totalData['total_artificial_money']) : 0)->style([ + 'font-size' => '15px', + 'text-align' => 'center' + ])), + ])->bodyStyle([ + 'display' => 'flex', + 'align-items' => 'center', + 'height' => '72px' + ])->hoverable()->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px']) + , 8); + $row->column( + Card::create([ + Row::create()->column(Statistic::create()->title(admin_trans('player_recharge_record.total_data.total_espay_money')) + ->value(!empty($totalData['total_espay_money']) ? floatval($totalData['total_espay_money']) : 0)->style([ + 'font-size' => '15px', + 'text-align' => 'center' + ])), + ])->bodyStyle([ + 'display' => 'flex', + 'align-items' => 'center', + 'height' => '72px' + ])->hoverable()->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px']) + , 8); + $row->column( + Card::create([ + Row::create()->column(Statistic::create()->title(admin_trans('player_recharge_record.total_data.total_espay_inmoney')) + ->value(bcadd(bcadd( + bcadd(bcmul($totalData['total_espay_duitnow_money'], 0.97, 3), bcmul($totalData['total_espay_deposit_money'], 0.985, 3), 3), + bcadd(bcmul($totalData['total_onepay_duitnow_money'], 0.984, 3), bcmul($totalData['total_onepay_deposit_money'], 0.986, 3), 3), + 3), bcadd(bcmul($totalData['total_skl_duitnow_money'], 0.987, 3), bcmul($totalData['total_skl_deposit_money'], 0.989, 3), 3), 3)) + ->style([ + 'font-size' => '15px', + 'text-align' => 'center' + ])), + ])->bodyStyle([ + 'display' => 'flex', + 'align-items' => 'center', + 'height' => '72px' + ])->hoverable()->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px']) + , 8); + })->style(['background' => '#fff']); + $grid->header($layout); + $grid->bordered(true); + $grid->autoHeight(); + $grid->column('id', admin_trans('player_recharge_record.fields.id'))->align('center')->fixed(true); + $grid->column('player.name', admin_trans('player.fields.name'))->display(function ($val, PlayerRechargeRecord $data) { + $image = (isset($data->player->avatar) && !empty($data->player->avatar)) ? Avatar::create()->src($data->player->avatar) : Avatar::create()->icon(Icon::create('UserOutlined')); + return Html::create()->content([ + $image, + Html::div()->content($val) + ])->style(['cursor' => 'pointer'])->modal($this->playerDetail([ + 'phone' => $data->player->phone ?? '', + 'name' => $data->player->name ?? '', + 'address' => $data->player->player_extend->address ?? '', + 'email' => $data->player->player_extend->email ?? '', + 'line' => $data->player->player_extend->line ?? '', + 'created_at' => $data->player->created_at ? date('Y-m-d H:i:s', strtotime($data->player->created_at)) : '', + ])); + })->align('center')->fixed(true); + $grid->column('player.uuid', admin_trans('player.fields.uuid'))->display(function ($val, PlayerRechargeRecord $data) { + return $data->player->uuid; + })->align('center')->fixed(true); + $grid->column('tradeno', admin_trans('player_recharge_record.fields.tradeno'))->copy(); + $grid->column('channel.name', admin_trans('player_recharge_record.fields.department_id'))->align('center'); + $grid->column('type', admin_trans('player_recharge_record.fields.type'))->display(function ($val) { + switch ($val) { + case PlayerRechargeRecord::TYPE_REGULAR: + return Tag::create(admin_trans('player_recharge_record.type.' . $val)) + ->color('#55acee'); + case PlayerRechargeRecord::TYPE_ACTIVITY: + return Tag::create(admin_trans('player_recharge_record.type.' . $val)) + ->color('#3b5999'); + case PlayerRechargeRecord::TYPE_ARTIFICIAL: + return Tag::create(admin_trans('player_recharge_record.type.' . $val)) + ->color('#cd201f'); + default: + return ''; + } + })->align('center'); + $grid->column('status', admin_trans('player_recharge_record.fields.status'))->display(function ($val, PlayerRechargeRecord $data) { + switch ($val) { + case PlayerRechargeRecord::STATUS_WAIT: + return Tag::create(admin_trans('player_recharge_record.status_wait')) + ->color('#108ee9'); + case PlayerRechargeRecord::STATUS_RECHARGING: + return Tag::create(admin_trans('player_recharge_record.status_examine')) + ->color('#3b5999'); + case PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS: + return Tag::create(admin_trans('player_recharge_record.status_success')) + ->color('#87d068'); + case PlayerRechargeRecord::STATUS_RECHARGED_FAIL: + return Tag::create(admin_trans('player_recharge_record.status_fail')) + ->color('#f50'); + case PlayerRechargeRecord::STATUS_RECHARGED_CANCEL: + return Tag::create(admin_trans('player_recharge_record.status_cancel')) + ->color('#2db7f5'); + case PlayerRechargeRecord::STATUS_RECHARGED_REJECT: + return Tag::create(admin_trans('player_recharge_record.status_reject')) + ->color('#2db7f5'); + case PlayerRechargeRecord::STATUS_RECHARGED_SYSTEM_CANCEL: + return Tag::create(admin_trans('player_recharge_record.status_system_cancel')) + ->color('#2db7f5'); + default: + return ''; + } + })->align('center'); + $grid->column('money', admin_trans('player_recharge_record.fields.money'))->display(function ($val, PlayerRechargeRecord $data) { + return bcdiv($val,$data->rate, 2) . ' ' . ($data->currency); + })->align('center'); + $grid->column('inmoney', admin_trans('player_recharge_record.fields.inmoney'))->display(function ($val, PlayerRechargeRecord $data) { + if ($data->payment_method == 'DUITNOWP2P') { + $ratio = 0.97; + } elseif ($data->payment_method == 'P2PDEPOSIT') { + $ratio = 0.985; + } elseif ($data->payment_method == 'duitnowqr') { + $ratio = 0.984; + } elseif ($data->payment_method == 'online_banking') { + $ratio = 0.986; + } elseif ($data->payment_method == 'P2P') { + $ratio = 0.989; + } elseif ($data->payment_method == 'QR') { + $ratio = 0.987; + } else { + $ratio = 1; + } + if ($data->currency == 'USDT') { + return bcdiv($val,$data->rate, 2) . ' ' . ($data->currency); + } + return $data->money * $ratio . ' ' . ($data->currency); + })->align('center'); + $grid->column('coins', admin_trans('player_recharge_record.fields.coins'))->align('center')->sortable(); + $grid->column('player_tag', admin_trans('player_recharge_record.fields.player_tag')) + ->display(function ($value) { + return $this->handleTagIds($value); + }) + ->editable( + Editable::checkboxTag() + ->options($this->getPlayerTagOptionsFilter()) + )->width('150px'); + $grid->column('remark', admin_trans('player_recharge_record.fields.remark'))->display(function ($value) { + return Str::of($value)->limit(20, ' (...)'); + })->editable( + (new Editable)->textarea('remark') + ->showCount() + ->rows(5) + ->rule(['max:255' => admin_trans('player_recharge_record.fields.remark')]) + )->width('150px')->align('center'); + $grid->column('finish_time', admin_trans('player_recharge_record.fields.finish_time'))->sortable()->align('center'); + $grid->column('created_at', admin_trans('player_recharge_record.fields.created_at'))->sortable()->align('center')->fixed('right'); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->expandFilter(); + $grid->actions(function (Actions $actions) { + $actions->hideDel(); + $actions->hideEdit(); + }); + $grid->filter(function (Filter $filter) { + $filter->like()->text('player.uuid')->placeholder(admin_trans('player.fields.uuid')); + $filter->like()->text('player.name')->placeholder(admin_trans('player.fields.name')); + $filter->eq()->select('department_id') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('player_recharge_record.fields.department_id')) + ->remoteOptions(admin_url(['addons-webman-controller-ChannelController', 'getDepartmentOptions'])); + $filter->eq()->select('type') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('player_recharge_record.fields.type')) + ->options([ + PlayerRechargeRecord::TYPE_REGULAR => admin_trans('player_recharge_record.type.' . PlayerRechargeRecord::TYPE_REGULAR), + PlayerRechargeRecord::TYPE_ARTIFICIAL => admin_trans('player_recharge_record.type.' . PlayerRechargeRecord::TYPE_ARTIFICIAL), + ]); + $filter->eq()->select('status') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('player_recharge_record.fields.status')) + ->options([ + PlayerRechargeRecord::STATUS_WAIT => admin_trans('player_recharge_record.status.' . PlayerRechargeRecord::STATUS_WAIT), + PlayerRechargeRecord::STATUS_RECHARGING => admin_trans('player_recharge_record.status.' . PlayerRechargeRecord::STATUS_RECHARGING), + PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS => admin_trans('player_recharge_record.status.' . PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS), + PlayerRechargeRecord::STATUS_RECHARGED_FAIL => admin_trans('player_recharge_record.status.' . PlayerRechargeRecord::STATUS_RECHARGED_FAIL), + PlayerRechargeRecord::STATUS_RECHARGED_CANCEL => admin_trans('player_recharge_record.status.' . PlayerRechargeRecord::STATUS_RECHARGED_CANCEL), + PlayerRechargeRecord::STATUS_RECHARGED_REJECT => admin_trans('player_recharge_record.status.' . PlayerRechargeRecord::STATUS_RECHARGED_REJECT), + PlayerRechargeRecord::STATUS_RECHARGED_SYSTEM_CANCEL => admin_trans('player_recharge_record.status.' . PlayerRechargeRecord::STATUS_RECHARGED_SYSTEM_CANCEL), + ]); + $filter->like()->text('tradeno')->placeholder(admin_trans('player_recharge_record.fields.tradeno')); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateTimeRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]); + $filter->form()->hidden('finish_time_start'); + $filter->form()->hidden('finish_time_end'); + $filter->form()->dateTimeRange('finish_time_start', 'finish_time_end', '')->placeholder([admin_trans('player_recharge_record.fields.finish_time'), admin_trans('player_recharge_record.fields.finish_time')]); + + }); + }); + } + + /** + * 处理标签 + * @param array $value + * @return Html + */ + public function handleTagIds(array $value): Html + { + $options = $this->getPlayerTagOptions($value); + $html = Html::create(); + foreach ($options as $option) { + $html->content( + Tag::create($option) + ->color('success') + ); + } + return $html; + } + + /** + * 获取玩家标签选项(筛选id) + * @param array $ids + * @return array + */ + public function getPlayerTagOptions(array $ids = []): array + { + $idsStr = json_encode($ids); + $cacheKey = md5("player_tag_options_ids_$idsStr"); + if (Cache::has($cacheKey)) { + return Cache::get($cacheKey); + } else { + if (!empty($ids)) { + $data = (new PlayerTag())->whereIn('id', $ids)->select(['name', 'id'])->get()->toArray(); + $data = $data ? array_column($data, 'name', 'id') : []; + Cache::set($cacheKey, $data, 24 * 60 * 60); + + return $data; + } + return []; + } + } + + /** + * 获取玩家标签(筛选id) + * @return array + */ + public function getPlayerTagOptionsFilter(): array + { + $cacheKey = "doc_player_tag_options_filter"; + if (Cache::has($cacheKey)) { + return Cache::get($cacheKey); + } else { + $data = (new PlayerTag())->select(['name', 'id'])->get()->toArray(); + $data = $data ? array_column($data, 'name', 'id') : []; + Cache::set($cacheKey, $data, 24 * 60 * 60); + + return $data; + } + } + + /** + * 筛选玩家下拉 + * @return mixed + */ + public function getPlayerOptions() + { + $request = Request::input(); + $player = Player::orderBy('created_at', 'desc') + ->forPage(1, 20); + if (!empty($request['search'])) { + $player->where('phone', 'like', '%' . $request['search'] . '%'); + } + $playerList = $player->get(); + $data = []; + /** @var Player $player */ + foreach ($playerList as $player) { + $data[] = [ + 'value' => $player->id, + 'label' => $player->phone, + ]; + } + return Response::success($data); + } + + /** + * 玩家详情 + * @param array $data + * @return Detail + */ + public function playerDetail(array $data): Detail + { + return Detail::create($data, function (Detail $detail) { + $detail->item('name', admin_trans('player.fields.name')); + $detail->item('address', admin_trans('player_extend.fields.address')); + $detail->item('email', admin_trans('player_extend.fields.email')); + $detail->item('phone', admin_trans('player.fields.phone')); + $detail->item('line', admin_trans('player_extend.fields.line')); + $detail->item('created_at', admin_trans('player.fields.created_at')); + })->layout('vertical'); + } +} diff --git a/addons/webman/controller/RoleController.php b/addons/webman/controller/RoleController.php new file mode 100644 index 0000000..1a6f36b --- /dev/null +++ b/addons/webman/controller/RoleController.php @@ -0,0 +1,344 @@ +model = plugin()->webman->config('database.role_model'); + } + + /** + * 系统角色 + * @auth true + * @return Grid + */ + public function index(): Grid + { + return Grid::create(new $this->model(), function (Grid $grid) { + $grid->title(admin_trans('auth.title')); + $grid->autoHeight(); + $grid->column('name', admin_trans('auth.fields.name')); + $grid->column('type', admin_trans('auth.fields.type')) + ->display(function ($value) { + $tag = ''; + switch ($value) { + case AdminDepartment::TYPE_DEPARTMENT: + $tag = Tag::create(admin_trans('auth.type.' . AdminDepartment::TYPE_DEPARTMENT))->color('#108ee9'); + break; + case AdminDepartment::TYPE_CHANNEL: + $tag = Tag::create(admin_trans('auth.type.' . AdminDepartment::TYPE_CHANNEL))->color('#f50'); + break; + } + return Html::create()->content([ + $tag + ]); + })->sortable(); + $grid->hideSelection(); + $grid->column('desc', admin_trans('auth.fields.desc')); + $grid->column('data_type', admin_trans('auth.fields.data_type')) + ->display(function ($value, AdminRole $data) { + $tag = ''; + switch ($value) { + case AdminRole::DATA_TYPE_ALL: + $tag = Tag::create(admin_trans('auth.options.data_type.full_data_rights'))->color('#f50'); + break; + case AdminRole::DATA_TYPE_CUSTOM: + $tag = Tag::create(admin_trans('auth.options.data_type.custom_data_permissions'))->color('#2db7f5'); + break; + case AdminRole::DATA_TYPE_DEPARTMENT_BELOW: + $tag = Tag::create(admin_trans('auth.options.data_type.this_department_and_the_following_data_permissions'))->color('#87d068'); + if ($data->type == AdminDepartment::TYPE_CHANNEL) { + $tag = Tag::create(admin_trans('auth.options.data_type.channel_and_the_following_data_permissions'))->color('#87d068'); + } + break; + case AdminRole::DATA_TYPE_DEPARTMENT: + $tag = Tag::create(admin_trans('auth.options.data_type.data_permissions_for_this_department'))->color('#108ee9'); + break; + case AdminRole::DATA_TYPE_SELF: + $tag = Tag::create(admin_trans('auth.options.data_type.personal_data_rights'))->color('#108ee9'); + break; + } + return Html::create()->content([ + $tag + ]); + })->sortable(); + $grid->setForm()->modal($this->form()); + $grid->quickSearch(); + $grid->actions(function (Actions $actions, AdminRole $data) { + $dropdown = $actions->dropdown(); + $dropdown->prepend(admin_trans('auth.auth_grant'), 'safety-certificate-filled') + ->modal($this->auth($data['id'], $data['type'])); + $dropdown->prepend(admin_trans('auth.menu_grant'), 'appstore-filled') + ->modal($this->menu($data['id'], $data['type'])); + $dropdown->prepend(admin_trans('auth.data_grant'), 'fas fa-database') + ->modal($this->data($data['id'], $data['type'])); + if ($data->id == AdminRole::ROLE_CHANNEL) { + $actions->hideDel(); + } + }); + }); + + } + + /** + * 系统角色 + * @auth true + * @return Form + */ + public function form(): Form + { + return Form::create(new $this->model(), function (Form $form) { + $form->title(admin_trans('auth.title')); + $form->text('name', admin_trans('auth.fields.name'))->required(); + $form->textarea('desc', admin_trans('auth.fields.desc'))->rows(5)->required(); + $form->radio('type', admin_trans('auth.fields.type')) + ->default(AdminDepartment::TYPE_DEPARTMENT) + ->options([ + AdminDepartment::TYPE_DEPARTMENT => admin_trans('auth.type.' . AdminDepartment::TYPE_DEPARTMENT), + AdminDepartment::TYPE_CHANNEL => admin_trans('auth.type.' . AdminDepartment::TYPE_CHANNEL), + ])->disabled($form->isEdit()); + $form->number('sort', admin_trans('auth.fields.sort'))->default($this->model::max('sort') + 1); + $form->saving(function (Form $form) { + if (!$form->isEdit()) { + $type = $form->input('type'); + switch ($type) { + case AdminDepartment::TYPE_DEPARTMENT: + $form->input('data_type', AdminRole::DATA_TYPE_ALL); + break; + case AdminDepartment::TYPE_CHANNEL: + $form->input('data_type', AdminRole::DATA_TYPE_DEPARTMENT_BELOW); + break; + default: + return message_error(admin_trans('auth.role_type_error')); + } + } + }); + }); + + } + + /** + * 数据权限 + * @auth true + * @return Form + */ + public function data($id, $type) + { + return Form::create(new $this->model(), function (Form $form) use ($type) { + switch ($type) { + case AdminDepartment::TYPE_DEPARTMENT: + $options = [ + 0 => admin_trans('auth.options.data_type.full_data_rights'), + 1 => admin_trans('auth.options.data_type.custom_data_permissions'), + 2 => admin_trans('auth.options.data_type.this_department_and_the_following_data_permissions'), + 3 => admin_trans('auth.options.data_type.data_permissions_for_this_department'), + 4 => admin_trans('auth.options.data_type.personal_data_rights'), + + ]; + break; + case AdminDepartment::TYPE_CHANNEL: + $options = [ + 2 => admin_trans('auth.options.data_type.channel_and_the_following_data_permissions'), + 3 => admin_trans('auth.options.data_type.data_permissions_for_this_department'), + 4 => admin_trans('auth.options.data_type.personal_data_rights'), + ]; + break; + default: + $options = []; + } + $form->title(admin_trans('auth.title')); + $form->desc('name', admin_trans('auth.fields.name')); + $form->desc('desc', admin_trans('auth.fields.desc')); + $form->select('data_type', admin_trans('auth.fields.data_type')) + ->required() + ->options($options) + ->when(1, function (Form $form) { + $department = plugin()->webman->config('database.department_model'); + $options = $department::where('status', 1) + ->where('type', AdminDepartment::TYPE_DEPARTMENT) + ->get()->toArray(); + $tree = $form->tree('department') + ->showIcon() + ->content(Icon::create('FolderOutlined'), 'groupIcon') + ->multiple() + ->checkable() + ->bindAttr('checkStrictly', $form->getModel() . '.check_strictly') + ->options($options); + $form->popItem(); + $form->switch('check_strictly', admin_trans('auth.fields.department')) + ->default(false) + ->checkedChildren(admin_trans('auth.father_son_linkage')) + ->unCheckedChildren(admin_trans('auth.father_son_linkage')) + ->checkedValue(false) + ->unCheckedValue(true) + ->getFormItem()->content($tree); + + }); + }); + } + + /** + * 菜单权限 + * @auth true + * @param $id + * @param $type + * @return Form + */ + public function menu($id, $type): Form + { + $menuModel = plugin()->webman->config('database.menu_model'); + $tree = $menuModel::select('id', 'pid', 'name')->where('type', $type)->get()->toArray(); + $model = plugin()->webman->config('database.role_menu_model'); + $field = 'menu_id'; + $label = 'name'; + $nodeTypeList = []; + foreach ($tree as $value) { + if (!empty($value['group'])) { + /** 全部菜单 */ + if ($value['group'] == 'all') { + $nodeTypeList[] = $value; + } + /** 渠道菜单,总站菜单 */ + if ($value['group'] == ($type == AdminDepartment::TYPE_CHANNEL ? 'channel' : 'department')) { + $nodeTypeList[] = $value; + } + } else { + $nodeTypeList[] = $value; + } + } + array_unshift($nodeTypeList, ['id' => 0, $label => admin_trans('auth.all'), 'pid' => -1]); + $auths = $model::where('role_id', $id)->pluck($field); + return Form::create(new $this->model(), function (Form $form) use ($id, $model, $nodeTypeList, $field, $auths, $label) { + $form->tree('auth') + ->options($nodeTypeList, $label) + ->default($auths) + ->checkable(); + $form->saving(function (Form $form) use ($id, $model, $field) { + $auths = $form->input('auth'); + $form->removeInput('auth'); + $auths = array_filter($auths); + $auths = array_map(function ($item) use ($id, $field) { + return ['role_id' => $id, $field => $item]; + }, $auths); + $model::where('role_id', $id)->delete(); + if ($auths) { + $authsArr = array_chunk($auths, 10, true); + foreach ($authsArr as $value) { + $model::insert($value); + } + } + }); + }); + } + + /** + * 功能权限 + * @auth true + * @param $id + * @param string $type + * @return Form + */ + public function auth($id, string $type = ''): Form + { + $tree = Admin::node()->all(); + $model = plugin()->webman->config('database.role_permission_model'); + $field = 'node_id'; + $label = 'title'; + $nodeTypeList = []; + foreach ($tree as $value) { + if (!empty($value['group'])) { + /** 全部菜单 */ + if ($value['group'] == 'all') { + $nodeTypeList[] = $value; + } + /** 渠道菜单,总站菜单 */ + if ($value['group'] == ($type == AdminDepartment::TYPE_CHANNEL ? 'channel' : 'department')) { + $nodeTypeList[] = $value; + } + } else { + $nodeTypeList[] = $value; + } + } + array_unshift($nodeTypeList, ['id' => 0, $label => admin_trans('auth.all'), 'pid' => -1]); + $auths = $model::where('role_id', $id)->pluck($field); + return Form::create(new $this->model(), function (Form $form) use ($id, $model, $nodeTypeList, $field, $auths, $label) { + $form->tree('auth') + ->options($nodeTypeList, $label) + ->default($auths) + ->checkable(); + $form->saving(function (Form $form) use ($id, $model, $field) { + $auths = $form->input('auth'); + $form->removeInput('auth'); + $auths = array_filter($auths); + $auths = array_map(function ($item) use ($id, $field) { + return ['role_id' => $id, $field => $item]; + }, $auths); + $model::where('role_id', $id)->delete(); + if ($auths) { + $authsArr = array_chunk($auths, 10, true); + foreach ($authsArr as $value) { + $model::insert($value); + } + } + }); + }); + } + + public function commonAuthForm($id, $model, $tree, $type, $field, $label): Form + { + $nodeTypeList = []; + foreach ($tree as $value) { + if (!empty($value['group'])) { + /** 全部菜单 */ + if ($value['group'] == 'all') { + $nodeTypeList[] = $value; + } + /** 渠道菜单,总站菜单 */ + if ($value['group'] == ($type == AdminDepartment::TYPE_CHANNEL ? 'channel' : 'department')) { + $nodeTypeList[] = $value; + } + } else { + $nodeTypeList[] = $value; + } + } + array_unshift($nodeTypeList, ['id' => 0, $label => admin_trans('auth.all'), 'pid' => -1]); + $auths = $model::where('role_id', $id)->pluck($field); + return Form::create(new $this->model(), function (Form $form) use ($id, $model, $nodeTypeList, $field, $auths, $label) { + $form->tree('auth') + ->options($nodeTypeList, $label) + ->default($auths) + ->checkable(); + $form->saving(function (Form $form) use ($id, $model, $field) { + $auths = $form->input('auth'); + $form->removeInput('auth'); + $auths = array_filter($auths); + $auths = array_map(function ($item) use ($id, $field) { + return ['role_id' => $id, $field => $item]; + }, $auths); + $model::where('role_id', $id)->delete(); + if ($auths) { + $authsArr = array_chunk($auths,10,true); + foreach ($authsArr as $value) { + $model::insert($value); + } + } + }); + }); + } +} diff --git a/addons/webman/controller/SystemSettingController.php b/addons/webman/controller/SystemSettingController.php new file mode 100644 index 0000000..08dd7e9 --- /dev/null +++ b/addons/webman/controller/SystemSettingController.php @@ -0,0 +1,135 @@ +model = plugin()->webman->config('database.system_setting_model'); + } + + /** + * 配置列表 + * @auth true + * @return Card + */ + public function index(): Card + { + $tabs = Tabs::create()->destroyInactiveTabPane() + ->type('card') + ->pane(admin_trans('system_setting.master'), $this->settingList()); + $channelList = Channel::get(); + /** @var Channel $channel */ + foreach ($channelList as $channel) { + $tabs->pane($channel->name, $this->settingList($channel->department_id)); + } + return Card::create($tabs); + } + + /** + * 系统配置 + * @param $id + * @return Grid + */ + public function settingList($id = 0): Grid + { + return Grid::create(new $this->model(), function (Grid $grid) use ($id) { + $grid->title(admin_trans('system_setting.title')); + $grid->autoHeight(); + $grid->bordered(true); + $grid->model()->where('department_id', $id)->whereNotIn('feature', ['sign_setting', 'commission_setting', 'first_recharge_setting']); + $grid->column('feature', admin_trans('system_setting.fields.feature'))->display(function ($value) { + return admin_trans('system_setting.fields.' . $value); + })->align('center'); + + $grid->column('setting', admin_trans('system_setting.fields.setting')) + ->if(function ($value, SystemSetting $data) { + return $data->feature === 'marquee' || $data->feature === 'machine_marquee'; + })->editable( + Editable::textarea('content') + ->showCount() + ->rows(6) + ->rule(['max:100' => admin_trans('system_setting.marquee_max_len')]) + )->display(function ($value, SystemSetting $data) { + return Str::of($data->content)->limit(35, ' (...)'); + })->width('20%')->align('center') + ->if(function ($value, SystemSetting $data) { // 条件2 + return $data->feature === 'register_present'; + })->editable( + (new Editable)->text('num') + ->rule([ + 'integer' => admin_trans('validator.integer'), + 'max:10000' => admin_trans('validator.max', null, ['{max}' => 10000]), + 'min:1' => admin_trans('validator.min', null, ['{min}' => 1]), + ]) + )->display(function ($value, SystemSetting $data) { + return $data->num; + })->align('center') + ->if(function ($value, SystemSetting $data) { // 条件2 + return $data->feature === 'recharge_order_expiration'; + })->editable( + (new Editable)->text('num') + ->rule([ + 'integer' => admin_trans('validator.integer'), + 'max:180' => admin_trans('validator.max', null, ['{max}' => 180]), + 'min:15' => admin_trans('validator.min', null, ['{min}' => 15]), + ])->addonAfter(admin_trans('system_setting.minutes')) + )->display(function ($val, SystemSetting $data) { + if (!empty($data->num)) { + return $data->num . ' ' . admin_trans('system_setting.minutes'); + } + return ''; + })->if(function ($value, SystemSetting $data) { // 条件2 + return $data->feature === 'pending_minutes'; + })->editable( + (new Editable)->number('num') + ->rule([ + 'integer' => admin_trans('validator.integer'), + 'max:240' => admin_trans('validator.max', null, ['{max}' => 240]), + 'min:2' => admin_trans('validator.min', null, ['{min}' => 2]), + ])->addonAfter(admin_trans('system_setting.minutes')) + )->display(function ($val, SystemSetting $data) { + if (!empty($data->num)) { + return $data->num . ' ' . admin_trans('system_setting.minutes'); + } + return ''; + }); + + $grid->column('status', admin_trans('system_setting.fields.status'))->switch()->align('center'); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->actions(function (Actions $actions) { + $actions->hideDel(); + $actions->hideEdit(); + }); + }); + } + + /** + * 结算日期 + * @return array + */ + public function getSettlementDate(): array + { + for ($i = 1; $i <= 28; $i++) { + $data[$i] = $i . admin_trans('player_promoter.date'); + } + + return $data; + } +} diff --git a/addons/webman/controller/WithdrawRecordController.php b/addons/webman/controller/WithdrawRecordController.php new file mode 100644 index 0000000..f23ccaf --- /dev/null +++ b/addons/webman/controller/WithdrawRecordController.php @@ -0,0 +1,383 @@ +model = plugin()->webman->config('database.player_withdraw_record_model'); + } + + /** + * 提現 + * @auth true + */ + public function index(): Grid + { + return Grid::create(new $this->model(), function (Grid $grid) { + $grid->title(admin_trans('player_withdraw_record.title')); + $grid->model()->with(['player', 'channel', 'player.player_extend'])->orderBy('created_at', 'desc'); + $exAdminFilter = Request::input('ex_admin_filter', []); + if (!empty($exAdminFilter)) { + if (isset($exAdminFilter['created_at_start']) && !empty($exAdminFilter['created_at_start'])) { + $grid->model()->where('created_at', '>=', $exAdminFilter['created_at_start']); + } + if (isset($exAdminFilter['created_at_end']) && !empty($exAdminFilter['created_at_end'])) { + $grid->model()->where('created_at', '<=', $exAdminFilter['created_at_end']); + } + if (isset($exAdminFilter['finish_time_start']) && !empty($exAdminFilter['finish_time_start'])) { + $grid->model()->where('finish_time', '>=', $exAdminFilter['finish_time_start']); + } + if (isset($exAdminFilter['finish_time_end']) && !empty($exAdminFilter['finish_time_end'])) { + $grid->model()->where('finish_time', '<=', $exAdminFilter['finish_time_end']); + } + if (!empty($exAdminFilter['player']['uuid'])) { + $grid->model()->whereHas('player', function ($query) use ($exAdminFilter) { + $query->where('uuid', 'like', '%' . $exAdminFilter['player']['uuid'] . '%'); + }); + } + if (!empty($exAdminFilter['player']['name'])) { + $grid->model()->whereHas('player', function ($query) use ($exAdminFilter) { + $query->where('name', 'like', '%' . $exAdminFilter['player']['name'] . '%'); + }); + } + if (!empty($exAdminFilter['department_id'])) { + $grid->model()->where('department_id', $exAdminFilter['department_id']); + } + if (!empty($exAdminFilter['type'])) { + $grid->model()->where('type', $exAdminFilter['type']); + } + if (!empty($exAdminFilter['status'])) { + $grid->model()->where('status', $exAdminFilter['status']); + } + if (!empty($exAdminFilter['tradeno'])) { + $grid->model()->where('tradeno', $exAdminFilter['tradeno']); + } + } + $query = clone $grid->model(); + $totalData = $query->selectRaw( + 'ifNull(sum(money), 0) as total_money, + ifNull(sum(IF(type = 6, money,0)), 0) as total_skl_money' + )->first(); + $layout = Layout::create(); + $layout->row(function (Row $row) use ($totalData) { + $row->gutter([10, 0]); + $row->column( + Card::create([ + Row::create()->column(Statistic::create()->title(admin_trans('player_withdraw_record.total_money')) + ->value($totalData['total_money']) + ->style([ + 'font-size' => '15px', + 'text-align' => 'center' + ])), + ])->bodyStyle([ + 'display' => 'flex', + 'align-items' => 'center', + 'height' => '72px' + ])->hoverable()->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px']) + , 8); + $row->column( + Card::create([ + Row::create()->column(Statistic::create()->title(admin_trans('player_withdraw_record.total_inmoney')) + ->value(bcadd(bcsub($totalData['total_money'], $totalData['total_skl_money'], 3), bcmul($totalData['total_skl_money'], 1.008, 3), 3)) + ->style([ + 'font-size' => '15px', + 'text-align' => 'center' + ])), + ])->bodyStyle([ + 'display' => 'flex', + 'align-items' => 'center', + 'height' => '72px' + ])->hoverable()->headStyle(['height' => '0px', 'border-bottom' => '0px', 'min-height' => '0px']) + , 8); + })->style(['background' => '#fff']); + $grid->header($layout); + $grid->bordered(true); + $grid->autoHeight(); + $grid->column('id', admin_trans('player_withdraw_record.fields.id'))->align('center')->fixed(true); + $grid->column('player.name', admin_trans('player.fields.name'))->display(function ($val, PlayerWithdrawRecord $data) { + $image = (isset($data->player->avatar) && !empty($data->player->avatar)) ? Avatar::create()->src($data->player->avatar) : Avatar::create()->icon(Icon::create('UserOutlined')); + return Html::create()->content([ + $image, + Html::div()->content($val) + ])->style(['cursor' => 'pointer'])->modal($this->playerDetail([ + 'phone' => $data->player->phone ?? '', + 'name' => $data->player->name ?? '', + 'address' => $data->player->player_extend->address ?? '', + 'email' => $data->player->player_extend->email ?? '', + 'line' => $data->player->player_extend->line ?? '', + 'created_at' => isset($data->player->created_at) && !empty($data->player->created_at) ? date('Y-m-d H:i:s', strtotime($data->player->created_at)) : '', + ])); + })->align('center')->fixed(true); + $grid->column('player.uuid', admin_trans('player.fields.uuid'))->display(function ($val, PlayerWithdrawRecord $data) { + return $data->player->uuid; + })->align('center')->fixed(true); + $grid->column('tradeno', admin_trans('player_withdraw_record.fields.tradeno'))->copy()->align('center'); + $grid->column('money', admin_trans('player_withdraw_record.fields.money'))->display(function ($val, PlayerWithdrawRecord $data) { + return bcdiv($val,$data->rate, 2) . ' ' . ($data->currency == 'TALK' ? 'Q币' : $data->currency); + })->align('center')->sortable(); + $grid->column('inmoney', admin_trans('player_recharge_record.fields.inmoney'))->display(function ($val, PlayerWithdrawRecord $data) { + if ($data->type == PlayerWithdrawRecord::TYPE_ESPAYOUT) { + $ratio = 1.005; + } elseif ($data->type == PlayerWithdrawRecord::TYPE_ONEPAYOUT){ + $ratio = 1.008; + } elseif ($data->type == PlayerWithdrawRecord::TYPE_SKLPAYOUT){ + $ratio = 1.008; + } else { + $ratio = 1; + } + if ($data->currency == 'USDT') { + return bcdiv($val,$data->rate, 2) . ' ' . ($data->currency); + } + return $data->money * $ratio . ' ' . ($data->currency); + })->align('center'); + $grid->column('coins', admin_trans('player_withdraw_record.fields.coins'))->align('center'); + $grid->column('type', admin_trans('player_withdraw_record.fields.type'))->display(function ($val) { + switch ($val) { + case PlayerWithdrawRecord::TYPE_SELF: + return Tag::create(admin_trans('player_withdraw_record.type.' . $val)) + ->color('#3b5999'); + case PlayerWithdrawRecord::TYPE_ARTIFICIAL: + return Tag::create(admin_trans('player_withdraw_record.type.' . $val)) + ->color('#cd201f'); + case PlayerWithdrawRecord::TYPE_USDT: + return Tag::create(admin_trans('player_withdraw_record.type.' . $val)) + ->color('#2db7f5'); + case PlayerWithdrawRecord::TYPE_SKLPAYOUT: + return Tag::create(admin_trans('player_withdraw_record.type.' . $val)) + ->color('#108ee9'); + default: + return ''; + } + })->align('center'); + $grid->column('withdraw_setting_info', + admin_trans('player_withdraw_record.player_bank'))->display(function ( + $val, + PlayerWithdrawRecord $data + ) { + $info = []; + switch ($data->type) { + case PlayerWithdrawRecord::TYPE_USDT: + $info[] = Html::markdown('- ' . admin_trans('channel_recharge_setting.fields.wallet_address') . ': ' . $data->wallet_address); + $info[] = Html::div()->content(Image::create() + ->width(40) + ->src($data->qr_code)); + break; + case PlayerWithdrawRecord::TYPE_SELF: + $info[] = Html::markdown('- ' . admin_trans('player_withdraw_record.fields.account_name') . ': ' . $data->account_name); + $info[] = Html::markdown('- ' . admin_trans('player_withdraw_record.fields.bank_name') . ': ' . $data->bank_name); + $info[] = Html::markdown('- ' . admin_trans('player_withdraw_record.fields.account') . ': ' . $data->account); + break; + } + return Html::create()->content($info); + })->align('left'); + $grid->column('status', admin_trans('player_withdraw_record.fields.status')) + ->display(function ($value, PlayerWithdrawRecord $data) { + $rejectReason = $data->reject_reason; + switch ($value) { + case PlayerWithdrawRecord::STATUS_SUCCESS: + $tag = Tag::create(admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_SUCCESS))->color('#87d068'); + break; + case PlayerWithdrawRecord::STATUS_WAIT: + $tag = Tag::create(admin_trans('player_withdraw_record.status_wait'))->color('#108ee9'); + break; + case PlayerWithdrawRecord::STATUS_FAIL: + $tag = Tag::create(admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_FAIL))->color('#f50'); + break; + case PlayerWithdrawRecord::STATUS_PENDING_REJECT: + $tag = Tag::create(admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_PENDING_REJECT))->color('#cd201f'); + break; + case PlayerWithdrawRecord::STATUS_PENDING_PAYMENT: + $tag = Tag::create(admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_PENDING_PAYMENT))->color('#3b5999'); + break; + case PlayerWithdrawRecord::STATUS_CANCEL: + case PlayerWithdrawRecord::STATUS_SYSTEM_CANCEL: + $tag = Tag::create(admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_CANCEL))->color('#2db7f5'); + break; + default: + $tag = ''; + } + if (!empty($rejectReason)) { + return ToolTip::create(Badge::create( + $tag + )->count('!')->title(''))->title($rejectReason)->color('orange'); + } else { + return $tag; + } + })->align('center')->sortable(); + $grid->column('channel.name', admin_trans('player_withdraw_record.fields.department_id'))->align('center'); + $grid->column('finish_time', admin_trans('player_withdraw_record.fields.finish_time'))->sortable()->align('center'); + $grid->column('created_at', admin_trans('player_withdraw_record.fields.created_at'))->sortable()->align('center'); + $grid->column('player_tag', admin_trans('player_withdraw_record.fields.player_tag')) + ->display(function ($value) { + return $this->handleTagIds($value); + }) + ->editable( + Editable::checkboxTag() + ->options($this->getPlayerTagOptionsFilter()) + )->width('150px'); + $grid->column('remark', admin_trans('player_withdraw_record.fields.remark'))->display(function ($value) { + return Str::of($value)->limit(20, ' (...)'); + })->editable( + (new Editable)->textarea('remark') + ->showCount() + ->rows(5) + ->rule(['max:255' => admin_trans('player_withdraw_record.fields.remark')]) + )->width('150px')->align('center'); + $grid->hideDelete(); + $grid->hideSelection(); + $grid->expandFilter(); + $grid->actions(function (Actions $actions) { + $actions->hideDel(); + $actions->hideEdit(); + }); + $grid->filter(function (Filter $filter) { + $filter->like()->text('player.uuid')->placeholder(admin_trans('player.fields.uuid')); + $filter->like()->text('player.name')->placeholder(admin_trans('player.fields.name')); + $filter->eq()->select('department_id') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('player_withdraw_record.fields.department_id')) + ->remoteOptions(admin_url(['addons-webman-controller-ChannelController', 'getDepartmentOptions'])); + $filter->eq()->select('type') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('player_withdraw_record.fields.type')) + ->options([ + PlayerWithdrawRecord::TYPE_USDT => admin_trans('player_withdraw_record.type.' . PlayerWithdrawRecord::TYPE_USDT), + PlayerWithdrawRecord::TYPE_SELF => admin_trans('player_withdraw_record.type.' . PlayerWithdrawRecord::TYPE_SELF), + PlayerWithdrawRecord::TYPE_ARTIFICIAL => admin_trans('player_withdraw_record.type.' . PlayerWithdrawRecord::TYPE_ARTIFICIAL), + PlayerWithdrawRecord::TYPE_SKLPAYOUT => admin_trans('player_withdraw_record.type.' . PlayerWithdrawRecord::TYPE_SKLPAYOUT), + ]); + $filter->eq()->select('status') + ->showSearch() + ->style(['width' => '200px']) + ->dropdownMatchSelectWidth() + ->placeholder(admin_trans('player_withdraw_record.fields.status')) + ->options([ + PlayerWithdrawRecord::STATUS_WAIT => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_WAIT), + PlayerWithdrawRecord::STATUS_SUCCESS => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_SUCCESS), + PlayerWithdrawRecord::STATUS_FAIL => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_FAIL), + PlayerWithdrawRecord::STATUS_PENDING_PAYMENT => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_PENDING_PAYMENT), + PlayerWithdrawRecord::STATUS_PENDING_REJECT => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_PENDING_REJECT), + PlayerWithdrawRecord::STATUS_CANCEL => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_CANCEL), + PlayerWithdrawRecord::STATUS_SYSTEM_CANCEL => admin_trans('player_withdraw_record.status.' . PlayerWithdrawRecord::STATUS_SYSTEM_CANCEL), + ]); + $filter->like()->text('tradeno')->placeholder(admin_trans('player_withdraw_record.fields.tradeno')); + $filter->form()->hidden('created_at_start'); + $filter->form()->hidden('created_at_end'); + $filter->form()->dateTimeRange('created_at_start', 'created_at_end', '')->placeholder([admin_trans('public_msg.created_at_start'), admin_trans('public_msg.created_at_end')]); + $filter->form()->hidden('finish_time_start'); + $filter->form()->hidden('finish_time_end'); + $filter->form()->dateTimeRange('finish_time_start', 'finish_time_end', '')->placeholder([admin_trans('player_withdraw_record.fields.finish_time'), admin_trans('player_withdraw_record.fields.finish_time')]); + + }); + }); + } + + /** + * 处理标签 + * @param array $value + * @return Html + */ + public function handleTagIds(array $value): Html + { + $options = $this->getPlayerTagOptions($value); + $html = Html::create(); + foreach ($options as $option) { + $html->content( + Tag::create($option) + ->color('success') + ); + } + return $html; + } + + /** + * 获取玩家标签选项(筛选id) + * @param array $ids + * @return array + */ + public function getPlayerTagOptions(array $ids = []): array + { + $idsStr = json_encode($ids); + $cacheKey = md5("player_tag_options_ids_$idsStr"); + if (Cache::has($cacheKey)) { + return Cache::get($cacheKey); + } else { + if (!empty($ids)) { + $data = (new PlayerTag())->whereIn('id', $ids)->select(['name', 'id'])->get()->toArray(); + $data = $data ? array_column($data, 'name', 'id') : []; + Cache::set($cacheKey, $data, 24 * 60 * 60); + + return $data; + } + return []; + } + } + + /** + * 获取玩家标签(筛选id) + * @return array + */ + public function getPlayerTagOptionsFilter(): array + { + $cacheKey = "doc_player_tag_options_filter"; + if (Cache::has($cacheKey)) { + return Cache::get($cacheKey); + } else { + $data = (new PlayerTag())->select(['name', 'id'])->get()->toArray(); + $data = $data ? array_column($data, 'name', 'id') : []; + Cache::set($cacheKey, $data, 24 * 60 * 60); + + return $data; + } + } + + /** + * 玩家详情 + * @param array $data + * @return Detail + */ + public function playerDetail(array $data): Detail + { + return Detail::create($data, function (Detail $detail) { + $detail->item('name', admin_trans('player.fields.name')); + $detail->item('address', admin_trans('player_extend.fields.address')); + $detail->item('email', admin_trans('player_extend.fields.email')); + $detail->item('phone', admin_trans('player.fields.phone')); + $detail->item('line', admin_trans('player_extend.fields.line')); + $detail->item('created_at', admin_trans('player.fields.created_at')); + })->layout('vertical'); + } +} diff --git a/addons/webman/database/webman.sql b/addons/webman/database/webman.sql new file mode 100644 index 0000000..59ac9aa --- /dev/null +++ b/addons/webman/database/webman.sql @@ -0,0 +1,304 @@ +/* + Navicat Premium Data Transfer + + Source Server : 本地 + Source Server Type : MySQL + Source Server Version : 50739 (5.7.39) + Source Host : localhost:3306 + Source Schema : webman + + Target Server Type : MySQL + Target Server Version : 50739 (5.7.39) + File Encoding : 65001 + + Date: 01/11/2022 20:09:35 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for admin_configs +-- ---------------------------- +DROP TABLE IF EXISTS `admin_configs`; +CREATE TABLE `admin_configs` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '配置字段', + `value` mediumtext COLLATE utf8mb4_unicode_ci COMMENT '配置值', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统配置表'; + +-- ---------------------------- +-- Records of admin_configs +-- ---------------------------- +BEGIN; +INSERT INTO `admin_configs` (`id`, `name`, `value`, `created_at`, `updated_at`) VALUES (1, 'web_name', 'Ex-Admin', '2022-10-17 05:02:50', NULL); +INSERT INTO `admin_configs` (`id`, `name`, `value`, `created_at`, `updated_at`) VALUES (2, 'web_logo', '/exadmin/img/logo.png', '2022-10-17 05:02:50', NULL); +INSERT INTO `admin_configs` (`id`, `name`, `value`, `created_at`, `updated_at`) VALUES (3, 'web_miitbeian', '', '2022-10-17 05:02:50', NULL); +INSERT INTO `admin_configs` (`id`, `name`, `value`, `created_at`, `updated_at`) VALUES (4, 'web_copyright', '©版权所有 2014-2021', '2022-10-17 05:02:50', NULL); +COMMIT; + +-- ---------------------------- +-- Table structure for admin_department +-- ---------------------------- +DROP TABLE IF EXISTS `admin_department`; +CREATE TABLE `admin_department` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `pid` int(11) DEFAULT '0' COMMENT '上级部门', + `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '部门名称', + `leader` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '负责人', + `phone` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '手机号', + `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1=正常,0=禁用', + `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序', + `path` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `deleted_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='部门表'; + +-- ---------------------------- +-- Records of admin_department +-- ---------------------------- +BEGIN; +INSERT INTO `admin_department` (`id`, `pid`, `name`, `leader`, `phone`, `status`, `sort`, `path`, `deleted_at`, `created_at`, `updated_at`) VALUES (1, 0, '超级管理员', '', NULL, 1, 0, '1', NULL, '2022-10-17 05:02:50', '2022-11-01 12:04:28'); +COMMIT; + +-- ---------------------------- +-- Table structure for admin_file_attachment_cates +-- ---------------------------- +DROP TABLE IF EXISTS `admin_file_attachment_cates`; +CREATE TABLE `admin_file_attachment_cates` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '分类名称', + `pid` int(11) NOT NULL DEFAULT '0' COMMENT '上级id', + `permission_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0所有人,1仅自己', + `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序', + `admin_id` int(11) NOT NULL DEFAULT '0' COMMENT '后台用户id', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统附件分类'; + +-- ---------------------------- +-- Records of admin_file_attachment_cates +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for admin_file_attachments +-- ---------------------------- +DROP TABLE IF EXISTS `admin_file_attachments`; +CREATE TABLE `admin_file_attachments` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `cate_id` int(11) NOT NULL COMMENT '分类id', + `uploader_id` int(11) NOT NULL DEFAULT '0' COMMENT '上传人id', + `type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'image图片 file文件', + `file_type` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文件类型', + `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '附件名称', + `real_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '原始文件名', + `path` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '路径', + `url` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '访问url', + `ext` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '文件后缀', + `disk` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'disk', + `size` bigint(20) NOT NULL COMMENT '文件大小', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `deleted_at` datetime DEFAULT NULL COMMENT '删除时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统附件'; + +-- ---------------------------- +-- Records of admin_file_attachments +-- ---------------------------- +BEGIN; +INSERT INTO `admin_file_attachments` (`id`, `cate_id`, `uploader_id`, `type`, `file_type`, `name`, `real_name`, `path`, `url`, `ext`, `disk`, `size`, `created_at`, `updated_at`, `deleted_at`) VALUES (1, 0, 1, 'image', 'image/png', '39380f58597e5c734118d4381348d011.png', '9V2A6493.png', 'images/39380f58597e5c734118d4381348d011.png', 'http://localhost/storage/images/39380f58597e5c734118d4381348d011.png', 'png', 'local', 2360037, '2022-11-01 18:32:17', '2022-11-01 20:08:14', '2022-11-01 20:08:14'); +INSERT INTO `admin_file_attachments` (`id`, `cate_id`, `uploader_id`, `type`, `file_type`, `name`, `real_name`, `path`, `url`, `ext`, `disk`, `size`, `created_at`, `updated_at`, `deleted_at`) VALUES (2, 0, 1, 'image', 'image/png', '39380f58597e5c734118d4381348d011.png', '9V2A6493.png', 'images/39380f58597e5c734118d4381348d011.png', 'http://0.0.0.0:8787/storage/images/39380f58597e5c734118d4381348d011.png', 'png', 'local', 2360037, '2022-11-01 18:33:00', '2022-11-01 20:08:16', '2022-11-01 20:08:16'); +INSERT INTO `admin_file_attachments` (`id`, `cate_id`, `uploader_id`, `type`, `file_type`, `name`, `real_name`, `path`, `url`, `ext`, `disk`, `size`, `created_at`, `updated_at`, `deleted_at`) VALUES (3, 0, 1, 'image', 'image/png', '4cc63343847a09d643800c48c97df81c.png', '720.png', 'images/4cc63343847a09d643800c48c97df81c.png', 'http://0.0.0.0:8787/storage/images/4cc63343847a09d643800c48c97df81c.png', 'png', 'local', 24337, '2022-11-01 18:50:15', '2022-11-01 20:08:18', '2022-11-01 20:08:18'); +COMMIT; + +-- ---------------------------- +-- Table structure for admin_menus +-- ---------------------------- +DROP TABLE IF EXISTS `admin_menus`; +CREATE TABLE `admin_menus` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '名称', + `icon` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '图标', + `url` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '链接', + `plugin` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '插件名称', + `pid` int(11) NOT NULL DEFAULT '0' COMMENT '父级id', + `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序', + `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态(0:禁用,1:启用)', + `open` tinyint(4) NOT NULL DEFAULT '1' COMMENT '菜单展开(0:收起,1:展开)', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统菜单表'; + +-- ---------------------------- +-- Records of admin_menus +-- ---------------------------- +BEGIN; +INSERT INTO `admin_menus` (`id`, `name`, `icon`, `url`, `plugin`, `pid`, `sort`, `status`, `open`, `created_at`, `updated_at`) VALUES (1, 'system', 'SettingFilled', '', '', 0, 0, 1, 1, '2022-10-17 05:02:50', NULL); +INSERT INTO `admin_menus` (`id`, `name`, `icon`, `url`, `plugin`, `pid`, `sort`, `status`, `open`, `created_at`, `updated_at`) VALUES (2, 'system_manage', 'SettingFilled', '', '', 1, 1, 1, 1, '2022-10-17 05:02:50', NULL); +INSERT INTO `admin_menus` (`id`, `name`, `icon`, `url`, `plugin`, `pid`, `sort`, `status`, `open`, `created_at`, `updated_at`) VALUES (3, '首页', 'fas fa-home', 'ex-admin/addons-webman-controller-IndexController/index', '', 1, 0, 1, 1, '2022-10-17 05:02:50', '2022-11-01 20:08:50'); +INSERT INTO `admin_menus` (`id`, `name`, `icon`, `url`, `plugin`, `pid`, `sort`, `status`, `open`, `created_at`, `updated_at`) VALUES (4, 'config_manage', 'far fa-circle', 'ex-admin/addons-webman-controller-ConfigController/form', '', 2, 2, 1, 1, '2022-10-17 05:02:50', NULL); +INSERT INTO `admin_menus` (`id`, `name`, `icon`, `url`, `plugin`, `pid`, `sort`, `status`, `open`, `created_at`, `updated_at`) VALUES (5, 'attachment_manage', 'far fa-circle', 'ex-admin/addons-webman-controller-AttachmentController/index', '', 2, 3, 1, 1, '2022-10-17 05:02:50', NULL); +INSERT INTO `admin_menus` (`id`, `name`, `icon`, `url`, `plugin`, `pid`, `sort`, `status`, `open`, `created_at`, `updated_at`) VALUES (6, 'permissions_manage', 'fas fa-users', '', '', 1, 4, 1, 1, '2022-10-17 05:02:50', NULL); +INSERT INTO `admin_menus` (`id`, `name`, `icon`, `url`, `plugin`, `pid`, `sort`, `status`, `open`, `created_at`, `updated_at`) VALUES (7, 'admin', 'far fa-circle', 'ex-admin/addons-webman-controller-AdminController/index', '', 6, 5, 1, 1, '2022-10-17 05:02:50', NULL); +INSERT INTO `admin_menus` (`id`, `name`, `icon`, `url`, `plugin`, `pid`, `sort`, `status`, `open`, `created_at`, `updated_at`) VALUES (8, 'role_manage', 'far fa-circle', 'ex-admin/addons-webman-controller-RoleController/index', '', 6, 6, 1, 1, '2022-10-17 05:02:50', NULL); +INSERT INTO `admin_menus` (`id`, `name`, `icon`, `url`, `plugin`, `pid`, `sort`, `status`, `open`, `created_at`, `updated_at`) VALUES (9, 'menu_manage', 'far fa-circle', 'ex-admin/addons-webman-controller-MenuController/index', '', 6, 7, 1, 1, '2022-10-17 05:02:50', NULL); +INSERT INTO `admin_menus` (`id`, `name`, `icon`, `url`, `plugin`, `pid`, `sort`, `status`, `open`, `created_at`, `updated_at`) VALUES (10, 'department_manage', 'far fa-circle', 'ex-admin/addons-webman-controller-DepartmentController/index', '', 6, 8, 1, 1, '2022-10-17 05:02:50', NULL); +INSERT INTO `admin_menus` (`id`, `name`, `icon`, `url`, `plugin`, `pid`, `sort`, `status`, `open`, `created_at`, `updated_at`) VALUES (11, 'post_manage', 'far fa-circle', 'ex-admin/addons-webman-controller-PostController/index', '', 6, 9, 1, 1, '2022-10-17 05:02:50', NULL); +INSERT INTO `admin_menus` (`id`, `name`, `icon`, `url`, `plugin`, `pid`, `sort`, `status`, `open`, `created_at`, `updated_at`) VALUES (12, 'plug_manage', 'fas fa-plug', 'ex-admin/ExAdmin-ui-plugin-Controller/index', '', 0, 10, 1, 1, '2022-10-17 05:02:50', NULL); +COMMIT; + +-- ---------------------------- +-- Table structure for admin_post +-- ---------------------------- +DROP TABLE IF EXISTS `admin_post`; +CREATE TABLE `admin_post` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '岗位名称', + `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1=正常,0=禁用', + `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序', + `deleted_at` timestamp NULL DEFAULT NULL, + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='岗位表'; + +-- ---------------------------- +-- Records of admin_post +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for admin_role_department +-- ---------------------------- +DROP TABLE IF EXISTS `admin_role_department`; +CREATE TABLE `admin_role_department` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `role_id` int(11) NOT NULL DEFAULT '0' COMMENT '角色id', + `department_id` int(11) NOT NULL DEFAULT '0' COMMENT '部门id', + `created_at` timestamp NULL DEFAULT NULL, + `updated_at` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色数据权限部门关联表'; + +-- ---------------------------- +-- Records of admin_role_department +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for admin_role_menus +-- ---------------------------- +DROP TABLE IF EXISTS `admin_role_menus`; +CREATE TABLE `admin_role_menus` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `role_id` int(11) NOT NULL DEFAULT '0' COMMENT '角色id', + `menu_id` int(11) NOT NULL DEFAULT '0' COMMENT '菜单id', + PRIMARY KEY (`id`), + KEY `admin_role_menus_role_id_menu_id_index` (`role_id`,`menu_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统角色菜单表'; + +-- ---------------------------- +-- Records of admin_role_menus +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for admin_role_permissions +-- ---------------------------- +DROP TABLE IF EXISTS `admin_role_permissions`; +CREATE TABLE `admin_role_permissions` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `role_id` int(11) NOT NULL DEFAULT '0' COMMENT '角色id', + `node_id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '节点id', + PRIMARY KEY (`id`), + KEY `admin_role_permissions_role_id_node_id_index` (`role_id`,`node_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统角色权限表'; + +-- ---------------------------- +-- Records of admin_role_permissions +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for admin_role_users +-- ---------------------------- +DROP TABLE IF EXISTS `admin_role_users`; +CREATE TABLE `admin_role_users` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `role_id` int(11) NOT NULL DEFAULT '0' COMMENT '角色id', + `user_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户id', + PRIMARY KEY (`id`), + KEY `admin_role_users_role_id_user_id_index` (`role_id`,`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统角色用户表'; + +-- ---------------------------- +-- Records of admin_role_users +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for admin_roles +-- ---------------------------- +DROP TABLE IF EXISTS `admin_roles`; +CREATE TABLE `admin_roles` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '权限角色名称', + `desc` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '备注说明', + `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `check_strictly` tinyint(1) NOT NULL DEFAULT '0', + `data_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '数据权限类型:0=全部数据权限,1=自定义数据权限,2=本部门及以下数据权限,3=本部门数据权限,4=本人数据权限', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统角色表'; + +-- ---------------------------- +-- Records of admin_roles +-- ---------------------------- +BEGIN; +COMMIT; + +-- ---------------------------- +-- Table structure for admin_users +-- ---------------------------- +DROP TABLE IF EXISTS `admin_users`; +CREATE TABLE `admin_users` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `username` varchar(120) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '用户账号', + `password` varchar(80) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '密码', + `nickname` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '姓名', + `avatar` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '头像', + `email` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '邮箱', + `phone` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '手机号', + `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态(0:禁用,1:启用)', + `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', + `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_at` datetime DEFAULT NULL COMMENT '更新时间', + `deleted_at` datetime DEFAULT NULL COMMENT '删除时间', + `department_id` int(11) DEFAULT NULL COMMENT '部门id', + `post` json DEFAULT NULL COMMENT '岗位', + PRIMARY KEY (`id`), + UNIQUE KEY `admin_users_username_unique` (`username`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统用户表'; + +-- ---------------------------- +-- Records of admin_users +-- ---------------------------- +BEGIN; +INSERT INTO `admin_users` (`id`, `username`, `password`, `nickname`, `avatar`, `email`, `phone`, `status`, `remember_token`, `created_at`, `updated_at`, `deleted_at`, `department_id`, `post`) VALUES (1, 'admin', '$2y$10$fU0gFdv53meVyTqcSugSfudnj/CLiNAnZ1j/X3cdHWXCTVt8DoK7G', 'admin', '/exadmin/img/logo.png', '', '', 1, '', '2022-10-17 05:02:50', '2022-11-01 12:04:11', NULL, 1, NULL); +COMMIT; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/addons/webman/echart/Driver/Eloquent.php b/addons/webman/echart/Driver/Eloquent.php new file mode 100644 index 0000000..f60c8e4 --- /dev/null +++ b/addons/webman/echart/Driver/Eloquent.php @@ -0,0 +1,100 @@ +builder = $this->repository->newQuery(); + } + + /** + * 筛选 + * @param array $rule + * @return mixed + */ + public function filter(array $rule) + { + new Filter($this->builder,$rule); + } + + public function count($text,\Closure $query = null, $dateField = 'created_at'){ + $this->parseAggregate(__FUNCTION__,$text,'*',$query,$dateField); + } + + public function max($text, $field, \Closure $query = null, $dateField = 'created_at'){ + $this->parseAggregate(__FUNCTION__,$text,$field,$query,$dateField); + } + + public function min($text, $field, \Closure $query = null, $dateField = 'created_at'){ + $this->parseAggregate(__FUNCTION__,$text,$field,$query,$dateField); + } + + public function sum($text, $field, \Closure $query = null, $dateField = 'created_at'){ + $this->parseAggregate(__FUNCTION__,$text,$field,$query,$dateField); + } + + public function avg($text, $field, \Closure $query = null, $dateField = 'created_at'){ + $this->parseAggregate(__FUNCTION__,$text,$field,$query,$dateField); + } + + protected function parseAggregate($method,$text, $field, \Closure $query = null, $dateField = 'created_at'){ + $data = []; + if($this->echart instanceof LineChart){ + foreach (array_column($this->echart->xAxisData,'value') as $item) { + $data[] = $this->aggregate($method,$field,$query,$dateField,$item); + } + }else{ + $data = $this->aggregate($method,$field,$query,$dateField,$this->echart->getDateFilterValue()); + } + + $this->echart->data($text,$data); + } + + protected function aggregate($method,$field,\Closure $query = null,$dateField= 'created_at',$dateValue=null){ + $builder = clone $this->builder; + if($query){ + call_user_func($query,$builder); + } + + if($dateValue){ + switch ($dateValue) { + case 'yesterday': + $builder->whereBetween($dateField,[Carbon::yesterday()->format("Y-m-d 00:00:00"),Carbon::yesterday()->format("Y-m-d 23:59:59")]); + break; + case 'today': + $builder->whereBetween($dateField,[Carbon::today()->format("Y-m-d 00:00:00"),Carbon::today()->format("Y-m-d 23:59:59")]); + break; + case 'week': + $start = Carbon::now()->startOfWeek()->toDateString(); + $end = Carbon::now()->endOfWeek()->toDateString(); + $builder->whereBetween($dateField,[$start,$end]); + break; + case 'month': + $builder->whereBetween($dateField,[Carbon::now()->startOfMonth()->format("Y-m-d 00:00:00"),Carbon::now()->endOfMonth()->format("Y-m-d 23:59:59")]); + break; + case 'year': + $builder->whereBetween($dateField,[Carbon::now()->startOfYear()->format("Y-m-d 00:00:00"),Carbon::now()->endOfYear()->format("Y-m-d 23:59:59")]); + break; + default: + $builder->whereBetween($dateField,$dateValue); + } + } + + return $builder->$method($field); + + } +} diff --git a/addons/webman/echart/EchartManager.php b/addons/webman/echart/EchartManager.php new file mode 100644 index 0000000..4bd9824 --- /dev/null +++ b/addons/webman/echart/EchartManager.php @@ -0,0 +1,18 @@ +driver = new Eloquent(); + } + } +} diff --git a/addons/webman/exception/HttpResponseException.php b/addons/webman/exception/HttpResponseException.php new file mode 100644 index 0000000..0b3ccbb --- /dev/null +++ b/addons/webman/exception/HttpResponseException.php @@ -0,0 +1,44 @@ +response = $response; + } + + /** + * Get the underlying response instance. + * + * @return Response + */ + public function getResponse() + { + return $this->response; + } + public function render(Request $request): ?Response + { + return $this->getResponse(); // TODO: Change the autogenerated stub + } +} \ No newline at end of file diff --git a/addons/webman/exception/PermissionException.php b/addons/webman/exception/PermissionException.php new file mode 100644 index 0000000..4dbb4f2 --- /dev/null +++ b/addons/webman/exception/PermissionException.php @@ -0,0 +1,10 @@ +make($config); + if($driver instanceof \League\Flysystem\Filesystem){ + $filesystem = $driver; + }else{ + $filesystem = new \League\Flysystem\Filesystem($driver,$config); + } + return new FilesystemAdapter($filesystem); + } + public static function __callStatic($name, $arguments) + { + $self = new static(); + if($name == 'disk'){ + return $self->driver(...$arguments); + }else{ + return $self->driver()->$name(...$arguments); + } + } +} \ No newline at end of file diff --git a/addons/webman/filesystem/driver/Local.php b/addons/webman/filesystem/driver/Local.php new file mode 100644 index 0000000..2b51b34 --- /dev/null +++ b/addons/webman/filesystem/driver/Local.php @@ -0,0 +1,15 @@ +addPlugin(new FileUrl()); + $filesystem->addPlugin(new SignUrl()); + $filesystem->addPlugin(new TemporaryUrl()); + $filesystem->addPlugin(new SignatureConfig()); + $filesystem->addPlugin(new SetBucket()); + $filesystem->addPlugin(new Verify()); + $filesystem->addPlugin(new Kernel()); + return $filesystem; + } +} \ No newline at end of file diff --git a/addons/webman/filesystem/driver/Qiniu.php b/addons/webman/filesystem/driver/Qiniu.php new file mode 100644 index 0000000..22bc222 --- /dev/null +++ b/addons/webman/filesystem/driver/Qiniu.php @@ -0,0 +1,35 @@ +addPlugin(new FetchFile()); + $flysystem->addPlugin(new UploadToken()); + $flysystem->addPlugin(new FileUrl()); + $flysystem->addPlugin(new PrivateDownloadUrl()); + $flysystem->addPlugin(new RefreshFile()); + + return $flysystem; + } +} \ No newline at end of file diff --git a/addons/webman/form/Driver/Config.php b/addons/webman/form/Driver/Config.php new file mode 100644 index 0000000..fd3f431 --- /dev/null +++ b/addons/webman/form/Driver/Config.php @@ -0,0 +1,74 @@ +dispatchEvent('saving',[$this->form]); + if ($result instanceof Message) { + return $result; + } + foreach ($data as $field => $value) { + admin_sysconf($field, $value); + } + + $savedResult = $this->dispatchEvent('saved',[$this->form]); + if ($savedResult instanceof Message) { + return $savedResult; + } + if($this->form->isStepfinish()){ + $result = call_user_func($this->form->getSteps()->getFinish(),new StepResult($this->form,$data, $result, $id)); + return Response::success($result,'',202); + } + return message_success(admin_trans('form.save_success')); + } + + /** + * 返回唯一标识字段,一般数据库主键自增字段 + * @return string + */ + public function getPk(): string + { + return 'id'; + } + + /** + * 获取数据 + * @param string $field 字段 + * @return mixed + */ + public function get(string $field = null) + { + return admin_sysconf($field); + } + + /** + * 编辑数据 + * @param mixed $id + * @return mixed + */ + public function edit($id) + { + // TODO: Implement edit() method. + } + + +} diff --git a/addons/webman/form/Driver/Eloquent.php b/addons/webman/form/Driver/Eloquent.php new file mode 100644 index 0000000..1d331c3 --- /dev/null +++ b/addons/webman/form/Driver/Eloquent.php @@ -0,0 +1,203 @@ +trashed()) { + $this->data = $this->repository->withTrashed()->find($id); + } else { + $this->data = $this->repository->find($id); + } + return $this->data; + } + + public function trashed(): bool + { + return in_array(SoftDeletes::class, class_uses_recursive($this->repository)); + } + + public function model() + { + return $this->repository; + } + + /** + * 数据保存 + * @param array $data + * @return Message|Response + */ + public function save(array $data, $id = null) + { + //验证数据 + $result = $this->form->validator()->check($data, !is_null($id)); + if ($result instanceof Response) { + return $result; + } + $this->form->input($data); + $result = $this->dispatchEvent('saving', [$this->form]); + if ($result instanceof Message) { + return $result; + } + $tableField = $this->getTableFields($this->repository->getTable()); + if (!is_null($id)) { + $this->repository = $this->edit($id); + } + Db::connection($this->repository->getConnectionName())->beginTransaction(); + try { + foreach ($this->form->input() as $field => $value) { + if (in_array($field, $tableField)) { + $this->repository->setAttribute($field, $value); + } + } + if (!in_array($this->repository::CREATED_AT, $tableField) || !in_array($this->repository::UPDATED_AT, $tableField)) { + $this->repository->timestamps = false; + } + $result = $this->repository->save(); + foreach ($this->form->input() as $field => $value) { + if (method_exists($this->repository, $field)) { + $relationMethod = $this->repository->$field(); + if ($relationMethod instanceof BelongsToMany) { + $relationMethod->sync($value); + } elseif ($relationMethod instanceof HasOne || $relationMethod instanceof MorphOne || $relationMethod instanceof BelongsTo || $relationMethod instanceof MorphTo) { + $model = $this->repository->$field; + if (!$model) { + $model = $relationMethod->make(); + } + $this->relationSave($model, $value); + } elseif ($relationMethod instanceof HasMany || $relationMethod instanceof MorphMany) { + $pk = $relationMethod->getModel()->getKeyName(); + + $realtionUpdateIds = array_column($value, $pk); + if (!empty($this->repository->$field)) { + $deleteIds = $this->repository->$field->pluck($pk)->toArray(); + $deleteIds = array_diff($deleteIds, $realtionUpdateIds); + if (count($deleteIds) > 0) { + $this->repository->$field()->whereIn($pk, $deleteIds)->delete(); + } + } + $foreignKey = $relationMethod->getForeignKeyName(); + $parentKey = $relationMethod->getParentKey(); + + foreach ($value as $key => &$val) { + $model = $relationMethod->getModel()->newModelInstance(); + if (!empty($val[$pk])) { + $model = $model->find($val[$pk]); + } + $val[$foreignKey] = $parentKey; + + $this->relationSave($model, $val); + } + } + } + } + Db::connection($this->repository->getConnectionName())->commit(); + } catch (\Exception $exception) { + Db::connection($this->repository->getConnectionName())->rollBack(); + if (config('app.debug')) { + throw $exception; + } + + } + $savedResult = $this->dispatchEvent('saved', [$this->form]); + if ($savedResult instanceof Message) { + return $savedResult; + } + if ($this->form->isStepfinish()) { + $result = call_user_func($this->form->getSteps()->getFinish(), new StepResult($this->form, $data, $result, $id)); + return Response::success($result, '', 202); + } + if ($result) { + return message_success(admin_trans('form.save_success')); + } + return message_error(admin_trans('form.save_fail')); + } + protected function getTableFields($table){ + $tableFields = Db::connection($this->repository->getConnectionName())->select('SHOW FULL COLUMNS FROM '.$table); + $fields = []; + foreach ($tableFields as $tableField){ + $tableField = json_decode(json_encode($tableField),true); + $tableField = array_change_key_case($tableField); + $fields[] = $tableField['field']; + } + return $fields; + } + protected function relationSave(Model $model, array $data) + { + $tableField = $this->getTableFields($model->getTable()); + + foreach ($data as $field => $value) { + if (in_array($field, $tableField)) { + $model->$field = $value; + } + } + if (!in_array($model::CREATED_AT, $tableField) || !in_array($model::UPDATED_AT, $tableField)) { + $model->timestamps = false; + } + $model->save(); + } + + /** + * 返回唯一标识字段,一般数据库主键自增字段 + * @return string + */ + public function getPk(): string + { + return $this->repository->getKeyName(); + } + + /** + * 获取数据 + * @param string $field 字段 + * @return mixed + */ + public function get(string $field = null) + { + if (is_null($field)) { + return $this->data->toArray(); + } + $value = Arr::get($this->data, $field); + if (method_exists($this->repository, $field)) { + $relation = $this->repository->$field(); + if ($relation instanceof BelongsToMany) { + if (empty($value)) { + return []; + } else { + return $value->pluck($relation->getRelatedKeyName()); + } + } + } + return $value; + } + + +} diff --git a/addons/webman/form/FormManager.php b/addons/webman/form/FormManager.php new file mode 100644 index 0000000..94e7d1b --- /dev/null +++ b/addons/webman/form/FormManager.php @@ -0,0 +1,19 @@ +driver = new Eloquent(); + } + } + +} diff --git a/addons/webman/form/MyEditor.php b/addons/webman/form/MyEditor.php new file mode 100644 index 0000000..167cf8a --- /dev/null +++ b/addons/webman/form/MyEditor.php @@ -0,0 +1,16 @@ +attr('html-raw',true) + ->content(file_get_contents( plugin()->webman->getPath(). '/views/my_editor.vue')); + + return parent::jsonSerialize(); + } +} \ No newline at end of file diff --git a/addons/webman/form/Uploader.php b/addons/webman/form/Uploader.php new file mode 100644 index 0000000..5f07aa9 --- /dev/null +++ b/addons/webman/form/Uploader.php @@ -0,0 +1,112 @@ +disk)->put($filename, $content); + } + + /** + * 是否存在 + * @param string $path 路径 + * @return bool + */ + public function exists(string $path): bool + { + return Filesystem::disk($this->disk)->exists($path); + } + + /** + * 返回访问url + * @param string $path 路径 + * @return string + */ + public function url(string $path): string + { + + return Filesystem::disk($this->disk)->url($path); + } + + /** + * 临时目录 + * @return string + */ + protected function tempDirectory(): string + { + return runtime_path('tmp'); + } + + /** + * 写入文件 + * @param $content 文件内容 + * @param $filename 文件名 + * @return bool|string + */ + public function putContent($content, $filename) + { + $path = $this->directory . $filename . '.' . $this->extension; + return Filesystem::disk($this->disk)->put($path, $content); + } + + /** + * 上传 + * @param \Closure $complete + * @param bool $exists 判断秒传 + * @return Response + */ + public function upload(\Closure $complete = null, bool $exists = false) + { + return parent::upload(function (UploadedFile $file) { + if ($this->form) { + $component = $this->form->getImageComponent(); + if ($component) { + $thumbnail = $component->getThumbnail(); + //图片处理 + $interventionCall = $component->getInterventionCall(); + if (count($interventionCall) > 0) { + $image = Image::make($file->getRealPath()); + foreach ($interventionCall as $call) { + call_user_func_array([$image, $call['method']], $call['arguments']); + } + $file = $image->encode(null, null)->getEncoded(); + } + //生成缩略图 + if (count($thumbnail) > 0) { + if ($file instanceof UploadedFile) { + $data = $file->getRealPath(); + $filename = request()->input('identifier'); + } else { + $data = $file; + $filename = md5($data); + } + foreach ($thumbnail as $name => $size) { + $image = Image::make($data); + list($width, $height) = $size; + $content = $image->resize($width, $height) + ->encode(null, null) + ->getEncoded(); + $this->putContent($content, $filename . '-' . $name); + } + } + + } + } + return $file; + }, request()->input('type') == 'file'); // TODO: Change the autogenerated stub + } +} diff --git a/addons/webman/form/Validator.php b/addons/webman/form/Validator.php new file mode 100644 index 0000000..ba0c759 --- /dev/null +++ b/addons/webman/form/Validator.php @@ -0,0 +1,53 @@ +updateRule : $this->createRule; + $rules = []; + $messages = []; + foreach ($ruleArr as $field => $row) { + $rule = []; + if($row instanceof \Closure){ + $row = call_user_func_array($row,[$data,$this->form]); + } + foreach ($row as $key => $item) { + if (is_numeric($key)) { + $rule[] = $item; + } else { + $rule[] = $key; + $index = strpos($key, ':'); + if ($index !== false) { + $key = substr($key, 0, $index); + } + $messages["{$field}.{$key}"] = $item; + } + } + $rules[$field] = $rule; + } + $validator = validator($data, $rules, $messages); + if ($validator->fails()) { + return Response::success($validator->errors()->getMessages(), '', 422); + } + if($this->form->getSteps()){ + + if(!$this->form->isStepfinish()){ + return Response::success([], '', 201); + } + } + return true; + } +} diff --git a/addons/webman/grid/Driver/Eloquent.php b/addons/webman/grid/Driver/Eloquent.php new file mode 100644 index 0000000..e453a36 --- /dev/null +++ b/addons/webman/grid/Driver/Eloquent.php @@ -0,0 +1,457 @@ +builder = $this->repository->newQuery(); + if ($this->trashed() && $this->grid->isTrashed()) { + $this->builder->onlyTrashed(); + } + $this->setPk($this->repository->getKeyName()); + } + + /** + * 是否有回收站 + * @return bool + */ + public function trashed(): bool + { + return in_array(SoftDeletes::class, class_uses_recursive($this->repository)); + } + + + /** + * 恢复数据 + * @param array $ids 恢复id + * @return Message + */ + public function restore(array $ids): Message + { + $this->repository->whereIn($this->getPk(), $ids)->restore(); + return message_success(admin_trans('grid.restore_success')); + } + + /** + * 删除 + * @param array $ids 删除id + * @param bool $all 是否删除全部 + * @return Message + */ + public function delete(array $ids, bool $all = false): Message + { + $arg = $all ?: $ids; + $result = $this->dispatchEvent('deling', [$arg]); + if ($result instanceof Message) { + return $result; + } + if ($this->grid->isTrashed()) { + $result = $this->builder->when($all, function ($query) { + $query->onlyTrashed(); + }, function ($query) use ($ids) { + $query->whereIn($this->getPk(), $ids); + })->forceDelete(); + } else { + $result = $this->builder->when($all, function ($query) { + $query->whereRaw('1=1'); + }, function ($query) use ($ids) { + $query->whereIn($this->getPk(), $ids); + })->delete(); + } + $deletedResult = $this->dispatchEvent('deleted', [$arg]); + if ($deletedResult instanceof Message) { + return $deletedResult; + } + if ($result) { + return message_success(admin_trans('grid.delete_success')); + } + return message_error(admin_trans('grid.delete_error')); + } + + /** + * 拖拽排序 + * @param int $id 排序id + * @param int $sort 排序位置 + * @param string $field 字段 + * @return Message + */ + public function dragSort($id, int $sort, string $field): Message + { + $result = $this->dispatchEvent('sorting', [$id, $sort, $field]); + if ($result instanceof Message) { + return $result; + } + $pk = $this->getPk(); + $selectRaw = "{$pk},(@rownum := @rownum+1),case when @rownum = {$sort} then @rownum := @rownum+1 else @rownum := @rownum end AS rownum"; + + $sortSql = $this->builder->from(Db::raw("(SELECT @rownum := -1) r," . $this->repository->getTable())) + ->selectRaw($selectRaw) + ->reorder($field) + ->where($pk, '<>', $id) + ->toSql(); + $this->repository->where($pk, $id)->update([$field => $sort]); + + Db::connection($this->repository->getConnectionName())->statement("update {$this->repository->getTable()} inner join ({$sortSql}) a on a.{$pk}={$this->repository->getTable()}.{$pk} set `{$field}`=a.rownum", $this->builder->getBindings()); + + return message_success(admin_trans('grid.sort_success')); + } + + /** + * 输入框排序 + * @param int $id 排序id + * @param int $sort 排序位置 + * @param string $field 字段 + * @return Message + */ + public function inputSort($id, int $sort, string $field): Message + { + $result = $this->dispatchEvent('sorting', [$id, $sort, $field]); + if ($result instanceof Message) { + return $result; + } + $this->repository->where($this->getPk(), $id)->update([$field => $sort]); + return message_success(admin_trans('grid.sort_success')); + } + + /** + * 更新 + * @param array $ids 更新条件id集合 + * @param array $data 更新数据 + * @return Message + */ + public function update(array $ids, array $data): Message + { + + $result = $this->dispatchEvent('updateing', [$ids, $data]); + if ($result instanceof Message) { + return $result; + } + foreach ($ids as $id) { + $model = $this->repository->find($id); + foreach ($data as $field => $value) { + $model->$field = $value; + } + $model->save(); + } + $result = $this->dispatchEvent('updated', [$ids, $data]); + if ($result instanceof Message) { + return $result; + } + return message_success(admin_trans('grid.update_success')); + } + + /** + * 表格列触发排序 + * @param string $field 字段 + * @param string $sort 排序 asc desc + * @return mixed + */ + public function tableSort($field, $sort) + { + $this->builder->reorder($field, $sort); + } + + /** + * 筛选 + * @param array $rule + */ + public function filter(array $rule) + { + new Filter($this->builder, $rule); + } + + /** + * 快捷搜索 + * @param string $keyword 关键词 + * @param string|array|\Closure $search 搜索设置 + * @return mixed + */ + public function quickSearch($keyword, $search) + { + if ($keyword === '' || $keyword === null) { + return; + } + if ($search instanceof \Closure) { + $this->builder->where(function ($query) use ($search, $keyword) { + call_user_func_array($search, [$query, $keyword]); + }); + } + if (is_string($search)) { + $search = [$search]; + } + if (is_array($search)) { + $this->builder->where(function ($query) use ($search, $keyword) { + foreach ($search as $field) { + $query->orWhere($field, "LIKE", "%$keyword%"); + } + }); + } elseif (is_null($search)) { + + $this->builder->where(function ($query) use ($keyword) { + $tableField[$this->repository->getTable()] = $this->getTableField(); + $table = $this->repository->getTable(); + $wheres = []; + foreach ($this->grid->getColumns() as $column) { + $field = $column->attr('dataIndex'); + $using = $column->using; + $fields = explode('.', $field); + if (count($fields) > 1) { + $field = array_pop($fields); + $model = $this->repository; + foreach ($fields as $relation) { + $model = $model->$relation()->getRelated(); + } + if (!array_key_exists($model->getTable(), $tableField)) { + $tableField[$model->getTable()] = $this->getTableFieldInfo($model->getTable()); + } + $relation = implode('.', $fields); + $relationTableField = $tableField[$model->getTable()]; + $where = $this->buildOrWhere($field, $relationTableField, $using, $keyword); + + } else { + $relation = $table; + $where = $this->buildOrWhere($field, $tableField[$table], $using, $keyword); + } + if (count($where) > 0) { + if (isset($wheres[$relation])) { + $wheres[$relation] = array_merge($wheres[$relation], $where); + } else { + $wheres[$relation] = $where; + } + } + } + foreach ($wheres as $relation => $where) { + if ($relation == $table) { + $this->addOrWhereBinding($query, $where); + } else { + $query->orWhereHas($relation, function ($q) use ($where) { + $q->where(function ($query) use ($where) { + $this->addOrWhereBinding($query, $where); + }); + }); + } + } + }); + + } + } + + protected function addOrWhereBinding($query, $wheres) + { + foreach ($wheres as $where) { + $query->orWhere(...$where); + } + } + + protected function parseDateTime($type, $originValue) + { + if (in_array($type, ['datetime', 'timestamp', 'date'])) { + $value = strtotime($originValue); + if ($value === false) { + return $value; + } + if ('date' == $type) { + $value = date('Y-m-d', $value); + } else { + $value = date('Y-m-d H:i:s', $value); + } + } else { + $value = $originValue; + } + return $value; + } + + protected function buildOrWhere($field, $tableField, $using, $keyword) + { + $where = []; + if (array_key_exists($field, $tableField)) { + if (count($using) > 0) { + foreach ($using as $key => $value) { + if (strpos($value, $keyword) !== false) { + $where[] = [$field, "=", $key]; + } + } + } else { + $value = $this->parseDateTime($tableField[$field]['type'], $keyword); + if ($value !== false) { + if ($keyword == $value) { + $where[] = [$field, "LIKE", "%$keyword%"]; + } else { + $where[] = [$field, "=", $value]; + } + } + } + } + return $where; + } + + /** + * 预关联加载 + */ + protected function with() + { + $eagerLoad = $this->builder->getEagerLoads(); + $relations = []; + foreach ($this->grid->getColumns() as $column) { + $field = $column->attr('dataIndex'); + $fields = explode('.', $field); + if (count($fields) > 1) { + array_pop($fields); + $relation = implode('.', $fields); + if (method_exists($this->repository, $relation)) { + $relations[] = $relation; + } + } + } + $relations = array_merge($relations, $eagerLoad); + $this->builder->setEagerLoads([]); + $this->builder->with($relations); + } + + /** + * 数据源 + * @param int $page 第几页 + * @param int $size 分页大小 + * @param bool $hidePage 是否分页 + * @return mixed + */ + public function data(int $page, int $size, bool $hidePage) + { + $totalBuilder = clone $this->builder; + $totalBuilder = $totalBuilder->select(DB::raw('count(*) as total'))->get(); + if (count($totalBuilder) > 1) { + $total = $totalBuilder->count(); + } else { + $total = $totalBuilder->sum('total'); + } + $this->setTotal($total); + $this->with(); + if ($hidePage) { + return $this->builder->get(); + } else { + return $this->builder->forPage($page, $size)->get(); + } + } + + /** + * 返回总条数 + * @return int + */ + public function total(): int + { + return $this->total; + } + + /** + * 导出数据 + * @param array $selectIds 导出选中id + * @param array $columns 导出列 + * @param bool $all 是否导出全部 + * @return Response + */ + public function export(array $selectIds, array $columns, bool $all): Response + { + $progressKey = Request::input('ex_admin_progress_key', uniqid()); + $export = $this->grid->getExport(); + $export->setProgressKey($progressKey); + try { + if (Request::input('ex_admin_queue')) { + $request = (new Request())->getRequest(); + + $data = Request::input() + ['ex_admin_progress_key' => $progressKey, 'ex_admin_request' => [ + 'method' => Request::getMethod(), + 'server' => $request->server->all(), + 'header' => $request->headers->all(), + ]]; + Client::send('ex-admin-grid-export', $data); + } else { + $arr = []; + foreach ($columns as $column) { + if (isset($column['title']) && !empty($column['title'])) { + $arr[$column['dataIndex']] = $column['title']; + } + if (isset($column['children']) && !empty($column['children'])) { + foreach ($column['children'] as $children) { + if (isset($children['title']) && !empty($children['title'])) { + $arr[$children['dataIndex']] = $children['title']; + } + } + } + } + $columns = $arr; + $this->builder->when(!$all, function (Builder $builder) use ($selectIds) { + $builder->whereKey($selectIds); + }); + $count = $this->builder->count(); + $export->columns($columns)->count($count); + $this->builder->chunk(500, function ($data) use ($export) { + $data = $this->grid->parseColumn($data, true); + $export->write($data, function ($export) { + $export->save(Filesystem::path('')); + return Filesystem::url($export->getFilename() . '.' . $export->getExtension()); + }); + }); + } + } catch (\Throwable $exception) { + $export->exportError(); + } + return $export->export(); + } + + protected function getTableFieldInfo($table) + { + $tableFields = Db::connection($this->repository->getConnectionName())->select('SHOW FULL COLUMNS FROM ' . $table); + $fields = []; + foreach ($tableFields as $tableField) { + $tableField = json_decode(json_encode($tableField), true); + $tableField = array_change_key_case($tableField); + $fields[$tableField['field']] = $tableField; + } + return $fields; + } + + protected function getTableField() + { + if (count($this->tableField) == 0) { + $this->tableField = $this->getTableFieldInfo($this->repository->getTable()); + } + return $this->tableField; + } + + /** + * @return Builder|mixed + */ + public function model() + { + return $this->builder; + } +} diff --git a/addons/webman/grid/Filter.php b/addons/webman/grid/Filter.php new file mode 100644 index 0000000..3789bdf --- /dev/null +++ b/addons/webman/grid/Filter.php @@ -0,0 +1,138 @@ +getModel()->getConnectionName())->select('SHOW FULL COLUMNS FROM '.$table); + $fields = []; + foreach ($tableFields as $tableField){ + $tableField = json_decode(json_encode($tableField),true); + $tableField = array_change_key_case($tableField); + $fields[] = $tableField['field']; + } + return $fields; + } + public function __construct(Builder $builder,$rule) + { + $tableField = $this->getTableFields($builder,$builder->getModel()->getTable()); + $builder->where(function ($query) use($rule,$tableField){ + $this->builder = $query; + foreach ($rule as $item) { + if(is_numeric($item['value']) || !empty($item['value'])){ + $fields = explode( '->',$item['field']); + $field = current($fields); + if($item['relation'] || in_array($field, $tableField)){ + $this->parseFilter($item['type'],$item['relation'],$item['rule'], $item['field'], $item['value']); + } + } + } + }); + } + + /** + * 关联筛选 + + * @param string $rule 规则类型 + * @param string $field 字段 + * @param mixed $value 筛选值 + * @param string $relation 关联方法 + */ + public function whereHas($relation, $rule, $field, $value) + { + $this->builder->whereHas($relation, function ($builder) use ($rule, $field, $value) { + $this->parseFilter($rule,null, $field, $value, $builder); + }); + } + + /** + * 解析筛选 + * @param string $type 类型 + * @param string $relation 关联方法 + * @param string $rule 规则类型 + * @param string $field 字段 + * @param mixed $value 筛选值 + * @param Builder $builder + */ + public function parseFilter($type,$relation,$rule, $field, $value, $builder = null) + { + if (is_null($builder)) { + $builder = $this->builder; + } + if($relation){ + return $builder->whereHas($relation, function ($query) use ($type,$rule, $field, $value) { + $this->parseFilter($type,null,$rule, $field, $value, $query); + }); + } + if($type == 'cascader'){ + return $builder->where(function ($query) use($rule,$value){ + foreach ($value as $row){ + $query->orWhere(function ($q) use($rule,$row){ + foreach ($row as $field=>$val){ + $this->parseFilter('normal',null,$rule,$field,$val,$q); + } + }); + } + }); + } + if ($field == 'player_tag') { + $rule = 'findIn'; + } + switch ($rule) { + case 'eq': + $builder->where($field, $value); + break; + case 'neq': + $builder->where($field, '!=', $value); + break; + case 'egt': + $builder->where($field, '>=', $value); + break; + case 'elt': + $builder->where($field, '<=', $value); + break; + case 'gt': + $builder->where($field, '>', $value); + break; + case 'lt': + $builder->where($field, '<', $value); + break; + case 'between': + $builder->whereBetween($field, $value); + break; + case 'notBetween': + $builder->whereNotBetween($field, $value); + break; + case 'like': + $builder->where($field, 'LIKE', "%$value%"); + break; + case 'json': + list($field,$node) = explode('->',$field); + $builder->whereRaw("JSON_EXTRACT({$field},'$.{$node}') = '{$value}'"); + break; + case 'jsonLike': + list($field,$node) = explode('->',$field); + $builder->whereRaw("JSON_EXTRACT({$field},'$.{$node}') LIKE '%{$value}%'"); + break; + case 'jsonArrLike': + list($field,$node) = explode('->',$field); + $builder->whereRaw("JSON_EXTRACT({$field},'$[*].{$node}') LIKE '%{$value}%'"); + break; + case 'in': + $builder->whereIn($field, $value); + break; + case 'notIn': + $builder->whereNotIn($field, $value); + break; + case 'findIn': + $builder->whereRaw("FIND_IN_SET('{$value}',{$field})"); + break; + } + } +} diff --git a/addons/webman/grid/GridManager.php b/addons/webman/grid/GridManager.php new file mode 100644 index 0000000..129ac80 --- /dev/null +++ b/addons/webman/grid/GridManager.php @@ -0,0 +1,17 @@ +driver = new Eloquent(); + } + } +} diff --git a/addons/webman/grid/Jobs/Export.php b/addons/webman/grid/Jobs/Export.php new file mode 100644 index 0000000..0582c5a --- /dev/null +++ b/addons/webman/grid/Jobs/Export.php @@ -0,0 +1,37 @@ +initialize($data,$data,[],[],[],$data['ex_admin_request']['server']); + $q->headers = new HeaderBag($data['ex_admin_request']['header']); + $q->setMethod($data['ex_admin_request']['method']); + }); + $class = str_replace('-', '\\', $data['ex_admin_class']); + Container::getInstance() + ->make(Route::class) + ->invokeMethod($class, $data['ex_admin_function'], $data) + ->jsonSerialize(); + } +} diff --git a/addons/webman/helpers.php b/addons/webman/helpers.php new file mode 100644 index 0000000..8ff4fab --- /dev/null +++ b/addons/webman/helpers.php @@ -0,0 +1,284 @@ +webman->config('database.config_model'); + if (is_null($name)) { + return $model::get()->toArray(); + } + if (is_null($value)) { + $value = $model::where('name', $name)->value('value'); + if (is_null($value)) { + return $value; + }; + $json = json_decode($value, true); + if (is_array($json)) { + return $json; + } else { + return $value; + } + } else { + if (is_array($value)) { + $value = json_encode($value, JSON_UNESCAPED_UNICODE); + } + return $model::updateOrCreate(['name' => $name], ['value' => $value]); + } + } +} + +if (!function_exists('validator')) { + /** + * Create a new Validator instance. + * + * @param array $data + * @param array $rules + * @param array $messages + * @param array $customAttributes + * @return ValidatorFactory + */ + function validator(array $data = [], array $rules = [], array $messages = [], array $customAttributes = []) + { + $factory = new ValidatorFactory(); + if (func_num_args() === 0) { + return $factory; + } + $factory->setPresenceVerifier(new \Illuminate\Validation\DatabasePresenceVerifier(\Illuminate\Database\Eloquent\Model::getConnectionResolver())); + + return $factory->make($data, $rules, $messages, $customAttributes); + } +} + +if (!function_exists('getGameTypeCateName')) { + /** + * 获取游戏类型转义名称 + * @param $val + * @return string + */ + function getGameTypeCateName($val): string + { + return admin_trans('game_type.game_type_cate.' . $val); + } +} + +if (!function_exists('floorToCoinsSecond')) { + function floorToCoinsSecond($number) + { + if (!is_numeric($number)) { + return $number; + } + + return number_format(($number * 100) / 100, 2); + } +} + +if (!function_exists('playerManualSystem')) { + /** + * 系统加点 + * @param $data + * @throws Exception + */ + function playerManualSystem($data) + { + $money = (float)$data['money']; + if ($money <= 0) { + throw new Exception(admin_trans('player.wallet.operation_amount_error')); + } + if ($data['type'] == PlayerMoneyEditLog::TYPE_INCREASE) { + if (!in_array($data['increase_action'], [ + PlayerMoneyEditLog::ACTIVITY_GIVE, + PlayerMoneyEditLog::RECHARGE, + PlayerMoneyEditLog::VIP_RECHARGE, + PlayerMoneyEditLog::OTHER, + PlayerMoneyEditLog::ADMIN_INCREASE + ])) { + throw new Exception(admin_trans('player.wallet.wallet_type_error')); + } + $action = $data['increase_action']; + } else { + if ($data['deduct_action'] != PlayerMoneyEditLog::ADMIN_DEDUCT) { + throw new Exception(admin_trans('player.wallet.wallet_type_error')); + } + $action = $data['deduct_action']; + } + /** @var Player $player */ + $player = Player::find($data['id']); + $tradeno = date('YmdHis') . rand(10000, 99999); + $originMoney = $player->wallet->money; + + $playerMoneyEditLog = new PlayerMoneyEditLog; + $playerMoneyEditLog->player_id = $player->id; + $playerMoneyEditLog->department_id = $player->department_id; + $playerMoneyEditLog->type = $data['type']; + $playerMoneyEditLog->action = $action; + $playerMoneyEditLog->tradeno = $tradeno; + $playerMoneyEditLog->currency = $player->currency; + $playerMoneyEditLog->money = $money; + $playerMoneyEditLog->inmoney = $money; + $playerMoneyEditLog->remark = $data['remark']; + $playerMoneyEditLog->user_id = Admin::id() ?? 0; + $playerMoneyEditLog->user_name = !empty(Admin::user()) ? Admin::user()->toArray()['username'] : trans('system_automatic', [], 'message'); + $playerMoneyEditLog->save(); + + $afterMoney = playerUpdateMoney($player, $playerMoneyEditLog, $data['type'], $money, 'wallet_modify', $playerMoneyEditLog->type == PlayerMoneyEditLog::TYPE_INCREASE ? PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD : PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT); + + $playerMoneyEditLog->origin_money = $originMoney; + $playerMoneyEditLog->after_money = $afterMoney; + $playerMoneyEditLog->save(); + } +} + + +if (!function_exists('playerUpdateMoney')) { + /** + * 玩家主錢包加扣點 + * @param Player $player 玩家信息 + * @param object $target 资料表 + * @param int $type 加点扣点 + * @param float $money 金额 + * @param string $source 来源 + * @param int $deliveryType 类型 + * @throws Exception + */ + function playerUpdateMoney(Player $player, object $target, int $type, float $money, string $source, int $deliveryType) + { + if (!in_array($type, [PlayerMoneyEditLog::TYPE_DEDUCT, PlayerMoneyEditLog::TYPE_INCREASE])) { + throw new Exception(admin_trans('player.wallet.wallet_type_error')); + } + + if (!$player->id) { + throw new Exception(admin_trans('player.wallet.player_error')); + } + + if (!$target->id) { + throw new Exception(admin_trans('player.wallet.wallet_action_log_not_found')); + } + + //玩家加點數 + /** @var PlayerPlatformCash $machineWallet */ + $machineWallet = PlayerPlatformCash::where('platform_id', PlayerPlatformCash::PLATFORM_SELF)->where('player_id', $player->id)->first(); + $originMoney = $machineWallet->money; + if ($type == PlayerMoneyEditLog::TYPE_INCREASE) { + $machineWallet->money = bcadd($machineWallet->money, $money, 2); + } else { + if ($money > $originMoney) { + throw new Exception(admin_trans('player.wallet.insufficient_player_money')); + } + $machineWallet->money = bcsub($machineWallet->money, $money, 2); + } + $machineWallet->save(); + //寫入金流明細 + $playerDeliveryRecord = new PlayerDeliveryRecord; + $playerDeliveryRecord->player_id = $player->id; + $playerDeliveryRecord->department_id = $player->department_id; + $playerDeliveryRecord->target = $target->getTable(); + $playerDeliveryRecord->target_id = $target->id; + $playerDeliveryRecord->type = $deliveryType; + $playerDeliveryRecord->source = $source; + $playerDeliveryRecord->amount = $money; + $playerDeliveryRecord->amount_before = $originMoney; + $playerDeliveryRecord->amount_after = $machineWallet->money; + $playerDeliveryRecord->tradeno = $target->tradeno ?? ''; + $playerDeliveryRecord->remark = $target->remark ?? ''; + $playerDeliveryRecord->user_id = Admin::id() ?? 0; + $playerDeliveryRecord->user_name = !empty(Admin::user()) ? Admin::user()->toArray()['username'] : trans('system_automatic', [], 'message'); + $playerDeliveryRecord->save(); + + return $machineWallet->money; + } +} + +if (!function_exists('isTime')) { + /** + * 是否是时间格式 + * @param $timeStr + * @return bool + */ + function isTime($timeStr): bool + { + //年-月-日 + $regex1 = '/^\d{4}-\d{2}-\d{2}$/'; + //时:分:秒 + $regex2 = '/^\d{2}:\d{2}:\d{2}$/'; + //年-月-日 时:分:秒 + $regex3 = '/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/'; + + if (preg_match($regex1, $timeStr) || preg_match($regex2, $timeStr) || preg_match($regex3, $timeStr)) { + return true; + } else { + return false; + } + } +} + +if (!function_exists('getSeatOptions')) { + /** + * 炮台位置 + * @return array + */ + function getSeatOptions(): array + { + return [ + 1 => admin_trans('machine.seat.1'), + 2 => admin_trans('machine.seat.2'), + 3 => admin_trans('machine.seat.3'), + 4 => admin_trans('machine.seat.4'), + 5 => admin_trans('machine.seat.5'), + 6 => admin_trans('machine.seat.6'), + 7 => admin_trans('machine.seat.7'), + 8 => admin_trans('machine.seat.8'), + ]; + } +} + +if (!function_exists('getAdminUserListOptions')) { + /** + * 获取管理员列表 + * @param int $departmentId + * @param int $type + * @return array + */ + function getAdminUserListOptions(int $departmentId = 1, int $type = 1): array + { + $optionList = []; + $userList = AdminUser::query()->where('status', 1)->where('type', $type)->where('department_id', $departmentId)->whereNull('deleted_at')->get(); + /** @var AdminUser $item */ + foreach ($userList as $item) { + $optionList[$item->id] = $item->nickname; + } + + return $optionList; + } +} + +if (!function_exists('getDayOfWeek')) { + + /** + * 数字转星期 + * @param $number + * @return string + */ + function getDayOfWeek($number): string + { + if ($number >= 0 && $number < 7) { + return admin_trans('activity.week.' . $number); + } else { + return ''; + } + } +} \ No newline at end of file diff --git a/addons/webman/ide/Echart.php b/addons/webman/ide/Echart.php new file mode 100644 index 0000000..2fc2986 --- /dev/null +++ b/addons/webman/ide/Echart.php @@ -0,0 +1,18 @@ +=1.1.4", + "author": "rocky", + "namespace": "addons\\webman", + "require": [] +} \ No newline at end of file diff --git a/addons/webman/lang/Ma-my/commission_record.php b/addons/webman/lang/Ma-my/commission_record.php new file mode 100644 index 0000000..c6dc956 --- /dev/null +++ b/addons/webman/lang/Ma-my/commission_record.php @@ -0,0 +1,24 @@ + 'Main dan dapatkan rekod', + 'fields' => [ + 'id' => 'ID', + 'recharge_amount' => 'Jumlah deposit awal', + 'total_amount' => 'Jumlah komisi', + 'damage_amount' => 'Jumlah kehilangan pelanggan', + 'amount' => 'Komisi semasa', + 'ratio' => 'kadar komisi', + 'date' => 'Tarikh penyelesaian', + 'create_at' => 'Masa ciptaan', + 'commission_first_recharge' => 'Muat pertama pengguna', + 'commission_damage' => 'Customer loss commission ratio', + 'commission_chip_multiple' => 'Banyak volum pengekodan', + ], + 'player_info' => 'Maklumat pemain', + 'parent_player_info' => 'Pemain berkongsi keuntungan', + 'commission_setting' => 'Main untuk mendapatkan konfigurasi', + 'commission_first_recharge' => 'Memundang pengguna baru, pengguna baru boleh menerima {$usd}USD untuk muat semula pertama mereka', + 'commission_damage' => '{$ratio}% daripada kerugian pelanggan harian akan diberikan kepada anda sebagai komisen.', + 'commission_chip_multiple' => 'Komisen untuk aktiviti ini adalah sama seperti COINS yang Top Up', +]; diff --git a/addons/webman/lang/Ma-my/menu.php b/addons/webman/lang/Ma-my/menu.php new file mode 100644 index 0000000..d69b2dd --- /dev/null +++ b/addons/webman/lang/Ma-my/menu.php @@ -0,0 +1,121 @@ + 'Tambah Menu', + 'title' => 'Pengurusan Menu Sistem', + 'fields' => [ + 'top' => 'Menu Puncak', + 'pid' => 'Menu Atasan', + 'name' => 'Nama Menu', + 'url' => 'Pautan Menu', + 'icon' => 'Ikon Menu', + 'sort' => 'Susunan', + 'status' => 'Status', + 'open' => 'Kembang Menu', + 'super_status' => 'Status Super Admin', + 'type' => 'Jenis Menu', + ], + 'options' => [ + 'admin_visible' => [ + [1 => 'Paparkan'], + [0 => 'Sembunyikan'] + ] + ], + 'type' => [ + AdminDepartment::TYPE_DEPARTMENT => 'Menu Stesen Utama', + AdminDepartment::TYPE_CHANNEL => 'Menu Saluran', + ], + 'titles' => [ + 'home' => 'Laman Utama', + 'system' => 'Sistem', + 'system_manage' => 'Pengurusan Sistem', + 'config_manage' => 'Pengurusan Konfigurasi', + 'attachment_manage' => 'Pengurusan Lampiran', + 'permissions_manage' => 'Pengurusan Kebenaran', + 'admin' => 'Pengurusan Pengguna', + 'role_manage' => 'Pengurusan Peranan', + 'menu_manage' => 'Pengurusan Menu', + 'plug_manage' => 'Pengurusan Plugin', + 'department_manage' => 'Pengurusan Jabatan', + 'post_manage' => 'Pengurusan Jawatan', + /** Admin Pusat */ + 'admin_manage' => 'Pengurusan Admin Utama', + 'data_center' => 'Pusat Data', + // Pengurusan Pengguna + 'user_manage' => 'Pengurusan Pemain', + 'user_manage_list' => 'Senarai Pemain', + 'accounting_change_records' => 'Rekod Perubahan Akaun', + // Data Kewangan + 'financial_data' => 'Data Kewangan', + 'recharge_record' => 'Rekod Pengisian', + 'withdrawal_records' => 'Rekod Pengeluaran', + // Pusat Laporan + 'report_center' => 'Pusat Laporan', + // Pengurusan Klien + 'client_manager' => 'Pengurusan Klien', + 'rotation_chart_manager' => 'Pengurusan Gambar Putar', + 'announcement_manager' => 'Pengurusan Pengumuman', + 'system_settings' => 'Tetapan Sistem', + // Pengurusan Saluran + 'channel_manager' => 'Pengurusan Saluran', + 'channel_list' => 'Senarai Saluran', + 'currency_manager' => 'Pengurusan Mata Wang', + /** Saluran Backend */ + 'channel_manage' => 'Pengurusan Saluran', + 'channel_data_center' => 'Pusat Data', + // Pengurusan Pemain + 'channel_player_manage' => 'Pengurusan Pemain', + 'channel_player_list' => 'Senarai Pemain', + 'channel_player_accounting_change_records' => 'Rekod Perubahan Akaun', + // Konfigurasi Front-end + 'channel_client_manager' => 'Pengurusan Klien', + 'channel_rotation_chart_manager' => 'Pengurusan Gambar Putar', + 'channel_marquee_manager' => 'Pengurusan Marquee', + 'channel_announcement_manager' => 'Pengurusan Pengumuman', + // Pengurusan Kewangan + 'channel_financial_manager' => 'Pengurusan Kewangan', + 'channel_recharge_review' => 'Semakan Pengisian', + 'channel_withdrawal_review' => 'Semakan Pengeluaran', + 'channel_withdrawal_and_payment' => 'Pembayaran Pengeluaran', + 'channel_recharge_record' => 'Rekod Pengisian', + 'channel_withdrawal_records' => 'Rekod Pengeluaran', + 'channel_recharge_channel_configuration' => 'Konfigurasi Saluran Pengisian', + 'channel_financial_operation_records' => 'Rekod Operasi Kewangan', + // Pengurusan Kebenaran + 'channel_auth_manager' => 'Pengurusan Kebenaran', + 'channel_admin_user_manager' => 'Pengurusan Pengguna', + 'channel_post_manager' => 'Pengurusan Jawatan', + // Pusat Log + 'log_center' => 'Pusat Log', + 'player_edit_log' => 'Log Suntingan Profil Pemain', + 'player_money_edit_log' => 'Log Operasi Dompet', + // Pengurusan Permainan + 'game_manage' => 'Pengurusan Permainan', + 'game_record' => 'Rekod Permainan', + 'game_out_in' => 'Rekod Pindah Masuk/Keluar Permainan', + 'game_list' => 'Senarai Permainan', + 'version_manager' => 'Pengurusan Versi', + 'activity_manager' => 'Pengurusan Aktiviti', + 'activity_list' => 'Senarai Aktiviti', + 'recharge_manager' => 'Pengurusan Pengisian', + 'recharge_channels' => 'Saluran Pengisian', + 'play_and_earn' => 'Main Sambil Cari Duit', + 'play_and_earn_record' => 'Rekod Main Cari Duit', + // Pengurusan Promosi + 'channel_player_promoter' => 'Pengurusan Promosi', + 'channel_player_promoter_list' => 'Senarai Promoter', + 'profit_record' => 'Laporan berkongsi keuntungan', + 'profit_settlement_record' => 'Bahagi rekod penyelesaian keuntungan', + '游戏类型列表' => 'Senarai Jenis Permainan', + //qrcode + '二维码管理' => 'Pengurusan kod QR', + '二维码批次列表' => 'Senarai batch kod QR', + '持码人列表' => 'Senarai pemegang kod', + '广播管理' => 'pengurusan siaran', + '手动广播管理' => 'Pengurusan siaran manual', + '自动广播管理' => 'Pengurusan siaran automatik', + '公告管理' => 'Pengurusan pengumuman', + '公告列表' => 'Senarai Pengumuman', + ] +]; diff --git a/addons/webman/lang/cam_dia/activity.php b/addons/webman/lang/cam_dia/activity.php new file mode 100644 index 0000000..d0cd4b5 --- /dev/null +++ b/addons/webman/lang/cam_dia/activity.php @@ -0,0 +1,48 @@ + 'សកម្មភាព', + 'fields' => [ + 'id' => 'ID', + 'status' => 'ស្ថានភាព', + 'is_show' => 'បង្អួចលេចឡើងទំព័រដើម', + 'sort' => 'តម្រៀប', + 'link' => 'ប្រភេទ', + 'recharge_id' => 'ការកំណត់រចនាសម្ព័ន្ធបញ្ចូលទឹកប្រាក់', + 'start_time' => 'ម៉ោងចាប់ផ្តើម', + 'end_time' => 'ពេលវេលាបញ្ចប់', + 'created_at' => 'ពេលវេលាបង្កើត', + 'time_frame' => 'ម៉ោងបើក', + ], + 'created_at_start' => 'ម៉ោងចាប់ផ្តើម', + 'created_at_end' => 'ពេលវេលាបញ្ចប់', + 'not_fount' => 'រកមិនឃើញសកម្មភាព', + 'activity_content_must' => 'សូមបំពេញខ្លឹមសារសកម្មភាព', + 'rang_time' => 'ម៉ោងបើក', + 'activity_content' => 'មាតិកាសកម្មភាព', + 'activity_info' => 'ព័ត៌មានសកម្មភាព', + 'sign_setting' => 'ការកំណត់ការចូល', + 'chip_amount' => 'ចំនួនសរសេរកូដ', + 'chip_multiple' => 'កូដច្រើន', + 'reward_amount' => 'ចំនួនរង្វាន់', + 'type_not_found' => 'សូមជ្រើសរើសរបៀបសកម្ម', + 'type_error' => 'កំហុសរបៀបសកម្មភាព', + 'cycle_type_not_found' => 'សូមជ្រើសរើសប្រភេទវដ្ត', + 'cycle_type_error' => 'កំហុស​ប្រភេទ​វដ្ត', + 'cycle_data_not_found' => 'សូមជ្រើសរើសការកំណត់រចនាសម្ព័ន្ធប្រភេទវដ្ត', + 'cycle_data_error' => 'សូមជ្រើសរើសការកំណត់រចនាសម្ព័ន្ធប្រភេទវដ្ត', + 'cycle_week' => 'រៀងរាល់សប្តាហ៍ {week} បើក', + 'cycle_month' => 'រៀងរាល់ខែ, {month} ចាប់ផ្តើម', + 'status' => 'ស្ថានភាព', + 'week' => ['ថ្ងៃអាទិត្យ', 'ច័ន្ទ', 'ថ្ងៃអង្គារ', 'ថ្ងៃពុធ', 'ថ្ងៃព្រហស្បតិ៍', 'សុក្រ', 'ថ្ងៃសៅរ៍'], + 'sign_setting_date' => [ + 'ថ្ងៃដំបូង', + 'ថ្ងៃទីពីរ', + 'ថ្ងៃទីបី', + 'ថ្ងៃទីបួន', + 'ថ្ងៃទីប្រាំ', + 'ថ្ងៃទីប្រាំមួយ', + 'ថ្ងៃទីប្រាំពីរ' + ], +]; diff --git a/addons/webman/lang/cam_dia/activity_content.php b/addons/webman/lang/cam_dia/activity_content.php new file mode 100644 index 0000000..be07e7e --- /dev/null +++ b/addons/webman/lang/cam_dia/activity_content.php @@ -0,0 +1,14 @@ + 'ខ្លឹមសារសកម្មភាព', + 'fields' => [ + 'id' => 'ID', + 'name' => 'ឈ្មោះសកម្មភាព', + 'activity_id' => 'លេខសម្គាល់សកម្មភាព', + 'lang' => 'កំណត់អត្តសញ្ញាណភាសា', + 'picture' => 'រូបភាពសំខាន់នៃសកម្មភាព', + 'created_at' => 'ពេលវេលាបង្កើត', + ] +]; diff --git a/addons/webman/lang/cam_dia/admin.php b/addons/webman/lang/cam_dia/admin.php new file mode 100644 index 0000000..7c9bdc3 --- /dev/null +++ b/addons/webman/lang/cam_dia/admin.php @@ -0,0 +1,50 @@ + 'ព័ត៌មានផ្ទាល់ខ្លួន', + 'system_user' => 'អ្នកប្រើប្រាស់ប្រព័ន្ធ', + 'not_access_permission' => 'គ្មានការអនុញ្ញាតឱ្យចូលដំណើរការប្រតិបត្តិការនេះទេ', + 'super_admin' => 'អ្នកគ្រប់គ្រងជាន់ខ្ពស់', + 'super_admin_delete' => 'អ្នកគ្រប់គ្រងជាន់ខ្ពស់មិនអាចលុបបានទេ!', + 'super_admin_disabled' => 'អ្នកគ្រប់គ្រងជាន់ខ្ពស់មិនអាចបិទបានទេ!', + 'reset_password' => 'កំណត់ពាក្យសម្ងាត់ឡើងវិញ', + 'old_password' => 'ពាក្យសម្ងាត់ចាស់', + 'old_password_error' => 'ពាក្យសម្ងាត់ចាស់ខុស', + 'new_password' => 'ពាក្យសម្ងាត់ថ្មី', + 'confim_password' => 'បញ្ជាក់ពាក្យសម្ងាត់', + 'access_rights' => 'សិទ្ធិចូលប្រើ', + 'normal' => 'ធម្មតា', + 'disable' => 'បិទ', + 'true' => 'បាទ', + 'false' => 'ទេ', + 'username_exist' => 'ឈ្មោះអ្នកប្រើប្រាស់ស្ទួនមាន', + 'phone_exist' => 'លេខទូរស័ព្ទមានរួចហើយ', + 'password_min_number' => 'ពាក្យសម្ងាត់ត្រូវតែមានយ៉ាងហោចណាស់ 6 ខ្ទង់', + 'password_confim_validate' => 'ពាក្យ​សម្ងាត់​បញ្ចូល​មិន​ស៊ីសង្វាក់គ្នា', + 'update_password' => 'ប្តូរពាក្យសម្ងាត់', + 'open' => 'បើក', + 'close' => 'បិទ', + 'department' => 'នាយកដ្ឋាន', + 'channel' => 'ឆានែល', + 'department_tree' => 'នាយកដ្ឋានកណ្តាល', + 'channel_tree' => 'ប៉ុស្តិ៍រង', + 'pass_help' => 'ពាក្យសម្ងាត់ចាប់ផ្តើម 123456 វាត្រូវបានណែនាំថាពាក្យសម្ងាត់មានអក្សរធំ និងអក្សរតូច លេខ និងនិមិត្តសញ្ញា', + 'search_department' => 'នាយកដ្ឋានស្វែងរក', + 'post' => 'ប្រកាស', + 'admin_user' => 'អ្នកគ្រប់គ្រង', + 'success' => 'ជោគជ័យ', + 'error' => 'បរាជ័យ', + 'system_messages' => 'សារប្រព័ន្ធ', + 'fields' => [ + 'username' => 'ឈ្មោះអ្នកប្រើប្រាស់', + 'nickname' => 'ឈ្មោះហៅក្រៅអ្នកប្រើប្រាស់', + 'avatar' => 'រូបតំណាងអ្នកប្រើប្រាស់', + 'password' => 'ពាក្យសម្ងាត់', + 'phone' => 'លេខទូរស័ព្ទ', + 'mail' => 'ប្រអប់សំបុត្រ', + 'status' => 'ស្ថានភាពគណនី', + 'create_at' => 'ពេលវេលាបង្កើត', + 'type' => 'ប្រភេទ', + 'is_super' => 'ការគ្រប់គ្រងឆានែល', + ], +]; diff --git a/addons/webman/lang/cam_dia/announcement.php b/addons/webman/lang/cam_dia/announcement.php new file mode 100644 index 0000000..22a2586 --- /dev/null +++ b/addons/webman/lang/cam_dia/announcement.php @@ -0,0 +1,36 @@ + 'ការគ្រប់គ្រងការប្រកាស', + 'fields' => [ + 'id' => 'ID', + 'title' => 'ចំណងជើង', + 'content' => 'មាតិកា', + 'valid_time' => 'ពេលវេលាត្រឹមត្រូវ', + 'push_time' => 'ម៉ោងផ្សាយ', + 'status' => 'ស្ថានភាព', + 'department_id' => 'ឆានែល', + 'sort' => 'តម្រៀប', + 'priority' => 'អាទិភាព', + 'admin_id' => 'លេខសម្គាល់អ្នកគ្រប់គ្រង', + 'admin_name' => 'ឈ្មោះអ្នកគ្រប់គ្រង', + 'created_at' => 'ពេលវេលាបង្កើត', + 'type' => 'ប្រភេទប្រកាស', + ], + 'priority' => [ + Announcement::PRIORITY_ORDINARY => 'ធម្មតា', + Announcement::PRIORITY_SENIOR => 'កម្រិតខ្ពស់', + Announcement::PRIORITY_EMERGENT => 'គ្រាអាសន្ន', + ], + 'type' => [ + Announcement::TYPE_BULLETIN => 'សេចក្តីប្រកាសនៃព្រឹត្តិបត្រ', + Announcement::TYPE_EVEBT => 'ព្រឹត្តិការណ៍ព្រឹត្តិការណ៍', + ], + 'help' => [ + 'valid_time' => 'ប្រសិនបើទុកឲ្យទទេ វានឹងមានសុពលភាពជាអចិន្ត្រៃយ៍', + 'push_time' => 'ការប្រកាសនេះនឹងមិនត្រូវបានបង្ហាញដល់អតិថិជនរហូតដល់ក្រោយពេលចេញផ្សាយ', + 'title' => 'ចំណងជើងប្រកាសអាចមានរហូតដល់ 200 ពាក្យ', + ] +]; diff --git a/addons/webman/lang/cam_dia/antd.php b/addons/webman/lang/cam_dia/antd.php new file mode 100644 index 0000000..9c14bba --- /dev/null +++ b/addons/webman/lang/cam_dia/antd.php @@ -0,0 +1,391 @@ + "zh-cn", + "Pagination" => [ + "items_per_page" => "ធាតុ/ទំព័រ", + "jump_to" => "លោតទៅ", + "jump_to_confirm" => "បញ្ជាក់", + "page" => "ទំព័រ", + "prev_page" => "ទំព័រមុន", + "next_page" => "ទំព័របន្ទាប់", + "prev_5" => "5 ទំព័រទៅមុខ", + "next_5" => "ទំព័រ 5 បន្ទាប់", + "prev_3" => "3 ទំព័រទៅមុខ", + "next_3" => "3 ទំព័រត្រឡប់មកវិញ" + ], + "DatePicker" => [ + "lang" => [ + "placeholder" => "សូមជ្រើសរើសកាលបរិច្ឆេទ", + "yearPlaceholder" => "សូមជ្រើសរើសមួយឆ្នាំ", + "quarterPlaceholder" => "សូមជ្រើសរើសមួយភាគបួន", + "monthPlaceholder" => "សូមជ្រើសរើសខែ", + "weekPlaceholder" => "សូមជ្រើសរើសមួយសប្តាហ៍", + "rangePlaceholder" => [ + "កាលបរិច្ឆេទចាប់ផ្តើម", + "កាលបរិច្ឆេទបញ្ចប់" + ], + "rangeYearPlaceholder" => [ + "ឆ្នាំចាប់ផ្តើម", + "ចុងឆ្នាំ" + ], + "rangeMonthPlaceholder" => [ + "ខែចាប់ផ្តើម", + "ចុងខែ" + ], + "rangeWeekPlaceholder" => [ + "សប្តាហ៍ចាប់ផ្តើម", + "ចុងសប្តាហ៍" + ], + "locale" => "zh_CN", + "today" => "ថ្ងៃនេះ", + "now" => "នៅពេលនេះ", + "backToToday" => "ត្រលប់ទៅថ្ងៃនេះ", + "ok" => "យល់ព្រម", + "timeSelect" => "ជ្រើសរើសពេលវេលា", + "dateSelect" => "ជ្រើសរើសកាលបរិច្ឆេទ", + "weekSelect" => "ជ្រើសរើសសប្តាហ៍", + "clear" => "ច្បាស់", + "month" => "ខែ", + "year" => "ឆ្នាំ", + "previousMonth" => "ខែមុន (កូនសោទំព័រឡើង)", + "nextMonth" => "ខែបន្ទាប់ (ប៊ូតុងចុះក្រោមដើម្បីបង្វែរទំព័រ)", + "monthSelect" => "ជ្រើសរើសខែ", + "yearSelect" => "ជ្រើសរើសឆ្នាំ", + "decadeSelect" => "ជ្រើសរើសទសវត្សរ៍", + "yearFormat" => "YYYY year", + "dayFormat" => "ថ្ងៃ D", + "dateFormat" => "M, D, YYYY", + "dateTimeFormat" => "YYYY ឆ្នាំ M ខែ D ថ្ងៃ HH ម៉ោង mm នាទី ss វិនាទី", + "previousYear" => "ឆ្នាំមុន (គ្រាប់ចុចបញ្ជា បូកនឹងគ្រាប់ចុចព្រួញខាងឆ្វេង)", + "nextYear" => "ឆ្នាំក្រោយ (គ្រាប់ចុចបញ្ជា បូកនឹងគ្រាប់ចុចព្រួញស្ដាំ)", + "previousDecade" => "ទសវត្សរ៍មុន", + "nextDecade" => "ជំនាន់ក្រោយ", + "previousCentury" => "សតវត្សមុន", + "nextCentury" => "សតវត្សបន្ទាប់" + ], + "timePickerLocale" => [ + "placeholder" => "សូមជ្រើសរើសពេលវេលា", + "rangePlaceholder" => [ + "ពេលវេលាចាប់ផ្តើម", + "ពេលវេលាបញ្ចប់" + ] + ] + ], + "TimePicker" => [ + "placeholder" => "សូមជ្រើសរើសពេលវេលា", + "rangePlaceholder" => [ + "ពេលវេលាចាប់ផ្តើម", + "ពេលវេលាបញ្ចប់" + ] + ], + "Calendar" => [ + "lang" => [ + "placeholder" => "សូមជ្រើសរើសកាលបរិច្ឆេទ", + "yearPlaceholder" => "សូមជ្រើសរើសមួយឆ្នាំ", + "quarterPlaceholder" => "សូមជ្រើសរើសមួយភាគបួន", + "monthPlaceholder" => "សូមជ្រើសរើសខែ", + "weekPlaceholder" => "សូមជ្រើសរើសមួយសប្តាហ៍", + "rangePlaceholder" => [ + "កាលបរិច្ឆេទចាប់ផ្តើម", + "កាលបរិច្ឆេទបញ្ចប់" + ], + "rangeYearPlaceholder" => [ + "ឆ្នាំចាប់ផ្តើម", + "ចុងឆ្នាំ" + ], + "rangeMonthPlaceholder" => [ + "ខែចាប់ផ្តើម", + "ចុងខែ" + ], + "rangeWeekPlaceholder" => [ + "សប្តាហ៍ចាប់ផ្តើម", + "ចុងសប្តាហ៍" + ], + "locale" => "zh_CN", + "today" => "ថ្ងៃនេះ", + "now" => "នៅពេលនេះ", + "backToToday" => "ត្រលប់ទៅថ្ងៃនេះ", + "ok" => "យល់ព្រម", + "timeSelect" => "ជ្រើសរើសពេលវេលា", + "dateSelect" => "ជ្រើសរើសកាលបរិច្ឆេទ", + "weekSelect" => "ជ្រើសរើសសប្តាហ៍", + "clear" => "ច្បាស់", + "month" => "ខែ", + "year" => "ឆ្នាំ", + "previousMonth" => "ខែមុន (កូនសោទំព័រឡើង)", + "nextMonth" => "ខែបន្ទាប់ (ប៊ូតុងចុះក្រោមដើម្បីបង្វែរទំព័រ)", + "monthSelect" => "ជ្រើសរើសខែ", + "yearSelect" => "ជ្រើសរើសឆ្នាំ", + "decadeSelect" => "ជ្រើសរើសទសវត្សរ៍", + "yearFormat" => "YYYY year", + "dayFormat" => "ថ្ងៃ D", + "dateFormat" => "M, D, YYYY", + "dateTimeFormat" => "YYYY ឆ្នាំ M ខែ D ថ្ងៃ HH ម៉ោង mm នាទី ss វិនាទី", + "previousYear" => "ឆ្នាំមុន (គ្រាប់ចុចបញ្ជា បូកនឹងគ្រាប់ចុចព្រួញខាងឆ្វេង)", + "nextYear" => "ឆ្នាំក្រោយ (គ្រាប់ចុចបញ្ជា បូកនឹងគ្រាប់ចុចព្រួញស្ដាំ)", + "previousDecade" => "ទសវត្សរ៍មុន", + "nextDecade" => "ជំនាន់ក្រោយ", + "previousCentury" => "សតវត្សមុន", + "nextCentury" => "សតវត្សបន្ទាប់" + ], + "timePickerLocale" => [ + "placeholder" => "សូមជ្រើសរើសពេលវេលា", + "rangePlaceholder" => [ + "ពេលវេលាចាប់ផ្តើម", + "ពេលវេលាបញ្ចប់" + ] + ] + ], + "global" => [ + "placeholder" => "សូមជ្រើសរើស" + ], + "Table" => [ + "filterTitle" => "តម្រង", + "filterConfirm" => "បញ្ជាក់", + "filterReset" => "កំណត់ឡើងវិញ", + "filterEmptyText" => "គ្មានធាតុតម្រង", + "selectAll" => "ជ្រើសរើសទាំងអស់នៅលើទំព័រនេះ", + "selectInvert" => "បញ្ច្រាសទំព័របច្ចុប្បន្ន", + "selectNone" => "ជម្រះទាំងអស់", + "selectionAll" => "ជ្រើសរើសទាំងអស់", + "sortTitle" => "តម្រៀប", + "expand" => "ពង្រីកជួរ", + "collapse" => "បិទជួរដេក", + "triggerDesc" => "ចុចដើម្បីបញ្ជាចុះក្រោម", + "triggerAsc" => "ចុចដើម្បីឡើង", + "cancelSort" => "បោះបង់ការតម្រៀប" + ], + "Modal" => [ + "okText" => "យល់ព្រម", + "cancelText" => "បោះបង់", + "justOkText" => "យល់ហើយ" + ], + "Popconfirm" => [ + "cancelText" => "បោះបង់", + "okText" => "យល់ព្រម" + ], + "Transfer" => [ + "searchPlaceholder" => "សូមបញ្ចូលមាតិកាស្វែងរក", + "itemUnit" => "ធាតុ", + "itemsUnit" => "ធាតុ", + "remove" => "លុប", + "selectCurrent" => "ជ្រើសរើសទំព័របច្ចុប្បន្នទាំងអស់", + "removeCurrent" => "លុបទំព័របច្ចុប្បន្ន", + "selectAll" => "ជ្រើសរើសទាំងអស់", + "removeAll" => "យកចេញទាំងអស់", + "selectInvert" => "បង្វែរទំព័របច្ចុប្បន្ន" + ], + "Upload" => [ + "uploading" => "ការផ្ទុកឯកសារ", + "removeFile" => "លុបឯកសារ", + "uploadError" => "កំហុសក្នុងការបង្ហោះ", + "previewFile" => "មើលឯកសារ", + "downloadFile" => "ទាញយកឯកសារ" + ], + "Empty" => [ + "description" => "មិនទាន់មានទិន្នន័យ" + ], + "Icon" => [ + "icon" => "រូបតំណាង" + ], + "Text" => [ + "edit" => "កែសម្រួល", + "copy" => "ចម្លង", + "copied" => "ចម្លងដោយជោគជ័យ", + "expand" => "ពង្រីក" + ], + "PageHeader" => [ + "back" => "ត្រឡប់" + ], + "Form" => [ + "optional" => "(ស្រេចចិត្ត)", + "defaultValidateMessages" => [ + "default" => "កំហុសក្នុងការផ្ទៀងផ្ទាត់វាល $[label]", + "required" => "សូមបញ្ចូល $[label]", + "enum" => "$[label] ត្រូវតែជាផ្នែកមួយនៃ [$[enum]]", + "whitespace" => "$[label] មិនអាចជាតួអក្សរទទេបានទេ", + "date" => [ + "format" => "$[label] date format is invalid", + "parse" => "$[label] មិនអាចបំប្លែងទៅជាកាលបរិច្ឆេទបានទេ", + "invalid" => "$[label] គឺជាកាលបរិច្ឆេទមិនត្រឹមត្រូវ" + ], + "types" => [ + "string" => "$[label] មិនមែនជា $[type] ត្រឹមត្រូវទេ", + "method" => "$[label] មិនមែនជា $[type] ត្រឹមត្រូវទេ", + "array" => "$[label] មិនមែនជា $[type] ត្រឹមត្រូវទេ", + "object" => "$[label] មិនមែនជា $[type] ត្រឹមត្រូវទេ", + "number" => "$[label] មិនមែនជា $[type] ត្រឹមត្រូវទេ", + "date" => "$[label] មិនមែនជា $[type] ត្រឹមត្រូវទេ", + "boolean" => "$[label] មិនមែនជា $[type] ត្រឹមត្រូវទេ", + "integer" => "$[label] មិនមែនជា $[type] ត្រឹមត្រូវទេ", + "float" => "$[label] មិនមែនជា $[type] ត្រឹមត្រូវទេ", + "regexp" => "$[label] មិនមែនជា $[type] ត្រឹមត្រូវទេ", + "email" => "$[label] មិនមែនជា $[type] ត្រឹមត្រូវទេ", + "url" => "$[label] មិនមែនជា $[type] ត្រឹមត្រូវទេ", + "hex" => "$[label] មិនមែនជា $[type] ត្រឹមត្រូវទេ" + ], + "string" => [ + "len" => "$[label] ត្រូវតែជាតួអក្សរ $[len]", + "min" => "$[label]យ៉ាងហោចណាស់ $[min] តួអក្សរ", + "max" => "$[label] គឺច្រើនបំផុត $[max] តួអក្សរ", + "range" => "$[label] ត្រូវតែស្ថិតនៅចន្លោះតួអក្សរ $[min]-$[max]" + ], + "number" => [ + "len" => "$[label] ត្រូវតែស្មើ $[len]", + "min" => "តម្លៃអប្បបរមានៃ $[label] គឺ $[min]", + "max" => "តម្លៃអតិបរមានៃ $[label] គឺ $[max]", + "range" => "$[label] ត្រូវតែនៅចន្លោះ $[min]-$[max]" + ], + "array" => [ + "len" => "ត្រូវតែ $[len]$[label]", + "min" => "យ៉ាងហោចណាស់ $[min]$[label]", + "max" => "ច្រើនបំផុត $[max]$[label]", + "range" => "បរិមាណនៃ $[label] ត្រូវតែនៅចន្លោះ $[min]-$[max]" + ], + "pattern" => [ + "mismatch" => "$[label] មិនត្រូវគ្នានឹងលំនាំ $[pattern]" + ] + ] + ], + "Image" => [ + "preview" => "មើលជាមុន" + ], + 'FormMany' => [ + 'up' => 'ឡើងលើ', + 'down' => 'ផ្លាស់ទីចុះក្រោម', + 'add' => 'បន្ថែម', + 'remove' => 'យកចេញ', + 'clear' => 'ច្បាស់', + ], + 'TabsTag' => [ + 'closeOther' => 'បិទផ្សេងទៀត', + 'closeLeft' => 'បិទ​ឆ្វេង', + 'closeRight' => 'បិទខាងស្តាំ', + 'back' => 'ត្រឡប់ទៅទំព័រមុន', + ], + 'Uploader' => [ + 'finder' => 'ធនធាន', + 'upload' => 'ផ្ទុកឡើង', + 'success' => 'ផ្ទុកឡើងដោយជោគជ័យ', + 'error' => 'កំហុសមិនស្គាល់', + 'check' => 'ផ្ទៀងផ្ទាត់', + 'uploading' => 'កំពុងផ្ទុកឡើង', + ], + 'Grid' => [ + 'confirmRecoverySelected' => 'ប្រតិបត្តិការនេះនឹងស្ដារទិន្នន័យដែលបានជ្រើសរើសឡើងវិញទេ? ', + 'confirmClearSelected' => 'ប្រតិបត្តិការនេះនឹងលុបទិន្នន័យដែលបានជ្រើសរើសឬ? ', + 'confirmClear' => 'ប្រតិបត្តិការនេះនឹងលុប និងសម្អាតទិន្នន័យទាំងអស់? ', + 'continue' => 'បន្ត?', + 'empty' => 'មិនទាន់មានទិន្នន័យទេ', + 'search' => 'ស្វែងរក', + 'quickSearchText' => 'សូមបញ្ចូលពាក្យគន្លឹះ', + 'export' => 'នាំចេញ', + 'exportPage' => 'នាំចេញទំព័របច្ចុប្បន្ន', + 'exportSelect' => 'នាំចេញជួរដែលបានជ្រើសរើស', + 'exportAll' => 'នាំចេញទាំងអស់', + 'exportProgress' => 'វឌ្ឍនភាពនាំចេញ', + 'exportFail' => 'ការនាំចេញបរាជ័យ', + 'exportSuccess' => 'នាំចេញដោយជោគជ័យ សូមចុច', + 'download' => 'ទាញយក', + 'sortTop' => 'កំពូល', + 'sortBottom' => 'កំណត់ទៅបាត', + 'sortDrag' => 'ការតម្រៀបអូស', + 'confirm' => 'យល់ព្រម', + 'reset' => 'កំណត់ឡើងវិញ', + 'dataList' => 'បញ្ជីទិន្នន័យ', + 'recycle' => 'ធុងសំរាមកែច្នៃ', + 'collapseFilter' => 'បង្រួមតម្រង', + 'expandFilter' => 'ពង្រីកតម្រង', + 'clearTrash' => 'លុបធុងសំរាមចោល', + 'clearData' => 'ជម្រះទិន្នន័យ', + 'restoreSelected' => 'ស្ដារ​បាន​ជ្រើសរើស', + 'deleteSelected' => 'លុបបានជ្រើសរើស', + 'selectedAction' => 'សូមពិនិត្យទិន្នន័យប្រតិបត្តិការ', + ], + 'SelectTable' => [ + 'select' => 'ជ្រើសរើស', + 'selected' => 'បានជ្រើសរើស', + 'confirm' => 'យល់ព្រម', + 'cancel' => 'បោះបង់', + ], + 'Confirm' => [ + 'title' => 'ប្រអប់បញ្ចូល' + ], + 'Copy' => [ + 'success' => 'ចម្លងដោយជោគជ័យ', + 'error' => 'ចម្លងបានបរាជ័យ', + ], + 'Logout' => [ + 'title' => 'ចេញ', + 'content' => 'តើអ្នកប្រាកដក្នុងការចាកចេញពីប្រព័ន្ធមែនទេ?', + ], + 'Header' => [ + 'refresh' => 'ធ្វើឱ្យស្រស់', + 'light' => 'ងងឹត', + 'dark' => 'ពណ៌ភ្លឺ', + ], + 'Setting' => [ + 'lang' => 'ភាសា', + 'theme_color' => 'ពណ៌ស្បែក', + 'sidebar_color' => 'របារចំហៀងជ្រើសរើសពណ៌', + 'sidebar_background' => 'ពណ៌ផ្ទៃខាងក្រោយរបារចំហៀង', + 'header_background' => 'ពណ៌ផ្ទៃខាងក្រោយកំពូល', + 'layout' => 'ប្លង់', + 'menu_layout' => 'ប្លង់ម៉ឺនុយ', + 'menu_style' => 'រចនាប័ទ្មម៉ឺនុយ', + 'sidebar' => [ + 'label' => 'របារចំហៀង', + 'width' => 'ទទឹង', + 'visible' => 'បង្ហាញ', + 'collapsed' => 'ដួលរលំ', + 'menu_num' => 'ចំនួនម៉ឺនុយនៅជាប់គ្នា', + ], + 'tabs' => 'ផ្ទាំងច្រើន', + 'light' => 'ពណ៌ភ្លឺ', + 'dark' => 'ងងឹត', + 'sider' => 'ចំហៀង', + 'header_sider' => 'ផ្នែកខាងលើ', + 'header' => 'កំពូល', + 'defualt' => 'ស្តារការកំណត់លំនាំដើមឡើងវិញ', + + ], + 'Sidebar' => [ + 'all' => 'ទាំងអស់' + ], + 'Dayjs' => [ + 'weekdays' => explode('_', "ថ្ងៃអាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍"), + 'weekdaysShort' => explode('_', "ថ្ងៃអាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍"), + 'weekdaysMin' => explode('_', "ថ្ងៃអាទិត្យ_ច័ន្ទ_អង្គារ_ពុធ_ព្រហស្បតិ៍_សុក្រ_សៅរ៍"), + 'months' => explode('_', "មករា កុម្ភៈ មីនា មេសា ឧសភា មិថុនា កក្កដា សីហា កញ្ញា កញ្ញា តុលា វិច្ឆិកា ធ្នូ"), + 'monthsShort' => explode('_', "មករា កុម្ភៈ មីនា មេសា ឧសភា មិថុនា កក្កដា សីហា កញ្ញា កញ្ញា តុលា វិច្ឆិកា ធ្នូ"), + 'weekStart' => 1, + 'yearStart' => 4, + 'formats' => [ + 'LT' => "HH=>mm", + 'LTS' => "HH=>mm=>ss", + 'L' => "YYYY/MM/DD", + 'LL' => "YYYY ឆ្នាំ M ខែ D ថ្ងៃ", + 'LLL' => "Ah point mm នាទីនៅ M ខែ D ថ្ងៃ YYYY ឆ្នាំ", + 'LLLL' => "YYYY ឆ្នាំ M ខែ D ថ្ងៃ ddddAh ចំណុច mm នាទី", + 'l' => "YYYY/M/D", + 'll' => "M, D, YYYY", + 'lll' => "YYYYឆ្នាំMខែDថ្ងៃHH=>mm", + 'llll' => "YYYYឆ្នាំMខែDថ្ងៃdddd HH=>mm" + ], + 'relativeTime' => [ + 'future' => "ក្នុង %s", + 'past' => "%s មុន", + 's' => "ពីរបីវិនាទី", + 'm' => "1 នាទី", + 'mm' => "%d នាទី", + 'h' => "1 ម៉ោង", + 'hh' => "%d ម៉ោង", + 'd' => "1 ថ្ងៃ", + 'dd' => "%d ថ្ងៃ", + 'M' => "1 ខែ", + 'MM' => "%d ខែ", + 'y' => "1 ឆ្នាំ", + 'yy' => "%d ឆ្នាំ" + ] + ], +]; diff --git a/addons/webman/lang/cam_dia/app_version.php b/addons/webman/lang/cam_dia/app_version.php new file mode 100644 index 0000000..6d6c9ae --- /dev/null +++ b/addons/webman/lang/cam_dia/app_version.php @@ -0,0 +1,32 @@ + 'ការគ្រប់គ្រងកំណែ', + 'fields' => [ + 'id' => 'ID', + 'system_key' => 'ការកំណត់អត្តសញ្ញាណប្រព័ន្ធ', + 'app_version' => 'លេខកំណែ', + 'app_version_key' => 'ការកំណត់អត្តសញ្ញាណកំណែ', + 'apk_url' => 'អាសយដ្ឋានកញ្ចប់ដំឡើង', + 'force_update' => 'បង្ខំឱ្យអាប់ដេត', + 'type' => 'ប្រភេទ', + 'hot_update' => 'អាប់ដេតក្តៅ', + 'regular_update' => 'ការធ្វើបច្ចុប្បន្នភាពជាប្រចាំ', + 'update_content' => 'ធ្វើបច្ចុប្បន្នភាពមាតិកា', + 'notes' => 'កំណត់ត្រាប្រតិបត្តិការ', + 'status' => 'ស្ថានភាព', + 'created_at' => 'ពេលវេលាបង្កើត', + ], + 'system_key' => [ + 'android' => 'Android', + 'ios' => 'Ios(Apple)', + ], + 'app_version_regex' => 'សូមបំពេញលេខកំណែដែលត្រឹមត្រូវ', + 'hot_apk_url' => 'កញ្ចប់អាប់ដេតក្តៅ', + 'missing_package_address' => 'បាត់អាសយដ្ឋានកញ្ចប់ដំឡើង', + 'app_version_key_not_found' => 'បាត់អត្តសញ្ញាណកំណែ', + 'upload_update_package' => 'សូមបង្ហោះកញ្ចប់អាប់ដេតក្តៅ', + 'hot_apk_url_error' => 'បញ្ហាអាសយដ្ឋានកញ្ចប់អាប់ដេតក្តៅ', + 'decompression_failed' => 'ការបង្ហាប់បានបរាជ័យ', + 'app_version_key_exists' => 'កំណែនេះត្រូវបានចេញផ្សាយ', +]; diff --git a/addons/webman/lang/cam_dia/attachment.php b/addons/webman/lang/cam_dia/attachment.php new file mode 100644 index 0000000..c8c8a2d --- /dev/null +++ b/addons/webman/lang/cam_dia/attachment.php @@ -0,0 +1,16 @@ + 'ការគ្រប់គ្រងឯកសារភ្ជាប់', + 'download' => 'ទាញយក', + 'cate' => [ + 'fields' => [ + 'name' => 'ឈ្មោះប្រភេទ', + 'pid' => 'ការចាត់ថ្នាក់ខ្ពស់', + 'permission_type' => 'ប្រភេទការអនុញ្ញាត', + 'sort' => 'តម្រៀប', + ], + 'parent' => 'ប្រភេទកំពូល', + 'public' => 'គ្រប់គ្នា', + 'private' => 'ឯកជន', + ], +]; diff --git a/addons/webman/lang/cam_dia/auth.php b/addons/webman/lang/cam_dia/auth.php new file mode 100644 index 0000000..c7dc712 --- /dev/null +++ b/addons/webman/lang/cam_dia/auth.php @@ -0,0 +1,43 @@ + 'ការគ្រប់គ្រងសិទ្ធិចូលប្រើ', + 'parent' => 'ឪពុកម្តាយ', + 'field_title_grant' => 'ការអនុញ្ញាតលើវាល (លាក់វាលដែលបានជ្រើសរើស)', + 'field_grant' => 'ការអនុញ្ញាតលើវាល', + 'data_grant' => 'ការអនុញ្ញាតទិន្នន័យ', + 'auth_grant' => 'ការអនុញ្ញាតមុខងារ', + 'menu_grant' => 'ការអនុញ្ញាតម៉ឺនុយ', + 'select_user' => 'ជ្រើសរើសមនុស្សម្នាក់', + 'select_group' => 'ជ្រើសរើសអង្គការ', + 'select_user_tip' => 'មានសិទ្ធិមើលទិន្នន័យរួមទាំងអ្នកដែលបានជ្រើសរើស', + 'select_group_tip' => 'មានសិទ្ធិមើលទិន្នន័យដែលមានអង្គការដែលបានជ្រើសរើស', + 'all' => 'ជ្រើសរើសទាំងអស់', + 'father_son_linkage' => 'ទំនាក់ទំនងឪពុក និងកូន', + 'role_type_error' => 'កំហុសប្រភេទតួនាទី', + 'fields' => [ + 'name' => 'ឈ្មោះ', + 'desc' => 'ការពិពណ៌នា', + 'status' => 'ស្ថានភាព', + 'sort' => 'តម្រៀប', + 'data_type' => 'ជួរទិន្នន័យ', + 'department' => 'បញ្ជីនាយកដ្ឋាន', + 'type' => 'ប្រភេទតួនាទី', + ], + 'options' => [ + 'data_type' => [ + 'full_data_rights' => 'សិទ្ធិទិន្នន័យពេញលេញ', + 'data_permissions_for_this_department' => 'ការអនុញ្ញាតទិន្នន័យសម្រាប់នាយកដ្ឋាននេះ', + 'this_department_and_the_following_data_permissions' => 'នាយកដ្ឋាននេះ និងការអនុញ្ញាតទិន្នន័យខាងក្រោម', + 'personal_data_rights' => 'សិទ្ធិទិន្នន័យផ្ទាល់ខ្លួន', + 'custom_data_permissions' => 'ការអនុញ្ញាតទិន្នន័យផ្ទាល់ខ្លួន', + 'channel_and_the_following_data_permissions' => 'ការអនុញ្ញាតទិន្នន័យទាំងអស់សម្រាប់ស្ថានីយរង' + ] + ], + 'type' => [ + AdminDepartment::TYPE_DEPARTMENT => 'តួនាទីស្ថានីយ', + AdminDepartment::TYPE_CHANNEL => 'តួនាទីឆានែល', + ], +]; diff --git a/addons/webman/lang/cam_dia/channel.php b/addons/webman/lang/cam_dia/channel.php new file mode 100644 index 0000000..05eb637 --- /dev/null +++ b/addons/webman/lang/cam_dia/channel.php @@ -0,0 +1,44 @@ + 'ការគ្រប់គ្រងឆានែល', + 'normal' => 'បើក', + 'disable' => 'កំពុង​ថែទាំ', + 'name_exist' => 'ឈ្មោះឆានែលស្ទួនមាន', + 'channel_exist' => 'ឈ្មោះដែនឆានែលស្ទួនមាន', + 'telegram_url_exist' => 'សេវាអតិថិជនរបស់ប៉ុស្តិ៍ Telegram មានរួចហើយ', + 'package_url_exist' => 'អាសយដ្ឋានដំឡើងឆានែលមានរួចហើយ', + 'save_error' => 'រក្សាទុកបានបរាជ័យ', + 'save_success' => 'រក្សាទុកដោយជោគជ័យ', + 'not_fount' => 'មិនមានឆានែលទេ', + 'fields' => [ + 'id' => 'លេខសម្គាល់ឆានែល', + 'name' => 'ឈ្មោះឆានែល', + 'domain' => 'ឈ្មោះដែនឆានែល', + 'player_num' => 'ចំនួនអ្នកលេង', + 'coin_num' => 'ចំនួនអ្នកជំនួញកាក់', + 'lang' => 'ភាសាលំនាំដើម', + 'currency' => 'រូបិយប័ណ្ណ', + 'department_id' => 'លេខសម្គាល់នាយកដ្ឋាន', + 'status' => 'ស្ថានភាព', + 'telegram_url' => 'សេវាអតិថិជន Telegram', + 'package_url' => 'អាសយដ្ឋានកញ្ចប់ដំឡើង', + 'recharge_amount' => 'បញ្ចូលទឹកប្រាក់ជាផ្លូវការ', + 'withdraw_amount' => 'ការដកប្រាក់ជាផ្លូវការ', + 'third_recharge_amount' => 'បញ្ចូលទឹកប្រាក់ភាគីទីបី', + 'third_withdraw_amount' => 'ការដកភាគីទីបី', + 'player_total_amount' => 'សមតុល្យគណនីអ្នកលេងសរុប', + 'phone' => 'លេខទូរស័ព្ទ', + 'leader' => 'អ្នកទទួលខុសត្រូវ', + 'create_at' => 'ពេលវេលាបង្កើតឆានែល', + 'username' => 'ចូលគណនី', + 'password' => 'ពាក្យសម្ងាត់ចូល', + 'channel_function' => 'អនុគមន៍​ស្ថានីយ', + 'web_login_status' => 'ចូលគេហទំព័រ', + 'recharge_status' => 'ការបញ្ចូលថ្មតាមវេទិកា', + 'withdraw_status' => 'ការដកវេទិកា', + 'wallet_action_status' => 'ប្រតិបត្តិការកាបូបអ្នកលេង', + 'department_name' => 'ឆានែល', + ], + 'channel_function_help' => 'សៀវភៅដៃ (បញ្ចូលទឹកប្រាក់ ដកប្រាក់) មិនអាចប្រើក្នុងពេលតែមួយជាមួយកាក់ Q (ផ្ទេរចូល ផ្ទេរចេញ)' +]; diff --git a/addons/webman/lang/cam_dia/channel_financial_record.php b/addons/webman/lang/cam_dia/channel_financial_record.php new file mode 100644 index 0000000..08cf79e --- /dev/null +++ b/addons/webman/lang/cam_dia/channel_financial_record.php @@ -0,0 +1,32 @@ + 'កំណត់ត្រាប្រតិបត្តិការហិរញ្ញវត្ថុ', + 'content' => 'លេខស៊េរី {setting_id}', + 'fields' => [ + 'id' => 'ID', + 'department_id' => 'លេខសម្គាល់នាយកដ្ឋាន/ឆានែល', + 'player_id' => 'លេខសម្គាល់អ្នកលេង', + 'player' => 'ព័ត៌មានអ្នកលេង', + 'target' => 'តារាងទិន្នន័យ', + 'target_id' => 'លេខសម្គាល់តារាងទិន្នន័យ', + 'action' => 'ឥរិយាបទប្រតិបត្តិការ', + 'tradeno' => 'ប្រតិបត្តិ​ការ​បញ្ជា', + 'user_id' => 'ប្រតិបត្តិការបញ្ជាទិញ', + 'user_name' => 'ប្រតិបត្តិករ', + 'created_at' => 'ពេលវេលាប្រតិបត្តិការ', + ], + 'action' => [ + ChannelFinancialRecord::ACTION_RECHARGE_PASS => 'ការពិនិត្យមើលការបញ្ចូលទឹកប្រាក់បានកន្លងផុតទៅ', + ChannelFinancialRecord::ACTION_RECHARGE_REJECT => 'ការបដិសេធការពិនិត្យមើលឡើងវិញ', + ChannelFinancialRecord::ACTION_WITHDRAW_PASS => 'ការត្រួតពិនិត្យការដកប្រាក់បានកន្លងផុតទៅ', + ChannelFinancialRecord::ACTION_WITHDRAW_REJECT => 'ការបដិសេធការពិនិត្យមើលការដកប្រាក់', + ChannelFinancialRecord::ACTION_WITHDRAW_PAYMENT => 'ការបង់ប្រាក់ពេញលេញ', + ChannelFinancialRecord::ACTION_RECHARGE_SETTING_ADD => 'បន្ថែមគណនីបញ្ចូលទឹកប្រាក់', + ChannelFinancialRecord::ACTION_RECHARGE_SETTING_STOP => 'បិទគណនីបញ្ចូលទឹកប្រាក់', + ChannelFinancialRecord::ACTION_RECHARGE_SETTING_ENABLE => 'បើកគណនីបញ្ចូលទឹកប្រាក់', + ChannelFinancialRecord::ACTION_RECHARGE_SETTING_EDIT => 'កែសម្រួលគណនីបញ្ចូលទឹកប្រាក់', + ], +]; diff --git a/addons/webman/lang/cam_dia/channel_recharge_method.php b/addons/webman/lang/cam_dia/channel_recharge_method.php new file mode 100644 index 0000000..1a04a4f --- /dev/null +++ b/addons/webman/lang/cam_dia/channel_recharge_method.php @@ -0,0 +1,19 @@ + 'បញ្ចូលទឹកប្រាក់ក្នុងការកំណត់រចនាសម្ព័ន្ធគណនី', + 'recharge_setting_info' => 'គណនីប្រមូល', + 'fields' => [ + 'id' => 'ID', + 'method_name' => 'ឈ្មោះវិធីសាស្ត្របញ្ចូលទឹកប្រាក់', + 'currency' => 'រូបិយប័ណ្ណ', + 'name' => 'បញ្ចូលឈ្មោះឡើងវិញ', + 'bank_name' => 'ធនាគារបើកគណនី', + 'sub_bank' => 'សាខា', + 'owner' => 'ឈ្មោះអ្នកប្រើប្រាស់', + 'account' => 'គណនីធនាគារ', + 'user_name' => 'អ្នកបង្កើត', + 'status' => 'ស្ថានភាព', + 'created_at' => 'ពេលវេលាបង្កើត', + ] +]; diff --git a/addons/webman/lang/cam_dia/channel_recharge_setting.php b/addons/webman/lang/cam_dia/channel_recharge_setting.php new file mode 100644 index 0000000..c850afa --- /dev/null +++ b/addons/webman/lang/cam_dia/channel_recharge_setting.php @@ -0,0 +1,47 @@ + 'ការកំណត់រចនាសម្ព័ន្ធវិធីបញ្ចូលទឹកប្រាក់', + 'placeholder_name' => 'សូមបញ្ចូលឈ្មោះបញ្ចូលទឹកប្រាក់', + 'placeholder_method' => 'សូមជ្រើសរើសវិធីសាស្ត្របញ្ចូលទឹកប្រាក់', + 'placeholder_chip_multiple' => 'សូមបញ្ចូលការសរសេរកូដច្រើន', + 'placeholder_coins_num' => 'សូមបញ្ចូលចំនួនកាក់បញ្ចូលទឹកប្រាក់', + 'placeholder_money' => 'សូមបញ្ចូលចំនួនទឹកប្រាក់បញ្ចូលទឹកប្រាក់ឡើងវិញ', + 'recharge_setting_info' => 'បញ្ចូលព័ត៌មានគណនីឡើងវិញ', + 'first_recharge_setting' => 'ការកំណត់បញ្ចូលទឹកប្រាក់ដំបូង', + 'fields' => [ + 'id' => 'ID', + 'department_id' => 'លេខសម្គាល់ផ្នែក/ឆានែល', + 'title' => 'ចំណងជើង', + 'method_name' => 'វិធីសាស្ត្របញ្ចូលទឹកប្រាក់', + 'method_id' => 'លេខសម្គាល់វិធីសាស្រ្តបញ្ចូលទឹកប្រាក់', + 'chip_multiple' => 'កូដច្រើន', + 'coins_num' => 'បរិមាណកាក់', + 'gift_coins' => 'កាក់អំណោយ', + 'money' => 'ចំនួន', + 'type' => 'ប្រភេទបញ្ចូលថ្ម', + 'user_id' => 'លេខសម្គាល់អ្នកគ្រប់គ្រង', + 'user_name' => 'អ្នកបង្កើត', + 'status' => 'ស្ថានភាព', + 'created_at' => 'ពេលវេលាបង្កើត', + ], + 'rul' => [ + 'chip_multiple_required' => 'ត្រូវការលេខកូដច្រើន', + 'chip_multiple_min_0' => 'ការសរសេរកូដច្រើនគឺយ៉ាងហោចណាស់ 0', + 'chip_multiple_max_100000000' => 'ពហុកូដអតិបរមាត្រូវបានកំណត់ទៅ 100 លាន', + 'coins_num_required' => 'ចំនួនកាក់ត្រូវបានទាមទារ', + 'coins_num_min_1' => 'ចំនួនកាក់អប្បបរមាគឺ 1', + 'coins_num_max_100000000' => 'ចំនួនកាក់អតិបរមាត្រូវបានកំណត់ទៅ 100 លាន', + 'gift_coins_min_1' => 'ចំនួនកាក់អប្បបរមាគឺ 1', + 'gift_coins_max_100000000' => 'ចំនួនអតិបរមានៃកាក់អំណោយត្រូវបានកំណត់ទៅ 100 លាន', + 'money_required' => 'តម្រូវឱ្យបញ្ចូលទឹកប្រាក់បន្ថែម', + 'money_min_1' => 'ចំនួនបញ្ចូលទឹកប្រាក់អប្បបរមាគឺ 1', + 'money_max_100000000' => 'ចំនួនបញ្ចូលទឹកប្រាក់អតិបរមាត្រូវបានកំណត់ទៅ 100 លាន', + ], + 'type' => [ + ChannelRechargeSetting::TYPE_REGULAR => 'បញ្ចូលថ្មធម្មតា', + ChannelRechargeSetting::TYPE_ACTIVITY => 'ការបញ្ចូលទឹកប្រាក់សកម្មភាព', + ] +]; diff --git a/addons/webman/lang/cam_dia/commission_record.php b/addons/webman/lang/cam_dia/commission_record.php new file mode 100644 index 0000000..cac5386 --- /dev/null +++ b/addons/webman/lang/cam_dia/commission_record.php @@ -0,0 +1,24 @@ + 'លេង និងរកកំណត់ត្រា', + 'fields' => [ + 'id' => 'ID', + 'recharge_amount' => 'ចំនួនបញ្ចូលទឹកប្រាក់ដំបូង', + 'total_amount' => 'កម្រៃជើងសារសរុប', + 'damage_amount' => 'ចំនួនការខូចខាតរបស់អតិថិជន', + 'amount' => 'គណៈកម្មការបច្ចុប្បន្ន', + 'ratio' => 'សមាមាត្រគណៈកម្មការ', + 'date' => 'កាលបរិច្ឆេទទូទាត់', + 'create_at' => 'ពេលវេលាបង្កើត', + 'commission_first_recharge' => 'ការបញ្ចូលទឹកប្រាក់ដំបូងរបស់អ្នកប្រើ', + 'commission_damage' => 'សមាមាត្រការខាតបង់របស់អតិថិជន', + 'commission_chip_multiple' => 'ចំនួនកូដច្រើន', + ], + 'player_info' => 'ព័ត៌មានអ្នកលេង', + 'parent_player_info' => 'អ្នកលេងចែករំលែកប្រាក់ចំណេញ', + 'commission_setting' => 'លេង និងរកបានការកំណត់រចនាសម្ព័ន្ធ', + 'commission_first_recharge' => 'អញ្ជើញអ្នកប្រើប្រាស់ថ្មី អ្នកប្រើប្រាស់ថ្មីអាចទទួលបាន {$usd}USD សម្រាប់ការបញ្ចូលទឹកប្រាក់ដំបូងរបស់ពួកគេ', + 'commission_damage' => '{$ratio}% នៃការបាត់បង់អតិថិជនប្រចាំថ្ងៃរបស់អ្នកប្រើប្រាស់ នឹងត្រូវបានផ្តល់ឱ្យអ្នកជាកម្រៃជើងសារ', + 'commission_chip_multiple' => 'កម្រៃជើងសារសម្រាប់ព្រឹត្តិការណ៍គឺដូចគ្នានឹងការបញ្ចូលទឹកប្រាក់ COINS ហើយ {$chip_multiple} ដងនៃចំនួនលេខកូដអាចដកបាន', +]; diff --git a/addons/webman/lang/cam_dia/config.php b/addons/webman/lang/cam_dia/config.php new file mode 100644 index 0000000..353e43c --- /dev/null +++ b/addons/webman/lang/cam_dia/config.php @@ -0,0 +1,9 @@ + 'ការកំណត់រចនាសម្ព័ន្ធ', + 'logo' => 'LOGO គេហទំព័រ', + 'name' => 'ឈ្មោះគេហទំព័រ', + 'miitbeian' => 'លេខចុះឈ្មោះគេហទំព័រ', + 'copyright' => 'ព័ត៌មានរក្សាសិទ្ធិគេហទំព័រ', +]; diff --git a/addons/webman/lang/cam_dia/currency.php b/addons/webman/lang/cam_dia/currency.php new file mode 100644 index 0000000..e8a5ff1 --- /dev/null +++ b/addons/webman/lang/cam_dia/currency.php @@ -0,0 +1,24 @@ + 'ការគ្រប់គ្រងរូបិយប័ណ្ណ', + 'normal' => 'ធម្មតា', + 'disable' => 'បិទ', + 'currency' => 'រូបិយប័ណ្ណ', + 'game_coins' => 'ពិន្ទុហ្គេម', + 'currency_has_exists' => 'រូបិយប័ណ្ណនេះមានការកំណត់រចនាសម្ព័ន្ធរួចហើយ', + 'fields' => [ + 'id' => 'លេខសម្គាល់រូបិយប័ណ្ណ', + 'name' => 'ឈ្មោះរូបិយប័ណ្ណ', + 'identifying' => 'ការកំណត់អត្តសញ្ញាណរូបិយប័ណ្ណ', + 'ratio' => '1 តម្លៃរូបិយប័ណ្ណ', + 'status' => 'ស្ថានភាព', + 'create_at' => 'ពេលវេលាបង្កើត', + ], + 'currency_name' => [ + 'CYN' => 'រ៉ែនមីនប៊ី', + 'TWD' => 'ដុល្លារតៃវ៉ាន់ថ្មី', + 'USD' => 'USD', + 'JPY' => 'ប្រាក់យ៉េនជប៉ុន', + ], +]; diff --git a/addons/webman/lang/cam_dia/data_center.php b/addons/webman/lang/cam_dia/data_center.php new file mode 100644 index 0000000..c897b72 --- /dev/null +++ b/addons/webman/lang/cam_dia/data_center.php @@ -0,0 +1,21 @@ + 'បញ្ចូលទឹកប្រាក់សរុប', + 'recharge_activity' => 'ការបញ្ចូលទឹកប្រាក់សកម្មភាព', + 'recharge_regular' => 'បញ្ចូលថ្មធម្មតា', + 'withdraw_all' => 'ការដកប្រាក់សរុប', + 'withdraw_self' => 'ការដកជាផ្លូវការ', + 'withdraw_business' => 'ការផ្ទេរអាជីវកម្មកាក់', + 'today_add_player' => 'សមាជិកថ្មីថ្ងៃនេះ', + 'player_all' => 'សមាជិកសរុប', + 'today_active_player' => 'អ្នកលេងសកម្មថ្ងៃនេះ', + 'mouth_active_player' => 'អ្នកលេងសកម្មក្នុងខែនេះ', + 'recharge_chart' => 'តារាងនិន្នាការបញ្ចូលទឹកប្រាក់', + 'recharge_amount' => 'ចំនួនបញ្ចូលទឹកប្រាក់', + 'withdraw_chart' => 'គំនូសតាងនិន្នាការនៃការដកប្រាក់', + 'withdraw_amount' => 'ដកប្រាក់', + 'player_chart' => 'បន្ថែមអ្នកលេងថ្មី', + 'player_amount' => 'ចំនួនអ្នកលេង', + 'department_id' => 'លេខសម្គាល់ឆានែល', + 'department_name' => 'ឈ្មោះឆានែល', +]; diff --git a/addons/webman/lang/cam_dia/department.php b/addons/webman/lang/cam_dia/department.php new file mode 100644 index 0000000..6e9aaaf --- /dev/null +++ b/addons/webman/lang/cam_dia/department.php @@ -0,0 +1,23 @@ + 'នាយកដ្ឋានគ្រប់គ្រង', + 'normal' => 'ធម្មតា', + 'disable' => 'បិទ', + 'parent_id_repeat' => 'នាយកដ្ឋានជាន់ខ្ពស់មិនអាចជានាយកដ្ឋាននេះបានទេ', + 'fields' => [ + 'pid' => 'នាយកដ្ឋានជាន់ខ្ពស់', + 'name' => 'ឈ្មោះនាយកដ្ឋាន', + 'leader' => 'អ្នកទទួលខុសត្រូវ', + 'mobile' => 'លេខទូរស័ព្ទ', + 'status' => 'ស្ថានភាព', + 'sort' => 'តម្រៀប', + 'create_at' => 'ពេលវេលាបង្កើត', + ], + 'type' => [ + AdminDepartment::TYPE_DEPARTMENT => 'នាយក', + AdminDepartment::TYPE_CHANNEL => 'អ្នកគ្រប់គ្រងប៉ុស្តិ៍', + ], +]; diff --git a/addons/webman/lang/cam_dia/echart.php b/addons/webman/lang/cam_dia/echart.php new file mode 100644 index 0000000..2ea2b8f --- /dev/null +++ b/addons/webman/lang/cam_dia/echart.php @@ -0,0 +1,11 @@ + 'ចំណុច', + 'to' => 'ទៅ', + 'month' => 'ខែ', + 'yesterday' => 'ម្សិលមិញ', + 'today' => 'ថ្ងៃនេះ', + 'this_week' => 'សប្តាហ៍នេះ', + 'this_month' => 'ខែនេះ', + 'this_year' => 'ឆ្នាំនេះ', +]; diff --git a/addons/webman/lang/cam_dia/first_recharge_setting.php b/addons/webman/lang/cam_dia/first_recharge_setting.php new file mode 100644 index 0000000..57d1a36 --- /dev/null +++ b/addons/webman/lang/cam_dia/first_recharge_setting.php @@ -0,0 +1,23 @@ + 'រង្វាន់ដាក់ប្រាក់ដំបូង', + 'fields' => [ + 'model' => 'គំរូការចេញ', + 'type' => 'ប្រភេទរង្វាន់', + 'number' => 'កាក់រង្វាន់', + 'number_percent' => 'ភាគរយរង្វាន់', + 'chip_amount' => 'ការដកលេខកូដច្រើន', + 'add_number' => 'ការបញ្ចូលទឹកប្រាក់បន្ថែម', + ], + 'model' => [ + SystemSetting::FIRST_RECHARGE_MODEL_ONE => 'ការចេញផ្សាយតែមួយដង', + SystemSetting::FIRST_RECHARGE_MODEL_ADD => 'ការចេញបណ្តុំ', + ], + 'type' => [ + SystemSetting::FIRST_RECHARGE_TYPE_VALUE => 'ចំនួនថេរ', + SystemSetting::FIRST_RECHARGE_TYPE_PERCENT => 'ភាគរយ', + ] +]; diff --git a/addons/webman/lang/cam_dia/form.php b/addons/webman/lang/cam_dia/form.php new file mode 100644 index 0000000..f6a43fb --- /dev/null +++ b/addons/webman/lang/cam_dia/form.php @@ -0,0 +1,17 @@ + 'បន្ថែម', + 'edit' => 'កែសម្រួល', + 'please_enter' => 'សូមបញ្ចូល', + 'please_select' => 'សូមជ្រើសរើស', + 'cancel' => 'បោះបង់', + 'submit' => 'បញ្ជូន', + 'reset' => 'កំណត់ឡើងវិញ', + 'complete' => 'ពេញលេញ', + 'pre_step' => 'ជំហាន​មុន', + 'next_step' => 'ជំហានបន្ទាប់', + 'operation_complete' => 'ប្រតិបត្តិការបានបញ្ចប់', + 'resubmit' => 'ដាក់ស្នើឡើងវិញ', + 'save_success' => 'ទិន្នន័យត្រូវបានរក្សាទុកដោយជោគជ័យ', + 'save_fail' => 'ការរក្សាទុកទិន្នន័យបរាជ័យ', +]; diff --git a/addons/webman/lang/cam_dia/game.php b/addons/webman/lang/cam_dia/game.php new file mode 100644 index 0000000..955fb75 --- /dev/null +++ b/addons/webman/lang/cam_dia/game.php @@ -0,0 +1,34 @@ + 'បញ្ជីហ្គេម', + 'fields' => [ + 'id' => 'លេខសម្គាល់ហ្គេម', + 'name' => 'ឈ្មោះហ្គេម', + 'game_code' => 'លេខសម្គាល់ហ្គេម', + 'platform_game_type' => 'ប្រភេទហ្គេម (អ្នកផ្តល់ហ្គេម)', + 'status' => 'ស្ថានភាព', + 'create_at' => 'ពេលវេលាបង្កើត', + 'game_type' => 'ប្រភេទហ្គេម', + 'platform_name' => 'វេទិកាហ្គេម', + 'player_num' => 'ចំនួនអ្នកលេង', + 'is_hot' => 'តើវាក្តៅទេ', + 'is_new' => 'តើវាថ្មីទេ', + 'is_online' => 'តើវាអនឡាញទេ', + ], + 'game_platform' => 'ព័ត៌មានអ្នកផ្គត់ផ្គង់ហ្គេម', + 'app_id' => 'លេខសៀរៀលគណនី៖ {app_id}', + 'app_secret' => 'សោគណនី៖ {app_secret}', + 'domain' => 'អាសយដ្ឋាន API៖ {domain}', + 'admin_url' => 'URL ខាងក្រោយ៖ {admin_url}', + 'admin_user' => 'ឈ្មោះអ្នកប្រើចូលខាងក្រោយ៖ {admin_user}', + 'nu_set' => 'មិនបានកំណត់រចនាសម្ព័ន្ធ', + 'unit' => 'មនុស្ស', + 'game_status' => 'ស្ថានភាពហ្គេម', + 'is_online' => [ + 'មិនអនឡាញ', + 'អនឡាញ' + ] +]; diff --git a/addons/webman/lang/cam_dia/game_platform.php b/addons/webman/lang/cam_dia/game_platform.php new file mode 100644 index 0000000..f261c72 --- /dev/null +++ b/addons/webman/lang/cam_dia/game_platform.php @@ -0,0 +1,17 @@ + 'បញ្ជីហ្គេម', + 'fields' => [ + 'id' => 'លេខសម្គាល់ក្រុមហ៊ុនផលិតហ្គេម', + 'title' => 'ឈ្មោះអ្នកផ្គត់ផ្គង់ហ្គេម', + 'status' => 'ស្ថានភាព', + ], + 'game_platform' => 'ព័ត៌មានអ្នកផ្គត់ផ្គង់ហ្គេម', + 'update_game_list' => 'ធ្វើបច្ចុប្បន្នភាពបញ្ជីហ្គេម', + 'update_game_list_confirm' => 'តើអ្នកប្រាកដថាចង់ធ្វើបច្ចុប្បន្នភាពបញ្ជីក្រុមហ៊ុនផលិតហ្គេមមែនទេ?', + 'action_error' => 'ប្រតិបត្តិការបានបរាជ័យ', + 'action_success' => 'សកម្មភាពជោគជ័យ', + 'enter_game' => 'ចូលសាលហ្គេម', + 'enter_game_confirm' => 'តើអ្នកប្រាកដថាចង់ចូលទៅក្នុងកន្លែងទទួលអ្នកផលិតហ្គេមមែនទេ?', +]; diff --git a/addons/webman/lang/cam_dia/grid.php b/addons/webman/lang/cam_dia/grid.php new file mode 100644 index 0000000..75a0327 --- /dev/null +++ b/addons/webman/lang/cam_dia/grid.php @@ -0,0 +1,22 @@ + 'បញ្ជី', + 'add' => 'បន្ថែម', + 'edit' => 'កែសម្រួល', + 'detail' => 'ព័ត៌មានលម្អិត', + 'delete' => 'លុប', + 'sort' => 'តម្រៀប', + 'action' => 'សកម្មភាព', + 'confim_delete' => 'បញ្ជាក់ការលុប? ', + 'confim_restore' => 'បញ្ជាក់ការងើបឡើងវិញ? ', + 'restore' => 'ស្ដារទិន្នន័យ', + 'update_success' => 'ធ្វើបច្ចុប្បន្នភាពបានជោគជ័យ', + 'delete_success' => 'លុបដោយជោគជ័យ', + 'restore_success' => 'ស្តារឡើងវិញដោយជោគជ័យ', + 'delete_error' => 'លុបបានបរាជ័យ', + 'sort_success' => 'តម្រៀបជោគជ័យ', + 'user_info' => 'ព័ត៌មានអ្នកប្រើប្រាស់', + 'pagination' => [ + 'total' => 'ធាតុសរុប {total}', + ], +]; diff --git a/addons/webman/lang/cam_dia/login.php b/addons/webman/lang/cam_dia/login.php new file mode 100644 index 0000000..e877e62 --- /dev/null +++ b/addons/webman/lang/cam_dia/login.php @@ -0,0 +1,11 @@ + 'គណនីចូលមិនអាចទទេបានទេ', + 'password_not_empty' => 'ពាក្យសម្ងាត់ចូលមិនអាចទទេបានទេ', + 'password_min_length' => 'ពាក្យសម្ងាត់ត្រូវតែមានយ៉ាងហោចណាស់ 5 ខ្ទង់', + 'success' => 'ចូលដោយជោគជ័យ', + 'logout' => 'បាន​ចេញ', + 'error' => 'ពាក្យសម្ងាត់គណនីខុស', + 'captcha_error' => 'កំហុសកូដផ្ទៀងផ្ទាត់', + 'source_not_empty' => 'ប្រភពមិនអាចទទេបានទេ', +]; diff --git a/addons/webman/lang/cam_dia/menu.php b/addons/webman/lang/cam_dia/menu.php new file mode 100644 index 0000000..fd80be6 --- /dev/null +++ b/addons/webman/lang/cam_dia/menu.php @@ -0,0 +1,123 @@ + 'បន្ថែមម៉ឺនុយ', + 'title' => 'ការគ្រប់គ្រងម៉ឺនុយប្រព័ន្ធ', + 'fields' => [ + 'top' => 'ម៉ឺនុយកំពូល', + 'pid' => 'ម៉ឺនុយមុន', + 'name' => 'ឈ្មោះម៉ឺនុយ', + 'url' => 'តំណម៉ឺនុយ', + 'icon' => 'រូបតំណាងម៉ឺនុយ', + 'sort' => 'តម្រៀប', + 'status' => 'ស្ថានភាព', + 'open' => 'ពង្រីកម៉ឺនុយ', + 'super_status' => 'ស្ថានភាពអ្នកគ្រប់គ្រងជាន់ខ្ពស់', + 'type' => 'ប្រភេទម៉ឺនុយ', + ], + 'options' => [ + 'admin_visible' => [ + [1 => 'អេក្រង់'], + [0 => 'លាក់'] + ] + ], + 'type' => [ + AdminDepartment::TYPE_DEPARTMENT => 'ម៉ឺនុយស្ថានីយ', + AdminDepartment::TYPE_CHANNEL => 'ម៉ឺនុយឆានែល', + ], + 'titles' => [ + 'home' => 'ផ្ទះ', + 'system' => 'ប្រព័ន្ធ', + 'system_manage' => 'ការគ្រប់គ្រងប្រព័ន្ធ', + 'config_manage' => 'ការគ្រប់គ្រងការកំណត់រចនាសម្ព័ន្ធ', + 'attachment_manage' => 'ការគ្រប់គ្រងឯកសារភ្ជាប់', + 'permissions_manage' => 'ការគ្រប់គ្រងការអនុញ្ញាត', + 'admin' => 'ការគ្រប់គ្រងអ្នកប្រើប្រាស់', + 'role_manage' => 'ការគ្រប់គ្រងតួនាទី', + 'menu_manage' => 'ការគ្រប់គ្រងម៉ឺនុយ', + 'plug_manage' => 'ការគ្រប់គ្រងកម្មវិធីជំនួយ', + 'department_manage' => 'ផ្នែកគ្រប់គ្រង', + 'post_manage' => 'ការគ្រប់គ្រងប្រៃសណីយ៍', + + 'admin_manage' => 'ផ្នែកខាងក្រោយទូទៅ', + 'data_center' => 'មជ្ឈមណ្ឌលទិន្នន័យ', + + 'user_manage' => 'ការគ្រប់គ្រងអ្នកលេង', + 'user_manage_list' => 'បញ្ជីអ្នកលេង', + 'accounting_change_records' => 'ការកត់ត្រាការផ្លាស់ប្តូរគណនេយ្យ', + + 'financial_data' => 'ទិន្នន័យហិរញ្ញវត្ថុ', + 'recharge_record' => 'កំណត់ត្រាបញ្ចូលថ្ម', + 'withdrawal_records' => 'កំណត់ត្រានៃការដកប្រាក់', + + 'report_center' => 'មជ្ឈមណ្ឌលរបាយការណ៍', + + 'client_manager' => 'ការគ្រប់គ្រងអតិថិជន', + 'rotation_chart_manager' => 'ការគ្រប់គ្រងតារាងបង្វិល', + 'announcement_manager' => 'ការគ្រប់គ្រងការប្រកាស', + 'system_settings' => 'ការកំណត់ប្រព័ន្ធ', + + 'channel_manager' => 'ការគ្រប់គ្រងឆានែល', + 'channel_list' => 'បញ្ជីឆានែល', + 'currency_manager' => 'ការគ្រប់គ្រងរូបិយប័ណ្ណ', + + 'channel_manage' => 'ឆានែលខាងក្រោយ', + 'channel_data_center' => 'មជ្ឈមណ្ឌលទិន្នន័យ', + + 'channel_player_manage' => 'ការគ្រប់គ្រងអ្នកលេង', + 'channel_player_list' => 'បញ្ជីអ្នកលេង', + 'channel_player_accounting_change_records' => 'កំណត់ត្រាការផ្លាស់ប្តូរគណនេយ្យ', + + 'channel_client_manager' => 'ការគ្រប់គ្រងអតិថិជន', + 'channel_rotation_chart_manager' => 'ការគ្រប់គ្រងគំនូសតាងរង្វង់មូល', + 'channel_marquee_manager' => 'ការគ្រប់គ្រង Marquee', + 'channel_announcement_manager' => 'ការគ្រប់គ្រងការប្រកាស', + + 'channel_financial_manager' => 'ការគ្រប់គ្រងហិរញ្ញវត្ថុ', + 'channel_recharge_review' => 'ការពិនិត្យមើលឡើងវិញ', + 'channel_withdrawal_review' => 'ការពិនិត្យការដកប្រាក់', + 'channel_withdrawal_and_payment' => 'ការដកប្រាក់', + 'channel_recharge_record' => 'កំណត់ត្រាបញ្ចូលថ្ម', + 'channel_withdrawal_records' => 'កំណត់ត្រាការដកប្រាក់', + 'channel_recharge_channel_configuration' => 'ការកំណត់រចនាសម្ព័ន្ធឆានែលបញ្ចូលទឹកប្រាក់', + 'channel_financial_operation_records' => 'កំណត់ត្រាប្រតិបត្តិការហិរញ្ញវត្ថុ', + + 'channel_auth_manager' => 'ការគ្រប់គ្រងការអនុញ្ញាត', + 'channel_admin_user_manager' => 'ការគ្រប់គ្រងអ្នកប្រើប្រាស់', + 'channel_post_manager' => 'ការគ្រប់គ្រងប្រកាស', + + 'log_center' => 'មជ្ឈមណ្ឌលកំណត់ហេតុ', + 'player_edit_log' => 'កំណត់ហេតុការកែប្រែទម្រង់អ្នកលេង', + 'player_money_edit_log' => 'កំណត់ហេតុប្រតិបត្តិការកាបូប', + + 'game_manage' => 'ការគ្រប់គ្រងហ្គេម', + 'game_record' => 'កំណត់ត្រាហ្គេម', + 'game_out_in' => 'ការផ្ទេរទិន្នន័យចូល/ចេញហ្គេម', + 'game_list' => 'បញ្ជីហ្គេម', + 'version_manager' => 'ការគ្រប់គ្រងកំណែ', + 'activity_manager' => 'ការគ្រប់គ្រងសកម្មភាព', + 'activity_list' => 'បញ្ជីសកម្មភាព', + 'recharge_manager' => 'ការគ្រប់គ្រងការបញ្ចូលទឹកប្រាក់', + 'recharge_channels' => 'ឆានែលបញ្ចូលថ្ម', + 'play_and_earn' => 'លេង និងរកលុយ', + 'play_and_earn_record' => 'លេង និងរកកំណត់ត្រា', + 'dian' => 'ចំណុច', + // Promotion Management + 'channel_player_promoter' => 'Promotion Management', + 'channel_player_promoter_list' => 'Promoter List', + 'profit_record' => 'របាយការណ៍​ចែករំលែក​ទម្រង់', + 'profit_settlement_record' => 'បំបែក​កំណត់​សម្រាប់​ការ​តម្រៀប​បំផុត', + '游戏类型列表' => 'បញ្ជី​ប្រភេទ​ល្បែង', + //qrcode + '二维码管理' => 'ការ​គ្រប់គ្រង​កូដ QR', + '二维码批次列表' => 'បញ្ជី​បាត់​កូដ QR', + '持码人列表' => 'បញ្ជី​មាន​គ្រប់គ្រង​កូដ', + '广播管理' => 'ការ​គ្រប់គ្រង​ការ​ផ្លាស់ប្ដូរ', + '手动广播管理' => 'ការ​គ្រប់គ្រង​ផ្សាយ​ដោយ​ដៃ​', + '自动广播管理' => 'ការ​គ្រប់គ្រង​ការ​ផ្សាយ​ដោយ​ស្វ័យ​ប្រវត្តិ', + '公告管理' => 'ការ​គ្រប់គ្រង​ការ​ប្រកាស', + '公告列表' => 'បញ្ជី​ការ​ប្រកាស', + ], +]; diff --git a/addons/webman/lang/cam_dia/notice.php b/addons/webman/lang/cam_dia/notice.php new file mode 100644 index 0000000..35ed5d2 --- /dev/null +++ b/addons/webman/lang/cam_dia/notice.php @@ -0,0 +1,14 @@ + [ + Notice::TYPE_EXAMINE_RECHARGE => 'ការជូនដំណឹងអំពីការបញ្ចូលទឹកប្រាក់របស់អ្នកលេងឡើងវិញដែលកំពុងរង់ចាំការពិនិត្យ', + Notice::TYPE_EXAMINE_WITHDRAW => 'ការជូនដំណឹងអំពីការដកកីឡាករដែលរង់ចាំការពិនិត្យឡើងវិញ', + ], + 'content' => [ + Notice::TYPE_EXAMINE_RECHARGE => 'ការបញ្ជាទិញបញ្ចូលទឹកប្រាក់ថ្មីដែលកំពុងរង់ចាំការពិនិត្យឡើងវិញ អ្នកលេង៖ {player_name} បញ្ចូលពិន្ទុហ្គេមឡើងវិញ៖ {coins} ចំនួនទឹកប្រាក់បញ្ចូលទឹកប្រាក់៖ {money}!', + Notice::TYPE_EXAMINE_WITHDRAW => 'ការបញ្ជាទិញដកប្រាក់ថ្មីដែលកំពុងរង់ចាំការពិនិត្យឡើងវិញ អ្នកលេង៖ {player_name} ពិន្ទុហ្គេមដកប្រាក់៖ {coins} ចំនួនដកប្រាក់៖ {money}!', + ], +]; diff --git a/addons/webman/lang/cam_dia/play_game_record.php b/addons/webman/lang/cam_dia/play_game_record.php new file mode 100644 index 0000000..f4907c4 --- /dev/null +++ b/addons/webman/lang/cam_dia/play_game_record.php @@ -0,0 +1,23 @@ + 'កំណត់ត្រាហ្គេមរបស់អ្នកលេង', + 'fields' => [ + 'id' => 'ID', + 'game_code' => 'លេខហ្គេម', + 'bet' => 'ចំនួនភ្នាល់', + 'win' => 'ចំនួនឈ្នះ', + 'reward' => 'ប្រាក់រង្វាន់ (មិនរាប់បញ្ចូលក្នុងការឈ្នះ)', + 'order_no' => 'លេខបញ្ជាទិញ (វេទិកាហ្គេម)', + 'status' => 'ស្ថានភាព', + 'platform_action_at' => 'ពេលវេលាទូទាត់ (វេទិកាហ្គេម)', + 'action_at' => 'ពេលវេលាទូទាត់', + 'create_at' => 'ពេលវេលាបង្កើត', + ], + 'status' => [ + PlayGameRecord::STATUS_UNSETTLED => 'មិនចែកចាយ', + PlayGameRecord::STATUS_SETTLED => 'ប្រាក់ចំណេញត្រូវបានបែងចែក', + ], +]; diff --git a/addons/webman/lang/cam_dia/player.php b/addons/webman/lang/cam_dia/player.php new file mode 100644 index 0000000..18b81c9 --- /dev/null +++ b/addons/webman/lang/cam_dia/player.php @@ -0,0 +1,136 @@ + 'បញ្ជីឈ្មោះអ្នកលេង', + 'details' => 'ព័ត៌មានលំអិតរបស់អ្នកលេង', + 'player' => 'អ្នកលេង', + 'coin_recharge_money' => 'ចំនួនបញ្ចូលទឹកប្រាក់', + 'coin_recharge_coins' => 'បញ្ចូលពិន្ទុ', + 'coin_recharge_title' => 'អ្នកកំពុងបញ្ចូលទឹកប្រាក់ {uuid} សូមបញ្ចូលចំនួនទឹកប្រាក់ទូទាត់ និងពិន្ទុបញ្ចូលទឹកប្រាក់', + 'coin_recharge_error' => 'ការបញ្ចូលលុយរបស់អ្នកចែកបៀបានបរាជ័យ', + 'coin_recharge_success' => 'អ្នកចែកបៀបញ្ចូលលុយបានជោគជ័យ', + 'artificial_recharge_error' => 'ការបញ្ចូលថ្មដោយដៃបានបរាជ័យ', + 'artificial_recharge_success' => 'ការបញ្ចូលថ្មដោយដៃបានជោគជ័យ', + 'artificial_withdrawal_error' => 'ការដកប្រាក់ដោយដៃបានបរាជ័យ', + 'artificial_withdrawal_success' => 'ការដកប្រាក់ដោយដៃបានជោគជ័យ', + 'insufficient_balance' => 'សមតុល្យគណនីមិនគ្រប់គ្រាន់', + 'fields' => [ + 'id' => 'ID', + 'phone' => 'លេខទូរស័ព្ទ (លេខគណនី)', + 'level' => 'កម្រិតអ្នកលេង', + 'name' => 'ឈ្មោះហៅក្រៅរបស់អ្នកប្រើ', + 'currency' => 'រូបិយប័ណ្ណ', + 'email' => 'អ៊ីមែល', + 'line' => 'បន្ទាត់', + 'department_id' => 'ឆានែល', + 'status' => 'ស្ថានភាពគណនី', + 'status_withdraw' => 'មុខងារដកប្រាក់', + 'status_transfer' => 'មុខងារផ្ទេរ', + 'status_open_coins' => 'ផ្តល់ការអនុញ្ញាត', + 'created_at' => 'ពេលវេលាចុះឈ្មោះ', + 'avatar' => 'រូបតំណាងអ្នកលេង', + 'machine_play_num' => 'ចំនួនម៉ាស៊ីនដែលអាចលេងបាន', + 'login_at' => 'ពេលចូលចុងក្រោយ', + 'register_ip' => 'ចុះឈ្មោះ IP', + 'register_domain' => 'ចុះឈ្មោះឈ្មោះដែន', + 'country_code' => 'លេខកូដប្រទេស/តំបន់', + 'player_tag' => 'ស្លាក', + 'uuid' => 'អ្នកលេង UID', + 'type' => 'ប្រភេទអ្នកលេង', + 'player_login_record' => 'ពេលវេលាចូលចុងក្រោយ', + 'play_password' => 'ពាក្យសម្ងាត់ទូទាត់', + 'password' => 'ពាក្យសម្ងាត់ចូល', + 'recommend_code' => 'លេខកូដផ្សព្វផ្សាយ', + 'recommend_promoter_name' => 'អ្នកផ្សព្វផ្សាយ', + 'chip_amount' => 'ចំនួនកូដបច្ចុប្បន្ន', + 'must_chip_amount' => 'ចំនួនលេខកូដគោលដៅ', + ], + 'player_no_change' => 'អ្នកលេងមិនបានផ្លាស់ប្តូរទេ', + 'not_fount' => 'រកមិនឃើញអ្នកលេង', + 'disable' => 'អ្នកលេងនេះត្រូវបានបិទ', + 'change_player_content' => 'ផ្លាស់ប្តូរអ្នកលេងហ្គេម៖ {form} ➜ {to}', + 'player_change_success' => 'ការផ្លាស់ប្តូរអ្នកលេងបានជោគជ័យ', + 'player_machine_limit' => 'ការផ្លាស់ប្តូរអ្នកលេងបានបរាជ័យ អ្នកលេងនេះអាចលេងបានតែ {machinePlayNum} stations ច្រើនបំផុត ការផ្លាស់ប្តូរដោយជោគជ័យ', + 'password_min_number' => 'ពាក្យសម្ងាត់ត្រូវតែមានយ៉ាងហោចណាស់ 6 ខ្ទង់', + 'password_confim_validate' => 'ពាក្យសម្ងាត់បញ្ចូលមិនស៊ីសង្វាក់គ្នា', + 'update_password' => 'ប្តូរពាក្យសម្ងាត់', + 'reset_password' => 'កំណត់ពាក្យសម្ងាត់ឡើងវិញ', + 'old_password' => 'ពាក្យសម្ងាត់ចាស់', + 'old_password_error' => 'កំហុសពាក្យសម្ងាត់ចាស់', + 'new_password' => 'ពាក្យសម្ងាត់ថ្មី', + 'confim_password' => 'បញ្ជាក់ពាក្យសម្ងាត់', + 'remark_edit_success' => 'ការកត់សម្គាល់បានធ្វើបច្ចុប្បន្នភាពដោយជោគជ័យ', + 'player_info' => 'ព័ត៌មានអ្នកលេង', + 'save_player_info_success' => 'រក្សាទុកដោយជោគជ័យ', + 'add_player' => 'បន្ថែមអ្នកលេង', + 'phone_has_register' => 'លេខទូរស័ព្ទត្រូវបានចុះឈ្មោះ', + 'avatar_type' => 'រូបតំណាង', + 'upload_avatar' => 'បង្ហោះរូបតំណាង', + 'def_avatar' => 'រូបតំណាងលំនាំដើម', + 'action_error' => 'ប្រតិបត្តិការបានបរាជ័យ', + 'action_success' => 'សកម្មភាពជោគជ័យ', + 'phone_exist' => 'លេខទូរស័ព្ទត្រូវបានចុះឈ្មោះ', + 'player_recharge_record' => 'កំណត់ត្រាបញ្ចូលថ្ម', + 'player_withdraw_record' => 'កំណត់ត្រានៃការដកប្រាក់', + 'player_game_record' => 'កំណត់ត្រាហ្គេម', + 'confirm' => [ + 'change_player_confirm' => 'បញ្ជាក់ដើម្បីផ្លាស់ប្តូរអ្នកលេង? ', + ], + 'btn' => [ + 'change_player' => 'ផ្លាស់ប្តូរអ្នកលេង', + ], + 'wallet' => [ + 'player_wallet' => 'កាបូបអ្នកលេង', + 'deduct' => 'ដកពិន្ទុ', + 'increase' => 'បន្ថែមចំណុច', + 'wallet_from' => 'ព័ត៌មានកាបូប', + 'wallet' => 'សមតុល្យកាបូប', + 'type' => 'ប្រភេទ', + 'action' => 'សកម្មភាព', + 'money' => 'ចំនួន', + 'textarea' => 'ចំណាំ', + 'wallet_operation_failed' => 'ប្រតិបត្តិការកាបូបបានបរាជ័យ', + 'wallet_operation_success' => 'ប្រតិបត្តិការកាបូបជោគជ័យ', + 'player_apply_manual_system_add' => 'ចំនួនប្រព័ន្ធដោយដៃត្រូវបានចែកចាយទៅកាបូបសំខាន់របស់អ្នកលេង', + 'operation_amount_error' => 'ចំនួនប្រតិបត្តិការមានកំហុស', + 'wallet_type_error' => 'កំហុសប្រភេទប្រតិបត្តិការ', + 'player_error' => 'កំហុសអ្នកលេង', + 'wallet_action_log_not_found' => 'កំណត់ហេតុប្រតិបត្តិការកាបូបរបស់អ្នកលេងមិនមានទេ', + 'insufficient_player_money' => 'សមតុល្យអ្នកលេងមិនគ្រប់គ្រាន់', + 'unlimited' => 'គ្មានដែនកំណត់', + 'modify' => 'កែប្រែសមតុល្យ', + 'artificial_recharge' => 'បញ្ចូលទឹកប្រាក់ដោយដៃ', + 'artificial_withdrawal' => 'ការដកប្រាក់ដោយដៃ', + 'artificial_recharge_tip' => 'ការបញ្ចូលទឹកប្រាក់ដោយដៃ គ្មានការអន្តរាគមន៍ដោយដៃត្រូវបានទាមទារសម្រាប់ការត្រួតពិនិត្យ បន្ទាប់ពីបញ្ចូលទឹកប្រាក់ត្រូវបានបញ្ចប់ ពិន្ទុហ្គេមនឹងត្រូវបានចេញដោយផ្ទាល់ទៅកាន់គណនីរបស់អ្នកលេង ហើយព័ត៌មាននៃការបញ្ចូលទឹកប្រាក់នឹងត្រូវបានកត់ត្រាទុក។', + 'artificial_withdrawal_tip' => 'ការដកប្រាក់ដោយដៃមិនតម្រូវឱ្យមានការអន្តរាគមន៍ និងការពិនិត្យមើលដោយដៃទេ បន្ទាប់ពីការដកប្រាក់ត្រូវបានបញ្ចប់ សមតុល្យកាបូបរបស់អ្នកលេងនឹងត្រូវបានកាត់ដោយផ្ទាល់ ហើយព័ត៌មានអំពីការដកប្រាក់នឹងត្រូវបានកត់ត្រាទុក។', + 'wallet_type' => [ + PlayerMoneyEditLog::RECHARGE => 'បញ្ចូលទឹកប្រាក់', + PlayerMoneyEditLog::VIP_RECHARGE => 'បញ្ចូលទឹកប្រាក់ VIP', + PlayerMoneyEditLog::ACTIVITY_GIVE => 'ប្រាក់រង្វាន់សកម្មភាព', + PlayerMoneyEditLog::ADMIN_DEDUCT => 'អ្នកគ្រប់គ្រងដកពិន្ទុ', + PlayerMoneyEditLog::ADMIN_INCREASE => 'អ្នកគ្រប់គ្រងបន្ថែមពិន្ទុ', + PlayerMoneyEditLog::OTHER => 'ផ្សេងទៀត', + ] + ], + 'player_delivery_record' => 'ប្រតិបត្តិការកាបូប', + 'wallet_action_status_has_closed' => 'មុខងារប្រតិបត្តិការកាបូបឆានែលត្រូវបានបិទ!', + 'level_setting' => 'កម្រិតអ្នកលេង', + 'level' => [ + 1 => 'កម្រិត 1', + 2 => 'កម្រិត 2', + 3 => 'កម្រិត 3', + 4 => 'កម្រិត 4', + 5 => 'កម្រិត 5', + 6 => 'កម្រិត 6', + 7 => 'កម្រិត 7', + 8 => 'កម្រិត 8', + 9 => 'កម្រិត 9', + 10 => 'កម្រិត 10', + 11 => 'កម្រិត 11', + 12 => 'កម្រិត 12', + 13 => 'កម្រិត 13' + ], + 'no_level' => 'គ្មានកម្រិត', +]; diff --git a/addons/webman/lang/cam_dia/player_chip_record.php b/addons/webman/lang/cam_dia/player_chip_record.php new file mode 100644 index 0000000..acf23b4 --- /dev/null +++ b/addons/webman/lang/cam_dia/player_chip_record.php @@ -0,0 +1,26 @@ + 'បញ្ជីចំនួននៃការសរសេរកូដ', + 'fields' => [ + 'id' => 'ID', + 'name' => 'ឈ្មោះហ្គេម', + 'chip_amount' => 'ចំនួនកូដបច្ចុប្បន្ន', + 'must_chip_amount' => 'ចំនួនលេខកូដគោលដៅ', + 'record_type' => 'ប្រភេទ', + 'amount' => 'ចំនួនដែលបានកើតឡើង', + 'created_at' => 'ពេលវេលាបង្កើត', + ], + 'record_type' => [ + PlayerChipRecord::RECORD_TYPE_SIGN => 'ចូល', + PlayerChipRecord::RECORD_TYPE_RECHARGE => 'បញ្ចូលថ្មធម្មតា', + PlayerChipRecord::RECORD_TYPE_ACTIVITY => 'ការបញ្ចូលទឹកប្រាក់សកម្មភាព', + PlayerChipRecord::RECORD_TYPE_GAME => 'ការភ្នាល់ហ្គេម', + PlayerChipRecord::RECORD_TYPE_COMMISSION => 'ការចែករំលែកប្រាក់ចំណេញ', + PlayerChipRecord::RECORD_TYPE_BANKRUPTCY => 'ក្ស័យធន', + PlayerChipRecord::RECORD_TYPE_BET_REBATE => 'ការបញ្ចុះតម្លៃលេខកូដ', + PlayerChipRecord::RECORD_TYPE_FIRST_RECHARGE_REWARD => 'រង្វាន់ដាក់ប្រាក់ដំបូង', + ], +]; diff --git a/addons/webman/lang/cam_dia/player_delivery_record.php b/addons/webman/lang/cam_dia/player_delivery_record.php new file mode 100644 index 0000000..a5ea419 --- /dev/null +++ b/addons/webman/lang/cam_dia/player_delivery_record.php @@ -0,0 +1,41 @@ + 'កំណត់ត្រាផ្លាស់ប្តូរគណនី', + 'fields' => [ + 'id' => 'ID', + 'player_id' => 'អ្នកលេង', + 'target' => 'តារាងទិន្នន័យប្រតិបត្តិការ', + 'target_id' => 'លេខសម្គាល់ទិន្នន័យ', + 'type' => 'ប្រភេទ', + 'source' => 'វត្ថុជួញដូរ', + 'amount' => 'ពិន្ទុហ្គេម', + 'user_id' => 'លេខសម្គាល់អ្នកគ្រប់គ្រង', + 'user_name' => 'ប្រតិបត្តិករ', + 'amount_before' => 'ពិន្ទុមុនការផ្លាស់ប្តូរ', + 'amount_after' => 'ពិន្ទុបន្ទាប់ពីការផ្លាស់ប្តូរ', + 'tradeno' => 'លេខបញ្ជាទិញ', + 'remark' => 'ចំណាំ', + 'updated_at' => 'ពេលធ្វើបច្ចុប្បន្នភាព', + 'created_at' => 'ពេលវេលាបង្កើត', + ], + 'type' => [ + PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD => '(ផ្ទៃខាងក្រោយការគ្រប់គ្រង) បន្ថែមពិន្ទុ', + PlayerDeliveryRecord::TYPE_RECHARGE => 'បញ្ចូលទឹកប្រាក់', + PlayerDeliveryRecord::TYPE_WITHDRAWAL => 'ការដកប្រាក់', + PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT => '(ផ្ទៃខាងក្រោយការគ្រប់គ្រង) ពិន្ទុកាត់', + PlayerDeliveryRecord::TYPE_WITHDRAWAL_BACK => 'ការដកប្រាក់ថយក្រោយ', + PlayerDeliveryRecord::TYPE_REGISTER_PRESENT => 'ចុះឈ្មោះដោយឥតគិតថ្លៃ', + PlayerDeliveryRecord::TYPE_COMMISSION => 'កម្រៃជើងសារសងប្រាក់វិញ', + PlayerDeliveryRecord::TYPE_SIGN => 'ចូល', + PlayerDeliveryRecord::TYPE_GAME_OUT => 'ការផ្ទេរហ្គេម', + PlayerDeliveryRecord::TYPE_GAME_IN => 'ការផ្ទេរហ្គេម', + PlayerDeliveryRecord::TYPE_BET_REBATE => 'ការបង្វិលសងសម្រាប់ចំនួនលេខកូដ', + PlayerDeliveryRecord::TYPE_DAMAGE_REBATE => 'ការបង្វិលសងការខូចខាតអតិថិជន', + PlayerDeliveryRecord::TYPE_RECHARGE_REWARD => 'រង្វាន់ដាក់ប្រាក់ដំបូង', + ], + 'detail' => 'ព័ត៌មានលម្អិត', + 'chart' => 'គំនូសតាង', +]; diff --git a/addons/webman/lang/cam_dia/player_edit_log.php b/addons/webman/lang/cam_dia/player_edit_log.php new file mode 100644 index 0000000..a421ffc --- /dev/null +++ b/addons/webman/lang/cam_dia/player_edit_log.php @@ -0,0 +1,42 @@ + 'កំណត់ហេតុការកែប្រែទម្រង់អ្នកលេង', + 'fields' => [ + 'id' => 'លេខ', + 'origin_data' => 'ទិន្នន័យដើម', + 'new_data' => 'ទិន្នន័យក្រោយប្រតិបត្តិការ', + 'create_at' => 'ពេលវេលាប្រតិបត្តិការ', + ], + 'details' => 'ព័ត៌មានលម្អិតអំពីប្រតិបត្តិការ', + 'created_at_start' => 'កំណត់ពេលចាប់ផ្តើម', + 'created_at_end' => 'កំណត់ពេលបញ្ចប់', + 'admin_user' => 'អ្នកគ្រប់គ្រង', + 'action_info' => 'ព័ត៌មានលម្អិតអំពីសកម្មភាព', + 'action' => [ + 'status_open' => 'បើកគណនីអ្នកលេង', + 'status_stop' => 'បិទដំណើរការគណនីអ្នកលេង', + 'status_withdraw_open' => 'បើកមុខងារដកប្រាក់', + 'status_withdraw_close' => 'បិទមុខងារដកប្រាក់', + 'status_open_coins_open' => 'បើកមុខងារដកប្រាក់របស់អ្នកលេង', + 'status_open_coins_close' => 'បិទមុខងារប្រាក់រង្វាន់អ្នកលេង', + 'name' => 'កែប្រែឈ្មោះអ្នកលេង៖ ', + 'phone' => 'កែប្រែលេខទូរស័ព្ទរបស់អ្នកលេង៖ ', + 'country_code' => 'កែប្រែប្រទេស/លេខកូដតំបន់របស់អ្នកលេង៖ ', + 'play_password' => 'កែប្រែពាក្យសម្ងាត់ទូទាត់៖ ', + 'password' => 'ផ្លាស់ប្តូរពាក្យសម្ងាត់ចូល៖ ', + 'avatar' => 'កែប្រែរូបតំណាង៖ ', + 'sex' => 'កែប្រែភេទ៖ ', + 'email' => 'កែប្រែអ៊ីមែល៖ ', + 'qq' => 'កែប្រែ QQ: ', + 'telegram' => 'កែប្រែ telegram: ', + 'birthday' => 'កែប្រែថ្ងៃកំណើត៖ ', + 'id_number' => 'កែប្រែអត្តសញ្ញាណប័ណ្ណ៖ ', + 'address' => 'កែប្រែអាសយដ្ឋាន៖ ', + 'wechat' => 'កែប្រែ Wechat ID: ', + 'whatsapp' => 'កែប្រែ whatsapp: ', + 'facebook' => 'កែប្រែ facebook: ', + 'line' => 'កែប្រែបន្ទាត់៖ ', + 'remark' => 'កំណត់ចំណាំការកែប្រែ៖ ', + ], +]; diff --git a/addons/webman/lang/cam_dia/player_extend.php b/addons/webman/lang/cam_dia/player_extend.php new file mode 100644 index 0000000..aec2341 --- /dev/null +++ b/addons/webman/lang/cam_dia/player_extend.php @@ -0,0 +1,33 @@ + [ + 'id' => 'ID', + 'player_id' => 'លេខសម្គាល់អ្នកលេង', + 'sex' => 'ភេទ', + 'email' => 'អ៊ីមែល', + 'ip' => 'អាសយដ្ឋាន IP', + 'qq' => 'គណនី QQ', + 'telegram' => 'តេឡេក្រាម', + 'birthday' => 'ខួបកំណើត', + 'id_number' => 'អត្តសញ្ញាណប័ណ្ណ', + 'address' => 'អាសយដ្ឋាន', + 'wechat' => 'លេខសម្គាល់ Wechat', + 'whatsapp' => 'Whatsapp', + 'facebook' => 'ហ្វេសប៊ុក', + 'line' => 'បន្ទាត់', + 'remark' => 'ចំណាំ', + 'coin_recharge_amount' => 'ការបញ្ចូលទឹកប្រាក់របស់អ្នកជំនួញកាក់', + 'present_out' => 'ផ្ទេរចេញ', + 'present_in' => 'ផ្ទេរ', + 'recharge_amount' => 'ពិន្ទុបញ្ចូលទឹកប្រាក់សរុប', + 'withdraw_amount' => 'ពិន្ទុដកសរុប', + 'present_out_amount' => 'ពិន្ទុដែលបានផ្ទេរសរុប', + 'present_in_amount' => 'ពិន្ទុផ្ទេរសរុប', + 'third_recharge_amount' => 'ពិន្ទុបញ្ចូលទឹកប្រាក់ភាគីទីបីសរុប', + 'third_withdraw_amount' => 'ពិន្ទុដកភាគីទីបីសរុប', + 'created_at' => 'ពេលវេលាបង្កើត', + 'updated_at' => 'ពេលធ្វើបច្ចុប្បន្នភាព', + ], + 'remark_limit' => 'តួអក្សរចំណាំមិនអាចលើសពី 255 តួអក្សរបានទេ' +]; diff --git a/addons/webman/lang/cam_dia/player_level.php b/addons/webman/lang/cam_dia/player_level.php new file mode 100644 index 0000000..e70f09d --- /dev/null +++ b/addons/webman/lang/cam_dia/player_level.php @@ -0,0 +1,25 @@ + 'កម្រិតអ្នកលេង', + 'recharge_amount' => 'ចំនួនបញ្ចូលទឹកប្រាក់', + 'chip_multiple' => 'ដកលេខកូដច្រើន', + 'bet_rebate_amount' => 'ចំនួនលេខកូដដែលត្រូវការសម្រាប់ការបង្វិលសង', + 'bet_rebate_ratio' => 'សមាមាត្របង្វិលសងនៃចំនួនលេខកូដ', + 'damage_rebate_ratio' => 'សមាមាត្រសងការខូចខាតអតិថិជន', + 'help' => [ + 'recharge_amount' => 'ការកំណត់រចនាសម្ព័ន្ធចំនួនបញ្ចូលទឹកប្រាក់អតិបរមាអាចត្រូវបានកំណត់ត្រឹម {max_amount}', + 'chip_multiple' => 'ចំនួនអតិបរមានៃចំនួនកូដដកប្រាក់អាចត្រូវបានកំណត់ត្រឹម {max_multiple}', + 'bet_rebate_amount' => 'ចំនួនអតិបរមានៃលេខកូដដែលត្រូវការសម្រាប់ការបង្វិលសងអាចត្រូវបានកំណត់ត្រឹម {max_amount}', + 'bet_rebate_ratio' => 'សមាមាត្រការបង្វិលសងអតិបរមាសម្រាប់បរិមាណនៃការសរសេរកូដអាចត្រូវបានកំណត់ត្រឹម {max_ratio}', + 'damage_rebate_ratio' => 'សមាមាត្របង្វិលសងការខូចខាតអតិថិជនអតិបរមាអាចត្រូវបានកំណត់ត្រឹម {max_ratio}', + 'level_name' => 'បញ្ចូលតួអក្សរអតិបរមាចំនួន 20 សម្រាប់ឈ្មោះកម្រិត', + 'level_content' => 'ការណែនាំកម្រិតអាចបញ្ចូលរហូតដល់ 500 តួអក្សរ', + ], + 'recharge_amount_must_gt_upper' => '{level}, ការកំណត់រចនាសម្ព័ន្ធចំនួនទឹកប្រាក់បញ្ចូលត្រូវតែធំជាងកម្រិតមុន', + 'recharge_amount_must_lt_next' => '{level}, ការកំណត់រចនាសម្ព័ន្ធចំនួនទឹកប្រាក់បញ្ចូលត្រូវតែតិចជាងកម្រិតមុន ឬបន្ទាប់', + 'recharge_amount_not_found' => '{level}, ការកំណត់រចនាសម្ព័ន្ធចំនួនបញ្ចូលទឹកប្រាក់ត្រូវបានទាមទារ', + 'level' => 'កម្រិតអ្នកលេង', + 'level_name' => 'ឈ្មោះកម្រិត', + 'level_content' => 'កម្រិតនៃការពិពណ៌នាមាតិកា', +]; diff --git a/addons/webman/lang/cam_dia/player_money_edit_log.php b/addons/webman/lang/cam_dia/player_money_edit_log.php new file mode 100644 index 0000000..bb26ef9 --- /dev/null +++ b/addons/webman/lang/cam_dia/player_money_edit_log.php @@ -0,0 +1,40 @@ + 'កំណត់ហេតុប្រតិបត្តិការកាបូប', + 'fields' => [ + 'id' => 'លេខ', + 'money' => 'ចំនួន', + 'action' => 'ប្រភេទសកម្មភាព', + 'origin_money' => 'ចំនួនដើម', + 'after_money' => 'ចំនួនទឹកប្រាក់បន្ទាប់ពីការផ្លាស់ប្តូរ', + 'create_at' => 'ពេលវេលាប្រតិបត្តិការ', + 'remark' => 'ចំណាំ', + ], + 'created_at_start' => 'កំណត់ពេលចាប់ផ្តើម', + 'created_at_end' => 'កំណត់ពេលបញ្ចប់', + 'admin_user' => 'អ្នកគ្រប់គ្រង', + 'player_info' => 'ព័ត៌មានអ្នកលេង', + 'action_info' => 'ព័ត៌មានសកម្មភាព', + 'action' => [ + PlayerMoneyEditLog::RECHARGE => 'បញ្ចូលទឹកប្រាក់', + PlayerMoneyEditLog::VIP_RECHARGE => 'បញ្ចូលទឹកប្រាក់ VIP', + PlayerMoneyEditLog::ACTIVITY_GIVE => 'ប្រាក់រង្វាន់សកម្មភាព', + PlayerMoneyEditLog::ADMIN_DEDUCT => 'អ្នកគ្រប់គ្រងដកពិន្ទុ', + PlayerMoneyEditLog::OTHER => 'ផ្សេងទៀត', + ], + 'total_data' => [ + 'total_recharge' => 'បញ្ចូលថ្ម', + 'total_vip_recharge' => 'បញ្ចូលទឹកប្រាក់ VIP', + 'total_testing_machine' => 'ម៉ាស៊ីនសាកល្បង', + 'total_other' => 'ផ្សេងៗ', + 'total_activity_give' => 'ការផ្ដល់ជូនសកម្មភាព', + 'total_triple_seven_give' => 'Total_triple_seven_give', + 'total_composite_machine_give' => 'ម៉ាស៊ីនផ្សំដែលបានផ្តល់ជាអំណោយ', + 'total_electronic_give' => 'រង្វាន់អេឡិចត្រូនិក', + 'total_admin_deduct' => 'អ្នកគ្រប់គ្រងដកពិន្ទុ', + 'total_real_person_give' => 'មនុស្សពិតផ្តល់ឱ្យ', + ], +]; diff --git a/addons/webman/lang/cam_dia/player_platform_cash.php b/addons/webman/lang/cam_dia/player_platform_cash.php new file mode 100644 index 0000000..e712a59 --- /dev/null +++ b/addons/webman/lang/cam_dia/player_platform_cash.php @@ -0,0 +1,20 @@ + 'កាបូបវេទិកា', + 'fields' => [ + 'id' => 'ID', + 'player_id' => 'លេខសម្គាល់អ្នកលេង', + 'platform_id' => 'លេខសម្គាល់វេទិកា', + 'platform_name' => 'ឈ្មោះវេទិកា', + 'money' => 'ពិន្ទុ', + 'status' => 'ស្ថានភាពវេទិកាហ្គេម', + 'created_at' => 'ពេលវេលាបង្កើត', + 'updated_at' => 'ពេលធ្វើបច្ចុប្បន្នភាព', + ], + 'platform_name' => [ + PlayerPlatformCash::PLATFORM_SELF => 'សមតុល្យកាបូប' + ] +]; diff --git a/addons/webman/lang/cam_dia/player_recharge_record.php b/addons/webman/lang/cam_dia/player_recharge_record.php new file mode 100644 index 0000000..b81fb88 --- /dev/null +++ b/addons/webman/lang/cam_dia/player_recharge_record.php @@ -0,0 +1,90 @@ + 'ការបញ្ចូលទិន្នន័យឡើងវិញ', + 'examine_title' => 'បញ្ចូលកំណត់ត្រាសវនកម្ម', + 'status_wait' => 'កំពុងសាកថ្ម', + 'status_examine' => 'គណនីមិនទាន់សម្រេច', + 'status_recharging' => 'ត្រូវបង់', + 'status_success' => 'បញ្ចូលថ្មរួចរាល់', + 'status_fail' => 'ការបញ្ចូលថ្មបានបរាជ័យ', + 'status_cancel' => 'បោះបង់ការបញ្ចូលទឹកប្រាក់ឡើងវិញ', + 'status_reject' => 'បដិសេធ', + 'status_system_cancel' => 'បិទ', + 'status_examine_pass' => 'បញ្ចូលទឹកប្រាក់រួចរាល់', + 'status_examine_reject' => 'ការបដិសេធសវនកម្ម', + 'not_fount' => 'រកមិនឃើញការបញ្ជាទិញបញ្ចូលទឹកប្រាក់', + 'recharge_record_error' => 'កំហុសក្នុងការបញ្ជាទិញឡើងវិញ', + 'action_error' => 'ប្រតិបត្តិការបានបរាជ័យ', + 'action_success' => 'សកម្មភាពជោគជ័យ', + 'view_recharge_certificate_title' => 'មើលប័ណ្ណទូទាត់សម្រាប់ការបញ្ជាទិញ {tradeno}', + 'recharge_record_not_complete' => 'ការបញ្ចូលទឹកប្រាក់របស់អ្នកលេងមិនទាន់បានបញ្ចប់ទេ', + 'recharge_record_has_pass' => 'ការបញ្ជាទិញបញ្ចូលទឹកប្រាក់ត្រូវបានអនុម័ត', + 'recharge_record_has_fail' => 'បញ្ចូលទឹកប្រាក់បញ្ជាទិញបានបរាជ័យ', + 'recharge_record_has_cancel' => 'អ្នកលេងបានលុបចោលការបញ្ជាទិញការផ្លាស់ប្តូរ', + 'recharge_record_has_reject' => 'ការបញ្ជាទិញបញ្ចូលទឹកប្រាក់ត្រូវបានច្រានចោល', + 'recharge_record_has_system_cancel' => 'ប្រព័ន្ធបានអស់ពេល និងបិទការបញ្ជាទិញ', + 'talk_currency' => 'រូបិយប័ណ្ណ Q', + 'fields' => [ + 'id' => 'ID', + 'player_id' => 'អ្នកលេង', + 'department_id' => 'ឆានែល', + 'tradeno' => 'បញ្ចូលលេខបញ្ជាទិញ', + 'status' => 'ស្ថានភាព', + 'type' => 'ប្រភេទ', + 'player_name' => 'ឈ្មោះអ្នកលេង', + 'player_phone' => 'លេខទូរស័ព្ទអ្នកលេង', + 'money' => 'ចំនួនបញ្ចូលទឹកប្រាក់', + 'inmoney' => 'ចំនួនពិត', + 'certificate' => 'ប័ណ្ណទូទាត់', + 'coins' => 'កាក់', + 'gift_coins' => 'កាក់អំណោយ', + 'player_tag' => 'ស្លាក', + 'remark' => 'ចំណាំ', + 'reject_reason' => 'ហេតុផលបដិសេធ', + 'user_name' => 'ប្រតិបត្តិករ', + 'currency' => 'រូបិយប័ណ្ណ', + 'finish_time' => 'ពេល​បញ្ចប់', + 'cancel_time' => 'បោះបង់ពេលវេលា', + 'created_at' => 'ពេលវេលាបង្កើត', + ], + 'type' => [ + PlayerRechargeRecord::TYPE_REGULAR => 'បញ្ចូលថ្មធម្មតា', + PlayerRechargeRecord::TYPE_ACTIVITY => 'ការបញ្ចូលទឹកប្រាក់សកម្មភាព', + PlayerRechargeRecord::TYPE_ARTIFICIAL => 'បញ្ចូលទឹកប្រាក់ដោយដៃ', + ], + 'status' => [ + PlayerRechargeRecord::STATUS_WAIT => 'ត្រូវបញ្ចូលថ្មឡើងវិញ', + PlayerRechargeRecord::STATUS_RECHARGING => 'ការបង់ប្រាក់មិនទាន់សម្រេច (ការសវនកម្មមិនទាន់សម្រេច)', + PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS => 'បញ្ចូលថ្មបានជោគជ័យ', + PlayerRechargeRecord::STATUS_RECHARGED_FAIL => 'បញ្ចូលថ្មបានបរាជ័យ', + PlayerRechargeRecord::STATUS_RECHARGED_CANCEL => 'បោះបង់ការបញ្ចូលទឹកប្រាក់', + PlayerRechargeRecord::STATUS_RECHARGED_REJECT => 'ពិនិត្យមើលការបដិសេធ', + PlayerRechargeRecord::STATUS_RECHARGED_SYSTEM_CANCEL => 'បិទ', + ], + 'action' => [ + 'action_error' => 'ប្រតិបត្តិការបានបរាជ័យ', + 'action_success' => 'សកម្មភាពជោគជ័យ', + 'action_not_fount' => 'សកម្មភាពមិនត្រូវបានកំណត់', + 'open_num' => 'ពិន្ទុបើកចំហ', + 'no_fount_player' => 'គ្មានអ្នកលេងនៅក្នុងហ្គេមទេ', + 'open_custom' => 'បើកពិន្ទុតាមបំណង', + 'down' => 'ចំណុចទាប', + ], + 'btn' => [ + 'action' => 'សកម្មភាព', + 'view_channel_recharge_setting' => 'មើលគណនីបញ្ចូលទឹកប្រាក់ឆានែល', + 'view_recharge_certificate' => 'មើលវិញ្ញាបនបត្រទូទាត់', + 'examine_pass' => 'ប្រឡងជាប់', + 'examine_reject' => 'ការបដិសេធការប្រឡង', + 'examine_pass_confirm' => 'សូមបញ្ជាក់ថាការបង់ប្រាក់ត្រូវបានទទួល បន្ទាប់ពីចុចប៊ូតុងអនុម័ត ប្រព័ន្ធនឹងចេញពិន្ទុហ្គេមដោយស្វ័យប្រវត្តិ', + 'examine_reject_confirm' => 'ការបដិសេធការពិនិត្យឡើងវិញ បន្ទាប់ពីការបដិសេធ អ្នកលេងនឹងមិនអាចបំពេញការបញ្ចូលទឹកប្រាក់បានទេ ហើយស្ថានភាពនៃកំណត់ត្រានេះមិនអាចផ្លាស់ប្តូរបានទេ', + ], + 'total_data' => [ + 'total_self_inmoney' => 'ចំនួនសរុបនៃការបញ្ចូលទឹកប្រាក់ក្នុងវេទិកា', + 'total_artificial_inmoney' => 'ចំនួនសរុបនៃការបញ្ចូលទឹកប្រាក់ដោយដៃ', + 'total_coins' => 'ពិន្ទុហ្គេមបញ្ចូលទឹកប្រាក់សរុប', + ], +]; diff --git a/addons/webman/lang/cam_dia/player_wallet_transfer.php b/addons/webman/lang/cam_dia/player_wallet_transfer.php new file mode 100644 index 0000000..7a0ce4f --- /dev/null +++ b/addons/webman/lang/cam_dia/player_wallet_transfer.php @@ -0,0 +1,15 @@ + 'កំណត់ត្រាផ្ទេរចូល/ចេញអ្នកលេង', + 'fields' => [ + 'id' => 'ID', + 'amount' => 'ចំនួន', + 'reward' => 'ចំនួនទឹកប្រាក់ឈ្នះ', + 'platform_no' => 'លេខបញ្ជាទិញ (វេទិកាហ្គេម)', + 'tradeno' => 'លេខបញ្ជាទិញ', + 'create_at' => 'ពេលវេលាបង្កើត', + 'department_name' => 'ឈ្មោះឆានែល', + 'platform_name' => 'វេទិកាហ្គេម', + ], +]; diff --git a/addons/webman/lang/cam_dia/player_withdraw_record.php b/addons/webman/lang/cam_dia/player_withdraw_record.php new file mode 100644 index 0000000..cadb70c --- /dev/null +++ b/addons/webman/lang/cam_dia/player_withdraw_record.php @@ -0,0 +1,80 @@ + 'កំណត់ត្រាដកប្រាក់', + 'payment_title' => 'ការដកប្រាក់ និងកំណត់ត្រាការទូទាត់', + 'examine_title' => 'កំណត់ត្រាសវនកម្មការដកប្រាក់', + 'status_wait' => 'ត្រូវពិនិត្យ', + 'status_success' => 'ការដកប្រាក់បានជោគជ័យ', + 'status_fail' => 'ការដកប្រាក់បានបរាជ័យ', + 'not_fount' => 'រកមិនឃើញការបញ្ជាទិញបញ្ចូលទឹកប្រាក់', + 'withdraw_record_error' => 'កំហុសក្នុងការបញ្ជាទិញឡើងវិញ', + 'action_error' => 'ប្រតិបត្តិការបានបរាជ័យ', + 'action_success' => 'សកម្មភាពជោគជ័យ', + 'withdraw_record_not_complete' => 'ការដកប្រាក់របស់អ្នកលេងមិនទាន់បានបញ្ចប់ទេ', + 'withdraw_record_has_complete' => 'ការដកប្រាក់ត្រូវបានបញ្ចប់', + 'withdraw_record_has_fail' => 'ការបញ្ជាទិញដកប្រាក់បានបរាជ័យ', + 'withdraw_record_has_cancel' => 'អ្នកលេងបានលុបចោលការបញ្ជាទិញហើយ', + 'withdraw_record_has_reject' => 'ការបញ្ជាទិញដកប្រាក់ត្រូវបានច្រានចោល', + 'withdraw_record_has_system_cancel' => 'ប្រព័ន្ធបានអស់ពេល និងបិទការបញ្ជាទិញ', + 'withdraw_record_has_pass' => 'ការបញ្ជាទិញដកប្រាក់ត្រូវបានអនុម័ត', + 'withdraw_record_status_error' => 'ការលើកលែងការបញ្ជាទិញដកប្រាក់', + 'withdraw_record_has_not_examine' => 'ការបញ្ជាទិញមិនទាន់ត្រូវបានពិនិត្យនៅឡើយ', + 'certificate_help' => 'មានតែទម្រង់ផ្ទុកឡើង jpg, png, និង jpeg ត្រូវបានអនុញ្ញាត ទំហំឯកសារអតិបរមាមិនអាចលើសពី 2M អ្នកអាចអូស និងទម្លាក់ទៅបន្ទាត់ចំនុចដើម្បីផ្ទុកឡើង។', + 'certificate_required' => 'សូមបង្ហោះប័ណ្ណទូទាត់', + 'player_bank' => 'គណនីអ្នកលេង', + 'fields' => [ + 'id' => 'ID', + 'player' => 'ព័ត៌មានអ្នកលេង', + 'player_id' => 'អ្នកលេង', + 'department_id' => 'ឆានែល', + 'tradeno' => 'លេខបញ្ជាការដកប្រាក់', + 'status' => 'ស្ថានភាព', + 'type' => 'ប្រភេទ', + 'player_name' => 'ឈ្មោះអ្នកលេង', + 'player_phone' => 'លេខទូរស័ព្ទអ្នកលេង', + 'money' => 'ចំនួនដកប្រាក់', + 'inmoney' => 'ចំនួនដកប្រាក់', + 'player_tag' => 'ស្លាក', + 'remark' => 'ចំណាំ', + 'currency' => 'រូបិយប័ណ្ណ', + 'finish_time' => 'ពេល​បញ្ចប់', + 'cancel_time' => 'បោះបង់ពេលវេលា', + 'created_at' => 'ចាប់ផ្តើមពេលដកប្រាក់', + 'coins' => 'ពិន្ទុហ្គេម', + 'bank_name' => 'ឈ្មោះធនាគារ', + 'account_name' => 'ឈ្មោះគណនី', + 'account' => 'លេខកាត', + ], + 'status' => [ + PlayerWithdrawRecord::STATUS_WAIT => 'ការដកប្រាក់ (រង់ចាំការពិនិត្យឡើងវិញ)', + PlayerWithdrawRecord::STATUS_SUCCESS => 'ដកប្រាក់ដោយជោគជ័យ', + PlayerWithdrawRecord::STATUS_FAIL => 'ការដកប្រាក់បានបរាជ័យ', + PlayerWithdrawRecord::STATUS_PENDING_PAYMENT => 'ការបង់ប្រាក់ដែលមិនទាន់សម្រេច', + PlayerWithdrawRecord::STATUS_PENDING_REJECT => 'សវនកម្មបានបរាជ័យ', + PlayerWithdrawRecord::STATUS_CANCEL => 'បោះបង់ការដក', + PlayerWithdrawRecord::STATUS_SYSTEM_CANCEL => 'ប្រព័ន្ធត្រូវបានលុបចោល', + ], + 'type' => [ + PlayerWithdrawRecord::TYPE_SELF => 'ការដកប្រាក់ពីវេទិកា', + PlayerWithdrawRecord::TYPE_ARTIFICIAL => 'ការដកប្រាក់ដោយដៃ', + ], + 'total_data' => [ + 'total_talk_inmoney' => 'ចំនួនសរុបនៃការដក QTalk', + 'total_self_inmoney' => 'ចំនួនសរុបនៃការដកប្រាក់ពីវេទិកា', + 'total_artificial_inmoney' => 'ចំនួនសរុបនៃការដកប្រាក់ដោយដៃ', + 'total_coins' => 'ពិន្ទុហ្គេមដកប្រាក់សរុប', + ], + 'btn' => [ + 'action' => 'សកម្មភាព', + 'view_channel_recharge_list' => 'មើលកំណត់ត្រាបញ្ចូលទឹកប្រាក់', + 'view_game_list' => 'មើលកំណត់ត្រាហ្គេម', + 'examine_pass' => 'ប្រឡងជាប់', + 'examine_reject' => 'ការបដិសេធការប្រឡង', + 'complete_payment' => 'ការទូទាត់ពេញលេញ', + 'examine_pass_confirm' => 'បន្ទាប់ពីឆ្លងកាត់ការត្រួតពិនិត្យ ការបញ្ជាទិញនឹងចូលទៅក្នុងដំណើរការទូទាត់ហិរញ្ញវត្ថុ សូមពិនិត្យដោយប្រុងប្រយ័ត្ន និងបញ្ជាក់', + 'examine_reject_confirm' => 'បដិសេធការពិនិត្យឡើងវិញ ចុចលើការពិនិត្យឡើងវិញ ហើយឆ្លងកាត់ ប្រព័ន្ធនឹងចេញពិន្ទុហ្គេមដោយស្វ័យប្រវត្តិ', + ], +]; diff --git a/addons/webman/lang/cam_dia/post.php b/addons/webman/lang/cam_dia/post.php new file mode 100644 index 0000000..af8fab9 --- /dev/null +++ b/addons/webman/lang/cam_dia/post.php @@ -0,0 +1,13 @@ + 'ការគ្រប់គ្រងទីតាំង', + 'normal' => 'ធម្មតា', + 'disable' => 'បិទ', + 'fields' => [ + 'name' => 'ឈ្មោះមុខតំណែង', + 'status' => 'ស្ថានភាព', + 'sort' => 'តម្រៀប', + 'create_at' => 'ពេលវេលាបង្កើត', + ], +]; diff --git a/addons/webman/lang/cam_dia/public_msg.php b/addons/webman/lang/cam_dia/public_msg.php new file mode 100644 index 0000000..84a2ddb --- /dev/null +++ b/addons/webman/lang/cam_dia/public_msg.php @@ -0,0 +1,12 @@ + 'កាលបរិច្ឆេទចាប់ផ្តើម', + 'date_end' => 'កាលបរិច្ឆេទបញ្ចប់', + 'created_at_start' => 'ម៉ោងចាប់ផ្តើម', + 'created_at_end' => 'ពេលវេលាបញ្ចប់', + 'status' => [ + 'បិទ', + 'បើក', + ], +]; diff --git a/addons/webman/lang/cam_dia/slider.php b/addons/webman/lang/cam_dia/slider.php new file mode 100644 index 0000000..082d0e6 --- /dev/null +++ b/addons/webman/lang/cam_dia/slider.php @@ -0,0 +1,19 @@ + 'រូបភាពរង្វង់មូល', + 'fields' => [ + 'id' => 'ID', + 'url' => 'អាសយដ្ឋានភ្ជាប់', + 'department_id' => 'ឆានែល', + 'content' => 'មាតិកា', + 'picture_url' => 'រូបភាព', + 'status' => 'ស្ថានភាព', + 'sort' => 'តម្រៀប', + 'created_at' => 'ពេលវេលាបង្កើត', + ], + 'url_max_length' => 'អាសយដ្ឋានតំណអាចមានរហូតដល់ 200 តួអក្សរ', + 'help' => [ + 'picture_url_size' => 'ទំហំរូបភាពដែលបានណែនាំ 1080*458', + ] +]; diff --git a/addons/webman/lang/cam_dia/system_setting.php b/addons/webman/lang/cam_dia/system_setting.php new file mode 100644 index 0000000..b9a9227 --- /dev/null +++ b/addons/webman/lang/cam_dia/system_setting.php @@ -0,0 +1,30 @@ + 'ការកំណត់រចនាសម្ព័ន្ធ', + 'fields' => [ + 'register_present' => 'ពិន្ទុអំណោយសម្រាប់ការចុះឈ្មោះដោយជោគជ័យ', + 'marquee' => 'ផ្លាកយីហោអតិថិជន', + 'machine_maintain' => 'រយៈពេលថែទាំម៉ាស៊ីនប្រចាំសប្តាហ៍', + 'feature' => 'មុខងារ', + 'setting' => 'ការកំណត់រចនាសម្ព័ន្ធ', + 'status' => 'ស្ថានភាព', + 'recharge_order_expiration' => 'បញ្ចូលម៉ោងផុតកំណត់នៃការបញ្ជាទិញឡើងវិញ', + ], + 'marquee_max_len' => 'Marquee អាចមានរហូតដល់ 100 តួអក្សរ', + 'week' => [ + 1 => 'ថ្ងៃច័ន្ទ', + 2 => 'ថ្ងៃអង្គារ', + 3 => 'ថ្ងៃពុធ', + 4 => 'ថ្ងៃព្រហស្បតិ៍', + 5 => 'ថ្ងៃសុក្រ', + 6 => 'ថ្ងៃសៅរ៍', + 7 => 'ថ្ងៃអាទិត្យ', + ], + 'week_str' => 'សប្តាហ៍', + 'minutes' => 'នាទី', + 'time_range' => 'ជួរកាលបរិច្ឆេទ', + 'master' => 'ការកំណត់រចនាសម្ព័ន្ធសរុប', + 'not_fount' => 'រកមិនឃើញការកំណត់', + 'action_success' => 'សកម្មភាពជោគជ័យ', +]; diff --git a/addons/webman/lang/cam_dia/validator.php b/addons/webman/lang/cam_dia/validator.php new file mode 100644 index 0000000..62dd190 --- /dev/null +++ b/addons/webman/lang/cam_dia/validator.php @@ -0,0 +1,23 @@ + 'មិនអាចទទេបានទេ', + 'email' => 'ទម្រង់អ៊ីមែលមិនត្រូវគ្នា', + 'idCard' => 'ទម្រង់អត្តសញ្ញាណប័ណ្ណមិនត្រូវគ្នា', + 'url' => 'មិនមែនជាអាសយដ្ឋាន URL ត្រឹមត្រូវ', + 'number' => 'ត្រូវតែជាលេខ', + 'integer' => 'ត្រូវតែជាចំនួនគត់', + 'float' => 'ត្រូវតែជាលេខអណ្តែតទឹក', + 'mobile' => 'ទម្រង់មិនត្រូវគ្នា', + 'leng' => 'ប្រវែងមិនបំពេញតាមតម្រូវការ', + 'alpha' => 'អាចជាអក្សរ', + 'alphaNum' => 'អាចជាអក្សរក្រមលេខ', + 'alphaDash' => 'តែអក្សរ លេខ សញ្ញា_ និងសញ្ញា-', + 'chs' => 'តែអក្សរចិន', + 'chsAlpha' => 'តែអក្សរចិន និងអក្សរ', + 'chsAlphaNum' => 'តែអក្សរចិន អក្សរ និងលេខ', + 'chsDash' => 'មានតែអក្សរចិន អក្សរ លេខ គូស_ និងសញ្ញា-', + 'max' => 'អតិបរមាអាចកំណត់បានតែ {max}', + 'min' => 'ការកំណត់អប្បបរមាអាចត្រឹមតែ {min}', + 'twoDecimal' => 'លេខវិជ្ជមានអាចមានរហូតដល់ 2 ខ្ទង់ទសភាគ', +]; \ No newline at end of file diff --git a/addons/webman/lang/en/commission_record.php b/addons/webman/lang/en/commission_record.php new file mode 100644 index 0000000..b7677e4 --- /dev/null +++ b/addons/webman/lang/en/commission_record.php @@ -0,0 +1,24 @@ + 'Play and earn records', + 'fields' => [ + 'id' => 'ID', + 'recharge_amount' => 'Recharge amount', + 'total_amount' => 'Total amount', + 'damage_amount' => 'Damage amount', + 'amount' => 'Amount', + 'ratio' => 'Ratio', + 'date' => 'Settlement date', + 'create_at' => 'Creation time', + 'commission_first_recharge' => 'User first charge', + 'commission_damage' => 'Customer loss commission ratio', + 'commission_chip_multiple' => 'Multiple of coding volume', + ], + 'player_info' => 'Player information', + 'parent_player_info' => 'Profit sharing players', + 'commission_setting' => 'Play to earn configuration', + 'commission_first_recharge' => 'Inviting new users, new users can receive {$usd}USD for their first recharge', + 'commission_damage' => '{$ratio}% of the daily customer loss will be given to you as commission.', + 'commission_chip_multiple' => 'The commission for the activity is the same as the Deposit of COINS.', +]; diff --git a/addons/webman/lang/en/menu.php b/addons/webman/lang/en/menu.php new file mode 100644 index 0000000..9f76cc1 --- /dev/null +++ b/addons/webman/lang/en/menu.php @@ -0,0 +1,122 @@ + 'Add Menu', + 'title' => 'System Menu Management', + 'fields' => [ + 'top' => 'Top Menu', + 'pid' => 'Parent Menu', + 'name' => 'Menu Name', + 'url' => 'Menu Link', + 'icon' => 'Menu Icon', + 'sort' => 'Sort', + 'status' => 'Status', + 'open' => 'Menu Expansion', + 'super_status' => 'Super Admin Status', + 'type' => 'Menu Type', + ], + 'options' => [ + 'admin_visible' => [ + [1 => 'Show'], + [0 => 'Hide'] + ] + ], + 'type' => [ + AdminDepartment::TYPE_DEPARTMENT => 'Main Station Menu', + AdminDepartment::TYPE_CHANNEL => 'Channel Menu', + ], + 'titles' => [ + 'home' => 'Home', + 'system' => 'System', + 'system_manage' => 'System Management', + 'config_manage' => 'Configuration Management', + 'attachment_manage' => 'Attachment Management', + 'permissions_manage' => 'Permissions Management', + 'admin' => 'User Management', + 'role_manage' => 'Role Management', + 'menu_manage' => 'Menu Management', + 'plug_manage' => 'Plugin Management', + 'department_manage' => 'Department Management', + 'post_manage' => 'Position Management', + /** Main Admin */ + 'admin_manage' => 'Main Admin', + 'data_center' => 'Data Center', + // User Management + 'user_manage' => 'Player Management', + 'user_manage_list' => 'Player List', + 'accounting_change_records' => 'Account Change Records', + // Financial Data + 'financial_data' => 'Financial Data', + 'recharge_record' => 'Recharge Records', + 'withdrawal_records' => 'Withdrawal Records', + // Report Center + 'report_center' => 'Report Center', + // Client Management + 'client_manager' => 'Client Management', + 'rotation_chart_manager' => 'Carousel Management', + 'announcement_manager' => 'Announcement Management', + 'system_settings' => 'System Settings', + // Channel Management + 'channel_manager' => 'Channel Management', + 'channel_list' => 'Channel List', + 'currency_manager' => 'Currency Management', + /** Channel Admin */ + 'channel_manage' => 'Channel Admin', + 'channel_data_center' => 'Data Center', + // Player Management + 'channel_player_manage' => 'Player Management', + 'channel_player_list' => 'Player List', + 'channel_player_accounting_change_records' => 'Account Change Records', + // Frontend Configuration + 'channel_client_manager' => 'Client Management', + 'channel_rotation_chart_manager' => 'Carousel Management', + 'channel_marquee_manager' => 'Marquee Management', + 'channel_announcement_manager' => 'Announcement Management', + // Financial Management + 'channel_financial_manager' => 'Financial Management', + 'channel_recharge_review' => 'Recharge Review', + 'channel_withdrawal_review' => 'Withdrawal Review', + 'channel_withdrawal_and_payment' => 'Withdrawal Payment', + 'channel_recharge_record' => 'Recharge Records', + 'channel_withdrawal_records' => 'Withdrawal Records', + 'channel_recharge_channel_configuration' => 'Recharge Channel Configuration', + 'channel_financial_operation_records' => 'Financial Operation Records', + // Permissions Management + 'channel_auth_manager' => 'Permissions Management', + 'channel_admin_user_manager' => 'User Management', + 'channel_post_manager' => 'Position Management', + // Log Center + 'log_center' => 'Log Center', + 'player_edit_log' => 'Player Edit Log', + 'player_money_edit_log' => 'Wallet Operation Log', + // Game Management + 'game_manage' => 'Game Management', + 'game_record' => 'Game Records', + 'game_out_in' => 'Game Transfer In/Out Records', + 'game_list' => 'Game List', + 'version_manager' => 'Version Management', + 'activity_manager' => 'Activity Management', + 'activity_list' => 'Activity List', + 'recharge_manager' => 'Recharge Management', + 'recharge_channels' => 'Recharge Channels', + 'play_and_earn' => 'Play and Earn', + 'play_and_earn_record' => 'Play and Earn Records', + // Promotion Management + 'channel_player_promoter' => 'Promotion Management', + 'channel_player_promoter_list' => 'Promoter List', + 'profit_record' => 'Profit sharing report', + 'profit_settlement_record' => 'Split profit settlement record', + '游戏类型列表' => 'GameType List', + //qrcode + '二维码管理' => 'Qrcode', + '二维码批次列表' => 'Qrcode List', + '持码人列表' => 'Qrcode Holder', + '广播管理' => 'Broadcast', + '手动广播管理' => 'Hand Broadcast', + '自动广播管理' => 'Auto Broadcast', + '公告管理' => 'Announcement', + '公告列表' => 'Announcement List', + ] +]; diff --git a/addons/webman/lang/zh-CN/activity.php b/addons/webman/lang/zh-CN/activity.php new file mode 100644 index 0000000..d84f86d --- /dev/null +++ b/addons/webman/lang/zh-CN/activity.php @@ -0,0 +1,48 @@ + '活动', + 'fields' => [ + 'id' => 'ID', + 'status' => '状态', + 'is_show' => '首页弹窗', + 'sort' => '排序', + 'link' => '类型', + 'recharge_id' => '充值配置', + 'start_time' => '开始时间', + 'end_time' => '结束时间', + 'created_at' => '创建时间', + 'time_frame' => '开放时间', + ], + 'created_at_start' => '开始时间', + 'created_at_end' => '结束时间', + 'not_fount' => '活动未找到', + 'activity_content_must' => '请填写活动内容', + 'rang_time' => '开放时间', + 'activity_content' => '活动内容', + 'activity_info' => '活动信息', + 'sign_setting' => '签到设置', + 'chip_amount' => '打码量', + 'chip_multiple' => '打码倍数', + 'reward_amount' => '奖励金额', + 'type_not_found' => '请选择活动模式', + 'type_error' => '活动模式错误', + 'cycle_type_not_found' => '请选择周期类型', + 'cycle_type_error' => '周期类型错误', + 'cycle_data_not_found' => '请选择周期类型配置', + 'cycle_data_error' => '请选择周期类型配置', + 'cycle_week' => ' 每周,{week}开启', + 'cycle_month' => ' 每月,{month}号开启', + 'status' => '状态', + 'week' => ['星期天', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], + 'sign_setting_date' => [ + '第一日', + '第二日', + '第三日', + '第四日', + '第五日', + '第六日', + '第七日', + ] +]; diff --git a/addons/webman/lang/zh-CN/activity_content.php b/addons/webman/lang/zh-CN/activity_content.php new file mode 100644 index 0000000..b71861e --- /dev/null +++ b/addons/webman/lang/zh-CN/activity_content.php @@ -0,0 +1,14 @@ + '活动内容', + 'fields' => [ + 'id' => 'ID', + 'name' => '活动名称', + 'activity_id' => '活动ID', + 'lang' => '语言标识', + 'picture' => '活动主图', + 'created_at' => '创建时间', + ], +]; diff --git a/addons/webman/lang/zh-CN/admin.php b/addons/webman/lang/zh-CN/admin.php new file mode 100644 index 0000000..e42a711 --- /dev/null +++ b/addons/webman/lang/zh-CN/admin.php @@ -0,0 +1,50 @@ + '个人信息', + 'system_user'=>'系统用户', + 'not_access_permission' => '没有访问该操作的权限', + 'super_admin'=>'超级管理员', + 'super_admin_delete'=>'超级管理员不可以删除!', + 'super_admin_disabled'=>'超级管理员不可以禁用!', + 'reset_password'=>'重置密码', + 'old_password'=>'旧密码', + 'old_password_error'=>'旧密码错误', + 'new_password'=>'新密码', + 'confim_password' => '确认密码', + 'access_rights' => '访问权限', + 'normal' => '正常', + 'disable' => '禁用', + 'true' => '是', + 'false' => '否', + 'username_exist' => '用户名存在重复', + 'phone_exist' => '手机号已存在', + 'password_min_number' => '密码最少6位数', + 'password_confim_validate' => '输入密码不一致', + 'update_password' => '修改密码', + 'open' => '开启', + 'close' => '关闭', + 'department' => '所属部门', + 'channel' => '所属渠道', + 'department_tree' => '总站部门', + 'channel_tree' => '子站渠道', + 'pass_help' => '初始化密码123456,建议密码包含大小写字母、数字、符号', + 'search_department' => '搜索部门', + 'post' => '岗位', + 'admin_user' => '管理员', + 'success' => '成功', + 'error' => '失败', + 'system_messages' => '系統消息', + 'fields' => [ + 'username' => '用户名', + 'nickname' => '用户昵称', + 'avatar' => '用户头像', + 'password' => '密码', + 'phone' => '手机号', + 'mail' => '邮箱', + 'status' => '账号状态', + 'create_at' => '创建时间', + 'type' => '类型', + 'is_super'=>'渠道超管', + ], +]; diff --git a/addons/webman/lang/zh-CN/announcement.php b/addons/webman/lang/zh-CN/announcement.php new file mode 100644 index 0000000..8e0ae2e --- /dev/null +++ b/addons/webman/lang/zh-CN/announcement.php @@ -0,0 +1,36 @@ + '公告管理', + 'fields' => [ + 'id' => 'ID', + 'title' => '标题', + 'content' => '内容', + 'valid_time' => '有效时间', + 'push_time' => '发布时间', + 'status' => '状态', + 'department_id' => '渠道', + 'sort' => '排序', + 'priority' => '优先级', + 'admin_id' => '管理员ID', + 'admin_name' => '管理员名称', + 'created_at' => '创建时间', + 'type' => '公告类型', + ], + 'priority' => [ + Announcement::PRIORITY_ORDINARY => '普通', + Announcement::PRIORITY_SENIOR => '高级', + Announcement::PRIORITY_EMERGENT => '紧急', + ], + 'type' => [ + Announcement::TYPE_BULLETIN => '公告', + Announcement::TYPE_EVEBT => '事件', + ], + 'help' => [ + 'valid_time' => '不填时为永久有效', + 'push_time' => '过发布时间该公告才对客户展示', + 'title' => '公告标题最多200个字', + ] +]; diff --git a/addons/webman/lang/zh-CN/antd.php b/addons/webman/lang/zh-CN/antd.php new file mode 100644 index 0000000..b1c3c0b --- /dev/null +++ b/addons/webman/lang/zh-CN/antd.php @@ -0,0 +1,393 @@ + "zh-cn", + "Pagination" => [ + "items_per_page" => "条/页", + "jump_to" => "跳至", + "jump_to_confirm" => "确定", + "page" => "页", + "prev_page" => "上一页", + "next_page" => "下一页", + "prev_5" => "向前 5 页", + "next_5" => "向后 5 页", + "prev_3" => "向前 3 页", + "next_3" => "向后 3 页" + ], + "DatePicker" => [ + "lang" => [ + "placeholder" => "请选择日期", + "yearPlaceholder" => "请选择年份", + "quarterPlaceholder" => "请选择季度", + "monthPlaceholder" => "请选择月份", + "weekPlaceholder" => "请选择周", + "rangePlaceholder" => [ + "开始日期", + "结束日期" + ], + "rangeYearPlaceholder" => [ + "开始年份", + "结束年份" + ], + "rangeMonthPlaceholder" => [ + "开始月份", + "结束月份" + ], + "rangeWeekPlaceholder" => [ + "开始周", + "结束周" + ], + "locale" => "zh_CN", + "today" => "今天", + "now" => "此刻", + "backToToday" => "返回今天", + "ok" => "确 定", + "timeSelect" => "选择时间", + "dateSelect" => "选择日期", + "weekSelect" => "选择周", + "clear" => "清除", + "month" => "月", + "year" => "年", + "previousMonth" => "上个月 (翻页上键)", + "nextMonth" => "下个月 (翻页下键)", + "monthSelect" => "选择月份", + "yearSelect" => "选择年份", + "decadeSelect" => "选择年代", + "yearFormat" => "YYYY年", + "dayFormat" => "D日", + "dateFormat" => "YYYY年M月D日", + "dateTimeFormat" => "YYYY年M月D日 HH时mm分ss秒", + "previousYear" => "上一年 (Control键加左方向键)", + "nextYear" => "下一年 (Control键加右方向键)", + "previousDecade" => "上一年代", + "nextDecade" => "下一年代", + "previousCentury" => "上一世纪", + "nextCentury" => "下一世纪" + ], + "timePickerLocale" => [ + "placeholder" => "请选择时间", + "rangePlaceholder" => [ + "开始时间", + "结束时间" + ] + ] + ], + "TimePicker" => [ + "placeholder" => "请选择时间", + "rangePlaceholder" => [ + "开始时间", + "结束时间" + ] + ], + "Calendar" => [ + "lang" => [ + "placeholder" => "请选择日期", + "yearPlaceholder" => "请选择年份", + "quarterPlaceholder" => "请选择季度", + "monthPlaceholder" => "请选择月份", + "weekPlaceholder" => "请选择周", + "rangePlaceholder" => [ + "开始日期", + "结束日期" + ], + "rangeYearPlaceholder" => [ + "开始年份", + "结束年份" + ], + "rangeMonthPlaceholder" => [ + "开始月份", + "结束月份" + ], + "rangeWeekPlaceholder" => [ + "开始周", + "结束周" + ], + "locale" => "zh_CN", + "today" => "今天", + "now" => "此刻", + "backToToday" => "返回今天", + "ok" => "确 定", + "timeSelect" => "选择时间", + "dateSelect" => "选择日期", + "weekSelect" => "选择周", + "clear" => "清除", + "month" => "月", + "year" => "年", + "previousMonth" => "上个月 (翻页上键)", + "nextMonth" => "下个月 (翻页下键)", + "monthSelect" => "选择月份", + "yearSelect" => "选择年份", + "decadeSelect" => "选择年代", + "yearFormat" => "YYYY年", + "dayFormat" => "D日", + "dateFormat" => "YYYY年M月D日", + "dateTimeFormat" => "YYYY年M月D日 HH时mm分ss秒", + "previousYear" => "上一年 (Control键加左方向键)", + "nextYear" => "下一年 (Control键加右方向键)", + "previousDecade" => "上一年代", + "nextDecade" => "下一年代", + "previousCentury" => "上一世纪", + "nextCentury" => "下一世纪" + ], + "timePickerLocale" => [ + "placeholder" => "请选择时间", + "rangePlaceholder" => [ + "开始时间", + "结束时间" + ] + ] + ], + "global" => [ + "placeholder" => "请选择" + ], + "Table" => [ + "filterTitle" => "筛选", + "filterConfirm" => "确定", + "filterReset" => "重置", + "filterEmptyText" => "无筛选项", + "selectAll" => "全选当页", + "selectInvert" => "反选当页", + "selectNone" => "清空所有", + "selectionAll" => "全选所有", + "sortTitle" => "排序", + "expand" => "展开行", + "collapse" => "关闭行", + "triggerDesc" => "点击降序", + "triggerAsc" => "点击升序", + "cancelSort" => "取消排序" + ], + "Modal" => [ + "okText" => "确定", + "cancelText" => "取消", + "justOkText" => "知道了" + ], + "Popconfirm" => [ + "cancelText" => "取消", + "okText" => "确定" + ], + "Transfer" => [ + "searchPlaceholder" => "请输入搜索内容", + "itemUnit" => "项", + "itemsUnit" => "项", + "remove" => "删除", + "selectCurrent" => "全选当页", + "removeCurrent" => "删除当页", + "selectAll" => "全选所有", + "removeAll" => "删除全部", + "selectInvert" => "反选当页" + ], + "Upload" => [ + "uploading" => "文件上传中", + "removeFile" => "删除文件", + "uploadError" => "上传错误", + "previewFile" => "预览文件", + "downloadFile" => "下载文件" + ], + "Empty" => [ + "description" => "暂无数据" + ], + "Icon" => [ + "icon" => "图标" + ], + "Text" => [ + "edit" => "编辑", + "copy" => "复制", + "copied" => "复制成功", + "expand" => "展开" + ], + "PageHeader" => [ + "back" => "返回" + ], + "Form" => [ + "optional" => "(可选)", + "defaultValidateMessages" => [ + "default" => "字段验证错误$[label]", + "required" => "请输入$[label]", + "enum" => "$[label]必须是其中一个[$[enum]]", + "whitespace" => "$[label]不能为空字符", + "date" => [ + "format" => "$[label]日期格式无效", + "parse" => "$[label]不能转换为日期", + "invalid" => "$[label]是一个无效日期" + ], + "types" => [ + "string" => "$[label]不是一个有效的$[type]", + "method" => "$[label]不是一个有效的$[type]", + "array" => "$[label]不是一个有效的$[type]", + "object" => "$[label]不是一个有效的$[type]", + "number" => "$[label]不是一个有效的$[type]", + "date" => "$[label]不是一个有效的$[type]", + "boolean" => "$[label]不是一个有效的$[type]", + "integer" => "$[label]不是一个有效的$[type]", + "float" => "$[label]不是一个有效的$[type]", + "regexp" => "$[label]不是一个有效的$[type]", + "email" => "$[label]不是一个有效的$[type]", + "url" => "$[label]不是一个有效的$[type]", + "hex" => "$[label]不是一个有效的$[type]" + ], + "string" => [ + "len" => "$[label]须为$[len]个字符", + "min" => "$[label]最少$[min]个字符", + "max" => "$[label]最多$[max]个字符", + "range" => "$[label]须在$[min]-$[max]字符之间" + ], + "number" => [ + "len" => "$[label]必须等于$[len]", + "min" => "$[label]最小值为$[min]", + "max" => "$[label]最大值为$[max]", + "range" => "$[label]须在$[min]-$[max]之间" + ], + "array" => [ + "len" => "须为$[len]个$[label]", + "min" => "最少$[min]个$[label]", + "max" => "最多$[max]个$[label]", + "range" => "$[label]数量须在$[min]-$[max]之间" + ], + "pattern" => [ + "mismatch" => "$[label]与模式不匹配$[pattern]" + ] + ] + ], + "Image" => [ + "preview" => "预览" + ], + + //自定义组件语言 + 'FormMany' => [ + 'up' => '上移', + 'down' => '下移', + 'add' => '添加', + 'remove' => '移除', + 'clear' => '清空', + ], + 'TabsTag' => [ + 'closeOther' => '关闭其他', + 'closeLeft' => '关闭左侧', + 'closeRight' => '关闭右侧', + 'back' => '返回上一页', + ], + 'Uploader' => [ + 'finder'=>'资源', + 'upload' => '上传', + 'success'=>'上传成功', + 'error'=>'未知错误', + 'check'=>'校验中', + 'uploading'=>'上传中', + ], + 'Grid' => [ + 'confirmRecoverySelected' => '此操作将恢复选中数据?', + 'confirmClearSelected' => '此操作将删除选中数据?', + 'confirmClear' => '此操作将删除清空所有数据?', + 'continue' => '是否继续?', + 'empty' => '暂无数据', + 'search' => '搜索', + 'quickSearchText' => '请输入关键字', + 'export' => '导出', + 'exportPage' => '导出当前页', + 'exportSelect' => '导出选中行', + 'exportAll' => '导出全部', + 'exportProgress' => '导出进度', + 'exportFail' => '导出失败', + 'exportSuccess' => '已导出成功,请点击', + 'download' => '下载', + 'sortTop' => '置顶', + 'sortBottom' => '置底', + 'sortDrag' => '拖动排序', + 'confirm' => '确定', + 'reset' => '重置', + 'dataList' => '数据列表', + 'recycle' => '回收站', + 'collapseFilter' => '收起筛选', + 'expandFilter' => '展开筛选', + 'clearTrash' => '清空回收站', + 'clearData' => '清空数据', + 'restoreSelected' => '恢复选中', + 'deleteSelected' => '删除选中', + 'selectedAction' => '请勾选操作数据', + ], + 'SelectTable' => [ + 'select' => '选择', + 'selected' => '已选中', + 'confirm' => '确定', + 'cancel' => '取消', + ], + 'Confirm' => [ + 'title' => '提示' + ], + 'Copy' => [ + 'success' => '复制成功', + 'error' => '复制失败', + ], + 'Logout' => [ + 'title' => '退出登录', + 'content' => '是否确认退出系统?', + ], + 'Header' => [ + 'refresh' => '刷新', + 'light' => '深色', + 'dark' => '亮色', + ], + 'Setting' => [ + 'lang' => '语言', + 'theme_color' => '主题色', + 'sidebar_color' => '侧边栏选中色', + 'sidebar_background' => '侧边栏背景色', + 'header_background' => '顶部背景色', + 'layout' => '布局', + 'menu_layout' => '菜单布局', + 'menu_style' => '菜单样式', + 'sidebar' => [ + 'label' => '侧边栏', + 'width' => '宽度', + 'visible' => '显示', + 'collapsed' => '收起', + 'menu_num' => '菜单并排数量', + ], + 'tabs' => '多标签', + 'light' => '亮色', + 'dark' => '暗色', + 'sider' => '侧边', + 'header_sider' => '顶部-侧边', + 'header' => '顶部', + 'defualt' => '恢复默认配置', + + ], + 'Sidebar' => [ + 'all'=>'全部' + ], + 'Dayjs' => [ + 'weekdays' => explode('_',"星期日_星期一_星期二_星期三_星期四_星期五_星期六"), + 'weekdaysShort' => explode('_',"周日_周一_周二_周三_周四_周五_周六"), + 'weekdaysMin' => explode('_',"日_一_二_三_四_五_六"), + 'months' => explode('_',"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月"), + 'monthsShort' => explode('_',"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月"), + 'weekStart' => 1, + 'yearStart' => 4, + 'formats' => [ + 'LT' => "HH=>mm", + 'LTS' => "HH=>mm=>ss", + 'L' => "YYYY/MM/DD", + 'LL' => "YYYY年M月D日", + 'LLL' => "YYYY年M月D日Ah点mm分", + 'LLLL' => "YYYY年M月D日ddddAh点mm分", + 'l' => "YYYY/M/D", + 'll' => "YYYY年M月D日", + 'lll' => "YYYY年M月D日 HH=>mm", + 'llll' => "YYYY年M月D日dddd HH=>mm" + ], + 'relativeTime' => [ + 'future' => "%s内", + 'past' => "%s前", + 's' => "几秒", + 'm' => "1 分钟", + 'mm' => "%d 分钟", + 'h' => "1 小时", + 'hh' => "%d 小时", + 'd' => "1 天", + 'dd' => "%d 天", + 'M' => "1 个月", + 'MM' => "%d 个月", + 'y' => "1 年", + 'yy' => "%d 年" + ] + ], +]; diff --git a/addons/webman/lang/zh-CN/app_version.php b/addons/webman/lang/zh-CN/app_version.php new file mode 100644 index 0000000..70aaea6 --- /dev/null +++ b/addons/webman/lang/zh-CN/app_version.php @@ -0,0 +1,32 @@ + '版本管理', + 'fields' => [ + 'id' => 'ID', + 'system_key' => '系统标识', + 'app_version' => '版本号', + 'app_version_key' => '版本标识', + 'apk_url' => '安装包地址', + 'force_update' => '强制更新', + 'type' => '类型', + 'hot_update' => '热更新', + 'regular_update' => '定时更新', + 'update_content' => '更新内容', + 'notes' => '操作备注', + 'status' => '状态', + 'created_at' => '创建时间', + ], + 'system_key' => [ + 'android' => 'Android(安卓)', + 'ios' => 'Ios(苹果)', + ], + 'app_version_regex' => '请填写正确的版本号', + 'hot_apk_url' => '热更新包', + 'missing_package_address' => '缺少安装包地址', + 'app_version_key_not_found' => '缺少版本标识', + 'upload_update_package' => '请上传热更新包', + 'hot_apk_url_error' => '热更新包地址错误', + 'decompression_failed' => '解压失败', + 'app_version_key_exists' => '该版本已发布', +]; diff --git a/addons/webman/lang/zh-CN/attachment.php b/addons/webman/lang/zh-CN/attachment.php new file mode 100644 index 0000000..a4ae78a --- /dev/null +++ b/addons/webman/lang/zh-CN/attachment.php @@ -0,0 +1,16 @@ +'附件管理', + 'download'=>'下载', + 'cate'=>[ + 'fields'=>[ + 'name'=>'分类名称', + 'pid'=>'上级分类', + 'permission_type'=>'权限类型', + 'sort'=>'排序', + ], + 'parent'=>'顶级分类', + 'public'=>'所有人', + 'private'=>'私有', + ] +]; diff --git a/addons/webman/lang/zh-CN/auth.php b/addons/webman/lang/zh-CN/auth.php new file mode 100644 index 0000000..007fc2a --- /dev/null +++ b/addons/webman/lang/zh-CN/auth.php @@ -0,0 +1,43 @@ +'访问权限管理', + 'parent'=>'父级', + 'field_title_grant'=>'字段权限(隐藏选中的字段)', + 'field_grant'=>'字段权限', + 'data_grant'=>'数据权限', + 'auth_grant'=>'功能权限', + 'menu_grant'=>'菜单权限', + 'select_user'=>'选个人', + 'select_group'=>'选组织', + 'select_user_tip'=>'具有包含所选人员的查看数据权限', + 'select_group_tip'=>'具有包含所选组织的查看数据数据权限', + 'all'=>'全选', + 'father_son_linkage'=>'父子联动', + 'role_type_error'=>'角色类型错误', + 'fields'=>[ + 'name'=>'名称', + 'desc'=>'描述', + 'status'=>'状态', + 'sort'=>'排序', + 'data_type'=>'数据范围', + 'department'=>'部门列表', + 'type'=>'角色类型', + ], + 'options'=>[ + 'data_type'=>[ + 'full_data_rights' => '全部数据权限', + 'data_permissions_for_this_department' => '本部门数据权限', + 'this_department_and_the_following_data_permissions' => '本部门及以下数据权限', + 'personal_data_rights' => '本人数据权限', + 'custom_data_permissions' => '自定义数据权限', + 'channel_and_the_following_data_permissions' => '子站全部数据权限' + ] + ], + 'type' => [ + AdminDepartment::TYPE_DEPARTMENT => '总站角色', + AdminDepartment::TYPE_CHANNEL => '渠道角色', + ], +]; diff --git a/addons/webman/lang/zh-CN/broadcast.php b/addons/webman/lang/zh-CN/broadcast.php new file mode 100644 index 0000000..3baa875 --- /dev/null +++ b/addons/webman/lang/zh-CN/broadcast.php @@ -0,0 +1,20 @@ + '广播管理', + 'fields' => [ + 'id' => 'ID', + 'copy_num' => '重复次数', + 'title' => '游戏平台', + 'num' => '金额', + 'phone' => '手机号', + 'min_money' => '展示最小金额', + 'max_money' => '展示最大金额', + 'date' => '展示日期', + 'status' => '状态', + 'creator_id' => '创建人', + 'created_at' => '创建时间', + 'updated_at' => '更新时间', + ], +]; diff --git a/addons/webman/lang/zh-CN/channel.php b/addons/webman/lang/zh-CN/channel.php new file mode 100644 index 0000000..c33df20 --- /dev/null +++ b/addons/webman/lang/zh-CN/channel.php @@ -0,0 +1,62 @@ + '渠道管理', + 'normal' => '开启中', + 'disable' => '维护中', + 'name_exist' => '渠道名存在重复', + 'channel_exist' => '渠道域名存在重复', + 'telegram_url_exist' => '渠道Telegram客服已存在', + 'package_url_exist' => '渠道安装地址已存在', + 'save_error' => '保存失败', + 'save_success' => '保存成功', + 'not_fount' => '渠道不存在', + 'fields' => [ + 'id' => '渠道ID', + 'name' => '渠道名称', + 'domain' => '渠道域名', + 'player_num' => '玩家数量', + 'coin_num' => '币商数量', + 'lang' => '默认语言', + 'currency' => '币种', + 'department_id' => '部门id', + 'status' => '状态', + 'telegram_url' => 'Telegram客服', + 'package_url' => '安装包地址', + 'recharge_amount' => '官方充值', + 'withdraw_amount' => '官方提现', + 'third_recharge_amount' => '第三方充值', + 'third_withdraw_amount' => '第三方提现', + 'player_total_amount' => '玩家账户总余额', + 'phone' => '手机号', + 'leader' => '负责人', + 'create_at' => '渠道创建时间', + 'username' => '登录账号', + 'password' => '登录密码', + 'channel_function' => '子站功能', + 'web_login_status' => '网页登录', + 'recharge_status' => '平台充值', + 'withdraw_status' => '平台提现', + 'wallet_action_status' => '玩家钱包操作', + 'department_name' => '渠道', + 'promotion_status' => '推广员功能', + 'pay_type' => '支付方式', + 'game_id' => '游戏', + 'whats_app' => 'WhatsApp', + ], + 'channel_function_help' => '人工(充值,提现)无法和Q币(转入,转出)同时使用', + 'pay_type' => [ + '人工充值', + 'EsPay', + 'OnePay', + 'SKL99', + ], + 'game' => [ + 262 => '转盘', + 263 => '砸金蛋', + 264 => '盲盒', + 265 => '刮刮乐', + 266 => 'TURN', + 267 => '摇色子', + ] +]; diff --git a/addons/webman/lang/zh-CN/channel_financial_record.php b/addons/webman/lang/zh-CN/channel_financial_record.php new file mode 100644 index 0000000..bfd48ba --- /dev/null +++ b/addons/webman/lang/zh-CN/channel_financial_record.php @@ -0,0 +1,32 @@ + '财务操作记录', + 'content' => '序号{setting_id}', + 'fields' => [ + 'id' => 'ID', + 'department_id' => '部门/渠道ID', + 'player_id' => '玩家ID', + 'player' => '玩家信息', + 'target' => '資料表', + 'target_id' => '資料表ID', + 'action' => '操作行为', + 'tradeno' => '操作订单', + 'user_id' => '操作订单', + 'user_name' => '操作人', + 'created_at' => '操作时间', + ], + 'action' => [ + ChannelFinancialRecord::ACTION_RECHARGE_PASS => '充值审核通过', + ChannelFinancialRecord::ACTION_RECHARGE_REJECT => '充值审核拒绝', + ChannelFinancialRecord::ACTION_WITHDRAW_PASS => '提现审核通过', + ChannelFinancialRecord::ACTION_WITHDRAW_REJECT => '提现审核拒绝', + ChannelFinancialRecord::ACTION_WITHDRAW_PAYMENT => '完成打款', + ChannelFinancialRecord::ACTION_RECHARGE_SETTING_ADD => '添加充值账户', + ChannelFinancialRecord::ACTION_RECHARGE_SETTING_STOP => '停用充值账户', + ChannelFinancialRecord::ACTION_RECHARGE_SETTING_ENABLE => '启用充值账户', + ChannelFinancialRecord::ACTION_RECHARGE_SETTING_EDIT => '编辑充值账户', + ] +]; diff --git a/addons/webman/lang/zh-CN/channel_recharge_method.php b/addons/webman/lang/zh-CN/channel_recharge_method.php new file mode 100644 index 0000000..bc5e1f8 --- /dev/null +++ b/addons/webman/lang/zh-CN/channel_recharge_method.php @@ -0,0 +1,19 @@ + '充值账户配置', + 'recharge_setting_info' => '收款账户', + 'fields' => [ + 'id' => 'ID', + 'method_name' => '充值方式名', + 'currency' => '币种', + 'name' => '充值名', + 'bank_name' => '开户行', + 'sub_bank' => '支行', + 'owner' => '户名', + 'account' => '银行账户', + 'user_name' => '创建人', + 'status' => '状态', + 'created_at' => '创建时间', + ] +]; diff --git a/addons/webman/lang/zh-CN/channel_recharge_setting.php b/addons/webman/lang/zh-CN/channel_recharge_setting.php new file mode 100644 index 0000000..61ad497 --- /dev/null +++ b/addons/webman/lang/zh-CN/channel_recharge_setting.php @@ -0,0 +1,53 @@ + '充值方式配置', + 'placeholder_name' => '请输入充值名', + 'placeholder_method' => '请选择充值方式', + 'placeholder_chip_multiple' => '请输入打码倍数', + 'placeholder_coins_num' => '请输入充值coins数量', + 'placeholder_money' => '请输入充值金额', + 'recharge_setting_info' => '充值账户信息', + 'first_recharge_setting' => '首充设置', + 'manual_recharge_setting' => '手动充值设置', + 'usdt_recharge_setting' => 'USDT充值设置', + 'fields' => [ + 'id' => 'ID', + 'department_id' => '部门/渠道id', + 'title' => '标题', + 'method_name' => '充值方式', + 'method_id' => '充值方式id', + 'wallet_address' => '钱包地址', + 'qr_code' => '二维码', + 'rate' => '汇率', + 'chip_multiple' => '打码倍数', + 'coins_num' => 'coins数量', + 'gift_coins' => '赠送coins', + 'first_coins' => '首充赠送coins', + 'money' => '金额', + 'type' => '充值类型', + 'user_id' => '管理员id', + 'user_name' => '创建人', + 'status' => '状态', + 'created_at' => '创建时间', + ], + 'rul' => [ + 'chip_multiple_required' => '打码倍数必填', + 'chip_multiple_min_0' => '打码倍数最少为0', + 'chip_multiple_max_100000000' => '打码倍数最大设置1亿', + 'coins_num_required' => 'coins数量必填', + 'coins_num_min_1' => 'coins数量最少为1', + 'coins_num_max_100000000' => 'coins数量最大设置1亿', + 'gift_coins_min_1' => 'coins数量最少为1', + 'gift_coins_max_100000000' => '赠送coins数量最大设置1亿', + 'money_required' => '充值金额必填', + 'money_min_1' => '充值金额最少为1', + 'money_max_100000000' => '充值金额最大设置1亿', + ], + 'type' => [ + ChannelRechargeSetting::TYPE_REGULAR => '普通充值', + ChannelRechargeSetting::TYPE_ACTIVITY => '活动充值', + ] +]; diff --git a/addons/webman/lang/zh-CN/commission_record.php b/addons/webman/lang/zh-CN/commission_record.php new file mode 100644 index 0000000..eb48d7e --- /dev/null +++ b/addons/webman/lang/zh-CN/commission_record.php @@ -0,0 +1,24 @@ + '玩赚记录', + 'fields' => [ + 'id' => 'ID', + 'recharge_amount' => '首充金额', + 'total_amount' => '总佣金', + 'damage_amount' => '客损金额', + 'amount' => '当期佣金', + 'ratio' => '佣金比例', + 'date' => '结算日期', + 'create_at' => '创建时间', + 'commission_first_recharge' => '用户首充', + 'commission_damage' => '客损佣金比', + 'commission_chip_multiple' => '打码量倍数', + ], + 'player_info' => '玩家信息', + 'parent_player_info' => '分润玩家', + 'commission_setting' => '玩赚配置', + 'commission_first_recharge' => '邀请新用户,新用户首笔充值可获得 {$usd}USD', + 'commission_damage' => '用户每日客损的 {$ratio}% 会作为佣金给到您', + 'commission_chip_multiple' => '活动的佣金同充值COINS', +]; diff --git a/addons/webman/lang/zh-CN/config.php b/addons/webman/lang/zh-CN/config.php new file mode 100644 index 0000000..b0b2405 --- /dev/null +++ b/addons/webman/lang/zh-CN/config.php @@ -0,0 +1,10 @@ + '系统配置', + 'logo' => '网站LOGO', + 'name' => '网站名称', + 'miitbeian' => '网站备案号', + 'copyright' => '网站版权信息', + +]; diff --git a/addons/webman/lang/zh-CN/currency.php b/addons/webman/lang/zh-CN/currency.php new file mode 100644 index 0000000..dfae30e --- /dev/null +++ b/addons/webman/lang/zh-CN/currency.php @@ -0,0 +1,25 @@ + '货币管理', + 'normal'=>'正常', + 'disable'=>'禁用', + 'currency'=>'货币', + 'game_coins'=>'游戏点', + 'currency_has_exists'=>'该货币已存在配置', + 'fields' => [ + 'id' => '货币ID', + 'name' => '货币名称', + 'identifying' => '货币标识', + 'ratio' => '1货币价格', + 'status' => '状态', + 'create_at' => '创建时间', + ], + 'currency_name' => [ + 'CYN' => '人民币', + 'TWD' => '新台币', + 'USD' => '美元', + 'JPY' => '日元', + 'RM' => '马币', + ], +]; diff --git a/addons/webman/lang/zh-CN/data_center.php b/addons/webman/lang/zh-CN/data_center.php new file mode 100644 index 0000000..35ea270 --- /dev/null +++ b/addons/webman/lang/zh-CN/data_center.php @@ -0,0 +1,21 @@ +'总充值', + 'recharge_activity'=>'活动充值', + 'recharge_regular'=>'普通充值', + 'withdraw_all'=>'总提现', + 'withdraw_self'=>'官方提现', + 'withdraw_business'=>'币商转入', + 'today_add_player'=>'今日新增会员', + 'player_all'=>'总会员', + 'today_active_player'=>'今日活跃玩家', + 'mouth_active_player'=>'本月活跃玩家', + 'recharge_chart' => '充值趋势图', + 'recharge_amount' => '充值金额', + 'withdraw_chart' => '提现趋势图', + 'withdraw_amount' => '提现金额', + 'player_chart' => '新增玩家', + 'player_amount' => '玩家数量', + 'department_id' => '渠道ID', + 'department_name' => '渠道名', +]; diff --git a/addons/webman/lang/zh-CN/department.php b/addons/webman/lang/zh-CN/department.php new file mode 100644 index 0000000..d7e7a15 --- /dev/null +++ b/addons/webman/lang/zh-CN/department.php @@ -0,0 +1,23 @@ + '部门管理', + 'normal'=>'正常', + 'disable'=>'禁用', + 'parent_id_repeat'=>'上级部门不能为本部门', + 'fields' => [ + 'pid' => '上级部门', + 'name' => '部门名称', + 'leader' => '负责人', + 'mobile' => '手机号', + 'status' => '状态', + 'sort' => '排序', + 'create_at' => '创建时间', + ], + 'type' => [ + AdminDepartment::TYPE_DEPARTMENT => '总站管理员', + AdminDepartment::TYPE_CHANNEL => '渠道管理员', + ], +]; diff --git a/addons/webman/lang/zh-CN/echart.php b/addons/webman/lang/zh-CN/echart.php new file mode 100644 index 0000000..2f2409c --- /dev/null +++ b/addons/webman/lang/zh-CN/echart.php @@ -0,0 +1,11 @@ + '点', + 'to' => '到', + 'month' => '月', + 'yesterday' => '昨天', + 'today' => '今天', + 'this_week' => '本周', + 'this_month' => '本月', + 'this_year' => '今年', +]; diff --git a/addons/webman/lang/zh-CN/first_recharge_setting.php b/addons/webman/lang/zh-CN/first_recharge_setting.php new file mode 100644 index 0000000..dcb6711 --- /dev/null +++ b/addons/webman/lang/zh-CN/first_recharge_setting.php @@ -0,0 +1,23 @@ + '首充奖励', + 'fields' => [ + 'model' => '发放模式', + 'type' => '奖励类型', + 'number' => '奖励coin', + 'number_percent' => '奖励百分比', + 'chip_amount' => '提现打码倍数', + 'add_number' => '累计充值', + ], + 'model' => [ + SystemSetting::FIRST_RECHARGE_MODEL_ONE => '一次性发放', + SystemSetting::FIRST_RECHARGE_MODEL_ADD => '累计发放', + ], + 'type' => [ + SystemSetting::FIRST_RECHARGE_TYPE_VALUE => '固定额度', + SystemSetting::FIRST_RECHARGE_TYPE_PERCENT => '百分比', + ] +]; diff --git a/addons/webman/lang/zh-CN/form.php b/addons/webman/lang/zh-CN/form.php new file mode 100644 index 0000000..7fa6432 --- /dev/null +++ b/addons/webman/lang/zh-CN/form.php @@ -0,0 +1,17 @@ +'添加', + 'edit' => '编辑', + 'please_enter' => '请输入', + 'please_select' => '请选择', + 'cancel' => '取消', + 'submit' => '提交', + 'reset' => '重置', + 'complete' => '完成', + 'pre_step' => '上一步', + 'next_step' => '下一步', + 'operation_complete' => '操作完成', + 'resubmit' => '重新提交', + 'save_success' => '数据保存成功', + 'save_fail' => '数据保存失败', +]; diff --git a/addons/webman/lang/zh-CN/game.php b/addons/webman/lang/zh-CN/game.php new file mode 100644 index 0000000..049a755 --- /dev/null +++ b/addons/webman/lang/zh-CN/game.php @@ -0,0 +1,44 @@ + '游戏列表', + 'fields' => [ + 'id' => '游戏ID', + 'name' => '游戏名称', + 'game_image' => '游戏图片', + 'consume' => '抽奖消耗', + 'prize_num' => '奖品数量', + 'logo' => '游戏图标', + 'description' => '描述信息', + 'game_type' => '游戏类型', + 'game_url' => '游戏链接', + 'status' => '状态', + 'create_at' => '创建时间', + 'updated_at' => '修改时间', + ], + 'game_platform' => '游戏供应商信息', + 'app_id' => '账号序列号 : {app_id}', + 'app_secret' => '账号密钥 : {app_secret}', + 'domain' => 'API地址 : {domain}', + 'admin_url' => '后台网址 : {admin_url}', + 'admin_user' => '后台登入用户名 : {admin_user}', + 'nu_set' => ' 未配置 ', + 'unit' => '人', + 'game_status' => '游戏状态', + 'is_online' => [ + '未上线', + '已上线' + ], + 'view_prize' => '查看奖品', + 'enter_game' => '进入游戏', + 'game_type' => [ + Game::GAME_TYPE_EGG => '砸金蛋', + Game::GAME_TYPE_TURNTABLE => '转盘', + Game::GAME_TYPE_BLINDBOX => '盲盒', + Game::GAME_TYPE_TICKET => '刮刮乐', + Game::GAME_TYPE_LOTTERY => '抽奖', + Game::GAME_TYPE_DICE => '摇色子', + ], +]; diff --git a/addons/webman/lang/zh-CN/game_platform.php b/addons/webman/lang/zh-CN/game_platform.php new file mode 100644 index 0000000..0a9900a --- /dev/null +++ b/addons/webman/lang/zh-CN/game_platform.php @@ -0,0 +1,27 @@ + '游戏列表', + 'fields' => [ + 'id' => '游戏厂商ID', + 'name' => '平台名称', + 'title' => '游戏供应商名', + 'status' => '状态', + 'created_at' => '创建时间', + 'service_ratio' => '供应商分润比例', + ], + 'game_platform' => '游戏供应商信息', + 'update_game_list' => '更新游戏列表', + 'update_game_list_confirm' => '您确定要更新该游戏厂商列表吗?', + 'action_error' => '操作失败', + 'action_success' => '操作成功', + 'enter_game' => '进入游戏大厅', + 'enter_game_confirm' => '您确定要进入该游戏厂商大厅吗?', + 'status' => [ + 0 => '禁用', + 1 => '启用' + ], + 'save_error' => '保存失败', + 'save_success' => '保存成功', + 'not_fount' => '供应商不存在', +]; diff --git a/addons/webman/lang/zh-CN/game_type.php b/addons/webman/lang/zh-CN/game_type.php new file mode 100644 index 0000000..7816f9e --- /dev/null +++ b/addons/webman/lang/zh-CN/game_type.php @@ -0,0 +1,15 @@ + '游戏类型列表', + 'fields' => [ + 'id' => 'ID', + 'game_type' => '游戏类型', + 'ratio' => '返佣', + 'created_at' => '创建时间', + 'updated_at' => '修改时间' + ], + 'nu_set' => ' 未配置 ', +]; diff --git a/addons/webman/lang/zh-CN/grid.php b/addons/webman/lang/zh-CN/grid.php new file mode 100644 index 0000000..3e7371f --- /dev/null +++ b/addons/webman/lang/zh-CN/grid.php @@ -0,0 +1,22 @@ + '列表', + 'add'=>'添加', + 'edit' => '编辑', + 'detail' => '详情', + 'delete' => '删除', + 'sort' => '排序', + 'action' => '操作', + 'confim_delete' => '确认删除?', + 'confim_restore' => '确认恢复?', + 'restore' => '恢复数据', + 'update_success' => '更新成功', + 'delete_success' => '删除成功', + 'restore_success' => '恢复成功', + 'delete_error' => '删除失败', + 'sort_success' => '排序成功', + 'user_info' => '用户信息', + 'pagination'=>[ + 'total' => '共 {total} 条', + ] +]; diff --git a/addons/webman/lang/zh-CN/login.php b/addons/webman/lang/zh-CN/login.php new file mode 100644 index 0000000..ebae51f --- /dev/null +++ b/addons/webman/lang/zh-CN/login.php @@ -0,0 +1,18 @@ + '登录账号不能为空', + 'password_not_empty' => '登录密码不能为空', + 'password_min_length' => '密码最少5位数', + 'success' => '登陆成功', + 'logout' => '已退出登录', + 'error' => '账号密码错误', + 'captcha_error' => '验证码错误', + 'source_not_empty' => '来源不能为空', + 'agent_login' => '子站登录', + 'admin_login' => '登录', + 'enter_account' => '请输入账号', + 'enter_password' => '请输入密码', + 'enter_verify' => '请输入验证码', + 'password_verify' => '密码输入长度不能少于5位', + 'login' => '登录', +]; diff --git a/addons/webman/lang/zh-CN/menu.php b/addons/webman/lang/zh-CN/menu.php new file mode 100644 index 0000000..fa0eb53 --- /dev/null +++ b/addons/webman/lang/zh-CN/menu.php @@ -0,0 +1,116 @@ + '添加菜单', + 'title' => '系统菜单管理', + 'fields' => [ + 'top' => '顶级菜单', + 'pid' => '上级菜单', + 'name' => '菜单名称', + 'url' => '菜单链接', + 'icon' => '菜单图标', + 'sort' => '排序', + 'status' => '状态', + 'open' => '菜单展开', + 'super_status' => '超级管理员状态', + 'type' => '菜单类型', + ], + 'options' => [ + 'admin_visible' => [ + [1 => '显示'], + [0 => '隐藏'] + ] + ], + 'type' => [ + AdminDepartment::TYPE_DEPARTMENT => '总站菜单', + AdminDepartment::TYPE_CHANNEL => '渠道菜单', + ], + 'titles' => [ + 'home' => '首页', + 'system' => '系统', + 'system_manage' => '系统管理', + 'config_manage' => '配置管理', + 'attachment_manage' => '附件管理', + 'permissions_manage' => '权限管理', + 'admin' => '用户管理', + 'role_manage' => '角色管理', + 'menu_manage' => '菜单管理', + 'plug_manage' => '插件管理', + 'department_manage' => '部门管理', + 'post_manage' => '岗位管理', + /** 总后台 */ + 'admin_manage' => '总后台', + 'data_center' => '数据中心', + //用户管理 + 'user_manage' => '玩家管理', + 'user_manage_list' => '玩家列表', + 'accounting_change_records' => '账变记录', + //财务数据 + 'financial_data' => '财务数据', + 'recharge_record' => '充值记录', + 'withdrawal_records' => '提现记录', + //报表中心 + 'report_center' => '报表中心', + //客户端管理 + 'client_manager' => '客户端管理', + 'rotation_chart_manager' => '轮播图管理', + 'announcement_manager' => '公告管理', + 'system_settings' => '系统设置', + //渠道管理 + 'channel_manager' => '渠道管理', + 'channel_list' => '渠道列表', + 'currency_manager' => '货币管理', + /** 渠道后台 */ + 'channel_manage' => '渠道后台', + 'channel_data_center' => '数据中心', + //玩家管理 + 'channel_player_manage' => '玩家管理', + 'channel_player_list' => '玩家列表', + 'channel_player_accounting_change_records' => '账变记录', + //前端配置 + 'channel_client_manager' => '客户端管理', + 'channel_rotation_chart_manager' => '轮播图管理', + 'channel_marquee_manager' => '跑马灯管理', + 'channel_announcement_manager' => '公告管理', + //财务管理 + 'channel_financial_manager' => '财务管理', + 'channel_recharge_review' => '充值审核', + 'channel_withdrawal_review' => '提现审核', + 'channel_withdrawal_and_payment' => '提现打款', + 'channel_recharge_record' => '充值记录', + 'channel_withdrawal_records' => '提现记录', + 'channel_recharge_channel_configuration' => '充值渠道配置', + 'channel_financial_operation_records' => '财务操作记录', + //权限管理 + 'channel_auth_manager' => '权限管理', + 'channel_admin_user_manager' => '用户管理', + 'channel_post_manager' => '岗位管理', + //日志中心 + 'log_center' => '日志中心', + 'player_edit_log' => '玩家资料修改日志', + 'player_money_edit_log' => '钱包操作日志', + //游戏管理 + 'game_manage' => '游戏管理', + 'game_record' => '游戏记录', + 'game_out_in' => '游戏转入/出记录', + 'game_list' => '游戏列表', + 'version_manager' => '版本管理', + 'activity_manager' => '活动管理', + 'activity_list' => '活动列表', + 'recharge_manager' => '充值管理', + 'recharge_channels' => '充值渠道', + 'play_and_earn' => '边玩边赚', + 'play_and_earn_record' => '玩赚记录', + //推广管理 + 'channel_player_promoter' => '推广管理', + 'channel_player_promoter_list' => '推广员列表', + 'profit_record' => '分润报表', + 'profit_settlement_record' => '分润结算记录', + //二维码 + 'qrcode' => '二维码管理', + 'qrcode_list' => '二维码批次列表', + 'qrcode_holder' => '持码人列表', + ] +]; diff --git a/addons/webman/lang/zh-CN/notice.php b/addons/webman/lang/zh-CN/notice.php new file mode 100644 index 0000000..9eaa5a1 --- /dev/null +++ b/addons/webman/lang/zh-CN/notice.php @@ -0,0 +1,14 @@ + [ + Notice::TYPE_EXAMINE_RECHARGE => '玩家充值待审核通知', + Notice::TYPE_EXAMINE_WITHDRAW => '玩家提现待审核通知', + ], + 'content' => [ + Notice::TYPE_EXAMINE_RECHARGE => '新的充值订单待审核, 玩家: {player_name}, 充值游戏点: {coins} 充值金额: {money}!', + Notice::TYPE_EXAMINE_WITHDRAW => '新的提现订单待审核, 玩家: {player_name}, 提现游戏点: {coins} 提现金额: {money}!', + ], +]; diff --git a/addons/webman/lang/zh-CN/play_game_record.php b/addons/webman/lang/zh-CN/play_game_record.php new file mode 100644 index 0000000..dff176e --- /dev/null +++ b/addons/webman/lang/zh-CN/play_game_record.php @@ -0,0 +1,23 @@ + '玩家游戏记录', + 'fields' => [ + 'id' => 'ID', + 'game_code' => '游戏编号', + 'bet' => '押注额', + 'win' => '贏取额', + 'reward' => '奖金(不计入贏取)', + 'order_no' => '单号(游戏平台)', + 'status' => '状态', + 'platform_action_at' => '结算时间(游戏平台)', + 'action_at' => '结算时间', + 'create_at' => '创建时间', + ], + 'status' => [ + PlayGameRecord::STATUS_UNSETTLED => '未分润', + PlayGameRecord::STATUS_SETTLED => '已分润', + ] +]; diff --git a/addons/webman/lang/zh-CN/player.php b/addons/webman/lang/zh-CN/player.php new file mode 100644 index 0000000..c99849a --- /dev/null +++ b/addons/webman/lang/zh-CN/player.php @@ -0,0 +1,153 @@ + '玩家列表', + 'details' => '玩家详情', + 'player' => '玩家', + 'coin_recharge_money' => '充值金额', + 'coin_recharge_coins' => '充值点数', + 'coin_recharge_title' => '您正在给{uuid}充值, 请输入收款金额和充值点数', + 'coin_recharge_error' => '币商充值失败', + 'coin_recharge_success' => '币商充值成功', + 'artificial_recharge_error' => '人工充值失败', + 'artificial_recharge_success' => '人工充值成功', + 'artificial_withdrawal_error' => '人工提现失败', + 'artificial_withdrawal_success' => '人工提现成功', + 'insufficient_balance' => '账户余额不足', + 'fields' => [ + 'id' => 'ID', + 'phone' => '手机号(账号)', + 'level' => '玩家等级', + /** TODO 翻译 */ + 'name' => '用户昵称', + 'currency' => '币种', + 'email' => '邮箱', + 'line' => 'line', + 'department_id' => '渠道', + 'status' => '账号状态', + 'status_withdraw' => '取款功能', + 'status_transfer' => '转点功能', + 'status_open_coins' => '开赠权限', + 'created_at' => '注册时间', + 'avatar' => '玩家头像', + 'machine_play_num' => '可玩机台数', + 'login_at' => '最近登录时间', + 'register_ip' => '注册IP', + 'register_domain' => '注册域名', + 'country_code' => '国家/地区号', + 'player_tag' => '标签', + 'uuid' => '玩家UID', + 'type' => '玩家类型', + 'player_login_record' => '最后登录时间', + 'play_password' => '支付密码', + 'password' => '登录密码', + 'recommend_code' => '推广码', + 'recommend_promoter_name' => '所属推广员', + 'chip_amount' => '当前打码量', + 'must_chip_amount' => '目标打码量', + 'is_promoter' => '是否为推广员', + ], + 'player_no_change' => '玩家沒有變動', + 'not_fount' => '未找到该玩家', + 'disable' => '该玩家已被禁用', + 'change_player_content' => '更換遊戲玩家: {form} ➜ {to}', + 'player_change_success' => '玩家更换成功', + 'player_machine_limit' => '玩家更換失敗,此玩家最多只能遊玩{machinePlayNum}台更换成功', + 'password_min_number' => '密码最少6位数', + 'password_confim_validate' => '输入密码不一致', + 'update_password' => '修改密码', + 'reset_password' => '重置密码', + 'old_password' => '旧密码', + 'old_password_error' => '旧密码错误', + 'new_password' => '新密码', + 'confim_password' => '确认密码', + 'remark_edit_success' => '备注更新成功', + 'player_info' => '玩家信息', + 'save_player_info_success' => '保存成功', + 'add_player' => '添加玩家', + 'phone_has_register' => '手机号已注册', + 'avatar_type' => '头像', + 'upload_avatar' => '上传头像', + 'def_avatar' => '默认头像', + 'action_error' => '操作失败', + 'action_success' => '操作成功', + 'phone_exist' => '手机号已注册', + 'player_recharge_record' => '充值记录', + 'player_withdraw_record' => '提现记录', + 'player_game_record' => '游戏记录', + 'confirm' => [ + 'change_player_confirm' => '是否确认更改玩家?', + ], + 'btn' => [ + 'change_player' => '更改玩家', + ], + 'wallet' => [ + 'player_wallet' => '玩家钱包', + 'deduct' => '扣点', + 'increase' => '加点', + 'wallet_from' => '钱包信息', + 'wallet' => '钱包余额', + 'type' => '类型', + 'action' => '操作', + 'money' => '金额', + 'textarea' => '备注', + 'wallet_operation_failed' => '钱包操作失败', + 'wallet_operation_success' => '钱包操作成功', + 'player_apply_manual_system_add' => '人工系统金额已派发到玩家主钱包', + 'operation_amount_error' => '操作金额错误', + 'wallet_type_error' => '操作类型错误', + 'player_error' => '玩家错误', + 'wallet_action_log_not_found' => '玩家钱包操作日志不存在', + 'insufficient_player_money' => '玩家余额不足', + 'unlimited' => '不限制', + 'modify' => '修改余额', + 'artificial_recharge' => '人工充值', + 'artificial_withdrawal' => '人工提现', + 'artificial_recharge_tip' => '人工充值,无需人工介入审核,充值完成后游戏点将直接发放给玩家账户,并记录充值信息.', + 'artificial_withdrawal_tip' => '人工提现,无需人工介入审核,提现完成后将直接扣除玩家钱包余额,并记录提现信息.', + 'wallet_type' => [ + PlayerMoneyEditLog::RECHARGE => '充值', + PlayerMoneyEditLog::VIP_RECHARGE => 'VIP充值', + PlayerMoneyEditLog::ACTIVITY_GIVE => '活動外贈', + PlayerMoneyEditLog::ADMIN_DEDUCT => '管理员扣点', + PlayerMoneyEditLog::ADMIN_INCREASE => '管理员加点', + PlayerMoneyEditLog::OTHER => '其他', + ] + ], + 'player_delivery_record' => '钱包操作', + 'wallet_action_status_has_closed' => '已关闭渠道钱包操作功能!', + 'level_setting' => '玩家等级', + 'level' => [ + 1 => 'level 1', + 2 => 'level 2', + 3 => 'level 3', + 4 => 'level 4', + 5 => 'level 5', + 6 => 'level 6', + 7 => 'level 7', + 8 => 'level 8', + 9 => 'level 9', + 10 => 'level 10', + 11 => 'level 11', + 12 => 'level 12', + 13 => 'level 13' + ], + 'no_level' => '无等级', + 'set_promoter' => '设置推广员', + 'set_promoter_tip' => '玩家账户必须满足, 未归属于莫个推广员才能被设置为一级推广员, 二级推广员由一级推广员在客户端设置.', + 'not_promoter' => '非推广员', + 'promoter' => '推广员', + 'present_coins' => '赠送coins', + 'account' => '账户', + 'account_name' => '账户名', + 'bank_name' => '银行名称', + 'bind_promoter' => '绑定推广员', + 'bind_promoter_confirm' => '提示: 推广员关系一旦绑定将无法解除, 请确认是否绑定?', + 'player_report' => '玩家报表', + 'bet_total' => '电子游戏打码量', + 'diff_total' => '电子游戏输赢', + 'cancel_transfer' => '取消转账', + 'cancel_transfer_confirm' => '您正在取消玩家 {uuid} 在游戏平台的转账操作, 玩家在该平台的余额须手动在后台增加, 请确认是否继续?', +]; diff --git a/addons/webman/lang/zh-CN/player_chip_record.php b/addons/webman/lang/zh-CN/player_chip_record.php new file mode 100644 index 0000000..aa07ce0 --- /dev/null +++ b/addons/webman/lang/zh-CN/player_chip_record.php @@ -0,0 +1,26 @@ + '打码量列表', + 'fields' => [ + 'id' => 'ID', + 'name' => '游戏名称', + 'chip_amount' => '当前打码量', + 'must_chip_amount' => '目标打码量', + 'record_type' => '类型', + 'amount' => '发生金额', + 'created_at' => '创建时间', + ], + 'record_type' => [ + PlayerChipRecord::RECORD_TYPE_SIGN => '签到', + PlayerChipRecord::RECORD_TYPE_RECHARGE => '普通充值', + PlayerChipRecord::RECORD_TYPE_ACTIVITY => '活动充值', + PlayerChipRecord::RECORD_TYPE_GAME => '游戏押注', + PlayerChipRecord::RECORD_TYPE_COMMISSION => '分润', + PlayerChipRecord::RECORD_TYPE_BANKRUPTCY => '破产', + PlayerChipRecord::RECORD_TYPE_BET_REBATE => '打码返水', + PlayerChipRecord::RECORD_TYPE_FIRST_RECHARGE_REWARD => '首充奖励', + ] +]; diff --git a/addons/webman/lang/zh-CN/player_delivery_record.php b/addons/webman/lang/zh-CN/player_delivery_record.php new file mode 100644 index 0000000..e4bc2b9 --- /dev/null +++ b/addons/webman/lang/zh-CN/player_delivery_record.php @@ -0,0 +1,43 @@ + '账变记录', + 'fields' => [ + 'id' => 'ID', + 'player_id' => '玩家', + 'target' => '交易資料表', + 'target_id' => '資料id', + 'type' => '类型', + 'source' => '交易对象', + 'amount' => '游戏点', + 'user_id' => '管理员id', + 'user_name' => '操作人', + 'amount_before' => '变更前点数', + 'amount_after' => '变更后点数', + 'tradeno' => '单号', + 'remark' => '备注', + 'updated_at' => '更新时间', + 'created_at' => '创建时间', + ], + 'type' => [ + PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD => '(管理后台)加点', + PlayerDeliveryRecord::TYPE_RECHARGE => '充值', + PlayerDeliveryRecord::TYPE_WITHDRAWAL => '提现', + PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT => '(管理后台)扣点', + PlayerDeliveryRecord::TYPE_WITHDRAWAL_BACK => '提现回退', + PlayerDeliveryRecord::TYPE_REGISTER_PRESENT => '注册赠送', + PlayerDeliveryRecord::TYPE_COMMISSION => '返佣金', + PlayerDeliveryRecord::TYPE_SIGN => '签到', + PlayerDeliveryRecord::TYPE_GAME_OUT => '游戏转出', + PlayerDeliveryRecord::TYPE_GAME_IN => '游戏转入', + PlayerDeliveryRecord::TYPE_BET_REBATE => '打码量返水', + PlayerDeliveryRecord::TYPE_DAMAGE_REBATE => '客损返水', + PlayerDeliveryRecord::TYPE_RECHARGE_REWARD => '首充奖励', + PlayerDeliveryRecord::TYPE_PROFIT => '推广员分润', + PlayerDeliveryRecord::TYPE_CANCELTRANSFER => '管理员取消转账', + ], + 'detail' => '详情', + 'chart' => '图表', +]; diff --git a/addons/webman/lang/zh-CN/player_edit_log.php b/addons/webman/lang/zh-CN/player_edit_log.php new file mode 100644 index 0000000..9f45a22 --- /dev/null +++ b/addons/webman/lang/zh-CN/player_edit_log.php @@ -0,0 +1,42 @@ + '玩家资料修改日志', + 'fields' => [ + 'id' => '编号', + 'origin_data' => '原数据', + 'new_data' => '操作后数据', + 'create_at' => '操作时间', + ], + 'details' => '操作详情', + 'created_at_start' => '日志开始时间', + 'created_at_end' => '日志结束时间', + 'admin_user' => '管理员', + 'action_info' => '操作详情', + 'action' => [ + 'status_open' => '启用玩家账户', + 'status_stop' => '停用玩家账户', + 'status_withdraw_open' => '开启提现功能', + 'status_withdraw_close' => '关闭提现功能', + 'status_open_coins_open' => '启用玩家提现功能', + 'status_open_coins_close' => '关闭玩家开赠功能', + 'name' => '修改玩家名称: ', + 'phone' => '修改玩家手机号: ', + 'country_code' => '修改玩家国家/地区号: ', + 'play_password' => '修改支付密码: ', + 'password' => '修改登录密码: ', + 'avatar' => '修改头像: ', + 'sex' => '修改性别: ', + 'email' => '修改邮箱: ', + 'qq' => '修改QQ: ', + 'telegram' => '修改telegram: ', + 'birthday' => '修改生日: ', + 'id_number' => '修改身份证: ', + 'address' => '修改地址: ', + 'wechat' => '修改微信号: ', + 'whatsapp' => '修改whatsapp: ', + 'facebook' => '修改facebook: ', + 'line' => '修改Line: ', + 'remark' => '修改备注: ', + ] +]; diff --git a/addons/webman/lang/zh-CN/player_extend.php b/addons/webman/lang/zh-CN/player_extend.php new file mode 100644 index 0000000..12f193f --- /dev/null +++ b/addons/webman/lang/zh-CN/player_extend.php @@ -0,0 +1,33 @@ + [ + 'id' => 'ID', + 'player_id' => '玩家ID', + 'sex' => '性别', + 'email' => '邮箱', + 'ip' => 'IP地址', + 'qq' => 'QQ账号', + 'telegram' => 'Telegram', + 'birthday' => '生日', + 'id_number' => '身份证', + 'address' => '地址', + 'wechat' => '微信号', + 'whatsapp' => 'Whatsapp', + 'facebook' => 'Facebook', + 'line' => 'Line', + 'remark' => '备注', + 'coin_recharge_amount' => '币商充值', + 'present_out' => '转出', + 'present_in' => '转入', + 'recharge_amount' => '总充值点数', + 'withdraw_amount' => '总提现点数', + 'present_out_amount' => '总转出点数', + 'present_in_amount' => '总转入点数', + 'third_recharge_amount' => '第三方总充值点数', + 'third_withdraw_amount' => '第三方总提现点数', + 'created_at' => '创建时间', + 'updated_at' => '更新时间', + ], + 'remark_limit' => '备注字符不能超过255个字' +]; diff --git a/addons/webman/lang/zh-CN/player_level.php b/addons/webman/lang/zh-CN/player_level.php new file mode 100644 index 0000000..2e3855a --- /dev/null +++ b/addons/webman/lang/zh-CN/player_level.php @@ -0,0 +1,25 @@ + '玩家等级', + 'recharge_amount' => '充值金额', + 'chip_multiple' => '提现打码量倍数', + 'bet_rebate_amount' => '返水所需打码量额度', + 'bet_rebate_ratio' => '打码量返水比值', + 'damage_rebate_ratio' => '客损返水比值', + 'help' => [ + 'recharge_amount' => '充值金额配置最大只能设置{max_amount}', + 'chip_multiple' => '提现打码量倍数最大只能设置{max_multiple}', + 'bet_rebate_amount' => '返水所需打码量额度最大只能设置{max_amount}', + 'bet_rebate_ratio' => '打码量返水比值最大只能设置{max_ratio}', + 'damage_rebate_ratio' => '客损返水比值最大只能设置{max_ratio}', + 'level_name' => '等级名称最多输入20个字符', + 'level_content' => '等级介绍最多输入500个字符', + ], + 'recharge_amount_must_gt_upper' => '{level},充值金额配置必须大于上一个等级', + 'recharge_amount_must_lt_next' => '{level},充值金额配置必须小于上下个等级', + 'recharge_amount_not_found' => '{level},充值金额配置为必填项', + 'level' => '玩家等级', + 'level_name' => '等级名称', + 'level_content' => '等级描述内容', +]; diff --git a/addons/webman/lang/zh-CN/player_money_edit_log.php b/addons/webman/lang/zh-CN/player_money_edit_log.php new file mode 100644 index 0000000..99c984d --- /dev/null +++ b/addons/webman/lang/zh-CN/player_money_edit_log.php @@ -0,0 +1,40 @@ + '钱包操作日志', + 'fields' => [ + 'id' => '编号', + 'money' => '金额', + 'action' => '操作类型', + 'origin_money' => '原始金额', + 'after_money' => '异动后金額', + 'create_at' => '操作时间', + 'remark' => '备注', + ], + 'created_at_start' => '日志开始时间', + 'created_at_end' => '日志结束时间', + 'admin_user' => '管理员', + 'player_info' => '玩家信息', + 'action_info' => '操作信息', + 'action' => [ + PlayerMoneyEditLog::RECHARGE => '充值', + PlayerMoneyEditLog::VIP_RECHARGE => 'VIP充值', + PlayerMoneyEditLog::ACTIVITY_GIVE => '活動外贈', + PlayerMoneyEditLog::ADMIN_DEDUCT => '管理员扣点', + PlayerMoneyEditLog::OTHER => '其他', + ], + 'total_data' => [ + 'total_recharge' => '充值', + 'total_vip_recharge' => 'VIP充值', + 'total_testing_machine' => '测试机台', + 'total_other' => '其他', + 'total_activity_give' => '活動外贈', + 'total_triple_seven_give' => '三七鋼珠外贈', + 'total_composite_machine_give' => '複合機外贈', + 'total_electronic_give' => '電子外贈', + 'total_admin_deduct' => '管理员扣点', + 'total_real_person_give' => '真人外贈', + ], +]; diff --git a/addons/webman/lang/zh-CN/player_platform_cash.php b/addons/webman/lang/zh-CN/player_platform_cash.php new file mode 100644 index 0000000..63e624c --- /dev/null +++ b/addons/webman/lang/zh-CN/player_platform_cash.php @@ -0,0 +1,20 @@ + '平台钱包', + 'fields' => [ + 'id' => 'ID', + 'player_id' => '玩家ID', + 'platform_id' => '平台ID', + 'platform_name' => '平台名称', + 'money' => '点数', + 'status' => '游戏平台状态', + 'created_at' => '创建时间', + 'updated_at' => '更新时间', + ], + 'platform_name' => [ + PlayerPlatformCash::PLATFORM_SELF => '钱包余额' + ] +]; diff --git a/addons/webman/lang/zh-CN/player_promoter.php b/addons/webman/lang/zh-CN/player_promoter.php new file mode 100644 index 0000000..8bcd34b --- /dev/null +++ b/addons/webman/lang/zh-CN/player_promoter.php @@ -0,0 +1,79 @@ + '推广员', + 'ratio_placeholder' => '最大分润比例{max_ratio}%', + 'ratio_help_parent' => '上级分润 {max_ratio}% 可给下级推广员分润最大 {max_ratio}%', + 'ratio_help_platform' => '平台分润 {max_ratio}% 可给推广员分润最大 {max_ratio}%', + 'ratio_max_error' => '分润比例设置错误最大不能超过 {max_ratio}%', + 'ratio_min_error' => '分润比例设置错误最大不能超过 {min_ratio}%', + 'submit_confirm' => '已成为推广员的玩家,将无法再设置为非推广员.', + 'promoter_player_info' => '个人信息', + 'parent_promoter_player_info' => '上级信息', + 'promoter_info' => '推广员信息', + 'promoter_team_info' => '团队信息', + 'name_max_length' => '备注名最大30个字', + 'settlement' => '分润结算', + 'settlementclear' => '分润清零', + 'not_fount' => '推广员不存在', + 'has_disable' => '推广员已禁用', + 'profit_amount_error' => '结算分润异常请对账后处理!', + 'settlement_clear_confirm' => '您正在对推广员 {uuid} 进行分润清零操作, 当前可结算分润(个人) {amount}, 请确认是否清零?', + 'settlement_confirm' => '您正在对推广员 {uuid} 进行结算操作, 当前可结算分润(个人) {amount}, 结算分润为负时将会累计到下期, 请确认是否结算?', + 'profit_amount_not_found' => '无可结算的分润!', + 'profit_amount_must_positive' => '可结算分润必须为正数!', + 'promoter_players' => '直系玩家', + 'promoter_team' => '直系团队', + 'settlement_null' => '无需结算', + 'promotion_function_disabled' => '渠道已禁用推广功能', + 'settlement_date_text' => '结算日期为每月的', + 'date' => '日', + 'settlement_date' => '结算日', + 'settlement_clear' => '分润清算', + 'promoter_profit_record' => '分润报表', + 'promoter_profit_record_detail' => '分润明细', + 'profit_settlement_confirm' => '对推广员进行结算操作,该操作不可逆确定要进行操作吗?', + 'fields' => [ + 'id' => 'ID', + 'status' => '状态', + 'player_num' => '玩家数量', + 'team_num' => '团队数量', + 'team_withdraw_total_amount' => '当期总提现', + 'team_recharge_total_amount' => '当前总充值', + 'total_profit_amount' => '总分润(个人)', + 'profit_amount' => '当前分润(总)', + 'profit_amount_team' => '下级提供分润', + 'player_profit_amount' => '直属分润', + 'adjust_amount' => '分润调整', + 'can_settlement_amount' => '当期应结算分润', + 'settlement_amount' => '已结算金额', + 'last_profit_amount' => '上期结算金额', + 'last_settlement_time' => '上次结算日期', + 'team_total_profit_amount' => '总分润(团队)', + 'team_profit_amount' => '当前分润(团队)', + 'team_settlement_amount' => '团队已结算金额', + 'ratio' => '分润比例', + 'name' => '推广员', + 'recommend_promoter_name' => '所属推广员', + 'parent_promoter_name' => '上级推广员', + 'created_at' => '创建时间', + 'updated_at' => '更新时间', + ], + 'status' => [ + '禁用', + '启用', + ], + 'action_error' => '设置失败', + 'action_success' => '设置成功', + 'settlement_date_text_null' => '未设置', + 'bath_settlement' => '批量结算', + 'bath_settlement_queue' => '批量结算任务', + 'settlement_amount_tip' => '当已结算金额为负数时, 推广员结算最终金额需扣除对应金额.', + 'adjust_amount_tip' => '分润调整金额将会, 计算到当期分润金额中, 结算完成后该金额将重置.', + 'can_settlement_amount_tip' => '当期可结算金额计算方式(直属分润 + 下级提供分润 + 调整金额).', + 'formula_tip' => '计算公式: ({up} + {admin_sub}) - ({activity} + {present} + {admin_add} + {down} + {lottery}) * {ratio}% = {profit_amount}', + 'source_promoter_name' => '来源推广员', + 'promoter_max_ratio' => '分润比最大可设置{max_ratio}%', + 'promoter_min_ratio' => '分润比最小可设置{min_ratio}%', +]; diff --git a/addons/webman/lang/zh-CN/player_recharge_record.php b/addons/webman/lang/zh-CN/player_recharge_record.php new file mode 100644 index 0000000..8fc5a3f --- /dev/null +++ b/addons/webman/lang/zh-CN/player_recharge_record.php @@ -0,0 +1,90 @@ + '充值记录', + 'examine_title' => '充值审核记录', + 'status_wait' => '充值中', + 'status_examine' => '待查账', + 'status_recharging' => '待支付', + 'status_success' => '完成充值', + 'status_fail' => '充值失败', + 'status_cancel' => '取消充值', + 'status_reject' => '已拒绝', + 'status_system_cancel' => '已关闭', + 'status_examine_pass' => '完成充值', + 'status_examine_reject' => '审核拒绝', + 'not_fount' => '未找到充值订单', + 'recharge_record_error' => '充值订单错误', + 'action_error' => '操作失败', + 'action_success' => '操作成功', + 'view_recharge_certificate_title' => '查看订单 {tradeno} 的付款凭证', + 'recharge_record_not_complete' => '玩家充值还未完成', + 'recharge_record_has_pass' => '充值订单已通过审核', + 'recharge_record_has_fail' => '充值订单支付失败', + 'recharge_record_has_cancel' => '玩家已取消改订单', + 'recharge_record_has_reject' => '该充值订单已被拒绝', + 'recharge_record_has_system_cancel' => '系统已超时关闭该订单', + 'talk_currency' => 'Q币', + 'fields' => [ + 'id' => 'ID', + 'player_id' => '玩家', + 'department_id' => '渠道', + 'tradeno' => '充值单号', + 'status' => '状态', + 'type' => '类型', + 'player_name' => '玩家名称', + 'player_phone' => '玩家手机号', + 'money' => '充值金额', + 'inmoney' => '实际金额', + 'certificate' => '付款凭证', + 'coins' => 'coins', + 'gift_coins' => '赠送coins', + 'player_tag' => '标签', + 'remark' => '备注', + 'reject_reason' => '拒绝原因', + 'user_name' => '操作人', + 'currency' => '币种', + 'finish_time' => '完成时间', + 'cancel_time' => '取消时间', + 'created_at' => '创建时间', + ], + 'type' => [ + PlayerRechargeRecord::TYPE_REGULAR => '普通充值', + PlayerRechargeRecord::TYPE_ACTIVITY => '活动充值', + PlayerRechargeRecord::TYPE_ARTIFICIAL => '人工充值', + ], + 'status' => [ + PlayerRechargeRecord::STATUS_WAIT => '待充值', + PlayerRechargeRecord::STATUS_RECHARGING => '待支付(待查账)', + PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS => '充值成功', + PlayerRechargeRecord::STATUS_RECHARGED_FAIL => '充值失败', + PlayerRechargeRecord::STATUS_RECHARGED_CANCEL => '取消充值', + PlayerRechargeRecord::STATUS_RECHARGED_REJECT => '审核拒绝', + PlayerRechargeRecord::STATUS_RECHARGED_SYSTEM_CANCEL => '已关闭', + ], + 'action' => [ + 'action_error' => '操作失败', + 'action_success' => '操作成功', + 'action_not_fount' => '操作未定义', + 'open_num' => '开分值', + 'no_fount_player' => '沒有正在遊戲中的玩家', + 'open_custom' => '开分自定', + 'down' => '下分', + ], + 'btn' => [ + 'action' => '操作', + 'view_channel_recharge_setting' => '查看渠道充值账号', + 'view_recharge_certificate' => '查看付款凭证', + 'examine_pass' => '审核通过', + 'examine_reject' => '审核拒绝', + 'examine_pass_confirm' => '请确认已收到款项, 点击审核通过后, 系统将会自动发放游戏点数', + 'examine_reject_confirm' => '审核拒绝, 拒绝后玩家将无法完成充值, 该条记录状态无法更改', + ], + 'total_data' => [ + 'total_espay_money' => '三方充值总金额', + 'total_espay_inmoney' => '三方充值实际总金额', + 'total_artificial_money' => '人工充值总金额', + ], +]; diff --git a/addons/webman/lang/zh-CN/player_wallet_transfer.php b/addons/webman/lang/zh-CN/player_wallet_transfer.php new file mode 100644 index 0000000..7f993d0 --- /dev/null +++ b/addons/webman/lang/zh-CN/player_wallet_transfer.php @@ -0,0 +1,15 @@ + '玩家转出/入记录', + 'fields' => [ + 'id' => 'ID', + 'amount' => '金额', + 'reward' => '中奖金额', + 'platform_no' => '单号(游戏平台)', + 'tradeno' => '单号', + 'create_at' => '创建时间', + 'department_name' => '渠道名称', + 'platform_name' => '游戏平台', + ], +]; diff --git a/addons/webman/lang/zh-CN/player_withdraw_record.php b/addons/webman/lang/zh-CN/player_withdraw_record.php new file mode 100644 index 0000000..8cecb76 --- /dev/null +++ b/addons/webman/lang/zh-CN/player_withdraw_record.php @@ -0,0 +1,85 @@ + '提现记录', + 'payment_title' => '提现打款记录', + 'examine_title' => '提现审核记录', + 'status_wait' => '待审核', + 'status_success' => '提现成功', + 'status_fail' => '提现失败', + 'not_fount' => '未找到充值订单', + 'withdraw_record_error' => '充值订单错误', + 'action_error' => '操作失败', + 'action_success' => '操作成功', + 'withdraw_record_not_complete' => '玩家提现还未完成', + 'withdraw_record_has_complete' => '提现订单已完成', + 'withdraw_record_has_fail' => '提现订单支已失败', + 'withdraw_record_has_cancel' => '玩家已取消该订单', + 'withdraw_record_has_reject' => '该提现订单已被拒绝', + 'withdraw_record_has_system_cancel' => '系统已超时关闭该订单', + 'withdraw_record_has_pass' => '该提现订单已通过审核', + 'withdraw_record_status_error' => '提现订单异常', + 'withdraw_record_has_not_examine' => '该订单还未审核', + 'certificate_help' => '只允许上传类型格式 jpg,png,jpeg,文件最大不可超过2M,可拖拽到虚线上传', + 'certificate_required' => '请上传打款凭证', + 'player_bank' => '玩家账户', + 'total_money' => '提現总金额', + 'total_inmoney' => '提現实际总金额', + 'fields' => [ + 'id' => 'ID', + 'player' => '玩家信息', + 'player_id' => '玩家', + 'department_id' => '渠道', + 'tradeno' => '提現单号', + 'status' => '状态', + 'type' => '类型', + 'player_name' => '玩家名称', + 'player_phone' => '玩家手机号', + 'money' => '提現金额', + 'inmoney' => '提現金额', + 'player_tag' => '标签', + 'remark' => '备注', + 'currency' => '币种', + 'finish_time' => '完成时间', + 'cancel_time' => '取消时间', + 'created_at' => '发起提现时间', + 'coins' => '游戏点数', + 'bank_name' => '银行名称', + 'account_name' => '账户名', + 'account' => '卡号', + ], + 'status' => [ + PlayerWithdrawRecord::STATUS_WAIT => '提現中(待审核)', + PlayerWithdrawRecord::STATUS_SUCCESS => '提現成功', + PlayerWithdrawRecord::STATUS_FAIL => '提現失敗', + PlayerWithdrawRecord::STATUS_PENDING_PAYMENT => '待打款', + PlayerWithdrawRecord::STATUS_PENDING_REJECT => '审核不通过', + PlayerWithdrawRecord::STATUS_CANCEL => '取消提现', + PlayerWithdrawRecord::STATUS_SYSTEM_CANCEL => '系统取消', + ], + 'type' => [ + PlayerWithdrawRecord::TYPE_USDT => 'usdt提现', + PlayerWithdrawRecord::TYPE_SELF => '平台提现', + PlayerWithdrawRecord::TYPE_ARTIFICIAL => '人工提现', + PlayerWithdrawRecord::TYPE_ESPAYOUT => 'EsPay提现', + PlayerWithdrawRecord::TYPE_ONEPAYOUT => 'OnePay提现', + PlayerWithdrawRecord::TYPE_SKLPAYOUT => 'Skl提现', + ], + 'total_data' => [ + 'total_artificial_money' => '人工提现总金额', + 'total_espay_money' => '三方支付提现总金额', + 'total_espay_inmoney' => '三方支付提现实际总金额', + ], + 'btn' => [ + 'action' => '操作', + 'view_channel_recharge_list' => '查看充值记录', + 'view_game_list' => '查看游戏记录', + 'examine_pass' => '审核通过', + 'examine_reject' => '审核拒绝', + 'complete_payment' => '完成打款', + 'examine_pass_confirm' => '审核通过后, 订单将进入财务打款流程, 请仔细核对确认', + 'examine_reject_confirm' => '审核拒绝, 点击审核通过后, 系统将会自动发放游戏点数', + ], +]; diff --git a/addons/webman/lang/zh-CN/post.php b/addons/webman/lang/zh-CN/post.php new file mode 100644 index 0000000..3596379 --- /dev/null +++ b/addons/webman/lang/zh-CN/post.php @@ -0,0 +1,13 @@ + '岗位管理', + 'normal'=>'正常', + 'disable'=>'禁用', + 'fields' => [ + 'name' => '岗位名称', + 'status' => '状态', + 'sort' => '排序', + 'create_at' => '创建时间', + ], +]; diff --git a/addons/webman/lang/zh-CN/prize.php b/addons/webman/lang/zh-CN/prize.php new file mode 100644 index 0000000..4e92724 --- /dev/null +++ b/addons/webman/lang/zh-CN/prize.php @@ -0,0 +1,44 @@ + '游戏列表', + 'fields' => [ + 'id' => '奖品ID', + 'name' => '奖品名称', + 'pic' => '图片', + 'probability' => '权重', + 'type' => '奖品类型', + 'total_stock' => '总库存', + 'daily_stock' => '每日库存', + 'total_remaining' => '总剩余库存', + 'daily_remaining' => '每日剩余库存', + 'description' => '奖品描述', + 'status' => '状态', + 'admin_name' => '管理员', + 'updated_at' => '修改时间', + ], + 'game_type' => [ + Game::GAME_TYPE_EGG => '砸金蛋', + Game::GAME_TYPE_TURNTABLE => '转盘', + Game::GAME_TYPE_BLINDBOX => '盲盒', + Game::GAME_TYPE_TICKET => '刮刮乐', + Game::GAME_TYPE_LOTTERY => '抽奖', + Game::GAME_TYPE_DICE => '摇色子', + ], + 'prize_type' => [ + Prize::PRIZE_TYPE_PHYSICAL => '实物奖品', + Prize::PRIZE_TYPE_VIRTUAL => '虚拟奖品', + Prize::PRIZE_TYPE_LOSE => ' 未中奖', + ], + 'help' => [ + 'name' => '请输入游戏名称', + 'picture_size' => '游戏图片大小不能超过 1MB', + ], + 'view_prize' => '查看奖品', + 'daily_stock_help' => '每日库存不能大于总库存', + 'replenish_daily_stock' => '补充每日库存', + 'action_success' => '操作成功', +]; diff --git a/addons/webman/lang/zh-CN/promoter_profit_record.php b/addons/webman/lang/zh-CN/promoter_profit_record.php new file mode 100644 index 0000000..fec6068 --- /dev/null +++ b/addons/webman/lang/zh-CN/promoter_profit_record.php @@ -0,0 +1,58 @@ + '分润报表', + 'promoter_info' => '推广员信息', + 'profit_record' => '报表信息', + 'player_info' => '玩家信息', + 'settlement_detail' => '结算详情', + 'player_game_record' => '机台上下分', + 'player_activity_phase_record' => '活动奖励', + 'player_lottery_record' => '彩金奖励', + 'player_recharge_record' => '充值记录', + 'player_withdraw_record' => '提现记录', + 'player_delivery_record' => '管理员钱包操作', + 'player_present_record' => '系统赠送', + 'fields' => [ + 'id' => 'ID', + 'player_id' => '玩家ID', + 'department_id' => '渠道ID', + 'promoter_player_id' => '推广员玩家id', + 'status' => '结算状态', + 'withdraw_amount' => '提现金额', + 'recharge_amount' => '充值金额', + 'bonus_amount' => '活动奖励金额', + 'admin_deduct_amount' => '管理员扣点', + 'admin_add_amount' => '管理员加点', + 'present_amount' => '系统赠送', + 'machine_up_amount' => '机台上点', + 'machine_down_amount' => '机台下点', + 'lottery_amount' => '彩金奖金', + 'profit_amount' => '分润金额', + 'settlement_tradeno' => '结算单号', + 'ratio' => '分润比例', + 'actual_ratio' => '实际分润比', + 'settlement_time' => '结算时间', + 'created_at' => '创建时间', + 'date' => '数据产生日期', + 'updated_at' => '更新时间', + 'total_amount' => '金额', + 'open_point' => '上分', + 'wash_point' => '下分', + ], + 'status' => [ + PromoterProfitRecord::STATUS_UNCOMPLETED => '未结算', + PromoterProfitRecord::STATUS_COMPLETED => '已结算', + ], + 'player_promoter' => [ + 'phone' => '推广员手机号', + 'uuid' => '推广员UUID' + ], + 'settlement_time_start' => '结算开始时间', + 'settlement_time_end' => '结算结束时间', + 'date_tip' => '数据凌晨3点更新前一日0点到24点数据', + 'profit_amount_tip' => '分润结算公式 (机台上分 + 管理员扣点) - (活动奖励 + 系统赠送 + 管理员加点 + 机台下分 + 彩金奖励). ', +]; diff --git a/addons/webman/lang/zh-CN/promoter_profit_settlement_record.php b/addons/webman/lang/zh-CN/promoter_profit_settlement_record.php new file mode 100644 index 0000000..6058f99 --- /dev/null +++ b/addons/webman/lang/zh-CN/promoter_profit_settlement_record.php @@ -0,0 +1,52 @@ + '结算记录', + 'fields' => [ + 'id' => 'ID', + 'total_withdraw_amount' => '提现金额', + 'total_recharge_amount' => '充值金额', + 'total_bonus_amount' => '活动赠送金额', + 'total_admin_deduct_amount' => '管理员扣点', + 'total_admin_add_amount' => '管理员加点', + 'total_present_amount' => '赠送金额', + 'total_machine_up_amount' => '机台上点', + 'total_machine_down_amount' => '机台下点', + 'total_lottery_amount' => '彩金奖金', + 'total_profit_amount' => '结算分润', + 'tradeno' => '结算单号', + 'type' => '类型', + 'last_profit_amount' => '上次结算分润(个人)', + 'adjust_amount' => '结算调整金额', + 'actual_amount' => '实际到账金额', + 'user_id' => '机台下点', + 'user_name' => '结算管理员', + 'created_at' => '结算时间', + 'updated_at' => '更新时间', + ], + 'status' => [ + PromoterProfitRecord::STATUS_UNCOMPLETED => '未结算', + PromoterProfitRecord::STATUS_COMPLETED => '已结算', + ], + 'type' => [ + PromoterProfitSettlementRecord::TYPE_SETTLEMENT => '结算', + PromoterProfitSettlementRecord::TYPE_CLEAR => '清算', + ], + 'player_promoter' => [ + 'phone' => '推广员手机号', + 'uuid' => '推广员UUID' + ], + 'settlement_time_start' => '结算开始时间', + 'settlement_time_end' => '结算结束时间', + 'profit_settlement_info' => '分润数据', + 'settlement_data' => '结算数据', + 'settlement_detail' => '分润报表', + 'channel_settlement_promoter_null' => '没有需要结算的推广员', + 'success' => '推广员结算成功', + 'channel_promotion_closed' => '推广员功能已关闭', + 'channel_closed' => '该渠道已关闭', +]; diff --git a/addons/webman/lang/zh-CN/public_msg.php b/addons/webman/lang/zh-CN/public_msg.php new file mode 100644 index 0000000..603e597 --- /dev/null +++ b/addons/webman/lang/zh-CN/public_msg.php @@ -0,0 +1,12 @@ + '开始日期', + 'date_end' => '结束日期', + 'created_at_start' => '开始时间', + 'created_at_end' => '结束时间', + 'status' => [ + '禁用', + '启用', + ], +]; diff --git a/addons/webman/lang/zh-CN/qrcode.php b/addons/webman/lang/zh-CN/qrcode.php new file mode 100644 index 0000000..da103be --- /dev/null +++ b/addons/webman/lang/zh-CN/qrcode.php @@ -0,0 +1,65 @@ + '二维码', + 'fields' => [ + 'id' => 'ID', + 'batch_id' => '批次ID', + 'verify_code' => '验证码', + 'tag_code' => '标识码', + 'score' => '积分值', + 'scan_user_id' => '扫码人ID', + 'scan_nickname' => '扫码人', + 'brand_id' => '创建人ID', + 'scan_phone' => '扫码人电话', + 'scan_time' => '扫码时间', + 'status' => '状态', + 'created_at' => '创建时间', + 'updated_at' => '更新时间', + 'is_export' =>'导出状态', + ], + 'status' => [ + '作废', + '正常', + '已使用', + '不可用' + ], + 'qrcode_owner' => [ + 'id' => 'ID', + 'name' => '持码人名称', + 'phone' => '持码人手机号', + 'brand_id' => '创建人ID', + 'creator' => '创建人', + 'status' => '状态', + 'created_at' => '创建时间', + 'updated_at' => '更新时间', + ], + 'qrcode_batch' => [ + 'id' => 'ID', + 'batch_code' => '二维码批次码', + 'score' => '面值', + 'total_score' => '总价值', + 'batch_count' => '持码数量', + 'owner_id' => '持码人ID', + 'creator' => '创建人', + 'brand_id' => '创建人ID', + 'status' => '状态', + 'created_at' => '创建时间', + 'updated_at' => '更新时间', + 'batch_count_set' => '持码数量每批次最多200' + ], + 'is_used' => '已扫码数量', + 'is_used_score' => '已扫码价值', + 'is_discard' => '已作废', + 'is_used' => '已扫码数量', + 'surplus' => '剩余数量', + 'export' => '导出', + 'check' => '查看', + 'discard' => '作废', + 'wait' => '导出时请耐心等待', + 'is_export' => [ + '未导出', + '已导出' + ], +]; diff --git a/addons/webman/lang/zh-CN/slider.php b/addons/webman/lang/zh-CN/slider.php new file mode 100644 index 0000000..62a8f39 --- /dev/null +++ b/addons/webman/lang/zh-CN/slider.php @@ -0,0 +1,19 @@ + '轮播图', + 'fields' => [ + 'id' => 'ID', + 'url' => '链接地址', + 'department_id' => '渠道', + 'content' => '内容', + 'picture_url' => '图片', + 'status' => '状态', + 'sort' => '排序', + 'created_at' => '创建时间', + ], + 'url_max_length'=>'链接地址最多200个字符', + 'help' => [ + 'picture_url_size' => '建議圖片尺寸 1080 * 458', + ] +]; diff --git a/addons/webman/lang/zh-CN/system_setting.php b/addons/webman/lang/zh-CN/system_setting.php new file mode 100644 index 0000000..1d66b93 --- /dev/null +++ b/addons/webman/lang/zh-CN/system_setting.php @@ -0,0 +1,30 @@ + '系统配置', + 'fields' => [ + 'register_present' => '注册成功赠送点数', + 'marquee' => '客户端跑马灯', + 'machine_maintain' => '每周机台维护时间段', + 'feature' => '功能', + 'setting' => '配置', + 'status' => '状态', + 'recharge_order_expiration' => '充值订单过期时间', + ], + 'marquee_max_len'=>'跑马灯最多100个字符', + 'week'=> [ + 1 => '星期一', + 2 => '星期二', + 3 => '星期三', + 4 => '星期四', + 5 => '星期五', + 6 => '星期六', + 7 => '星期天', + ], + 'week_str' => '星期', + 'minutes' => '分钟', + 'time_range' => '日期范围', + 'master' => '总配置', + 'not_fount' => '配置未找到', + 'action_success' => '操作成功', +]; diff --git a/addons/webman/lang/zh-CN/validator.php b/addons/webman/lang/zh-CN/validator.php new file mode 100644 index 0000000..e971bd2 --- /dev/null +++ b/addons/webman/lang/zh-CN/validator.php @@ -0,0 +1,23 @@ + '不能为空', + 'email' => '邮箱格式不符', + 'idCard' => '身份证格式不符', + 'url' => '不是有效的URL地址', + 'number' => '必须是数字', + 'integer' => '必须是整数', + 'float' => '必须是浮点数', + 'mobile' => '格式不符', + 'leng' => '长度不符合要求 ', + 'alpha' => '只能是字母', + 'alphaNum' => '只能是字母数字', + 'alphaDash' => '只能是字母、数字和下划线_及破折号-', + 'chs' => '只能是汉字', + 'chsAlpha' => '只能是汉字、字母', + 'chsAlphaNum' => '只能是汉字、字母和数字', + 'chsDash' => '只能是汉字、字母、数字和下划线_及破折号-', + 'max' => '最大只能设置{max}', + 'min' => '最小只能设置{min}', + 'twoDecimal' => '正数小数点最多2位', +]; \ No newline at end of file diff --git a/addons/webman/license b/addons/webman/license new file mode 100644 index 0000000..e69de29 diff --git a/addons/webman/middleware/AuthMiddleware.php b/addons/webman/middleware/AuthMiddleware.php new file mode 100644 index 0000000..9da1a79 --- /dev/null +++ b/addons/webman/middleware/AuthMiddleware.php @@ -0,0 +1,52 @@ +type == AdminDepartment::TYPE_CHANNEL) { + if (!empty($user->department_id)) { + /** @var Channel $channel */ + $channel = Channel::where('department_id', $user->department_id)->first(); + if ($channel->status == 0 || $channel->department->status == 0) { + throw new AuthException('渠道已禁用', 40006); + } + if (!empty($channel->deleted_at) || !empty($channel->department->deleted_at)) { + throw new AuthException('渠道已删除', 40007); + } + } else { + throw new AuthException('账号异常', 40008); + } + } + if ($user->status == 0) { + throw new AuthException('账号已禁用', 40009); + } + } catch (AuthException $exception) { + return response( + json_encode(['message' => $exception->getMessage(), 'code' => $exception->getCode()]), + 401, + ['Content-Type' => 'application/json']); + } + } + return $handler($request); + } +} \ No newline at end of file diff --git a/addons/webman/middleware/LoadLangPack.php b/addons/webman/middleware/LoadLangPack.php new file mode 100644 index 0000000..80d4ae1 --- /dev/null +++ b/addons/webman/middleware/LoadLangPack.php @@ -0,0 +1,24 @@ +webman->config('ui.lang'); + Arr::set($lang,'default',$request->cookie('ex_admin_lang',$lang['default'])); + admin_config(['lang'=>$lang], 'ui'); + Container::getInstance()->translator->setLocale($lang['default']); + Container::getInstance()->translator->load(plugin()->webman->getPath() . DIRECTORY_SEPARATOR . 'lang', 'ex_admin_ui'); + return $handler($request); + } +} diff --git a/addons/webman/middleware/Permission.php b/addons/webman/middleware/Permission.php new file mode 100644 index 0000000..29f1afc --- /dev/null +++ b/addons/webman/middleware/Permission.php @@ -0,0 +1,24 @@ +input('_ajax',$request->method()); + if(!Admin::check($class,$function,$method)){ + return response( + json_encode(['message' => admin_trans('admin.not_access_permission')]), + 405, + ['Content-Type' => 'application/json']); + } + return $handler($request); + } +} diff --git a/addons/webman/middleware/RequestMiddleware.php b/addons/webman/middleware/RequestMiddleware.php new file mode 100644 index 0000000..ca6458d --- /dev/null +++ b/addons/webman/middleware/RequestMiddleware.php @@ -0,0 +1,32 @@ +file() as $key=>$file){ + $files[$key] = new UploadedFile($file->getPathname(),$file->getUploadName(),$file->getUploadMineType(),$file->getUploadErrorCode(),true); + } + $q->initialize($request->get(),$request->all(),[],$request->cookie(),$files,$_SERVER,$request->rawBody()); + $q->server->set('REQUEST_URI',$request->path()); + $q->headers = new HeaderBag($request->header()); + $q->setMethod($request->method()); + }); + + return $handler($request); + } +} \ No newline at end of file diff --git a/addons/webman/model/Activity.php b/addons/webman/model/Activity.php new file mode 100644 index 0000000..ddc0bcb --- /dev/null +++ b/addons/webman/model/Activity.php @@ -0,0 +1,78 @@ + 'department_id']; + + const TYPE_CYCLE = 1; // 周期模式 + const TYPE_CUSTOM = 2; // 自定义模式 + + //数据权限字段 + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.activity_table')); + } + + /** + * 渠道信息 + * @return BelongsTo + */ + public function channel(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_model'), 'department_id', 'department_id')->withTrashed(); + } + + /** + * 活动内容 + * @return hasMany + */ + public function activity_content(): hasMany + { + return $this->hasMany(plugin()->webman->config('database.activity_content_model'), 'activity_id'); + } + + /** + * 充值配置 + * @return BelongsTo + */ + public function channelRechargeSetting(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_recharge_setting_model'), 'recharge_id')->withTrashed(); + } +} diff --git a/addons/webman/model/ActivityContent.php b/addons/webman/model/ActivityContent.php new file mode 100644 index 0000000..6cd498c --- /dev/null +++ b/addons/webman/model/ActivityContent.php @@ -0,0 +1,42 @@ +setTable(plugin()->webman->config('database.activity_content_table')); + } + + /** + * 活动 + * @return BelongsTo + */ + public function activity(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.activity_model'), 'activity_id')->withTrashed(); + } +} diff --git a/addons/webman/model/AdminConfig.php b/addons/webman/model/AdminConfig.php new file mode 100644 index 0000000..44a3f2b --- /dev/null +++ b/addons/webman/model/AdminConfig.php @@ -0,0 +1,19 @@ +setTable(plugin()->webman->config('database.config_table')); + } +} diff --git a/addons/webman/model/AdminDepartment.php b/addons/webman/model/AdminDepartment.php new file mode 100644 index 0000000..49404d9 --- /dev/null +++ b/addons/webman/model/AdminDepartment.php @@ -0,0 +1,66 @@ +setTable(plugin()->webman->config('database.department_table')); + } + + protected static function booted() + { + //创建时间倒序 + static::addGlobalScope('sort', function (Builder $builder) { + $builder->latest(); + }); + } + + protected function getPidAttribute($value) + { + return (int)$value; + } + + /** + * 渠道信息 + * @return HasOne + */ + public function channel(): HasOne + { + return $this->hasOne(plugin()->webman->config('database.channel_model'), 'department_id'); + } +} diff --git a/addons/webman/model/AdminFileAttachment.php b/addons/webman/model/AdminFileAttachment.php new file mode 100644 index 0000000..d67520b --- /dev/null +++ b/addons/webman/model/AdminFileAttachment.php @@ -0,0 +1,21 @@ +setTable(plugin()->webman->config('database.attachment_table')); + } +} diff --git a/addons/webman/model/AdminFileAttachmentCate.php b/addons/webman/model/AdminFileAttachmentCate.php new file mode 100644 index 0000000..4814541 --- /dev/null +++ b/addons/webman/model/AdminFileAttachmentCate.php @@ -0,0 +1,15 @@ +setTable(plugin()->webman->config('database.attachment_cate_table')); + } +} diff --git a/addons/webman/model/AdminMenu.php b/addons/webman/model/AdminMenu.php new file mode 100644 index 0000000..f24fd8b --- /dev/null +++ b/addons/webman/model/AdminMenu.php @@ -0,0 +1,23 @@ +setTable(plugin()->webman->config('database.menu_table')); + } + + protected function getNameAttribute($value) + { + return admin_trans('menu.titles.' . $value, $value); + } +} diff --git a/addons/webman/model/AdminPost.php b/addons/webman/model/AdminPost.php new file mode 100644 index 0000000..b46633b --- /dev/null +++ b/addons/webman/model/AdminPost.php @@ -0,0 +1,43 @@ + 'department_id']; + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + + $this->setTable(plugin()->webman->config('database.post_table')); + } + protected static function booted() + { + //创建时间倒序 + static::addGlobalScope('sort', function (Builder $builder) { + $builder->latest(); + }); + } +} diff --git a/addons/webman/model/AdminRole.php b/addons/webman/model/AdminRole.php new file mode 100644 index 0000000..b434a14 --- /dev/null +++ b/addons/webman/model/AdminRole.php @@ -0,0 +1,50 @@ +setTable(plugin()->webman->config('database.role_table')); + } + /** + * 部门 + * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany + */ + public function department(){ + return $this->belongsToMany(plugin()->webman->config('database.department_model'),plugin()->webman->config('database.role_department_model'), 'role_id', 'department_id'); + } + protected function setCheckStrictlyAttribute($value) + { + $this->attributes['check_strictly'] = (int)$value; + } + protected function getCheckStrictlyAttribute($value) + { + return (boolean)$value; + } +} diff --git a/addons/webman/model/AdminRoleDepartment.php b/addons/webman/model/AdminRoleDepartment.php new file mode 100644 index 0000000..9273125 --- /dev/null +++ b/addons/webman/model/AdminRoleDepartment.php @@ -0,0 +1,14 @@ +setTable(plugin()->webman->config('database.role_department_table')); + } +} diff --git a/addons/webman/model/AdminRoleMenu.php b/addons/webman/model/AdminRoleMenu.php new file mode 100644 index 0000000..a55ee88 --- /dev/null +++ b/addons/webman/model/AdminRoleMenu.php @@ -0,0 +1,14 @@ +setTable(plugin()->webman->config('database.role_menu_table')); + } +} diff --git a/addons/webman/model/AdminRolePermission.php b/addons/webman/model/AdminRolePermission.php new file mode 100644 index 0000000..312dbda --- /dev/null +++ b/addons/webman/model/AdminRolePermission.php @@ -0,0 +1,14 @@ +setTable(plugin()->webman->config('database.role_permission_table')); + } +} diff --git a/addons/webman/model/AdminRoleUsers.php b/addons/webman/model/AdminRoleUsers.php new file mode 100644 index 0000000..9b579ab --- /dev/null +++ b/addons/webman/model/AdminRoleUsers.php @@ -0,0 +1,25 @@ +setTable(plugin()->webman->config('database.role_user_table')); + } +} diff --git a/addons/webman/model/AdminUser.php b/addons/webman/model/AdminUser.php new file mode 100644 index 0000000..144a7ed --- /dev/null +++ b/addons/webman/model/AdminUser.php @@ -0,0 +1,75 @@ +'array']; + protected $fillable = ['username', 'password', 'nickname', 'avatar']; + + use SoftDeletes, HasDateTimeFormatter; + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.user_table')); + } + + /** + * 角色 + * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany + */ + public function roles(){ + return $this->belongsToMany(plugin()->webman->config('database.role_model'),plugin()->webman->config('database.role_user_model'), 'user_id', 'role_id'); + } + + /** + * 部门 + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function department(){ + return $this->belongsTo(plugin()->webman->config('database.department_model'), 'department_id'); + } + + /** + * 功能 + * @return \Illuminate\Database\Eloquent\Relations\HasManyThrough + */ + public function permission() + { + return $this->hasManyThrough(plugin()->webman->config('database.role_permission_model'), plugin()->webman->config('database.role_user_model'), 'user_id', 'role_id','id','role_id'); + } + + /** + * 密码哈希加密 + * @param $value + */ + public function setPasswordAttribute($value){ + $this->attributes['password'] = password_hash($value,PASSWORD_DEFAULT); + } +} diff --git a/addons/webman/model/Announcement.php b/addons/webman/model/Announcement.php new file mode 100644 index 0000000..2977cc1 --- /dev/null +++ b/addons/webman/model/Announcement.php @@ -0,0 +1,79 @@ + 'department_id']; + + const PRIORITY_ORDINARY = 1; // 普通 + const PRIORITY_SENIOR = 2; // 高级 + const PRIORITY_EMERGENT = 3; // 紧急 + + const TYPE_BULLETIN = 1; // 公告 + const TYPE_EVEBT = 2; // 事件 + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.announcement_table')); + } + + /** + * 游戏类别 + * @return BelongsTo + */ + public function adminUser(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.user_model'), 'admin_id'); + } + + /** + * 渠道信息 + * @return BelongsTo + */ + public function channel(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_model'), 'department_id', 'department_id')->withTrashed(); + } + + /** + * 渠道信息 + * @return hasMany + */ + public function content(): hasMany + { + return $this->hasMany(plugin()->webman->config('database.announcement_content_model'), 'announcement_id'); + } +} diff --git a/addons/webman/model/AnnouncementContent.php b/addons/webman/model/AnnouncementContent.php new file mode 100644 index 0000000..6eb965a --- /dev/null +++ b/addons/webman/model/AnnouncementContent.php @@ -0,0 +1,60 @@ + 'department_id']; + + protected $fillable = [ + 'content', 'title', 'lang', 'announcement_id', 'department_id', + ]; + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.announcement_content_table')); + } + + + /** + * 渠道信息 + * @return BelongsTo + */ + public function channel(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_model'), 'department_id', 'department_id')->withTrashed(); + } + + /** + * 渠道信息 + * @return BelongsTo + */ + public function announcement(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.announcement_model'), 'announcement_id')->withTrashed(); + } +} diff --git a/addons/webman/model/ApiErrorLog.php b/addons/webman/model/ApiErrorLog.php new file mode 100644 index 0000000..2bd501e --- /dev/null +++ b/addons/webman/model/ApiErrorLog.php @@ -0,0 +1,28 @@ +setTable(plugin()->webman->config('database.api_error_log_table')); + } +} diff --git a/addons/webman/model/AppVersion.php b/addons/webman/model/AppVersion.php new file mode 100644 index 0000000..72799c8 --- /dev/null +++ b/addons/webman/model/AppVersion.php @@ -0,0 +1,53 @@ +setTable(plugin()->webman->config('database.app_version_table')); + } + + /** + * 渠道信息 + * @return BelongsTo + */ + public function channel(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_model'), 'department_id', 'department_id')->withTrashed(); + } +} diff --git a/addons/webman/model/BankList.php b/addons/webman/model/BankList.php new file mode 100644 index 0000000..9d5b0f1 --- /dev/null +++ b/addons/webman/model/BankList.php @@ -0,0 +1,30 @@ +setTable(plugin()->webman->config('database.bank_list_table')); + } + +} diff --git a/addons/webman/model/Broadcast.php b/addons/webman/model/Broadcast.php new file mode 100644 index 0000000..31c99d9 --- /dev/null +++ b/addons/webman/model/Broadcast.php @@ -0,0 +1,55 @@ +format('Y-m-d H:i:s'); + } + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + } + +} diff --git a/addons/webman/model/Channel.php b/addons/webman/model/Channel.php new file mode 100644 index 0000000..2d6246b --- /dev/null +++ b/addons/webman/model/Channel.php @@ -0,0 +1,126 @@ +setTable(plugin()->webman->config('database.channel_table')); + } + + /** + * 部门 + * @return BelongsTo + */ + public function department(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.department_model'), 'department_id')->withTrashed(); + } + + /** + * 管理员用户 + * @return BelongsTo + */ + public function user(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.user_model'), 'user_id')->withTrashed(); + } + + /** + * 管理员用户 + * @return hasMany + */ + public function player(): hasMany + { + return $this->hasMany(plugin()->webman->config('database.player_model'), 'department_id', 'department_id'); + } + + /** + * 管理员用户 + * @return hasManyThrough + */ + public function wallet(): hasManyThrough + { + return $this->hasManyThrough(plugin()->webman->config('database.player_platform_cash_model'), plugin()->webman->config('database.player_model'), 'department_id', 'player_id', 'department_id', 'id'); + } + + /** + * 模型的 "booted" 方法 + * + * @return void + */ + protected static function booted() + { + static::created(function (Channel $channel) { + $cacheKey = "channel_" . $channel->site_id; + Cache::set($cacheKey, $channel->toArray()); + // 创建渠道系统配置 + SystemSetting::insert([ + [ + 'department_id' => $channel->department_id, + 'feature' => 'marquee', + 'created_at' => date('Y-m-d H:i:s'), + ], + [ + 'department_id' => $channel->department_id, + 'feature' => 'machine_marquee', + 'created_at' => date('Y-m-d H:i:s'), + ] + ]); + }); + static::deleted(function (Channel $channel) { + $cacheKey = "channel_" . $channel->site_id; + Cache::delete($cacheKey); + }); + static::updated(function (Channel $channel) { + $cacheKey = "channel_" . $channel->site_id; + Cache::set($cacheKey, $channel->toArray()); + }); + } +} diff --git a/addons/webman/model/ChannelFinancialRecord.php b/addons/webman/model/ChannelFinancialRecord.php new file mode 100644 index 0000000..c735cbc --- /dev/null +++ b/addons/webman/model/ChannelFinancialRecord.php @@ -0,0 +1,58 @@ + 'department_id']; + + CONST ACTION_RECHARGE_PASS = 1; // 充值审核通过 + CONST ACTION_RECHARGE_REJECT = 2; // 充值审核拒绝 + CONST ACTION_WITHDRAW_PASS = 3; // 提现审核通过 + CONST ACTION_WITHDRAW_REJECT = 4; // 提现审核拒绝 + CONST ACTION_WITHDRAW_PAYMENT = 5; // 提现打款 + CONST ACTION_RECHARGE_SETTING_ADD = 6; // 添加充值配置 + CONST ACTION_RECHARGE_SETTING_STOP = 7; // 停用充值配置 + CONST ACTION_RECHARGE_SETTING_ENABLE = 8; // 启用充值配置 + CONST ACTION_RECHARGE_SETTING_EDIT = 9; // 修改充值配置 + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.channel_financial_record_table')); + } + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'),'player_id'); + } +} diff --git a/addons/webman/model/ChannelRechargeMethod.php b/addons/webman/model/ChannelRechargeMethod.php new file mode 100644 index 0000000..931e7c9 --- /dev/null +++ b/addons/webman/model/ChannelRechargeMethod.php @@ -0,0 +1,84 @@ + 'department_id']; + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + + $this->setTable(plugin()->webman->config('database.channel_recharge_method_table')); + } + + /** + * 部门 + * @return BelongsTo + */ + public function department(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.department_model'), 'department_id')->withTrashed(); + } + + /** + * 管理员用户 + * @return BelongsTo + */ + public function user(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.user_model'), 'user_id')->withTrashed(); + } + + /** + * 多语言 + * @return hasMany + */ + public function methodLang(): hasMany + { + return $this->hasMany(plugin()->webman->config('database.channel_recharge_method_lang_model'), 'method_id'); + } + + /** + * 充值配置 + * @return hasMany + */ + public function channelRechargeSetting(): hasMany + { + return $this->hasMany(plugin()->webman->config('database.channel_recharge_setting_model'), 'method_id'); + } +} diff --git a/addons/webman/model/ChannelRechargeMethodLang.php b/addons/webman/model/ChannelRechargeMethodLang.php new file mode 100644 index 0000000..49c6773 --- /dev/null +++ b/addons/webman/model/ChannelRechargeMethodLang.php @@ -0,0 +1,40 @@ +setTable(plugin()->webman->config('database.channel_recharge_method_lang_table')); + } + + /** + * 充值方式 + * @return BelongsTo + */ + public function rechargeMethod(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_recharge_method_model'), 'method_id')->withTrashed(); + } +} diff --git a/addons/webman/model/ChannelRechargeSetting.php b/addons/webman/model/ChannelRechargeSetting.php new file mode 100644 index 0000000..ae57f4c --- /dev/null +++ b/addons/webman/model/ChannelRechargeSetting.php @@ -0,0 +1,76 @@ + 'department_id']; + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + + $this->setTable(plugin()->webman->config('database.channel_recharge_setting_table')); + } + + /** + * 部门 + * @return BelongsTo + */ + public function department(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.department_model'), 'department_id')->withTrashed(); + } + + /** + * 管理员用户 + * @return BelongsTo + */ + public function user(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.user_model'), 'user_id')->withTrashed(); + } + + /** + * 充值账户 + * @return BelongsTo + */ + public function channel_recharge_method(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_recharge_method_model'), 'method_id')->withTrashed(); + } +} diff --git a/addons/webman/model/CommissionRecord.php b/addons/webman/model/CommissionRecord.php new file mode 100644 index 0000000..5bbe4ed --- /dev/null +++ b/addons/webman/model/CommissionRecord.php @@ -0,0 +1,72 @@ + 'department_id']; + //简写省略id,默认后台用户表的id + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.commission_record_table')); + } + + /** + * 渠道信息 + * @return BelongsTo + */ + public function channel(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_model'), 'department_id', 'department_id')->withTrashed(); + } + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'player_id'); + } + + /** + * 分润玩家信息 + * @return BelongsTo + */ + public function parentPlayer(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'parent_player_id'); + } +} diff --git a/addons/webman/model/Currency.php b/addons/webman/model/Currency.php new file mode 100644 index 0000000..b593d55 --- /dev/null +++ b/addons/webman/model/Currency.php @@ -0,0 +1,52 @@ +setTable(plugin()->webman->config('database.currency_table')); + } + + /** + * 游戏类别 + * @return BelongsTo + */ + public function admin_user(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.user_model'), 'admin_id'); + } + + /** + * 比值 + * + * @param $value + * @return float + */ + public function getRatioAttribute($value): float + { + return floatval($value); + } +} diff --git a/addons/webman/model/DrawRecord.php b/addons/webman/model/DrawRecord.php new file mode 100644 index 0000000..ca4f274 --- /dev/null +++ b/addons/webman/model/DrawRecord.php @@ -0,0 +1,71 @@ + 'department_id']; + protected $table = 'draw_records'; + public $timestamps = false; + protected $fillable = ['uid', 'prize_id', 'prize_type', 'prize_name', 'prize_pic', 'game_id', 'game_type', 'department_id', 'draw_time', 'ip', 'consume']; + + /** + * 奖品信息 + * @return BelongsTo + */ + public function prize(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.prize_model'), 'prize_id', 'id'); + } + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'uid')->withTrashed(); + } + + /** + * 渠道信息 + * @return BelongsTo + */ + public function channel(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_model'), 'department_id', 'department_id')->withTrashed(); + } + + +} \ No newline at end of file diff --git a/addons/webman/model/ExternalApp.php b/addons/webman/model/ExternalApp.php new file mode 100644 index 0000000..3d1736b --- /dev/null +++ b/addons/webman/model/ExternalApp.php @@ -0,0 +1,34 @@ +setTable(plugin()->webman->config('database.external_app_table')); + } +} diff --git a/addons/webman/model/Game.php b/addons/webman/model/Game.php new file mode 100644 index 0000000..c2edfdd --- /dev/null +++ b/addons/webman/model/Game.php @@ -0,0 +1,62 @@ +setTable(plugin()->webman->config('database.game_table')); + } + + /** + * 平台信息 + * @return BelongsTo + */ + public function gamePlatform(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.game_platform_model'), 'platform_id')->withTrashed(); + } + +} diff --git a/addons/webman/model/GamePlatform.php b/addons/webman/model/GamePlatform.php new file mode 100644 index 0000000..9935649 --- /dev/null +++ b/addons/webman/model/GamePlatform.php @@ -0,0 +1,32 @@ +setTable(plugin()->webman->config('database.game_platform_table')); + } +} diff --git a/addons/webman/model/GameType.php b/addons/webman/model/GameType.php new file mode 100644 index 0000000..7220eac --- /dev/null +++ b/addons/webman/model/GameType.php @@ -0,0 +1,36 @@ +setTable(plugin()->webman->config('database.game_type_table')); + } + +} diff --git a/addons/webman/model/Notice.php b/addons/webman/model/Notice.php new file mode 100644 index 0000000..c1e53fa --- /dev/null +++ b/addons/webman/model/Notice.php @@ -0,0 +1,116 @@ + 'department_id']; + + const TYPE_SYSTEM = 1; // 系统 + const TYPE_EXAMINE_RECHARGE = 2; // 充值审核 + const TYPE_EXAMINE_WITHDRAW = 3; // 提现审核 + const TYPE_PAY = 4; // 三方充值 + const TYPE_WITHDRAW = 5; // 三方提现 + + const RECEIVER_PLAYER = 1; // 玩家 + const RECEIVER_ADMIN = 2; // 总站 + const RECEIVER_DEPARTMENT = 3; // 子站 + + /** + * 时间转换 + * @param DateTimeInterface $date + * @return string + */ + protected function serializeDate(DateTimeInterface $date): string + { + return $date->format('Y-m-d H:i:s'); + } + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.notice_table')); + } + + /** + * 游戏类别 + * @return BelongsTo + */ + public function adminUser(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.user_model'), 'admin_id'); + } + + /** + * 渠道信息 + * @return BelongsTo + */ + public function channel(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_model'), 'department_id', 'department_id')->withTrashed(); + } + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'player_id', 'department_id')->withTrashed(); + } + + /** + * 模型的 "booted" 方法 + * + * @return void + */ + protected static function booted() + { + static::created(function (Notice $notice) { + if ($notice->is_private == 1) { + sendSocketMessage('player-' . $notice->player_id, [ + 'msg_type' => 'player_notice_num', + 'notice_num' => Notice::query() + ->where('player_id', $notice->player_id) + ->where('receiver', Notice::RECEIVER_PLAYER) + ->where('is_private', 1) + ->where('status', 0) + ->count('*'), + ]); + } + }); + } +} diff --git a/addons/webman/model/PhoneSmsLog.php b/addons/webman/model/PhoneSmsLog.php new file mode 100644 index 0000000..ebb9ee4 --- /dev/null +++ b/addons/webman/model/PhoneSmsLog.php @@ -0,0 +1,46 @@ +setTable(plugin()->webman->config('database.phone_sms_log_table')); + } +} diff --git a/addons/webman/model/PlayGameRecord.php b/addons/webman/model/PlayGameRecord.php new file mode 100644 index 0000000..d334672 --- /dev/null +++ b/addons/webman/model/PlayGameRecord.php @@ -0,0 +1,75 @@ + 'department_id']; + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.play_game_record_table')); + } + + /** + * 渠道信息 + * @return BelongsTo + */ + public function channel(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_model'), 'department_id', 'department_id')->withTrashed(); + } + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'player_id')->withTrashed(); + } + + /** + * 平台信息 + * @return BelongsTo + */ + public function gamePlatform(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.game_platform_model'), 'platform_id')->withTrashed(); + } +} diff --git a/addons/webman/model/Player.php b/addons/webman/model/Player.php new file mode 100644 index 0000000..db3151d --- /dev/null +++ b/addons/webman/model/Player.php @@ -0,0 +1,282 @@ + 'department_id']; + //简写省略id,默认后台用户表的id + + /** + * 时间转换 + * @param DateTimeInterface $date + * @return string + */ + protected function serializeDate(DateTimeInterface $date): string + { + return $date->format('Y-m-d H:i:s'); + } + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.player_table')); + } + + public function wallet(): HasOne + { + return $this->hasOne(plugin()->webman->config('database.player_platform_cash_model'))->where('platform_id', PlayerPlatformCash::PLATFORM_SELF); + } + + public function player_level(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_level_model'), 'level', 'level'); + } + + /** + * 玩家扩展信息 + * @return HasOne + */ + public function player_extend(): HasOne + { + return $this->hasOne(plugin()->webman->config('database.player_extend_model'), 'player_id'); + } + + public function player_promoter(): HasOne + { + return $this->hasOne(PlayerPromoter::class, 'player_id'); + } + + /** + * 渠道信息 + * @return BelongsTo + */ + public function channel(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_model'), 'department_id', 'department_id')->withTrashed(); + } + + /** + * 提现信息 + * @return hasMany + */ + public function player_withdraw_record(): hasMany + { + return $this->hasMany(plugin()->webman->config('database.player_withdraw_record_model'), 'player_id'); + } + + /** + * 提现信息 + * @return hasMany + */ + public function player_recharge_record(): hasMany + { + return $this->hasMany(plugin()->webman->config('database.player_recharge_record_model'), 'player_id'); + } + + /** + * 推荐玩家 + * @return BelongsTo + */ + public function recommend_player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'recommend_id'); + } + + public function the_last_player_login_record(): HasOne + { + return $this->hasOne(PlayerLoginRecord::class, 'player_id')->latest(); + } + + public function player_register_record(): HasOne + { + return $this->hasOne(PlayerRegisterRecord::class, 'player_id'); + } + + /** + * 密码哈希加密 + * @param $value + */ + public function setPasswordAttribute($value) + { + $this->attributes['password'] = password_hash($value, PASSWORD_DEFAULT); + } + + /** + * 支付密码哈希加密 + * @param $value + */ + public function setPlayPasswordAttribute($value) + { + $this->attributes['play_password'] = password_hash($value, PASSWORD_DEFAULT); + } + + /** + * 获取器 - 标签id + * @param $value + * @return false|string[] + */ + public function getPlayerTagAttribute($value) + { + return array_filter(explode(',', $value)); + } + + /** + * 修改器 - 标签id + * @param $value + * @return string + */ + public function setPlayerTagAttribute($value): string + { + $idsStr = json_encode($value); + $cacheKey = md5("player_tag_options_ids_$idsStr"); + Cache::delete($cacheKey); + + return $this->attributes['player_tag'] = implode(',', $value); + } + + /** + * 获取器 - 玩家头像 + * @param $value + * @return false|string[] + */ + public function getAvatarAttribute($value) + { + return is_numeric($value) ? config('def_avatar.' . $value) : $value; + } + + /** + * 玩家平台账号 + * @return hasMany + */ + public function playerGamePlatform(): hasMany + { + return $this->hasMany(plugin()->webman->config('database.player_game_platform_model'), 'player_id'); + } + + /** + * 所属推广员 + * @return BelongsTo + */ + public function recommend_promoter(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_promoter_model'), 'recommend_id', 'player_id'); + } + + /** + * 模型的 "booted" 方法 + * + * @return void + */ + protected static function booted() + { + static::updated(function (Player $player) { + $columns = [ + 'type', + 'status', + 'status_withdraw', + 'status_open_coins', + 'status_open_coins', + 'name', + 'phone', + 'country_code', + 'play_password', + 'password', + 'flag', + 'avatar', + 'player_tag', + ]; + if ($player->wasChanged($columns) && !empty(Admin::user())) { + $orData = $player->getOriginal(); + $changeData = $player->getChanges(); + $orDataArr = []; + $newDataArr = []; + foreach ($changeData as $key => $item) { + if (empty($item) == empty($orData[$key])) { + continue; + } + if ($key == 'updated_at') { + $orData[$key] = date('Y-m-d H:i:s', strtotime($orData[$key])); + } + $orDataArr[$key] = $orData[$key]; + $newDataArr[$key] = $item; + } + if (!empty($newDataArr)) { + $playerEditLog = new PlayerEditLog(); + $playerEditLog->player_id = $player->id; + $playerEditLog->department_id = $player->department_id; + $playerEditLog->origin_data = json_encode($orDataArr); + $playerEditLog->new_data = json_encode($newDataArr); + $playerEditLog->user_id = Admin::id() ?? 0; + $playerEditLog->user_name = !empty(Admin::user()) ? Admin::user()->username : ''; + $playerEditLog->save(); + } + } + }); + } +} diff --git a/addons/webman/model/PlayerBank.php b/addons/webman/model/PlayerBank.php new file mode 100644 index 0000000..437e46f --- /dev/null +++ b/addons/webman/model/PlayerBank.php @@ -0,0 +1,88 @@ +setTable(plugin()->webman->config('database.player_bank_table')); + } + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'player_id')->withTrashed(); + } + + /** + * 模型事件 - 删除前 + */ + protected static function boot() + { + parent::boot(); + + static::deleting(function (PlayerBank $playerBank) { + if (!empty($playerBank->qr_code)) { + $imagePath = self::extractImagePathFromUrl($playerBank->qr_code); + + if ($imagePath) { + deleteToGCS($imagePath); + } + } + }); + } + + /** + * 从 URL 中提取图片路径 + */ + private static function extractImagePathFromUrl($url): string + { + if (filter_var($url, FILTER_VALIDATE_URL)) { + $parsedUrl = parse_url($url); + if (isset($parsedUrl['path'])) { + $path = $parsedUrl['path']; + + // 移除可能的存储桶名称 + $bucketName = env('GOOGLE_CLOUD_STORAGE_BUCKET', 'yjbfile'); + $bucketPrefix = '/' . $bucketName . '/'; + + if (str_starts_with($path, $bucketPrefix)) { + return substr($path, strlen($bucketPrefix)); + } + + return ltrim($path, '/'); + } + } + + return $url; + } +} diff --git a/addons/webman/model/PlayerBankruptcyRecord.php b/addons/webman/model/PlayerBankruptcyRecord.php new file mode 100644 index 0000000..9f49967 --- /dev/null +++ b/addons/webman/model/PlayerBankruptcyRecord.php @@ -0,0 +1,48 @@ +setTable(plugin()->webman->config('database.player_bankruptcy_record_table')); + } // 減少 + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'player_id')->withTrashed(); + } + + /** + * 渠道信息 + * @return BelongsTo + */ + public function channel(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_model'), 'department_id', 'department_id')->withTrashed(); + } +} diff --git a/addons/webman/model/PlayerChipRecord.php b/addons/webman/model/PlayerChipRecord.php new file mode 100644 index 0000000..c5d93cf --- /dev/null +++ b/addons/webman/model/PlayerChipRecord.php @@ -0,0 +1,84 @@ + 'department_id']; + const TYPE_INC = 1; // 增加 + const TYPE_DEC = 2; // 减少 + + const RECORD_TYPE_SIGN = 1; // 签到 + const RECORD_TYPE_RECHARGE = 2; // 充值 + const RECORD_TYPE_ACTIVITY = 3; // 活动 + const RECORD_TYPE_GAME = 4; // 游戏 + const RECORD_TYPE_COMMISSION = 5; // 分润 + const RECORD_TYPE_BANKRUPTCY = 6; // 破产 + const RECORD_TYPE_BET_REBATE = 7; // 打码返水 + const RECORD_TYPE_FIRST_RECHARGE_REWARD = 8; // 首充奖励 + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.player_chip_record_table')); + } // 減少 + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'player_id')->withTrashed(); + } + + /** + * 渠道信息 + * @return BelongsTo + */ + public function channel(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_model'), 'department_id', 'department_id')->withTrashed(); + } + + /** + * 来源 + * @return MorphTo + */ + public function source(): MorphTo + { + return $this->morphTo(); + } +} diff --git a/addons/webman/model/PlayerDeliveryRecord.php b/addons/webman/model/PlayerDeliveryRecord.php new file mode 100644 index 0000000..bfb48f5 --- /dev/null +++ b/addons/webman/model/PlayerDeliveryRecord.php @@ -0,0 +1,133 @@ + 'department_id']; + + const TYPE_MODIFIED_AMOUNT_ADD = 1; // (管理后台)加点 + const TYPE_RECHARGE = 2; // 充值 + const TYPE_WITHDRAWAL = 3; // 提现 + const TYPE_MODIFIED_AMOUNT_DEDUCT = 4; // (管理后台)扣点 + const TYPE_WITHDRAWAL_BACK = 5; // 提现失败返还 + const TYPE_REGISTER_PRESENT = 6; // 注册赠送 + const TYPE_COMMISSION = 7; // 返佣 + const TYPE_SIGN = 8; // 签到 + const TYPE_GAME_OUT = 9; // 游戏转出 + const TYPE_GAME_IN = 10; // 游戏转入 + const TYPE_BET_REBATE = 11; // 打码量返水 + const TYPE_DAMAGE_REBATE = 12; // 客损返水 + const TYPE_RECHARGE_REWARD = 13; // 首充值奖励 + const TYPE_PROFIT = 14; // 推广员分润 + const TYPE_CANCELTRANSFER = 15; // 管理员取消转账 + + protected $fillable = [ + 'player_id', + 'target', + 'target_id', + 'department_id', + 'type', + 'source', + 'amount', + 'amount_after', + 'amount_before', + 'amount_platform_before', + 'amount_platform_after', + 'tradeno', + 'remark', + 'operator_audit', + 'operator_withdraw', + 'created_at', + 'updated_at', + ]; + + /** + * 时间转换 + * @param DateTimeInterface $date + * @return string + */ + protected function serializeDate(DateTimeInterface $date): string + { + return $date->format('Y-m-d H:i:s'); + } + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.player_delivery_record_table')); + } + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'player_id')->withTrashed(); + } + + /** + * 金额 + * + * @param $value + * @return float + */ + public function getAmountAttribute($value): float + { + return floatval($value); + } + + /** + * 異動前金額 + * + * @param $value + * @return float + */ + public function getAmountBeforeAttribute($value): float + { + return floatval($value); + } + + /** + * 異動后金額 + * + * @param $value + * @return float + */ + public function getAmountAfterAttribute($value): float + { + return floatval($value); + } +} diff --git a/addons/webman/model/PlayerEditLog.php b/addons/webman/model/PlayerEditLog.php new file mode 100644 index 0000000..924cc22 --- /dev/null +++ b/addons/webman/model/PlayerEditLog.php @@ -0,0 +1,67 @@ + 'department_id']; + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.player_edit_log_table')); + } + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->BelongsTo(plugin()->webman->config('database.player_model'), 'player_id')->withTrashed(); + } + + /** + * 渠道信息 + * @return BelongsTo + */ + public function channel(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_model'), 'department_id', 'department_id')->withTrashed(); + } + + /** + * 管理员用户 + * @return BelongsTo + */ + public function user(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.user_model'), 'user_id')->withTrashed(); + } +} diff --git a/addons/webman/model/PlayerExtend.php b/addons/webman/model/PlayerExtend.php new file mode 100644 index 0000000..c81c354 --- /dev/null +++ b/addons/webman/model/PlayerExtend.php @@ -0,0 +1,186 @@ +setTable(plugin()->webman->config('database.player_extend_table')); + } + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'player_id')->withTrashed(); + } + + /** + * 总充值点数 + * + * @param $value + * @return float + */ + public function getRechargeAmountAttribute($value): float + { + return floatval($value); + } + + /** + * 总提现金额 + * + * @param $value + * @return float + */ + public function getWithdrawAmountAttribute($value): float + { + return floatval($value); + } + + /** + * 总提转入金额 + * + * @param $value + * @return float + */ + public function getPresentInAmountAttribute($value): float + { + return floatval($value); + } + + /** + * 总提转出金额 + * + * @param $value + * @return float + */ + public function getPresentOutAmountAttribute($value): float + { + return floatval($value); + } + + /** + * 第三方总充值点数 + * + * @param $value + * @return float + */ + public function getThirdRechargeAmountAttribute($value): float + { + return floatval($value); + } + + /** + * 第三方总提现金额 + * + * @param $value + * @return float + */ + public function getThirdWithdrawAmountAttribute($value): float + { + return floatval($value); + } + + /** + * 币商充值总金额 + * + * @param $value + * @return float + */ + public function getCoinRechargeAmountAttribute($value): float + { + return floatval($value); + } + + protected static function booted() + { + static::updated(function (PlayerExtend $playerExtend) { + $columns = [ + 'sex', + 'email', + 'qq', + 'telegram', + 'birthday', + 'id_number', + 'address', + 'wechat', + 'whatsapp', + 'facebook', + 'line', + 'remark', + ]; + if ($playerExtend->wasChanged($columns) && !empty(Admin::user())) { + $orData = $playerExtend->getOriginal(); + $changeData = $playerExtend->getChanges(); + $orDataArr = []; + $newDataArr = []; + foreach ($changeData as $key => $item) { + if (empty($item) == empty($orData[$key])) { + continue; + } + if ($key == 'updated_at') { + $orData[$key] = date('Y-m-d H:i:s', strtotime($orData[$key])); + } + $orDataArr[$key] = $orData[$key]; + $newDataArr[$key] = $item; + } + if (!empty($newDataArr)) { + $playerEditLog = new PlayerEditLog(); + $playerEditLog->player_id = $playerExtend->player_id; + $playerEditLog->department_id = $playerExtend->player->department_id; + $playerEditLog->origin_data = json_encode($orDataArr); + $playerEditLog->new_data = json_encode($newDataArr); + $playerEditLog->user_id = Admin::id() ?? 0; + $playerEditLog->user_name = !empty(Admin::user()) ? Admin::user()->username : ''; + $playerEditLog->save(); + } + } + }); + } +} diff --git a/addons/webman/model/PlayerGamePlatform.php b/addons/webman/model/PlayerGamePlatform.php new file mode 100644 index 0000000..8c92456 --- /dev/null +++ b/addons/webman/model/PlayerGamePlatform.php @@ -0,0 +1,53 @@ +setTable(plugin()->webman->config('database.player_game_platform_table')); + } + + /** + * 游戏平台 + * @return BelongsTo + */ + public function gamePlatform(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.game_platform_model'), 'platform_id'); + } + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'player_id'); + } +} diff --git a/addons/webman/model/PlayerGameRecord.php b/addons/webman/model/PlayerGameRecord.php new file mode 100644 index 0000000..c94bda6 --- /dev/null +++ b/addons/webman/model/PlayerGameRecord.php @@ -0,0 +1,121 @@ +setTable(plugin()->webman->config('database.player_game_record_table')); + } + + /** + * 上分 + * + * @param $value + * @return float + */ + public function getOpenPointAttribute($value): float + { + return floatval($value); + } + + /** + * 下分 + * + * @param $value + * @return float + */ + public function getWashPointAttribute($value): float + { + return floatval($value); + } + + /** + * 余点数 + * + * @param $value + * @return float + */ + public function getAfterGameAmountAttribute($value): float + { + return floatval($value); + } + + /** + * 机台信息 + * @return BelongsTo + */ + public function machine(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.machine_model'), 'machine_id')->withTrashed(); + } + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'player_id')->withTrashed(); + } + + /** + * 模型的 "booted" 方法 + * + * @return void + */ + protected static function booted() + { + if (config('app.profit', 'task') == 'event') { + static::updated(function (PlayerGameRecord $playerGameRecord) { + $oldStatus = $playerGameRecord->getOriginal('status'); // 原始值 + $newStatus = $playerGameRecord->status; + // 游戏结束并且产生盈亏后计算分润 + if ($oldStatus != $newStatus && $newStatus == PlayerGameRecord::STATUS_END && $playerGameRecord->open_point != $playerGameRecord->wash_point) { + Event::emit('promotion.playerGame', $playerGameRecord); + } + }); + } + } + + public function last_player_game_log(): HasOne + { + return $this->hasOne(PlayerGameLog::class, 'game_record_id')->latest(); + } +} diff --git a/addons/webman/model/PlayerLevel.php b/addons/webman/model/PlayerLevel.php new file mode 100644 index 0000000..b96b9d5 --- /dev/null +++ b/addons/webman/model/PlayerLevel.php @@ -0,0 +1,31 @@ +setTable(plugin()->webman->config('database.player_level_table')); + } +} diff --git a/addons/webman/model/PlayerLoginRecord.php b/addons/webman/model/PlayerLoginRecord.php new file mode 100644 index 0000000..0fb0278 --- /dev/null +++ b/addons/webman/model/PlayerLoginRecord.php @@ -0,0 +1,56 @@ + 'department_id']; + + protected $fillable = [ + 'player_id', + 'login_domain', + 'ip', + 'country_name', + 'city_name', + 'remark', + 'department_id', + ]; + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.player_login_record_table')); + } + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'player_id')->withTrashed(); + } +} diff --git a/addons/webman/model/PlayerLotteryRecord.php b/addons/webman/model/PlayerLotteryRecord.php new file mode 100644 index 0000000..c56e168 --- /dev/null +++ b/addons/webman/model/PlayerLotteryRecord.php @@ -0,0 +1,144 @@ + 'department_id']; + + const STATUS_UNREVIEWED = 0; // 未审核 + const STATUS_REJECT = 1; // 未通过 + const STATUS_PASS = 2; // 通过 + const STATUS_COMPLETE = 3; // 已完成 + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.player_lottery_record_table')); + } + + /** + * 渠道信息 + * @return BelongsTo + */ + public function channel(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_model'), 'department_id', 'department_id')->withTrashed(); + } + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'player_id')->withTrashed(); + } + + /** + * 机台信息 + * @return BelongsTo + */ + public function machine(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.machine_model'), 'machine_id')->withTrashed(); + } + + /** + * 彩金信息 + * @return BelongsTo + */ + public function lottery(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.lottery_model'), 'lottery_id')->withTrashed(); + } + + /** + * 派彩金额 + * + * @param $value + * @return float + */ + public function getAmountAttribute($value): float + { + return floatval($value); + } + + /** + * 金额比例 + * + * @param $value + * @return float + */ + public function getLotteryRateAttribute($value): float + { + return floatval($value); + } + + /** + * 派彩系数 + * + * @param $value + * @return float + */ + public function getCateRateAttribute($value): float + { + return floatval($value); + } + + /** + * 派彩系数 + * + * @param $value + * @return float + */ + public function getLotteryPoolAmountAttribute($value): float + { + return floatval($value); + } +} \ No newline at end of file diff --git a/addons/webman/model/PlayerMoneyEditLog.php b/addons/webman/model/PlayerMoneyEditLog.php new file mode 100644 index 0000000..189b4df --- /dev/null +++ b/addons/webman/model/PlayerMoneyEditLog.php @@ -0,0 +1,88 @@ + 'department_id']; + + const TYPE_DEDUCT = 0; // 扣点 + const TYPE_INCREASE = 1; // 加点 + + const RECHARGE = 0; // 充值 + const VIP_RECHARGE = 1; // vip充值 + const OTHER = 2; // 其他 + const ACTIVITY_GIVE = 3; // 活動外贈 + const ADMIN_DEDUCT = 4; // 管理员扣点 + const ADMIN_INCREASE = 5; // 管理员加点 + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.player_money_edit_log_table')); + } + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->BelongsTo(plugin()->webman->config('database.player_model'), 'player_id')->withTrashed(); + } + + /** + * 渠道信息 + * @return BelongsTo + */ + public function channel(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_model'), 'department_id', 'department_id')->withTrashed(); + } + + /** + * 管理员用户 + * @return BelongsTo + */ + public function user(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.user_model'), 'user_id')->withTrashed(); + } +} diff --git a/addons/webman/model/PlayerPlatformCash.php b/addons/webman/model/PlayerPlatformCash.php new file mode 100644 index 0000000..0dea470 --- /dev/null +++ b/addons/webman/model/PlayerPlatformCash.php @@ -0,0 +1,45 @@ +setTable(plugin()->webman->config('database.player_platform_cash_table')); + } + + /** + * 点数 + * + * @param $value + * @return float + */ + public function getMoneyAttribute($value): float + { + return floatval($value); + } +} diff --git a/addons/webman/model/PlayerPromoter.php b/addons/webman/model/PlayerPromoter.php new file mode 100644 index 0000000..e287a33 --- /dev/null +++ b/addons/webman/model/PlayerPromoter.php @@ -0,0 +1,112 @@ + 'department_id']; + + /** + * 时间转换 + * @param DateTimeInterface $date + * @return string + */ + protected function serializeDate(DateTimeInterface $date): string + { + return $date->format('Y-m-d H:i:s'); + } + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.player_promoter_table')); + } + + /** + * 渠道信息 + * @return BelongsTo + */ + public function channel(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_model'), 'department_id', 'department_id')->withTrashed(); + } + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'player_id')->withTrashed(); + } + + /** + * 上级推广员 + * @return hasOne + */ + public function parent_promoter(): hasOne + { + return $this->hasOne(plugin()->webman->config('database.player_promoter_model'), 'player_id', 'recommend_id'); + } + + /** + * 下级推广员 + ** @return hasMany + */ + public function sub_promoter() + { + return $this->hasMany(plugin()->webman->config('database.player_promoter_model'), 'recommend_id', 'player_id'); + } + + /** + * 下级推广员 + ** @return hasMany + */ + public function max_sub_promoter() + { + return $this->hasOne(plugin()->webman->config('database.player_promoter_model'), 'recommend_id', 'player_id') + ->orderBy('ratio','desc'); + } + +} diff --git a/addons/webman/model/PlayerRechargeRecord.php b/addons/webman/model/PlayerRechargeRecord.php new file mode 100644 index 0000000..37add14 --- /dev/null +++ b/addons/webman/model/PlayerRechargeRecord.php @@ -0,0 +1,174 @@ + 'department_id']; + + const STATUS_WAIT = 0; // 充值中 + const STATUS_RECHARGING = 1; // 待审核 + const STATUS_RECHARGED_SUCCESS = 2; // 充值成功(管理员通过) + const STATUS_RECHARGED_FAIL = 3; // 充值失败 + const STATUS_RECHARGED_CANCEL = 4; // 充值取消(玩家取消) + const STATUS_RECHARGED_REJECT = 5; // 拒绝(管理员拒绝) + const STATUS_RECHARGED_SYSTEM_CANCEL = 6; // 已关闭(系统取消) + + const TYPE_REGULAR = 1; // 普通充值 + const TYPE_ACTIVITY = 2; // 活动充值 + const TYPE_ARTIFICIAL = 4; // 人工充值 + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.player_recharge_record_table')); + } + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'player_id')->withTrashed(); + } + + /** + * 渠道信息 + * @return BelongsTo + */ + public function channel(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_model'), 'department_id', 'department_id')->withTrashed(); + } + + /** + * 充值配置信息 + * @return BelongsTo + */ + public function channel_recharge_setting(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_recharge_setting_model'), 'setting_id')->withTrashed(); + } + + /** + * 获取器 - 标签id + * @param $value + * @return false|string[] + */ + public function getPlayerTagAttribute($value) + { + return array_filter(explode(',', $value)); + } + + /** + * 修改器 - 标签id + * @param $value + * @return string + */ + public function setPlayerTagAttribute($value): string + { + return $this->attributes['player_tag'] = implode(',', $value); + } + + /** + * 金额 + * + * @param $value + * @return float + */ + public function getMoneyAttribute($value): float + { + return floatval($value); + } + + /** + * 时间金额 + * + * @param $value + * @return float + */ + public function getInmoneyAttribute($value): float + { + return floatval($value); + } + + /** + * 游戏点数 + * + * @param $value + * @return float + */ + public function getCoinsAttribute($value): float + { + return floatval($value); + } + + /** + * 模型的 "booted" 方法 + * + * @return void + */ + protected static function booted() + { + if (config('app.profit', 'task') == 'event') { + static::updated(function (PlayerRechargeRecord $playerRechargeRecord) { + $oldStatus = $playerRechargeRecord->getOriginal('status'); // 原始值 + $newStatus = $playerRechargeRecord->status; + // 游戏结束并且产生盈亏后计算分润 + if ($oldStatus != $newStatus && $newStatus == PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS) { + Event::emit('promotion.playerRecharge', $playerRechargeRecord); + } + }); + } + } +} diff --git a/addons/webman/model/PlayerRegisterRecord.php b/addons/webman/model/PlayerRegisterRecord.php new file mode 100644 index 0000000..1222268 --- /dev/null +++ b/addons/webman/model/PlayerRegisterRecord.php @@ -0,0 +1,58 @@ +setTable(plugin()->webman->config('database.player_register_record_table')); + } + + /** + * 玩家信息 + * @return belongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'),'player_id')->withTrashed(); + } +} diff --git a/addons/webman/model/PlayerTag.php b/addons/webman/model/PlayerTag.php new file mode 100644 index 0000000..943c5ce --- /dev/null +++ b/addons/webman/model/PlayerTag.php @@ -0,0 +1,65 @@ +setTable(plugin()->webman->config('database.player_tag_table')); + } + + /** + * 时间转换 + * @param DateTimeInterface $date + * @return string + */ + protected function serializeDate(DateTimeInterface $date): string + { + return $date->format('Y-m-d H:i:s'); + } + + /** + * 模型的 "booted" 方法 + * + * @return void + */ + protected static function booted() + { + static::created(function () { + $cacheKey = "doc_player_tag_options_filter"; + $data = (new PlayerTag())->select(['name', 'id'])->get()->toArray(); + $data = $data ? array_column($data, 'name', 'id') : []; + Cache::set($cacheKey, $data, 24 * 60 * 60); + }); + static::deleted(function () { + $cacheKey = "doc_player_tag_options_filter"; + $data = (new PlayerTag())->select(['name', 'id'])->get()->toArray(); + $data = $data ? array_column($data, 'name', 'id') : []; + Cache::set($cacheKey, $data, 24 * 60 * 60); + }); + static::updated(function () { + $cacheKey = "doc_player_tag_options_filter"; + $data = (new PlayerTag())->select(['name', 'id'])->get()->toArray(); + $data = $data ? array_column($data, 'name', 'id') : []; + Cache::set($cacheKey, $data, 24 * 60 * 60); + }); + } +} diff --git a/addons/webman/model/PlayerWalletTransfer.php b/addons/webman/model/PlayerWalletTransfer.php new file mode 100644 index 0000000..7e44c31 --- /dev/null +++ b/addons/webman/model/PlayerWalletTransfer.php @@ -0,0 +1,68 @@ + 'department_id']; + const TYPE_OUT = 1; // 转出 + const TYPE_IN = 2; // 转入 + //数据权限字段 + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.player_wallet_transfer_table')); + } + + /** + * 渠道信息 + * @return BelongsTo + */ + public function channel(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_model'), 'department_id', 'department_id')->withTrashed(); + } + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'player_id')->withTrashed(); + } + + /** + * 平台信息 + * @return BelongsTo + */ + public function gamePlatform(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.game_platform_model'),'platform_id')->withTrashed(); + } +} diff --git a/addons/webman/model/PlayerWithdrawRecord.php b/addons/webman/model/PlayerWithdrawRecord.php new file mode 100644 index 0000000..5fe2031 --- /dev/null +++ b/addons/webman/model/PlayerWithdrawRecord.php @@ -0,0 +1,176 @@ + 'department_id']; + + const STATUS_WAIT = 1; // 提现中(待审核) + const STATUS_SUCCESS = 2; // 成功 + const STATUS_FAIL = 3; // 提现失败 + const STATUS_PENDING_PAYMENT = 4; // 待打款(审核通过) + const STATUS_PENDING_REJECT = 5; // 审核拒绝 + const STATUS_CANCEL = 6; // 玩家取消 + const STATUS_SYSTEM_CANCEL = 7; // 系统取消 + + const TYPE_USDT = 1; // usdt + const TYPE_SELF = 2; // 渠道提现 + const TYPE_ARTIFICIAL = 3; // 人工提现 + const TYPE_ESPAYOUT = 4; // ES代付 + const TYPE_ONEPAYOUT = 5; // ONE代付 + const TYPE_SKLPAYOUT = 6; // SKL代付 + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.player_withdraw_record_table')); + } + + /** + * 渠道信息 + * @return BelongsTo + */ + public function channel(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_model'), 'department_id', 'department_id')->withTrashed(); + } + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'player_id'); + } + + /** + * 获取器 - 标签id + * @param $value + * @return false|string[] + */ + public function getPlayerTagAttribute($value) + { + return array_filter(explode(',', $value)); + } + + /** + * 修改器 - 标签id + * @param $value + * @return string + */ + public function setPlayerTagAttribute($value): string + { + return $this->attributes['player_tag'] = implode(',', $value); + } + + /** + * 实际金额 + * + * @param $value + * @return float + */ + public function getInmoneyAttribute($value): float + { + return floatval($value); + } + + /** + * 金额 + * + * @param $value + * @return float + */ + public function getMoneyAttribute($value): float + { + return floatval($value); + } + + /** + * 游戏点数 + * + * @param $value + * @return float + */ + public function getCoinsAttribute($value): float + { + return floatval($value); + } + + /** + * 手续费 + * + * @param $value + * @return float + */ + public function getFeeAttribute($value): float + { + return floatval($value); + } + + /** + * 模型的 "booted" 方法 + * + * @return void + */ + protected static function booted() + { + if (config('app.profit', 'task') == 'event') { + static::updated(function (PlayerWithdrawRecord $playerWithdrawRecord) { + $oldStatus = $playerWithdrawRecord->getOriginal('status'); // 原始值 + $newStatus = $playerWithdrawRecord->status; + // 游戏结束并且产生盈亏后计算分润 + if ($oldStatus != $newStatus && $newStatus == PlayerWithdrawRecord::STATUS_SUCCESS) { + Event::emit('promotion.playerWithdraw', $playerWithdrawRecord); + } + }); + } + } +} diff --git a/addons/webman/model/Prize.php b/addons/webman/model/Prize.php new file mode 100644 index 0000000..45dd370 --- /dev/null +++ b/addons/webman/model/Prize.php @@ -0,0 +1,47 @@ +setTable(plugin()->webman->config('database.promoter_profit_record_table')); + } + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'player_id'); + } + + /** + * 推广员信息 + * @return BelongsTo + */ + public function promoter(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_promoter_model'), 'promoter_player_id', 'player_id'); + } + + /** + * 来源推广员 + * @return BelongsTo + */ + public function source_promoter(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_promoter_model'), 'source_player_id', 'player_id'); + } + + /** + * 推广员玩家信息 + * @return BelongsTo + */ + public function player_promoter(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'promoter_player_id'); + } + + /** + * 结算信息 + * @return BelongsTo + */ + public function settlement(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.promoter_profit_settlement_record_model'), 'settlement_id'); + } +} \ No newline at end of file diff --git a/addons/webman/model/PromoterProfitSettlementRecord.php b/addons/webman/model/PromoterProfitSettlementRecord.php new file mode 100644 index 0000000..355b37b --- /dev/null +++ b/addons/webman/model/PromoterProfitSettlementRecord.php @@ -0,0 +1,81 @@ +setTable(plugin()->webman->config('database.promoter_profit_settlement_record_table')); + } + + /** + * 推广员信息 + * @return BelongsTo + */ + public function promoter(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_promoter_model'), 'promoter_player_id', 'player_id'); + } + + /** + * 推广员玩家信息 + * @return BelongsTo + */ + public function player_promoter(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'promoter_player_id'); + } + + /** + * 管理员用户 + * @return BelongsTo + */ + public function user(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.user_model'), 'user_id')->withTrashed(); + } +} \ No newline at end of file diff --git a/addons/webman/model/Qrcode.php b/addons/webman/model/Qrcode.php new file mode 100644 index 0000000..699534a --- /dev/null +++ b/addons/webman/model/Qrcode.php @@ -0,0 +1,57 @@ +format('Y-m-d H:i:s'); + } + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.qrcode_table')); + } + + public function qrcode_batch(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.qrcode_batch_model'), 'batch_id', 'id'); + } + +} diff --git a/addons/webman/model/QrcodeBatch.php b/addons/webman/model/QrcodeBatch.php new file mode 100644 index 0000000..350d152 --- /dev/null +++ b/addons/webman/model/QrcodeBatch.php @@ -0,0 +1,59 @@ +format('Y-m-d H:i:s'); + } + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.qrcode_batch_table')); + } + + + public function qrcode_owner(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.qrcode_owner_model'), 'owner_id'); + } + + public function qrcode(): HasMany + { + return $this->hasMany(plugin()->webman->config('database.qrcode_model'), 'batch_id'); + } + +} diff --git a/addons/webman/model/QrcodeOwner.php b/addons/webman/model/QrcodeOwner.php new file mode 100644 index 0000000..e77c4ae --- /dev/null +++ b/addons/webman/model/QrcodeOwner.php @@ -0,0 +1,58 @@ +format('Y-m-d H:i:s'); + } + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.qrcode_owner_table')); + } + + public function qrcode_batch(): hasMany + { + return $this->hasMany(plugin()->webman->config('database.qrcode_batch_model'), 'owner_id'); + } + + public function qrcode(): hasManyThrough + { + return $this->hasManyThrough(plugin()->webman->config('database.qrcode_model'), plugin()->webman->config('database.qrcode_batch_model'), 'owner_id', 'batch_id'); + } + +} diff --git a/addons/webman/model/SepayRecharge.php b/addons/webman/model/SepayRecharge.php new file mode 100644 index 0000000..a638e51 --- /dev/null +++ b/addons/webman/model/SepayRecharge.php @@ -0,0 +1,50 @@ +format('Y-m-d H:i:s'); + } + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.sepay_recharge_table')); + } + + + +} diff --git a/addons/webman/model/SignIns.php b/addons/webman/model/SignIns.php new file mode 100644 index 0000000..7993bc4 --- /dev/null +++ b/addons/webman/model/SignIns.php @@ -0,0 +1,67 @@ + 'department_id']; + //简写省略id,默认后台用户表的id + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.sign_ins_table')); + } + + /** + * 渠道信息 + * @return BelongsTo + */ + public function channel(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_model'), 'department_id', 'department_id')->withTrashed(); + } + + /** + * 玩家信息 + * @return BelongsTo + */ + public function player(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.player_model'), 'player_id'); + } + + /** + * 时间转换 + * @param DateTimeInterface $date + * @return string + */ + protected function serializeDate(DateTimeInterface $date): string + { + return $date->format('Y-m-d H:i:s'); + } +} diff --git a/addons/webman/model/Slider.php b/addons/webman/model/Slider.php new file mode 100644 index 0000000..0abb4d1 --- /dev/null +++ b/addons/webman/model/Slider.php @@ -0,0 +1,46 @@ +'department_id']; + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.slider_table')); + } + + /** + * 渠道信息 + * @return BelongsTo + */ + public function channel(): BelongsTo + { + return $this->belongsTo(plugin()->webman->config('database.channel_model'), 'department_id', 'department_id')->withTrashed(); + } +} diff --git a/addons/webman/model/SystemSetting.php b/addons/webman/model/SystemSetting.php new file mode 100644 index 0000000..9d8f141 --- /dev/null +++ b/addons/webman/model/SystemSetting.php @@ -0,0 +1,43 @@ + 'department_id']; + + public function __construct(array $attributes = []) + { + parent::__construct($attributes); + $this->setTable(plugin()->webman->config('database.system_setting_table')); + } + + const FIRST_RECHARGE_MODEL_ONE = 1; // 一次性发放 + const FIRST_RECHARGE_MODEL_ADD = 2; // 累计发放 + + const FIRST_RECHARGE_TYPE_VALUE = 1; // 固定值 + const FIRST_RECHARGE_TYPE_PERCENT = 2; // 百分比 +} \ No newline at end of file diff --git a/addons/webman/service/Menu.php b/addons/webman/service/Menu.php new file mode 100644 index 0000000..15711a4 --- /dev/null +++ b/addons/webman/service/Menu.php @@ -0,0 +1,111 @@ +model = plugin()->webman->config('database.menu_model'); + } + + /** + * 菜单 + * @return array + */ + public function all(): array + { + $departmentId = Admin::user()->department_id; + /** @var Channel $channel */ + if (Admin::user()->type == AdminDepartment::TYPE_CHANNEL) { + $channel = Channel::where('department_id', $departmentId)->first(); + } + return $this->model::where('status', 1) + ->where('type', Admin::user()->type) + ->when(plugin()->webman->config('admin_auth_id') != Admin::id(), function ($query) { + $model = plugin()->webman->config('database.role_menu_model'); + $menuIds = $model::whereIn('role_id', Admin::role())->pluck('menu_id'); + $query->whereIn('id', $menuIds); + }) + ->when(isset($channel) && !empty($channel) && $channel->withdraw_status == 0, function ($query) { + $query->where('id', '!=', 59); + }) + ->when(isset($channel) && !empty($channel) && $channel->promotion_status == 0, function ($query) { + $query->whereNotIn('id', [73, 74, 75, 76]); + }) + ->when(isset($channel) && !empty($channel) && $channel->coin_status == 0, function ($query) { + $query->whereNotIn('id', [37, 38, 39, 40]); + }) + ->orderBy('sort')->get()->toArray(); + } + + /** + * 获取菜单 + * @param array $data + * @return array + */ + public function get($id) + { + return $this->model::find($id)->toArray(); + } + + /** + * 更新菜单 + * @param int $id + * @param array $data + * @return mixed + */ + public function update($id, $data) + { + $this->model::where('id', $id)->update($data); + } + + /** + * 创建菜单 + * @param array $data + * @return int + */ + public function create(array $data): int + { + $result = $this->model::create($data); + return $result->id; + } + + /** + * 启用菜单 + * @param $plugin + * @return mixed + */ + public function enable($plugin) + { + $this->model::where('plugin', $plugin)->update(['status' => 1]); + } + + /** + * 禁用菜单 + * @param $plugin + * @return mixed + */ + public function disable($plugin) + { + $this->model::where('plugin', $plugin)->update(['status' => 0]); + } + + /** + * 删除菜单 + * @param $plugin + * @return mixed + */ + public function delete($plugin) + { + $this->model::where('plugin', $plugin)->delete(); + } +} diff --git a/addons/webman/service/Service.php b/addons/webman/service/Service.php new file mode 100644 index 0000000..1367b0e --- /dev/null +++ b/addons/webman/service/Service.php @@ -0,0 +1,10 @@ +model->getKeyName(); + } + + /** + * 获取当前用户 + * @return mixed + */ + public function user($id) + { + return $this->model->find($id); + } +} \ No newline at end of file diff --git a/addons/webman/traits/DataPermissions.php b/addons/webman/traits/DataPermissions.php new file mode 100644 index 0000000..4fdc754 --- /dev/null +++ b/addons/webman/traits/DataPermissions.php @@ -0,0 +1,120 @@ +withoutGlobalScope('dataAuth'); + } + + /** + * 数据权限字段 + * @var array + */ + public function initializeDataPermissions() + { + $adminId = Admin::id(); + if ($adminId && plugin()->webman->config('admin_auth_id') != $adminId) { + + static::addGlobalScope('dataAuth', function ($builder) { + $adminId = Admin::id(); + if (request()->app != 'api' && $adminId && plugin()->webman->config('admin_auth_id') != $adminId) { + $role_user_table = plugin()->webman->config('database.role_user_table'); + $role_table = plugin()->webman->config('database.role_table'); + $role = DB::connection($this->getConnectionName())->table($role_table) + ->selectRaw($role_table . '.id,data_type') + ->where($role_user_table . '.user_id', $adminId) + ->join($role_user_table, $role_user_table . '.role_id', '=', $role_table . '.id') + ->orderBy('data_type') + ->first(); + $builder->where(function ($query) use ($role, $adminId) { + $table = $this->getTable(); + $user_table = plugin()->webman->config('database.user_table'); + switch ($role->data_type) { + case $this->CUSTOM_DATA_PERMISSIONS: + $role_department_table = plugin()->webman->config('database.role_department_table'); + $query->where(function ($q) use ($table, $query, $user_table, $role_department_table, $role) { + $this->eachDataAuth(function ($field, $adminField) use ($table, $q, $user_table, $role_department_table, $role) { + $db = DB::connection($this->getConnectionName())->table($user_table) + ->selectRaw($user_table . '.' . $adminField) + ->whereNull($user_table . '.deleted_at') + ->join($role_department_table, $role_department_table . '.department_id', '=', $user_table . '.department_id') + ->where($role_department_table . '.role_id', $role->id); + $q->whereRaw($table . '.' . $field . ' IN (' . $db->toSql() . ')', $db->getBindings()); + }); + })->orWhere(function ($q) use ($table) { + $this->eachDataAuth(function ($field, $adminField) use ($table, $q) { + $q->where($table . '.' . $field, Admin::user()->$adminField); + }); + }); + break; + case $this->THIS_DEPARTMENT_AND_THE_FOLLOWING_DATA_PERMISSIONS: + $department_id = Admin::user()->department_id; + $department_table = plugin()->webman->config('database.department_table'); + $this->eachDataAuth(function ($field, $adminField) use ($table, $query, $department_id, $user_table, $department_table) { + $db = DB::connection($this->getConnectionName())->table($user_table) + ->selectRaw($user_table . '.' . $adminField) + ->whereNull($user_table . '.deleted_at') + ->join($department_table, $department_table . '.id', '=', $user_table . '.department_id') + ->whereRaw("FIND_IN_SET({$department_id},{$department_table}.path)"); + $query->whereRaw($table . '.' . $field . ' IN (' . $db->toSql() . ')', $db->getBindings()); + }); + break; + case $this->DATA_PERMISSIONS_FOR_THIS_DEPARTMENT: + $department_id = Admin::user()->department_id; + $this->eachDataAuth(function ($field, $adminField) use ($table, $query, $department_id, $user_table) { + $db = DB::connection($this->getConnectionName())->table($user_table) + ->selectRaw($user_table . '.' . $adminField) + ->whereNull($user_table . '.deleted_at') + ->where('department_id', $department_id); + $query->whereRaw($table . '.' . $field . ' IN (' . $db->toSql() . ')', $db->getBindings()); + }); + break; + case $this->PERSONAL_DATA_RIGHTS: + $this->eachDataAuth(function ($field, $adminField) use ($table, $query) { + $query->where($table . '.' . $field, Admin::user()->$adminField); + }); + break; + } + }); + } + }); + } + } + + private function eachDataAuth(\Closure $closure) + { + foreach ($this->dataAuth as $key => $field) { + if (is_numeric($key)) { + $adminField = 'id'; + } else { + $adminField = $key; + } + call_user_func_array($closure, [$field, $adminField]); + } + } +} diff --git a/addons/webman/traits/HasDateTimeFormatter.php b/addons/webman/traits/HasDateTimeFormatter.php new file mode 100644 index 0000000..405fcc7 --- /dev/null +++ b/addons/webman/traits/HasDateTimeFormatter.php @@ -0,0 +1,12 @@ +format($this->getDateFormat()); + } +} \ No newline at end of file diff --git a/addons/webman/validator/ValidatorFactory.php b/addons/webman/validator/ValidatorFactory.php new file mode 100644 index 0000000..89f8b7d --- /dev/null +++ b/addons/webman/validator/ValidatorFactory.php @@ -0,0 +1,37 @@ +factory = new Validation\Factory($this->loadTranslator()); + } + + protected function loadTranslator() + { + $path = config('translation.path'); + $locale = config('translation.locale'); + + $filesystem = new Filesystem(); + $loader = new Translation\FileLoader($filesystem, $path); + $loader->addNamespace('lang', $path); + $loader->load($locale, 'validation', 'lang'); + + return new Translation\Translator($loader, $locale); + } + + public function __call($method, $args) + { + return call_user_func_array([$this->factory, $method], $args); + } +} \ No newline at end of file diff --git a/addons/webman/views/activity_tabs.vue b/addons/webman/views/activity_tabs.vue new file mode 100644 index 0000000..2914878 --- /dev/null +++ b/addons/webman/views/activity_tabs.vue @@ -0,0 +1,386 @@ + + \ No newline at end of file diff --git a/addons/webman/views/agent.vue b/addons/webman/views/agent.vue new file mode 100644 index 0000000..5806110 --- /dev/null +++ b/addons/webman/views/agent.vue @@ -0,0 +1,322 @@ + + + diff --git a/addons/webman/views/login.vue b/addons/webman/views/login.vue new file mode 100644 index 0000000..d72e860 --- /dev/null +++ b/addons/webman/views/login.vue @@ -0,0 +1,322 @@ + + + diff --git a/addons/webman/views/machine_status.vue b/addons/webman/views/machine_status.vue new file mode 100644 index 0000000..1a50ddd --- /dev/null +++ b/addons/webman/views/machine_status.vue @@ -0,0 +1,72 @@ + + \ No newline at end of file diff --git a/addons/webman/views/media_play.vue b/addons/webman/views/media_play.vue new file mode 100644 index 0000000..f4ba03b --- /dev/null +++ b/addons/webman/views/media_play.vue @@ -0,0 +1,206 @@ + + + \ No newline at end of file diff --git a/addons/webman/views/my_editor.vue b/addons/webman/views/my_editor.vue new file mode 100644 index 0000000..efdd507 --- /dev/null +++ b/addons/webman/views/my_editor.vue @@ -0,0 +1,42 @@ + + + \ No newline at end of file diff --git a/addons/webman/views/socket.vue b/addons/webman/views/socket.vue new file mode 100644 index 0000000..f55b1e7 --- /dev/null +++ b/addons/webman/views/socket.vue @@ -0,0 +1,350 @@ + + + \ No newline at end of file diff --git a/app/api/controller/v1/GameController.php b/app/api/controller/v1/GameController.php new file mode 100644 index 0000000..91d78f6 --- /dev/null +++ b/app/api/controller/v1/GameController.php @@ -0,0 +1,240 @@ +intVal()->setName(trans('platform_id', [], 'message'))) + ->key('game_code', v::stringVal()->setName(trans('game_code', [], 'message'))) + ->key('app_type', v::notEmpty()->intVal()->in([ + GameServiceFactory::DEVICE_TYPE_WEB, + GameServiceFactory::DEVICE_TYPE_IOS, + GameServiceFactory::DEVICE_TYPE_ANDROID, + ])->setName(trans('app_type', [], 'message'))); + + $data = $request->all(); + /** @var GamePlatform $gamePlatform */ + $gamePlatform = GamePlatform::query()->find($data['platform_id']); + if (empty($gamePlatform)) { + return jsonFailResponse(trans('game_platform_not_found', [], 'message')); + } + if ($gamePlatform->status == 0) { + return jsonFailResponse(trans('game_platform_disabled', [], 'message')); + } + /** @var Game $game */ + $game = Game::query() + ->whereHas('gamePlatform', function ($query) { + $query->where('status', 1)->whereNull('deleted_at'); + }) + ->where('platform_id', $data['platform_id']) + ->where('game_code', $data['game_code']) + ->first(); + if (empty($game)) { + return jsonFailResponse(trans('game_not_found', [], 'message')); + } + if ($game->status == 0) { + return jsonFailResponse(trans('game_disabled', [], 'message')); + } + $lang = locale(); + $lang = Str::replace('_', '-', $lang); + try { + $validator->assert($data); + $res = GameServiceFactory::createService(strtoupper($gamePlatform->name), $player)->login( + [ + 'CallBackUrl' => '', + 'lang' => $lang, + 'gameCode' => $game->game_code, + 'appType' => $data['app_type'], + 'platformGameType' => $game->platform_game_type + ] + ); + if ($player->wallet->money > 0) { + GameServiceFactory::createService(strtoupper($gamePlatform->name), $player)->balanceTransferOut(); + } + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } catch (\Exception $e) { + return jsonFailResponse($e->getMessage()); + } + if ($gamePlatform->name == 'MEGA888') { + $response = [ + 'link_game' => $res['url'], + 'jump_url' => 'lobbymegarelease://', + 'jump_url_android' => 'lobbymegarelease://?account='.$res['account'].'&password='.$res['password'], + 'jump_url_ios' => 'lobbymegarelease://account='.$res['account'].'&password='.$res['password'], + 'account' => $res['account'], + 'password' => $res['password'], + ]; + } elseif ($gamePlatform->name == 'KISS918') { + $response = [ + 'link_game' => $res['url'], + 'jump_url_android' => 'lobbykiss://lobbykiss?account='.$res['account'].'&password='.$res['password'], + 'jump_url_ios' => 'lobbykissgame://account='.$res['account'].'&password='.$res['password'], + 'account' => $res['account'], + 'password' => $res['password'], + ]; + } else { + $response = ['link_game' => $res]; + } + return jsonSuccessResponse('success',$response); + } + + /** + * 游戏列表 + * @param Request $request + * @return Response + * @throws PlayerCheckException|GameException + */ + public function gameList(Request $request): Response + { + checkPlayer(); + $validator = v::key('game_type', v::notEmpty()->intVal()->setName(trans('game_type', [], 'message')), false) + ->key('is_hot', v::optional(v::in([0, 1]))->setName(trans('is_hot', [], 'message')), false); + + $data = $request->all(); + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + $size = $data['size'] ?? 20; + $query = Game::query() + ->with(['gamePlatform' => function ($query) { + $query->select(['id', 'name', 'status']); + }]) + ->whereHas('gamePlatform', function ($query) { + $query->where('status', 1)->whereNull('deleted_at'); + }) + ->where('status', 1) + ->where('is_online', 1) + ->when(!empty($data['game_type']), function ($query) use ($data) { + $query->where('game_type', $data['game_type']); + }) + ->when(isset($data['is_hot']) && is_numeric($data['is_hot']), function ($query) use ($data) { + $query->where('is_hot', $data['is_hot']); + }) + ->when(isset($data['platform_id']) && is_numeric($data['platform_id']), function ($query) use ($data) { + $query->where('platform_id', $data['platform_id']); + }); + $list = $query->select(['id', 'platform_id', 'game_code', 'game_type', 'game_image', 'name', 'status', 'player_num_range', 'is_hot', 'is_new', 'sort']) + ->forPage($data['page'] ?? 1, $size) + ->orderBy('sort', 'desc') + ->orderBy('id', 'desc') + ->get(); + $totalGames = $query->count(); + /** @var Game $game */ + foreach ($list as $game) { + $game->player_num_range = empty($game->player_num_range) ? 0 : getGamePlayerNum($game->id, $game->player_num_range); + } + + return jsonSuccessResponse('success', [ + 'list' => $list, + 'game_platform' => GamePlatform::query()->where('status', 1)->select(['id', 'title'])->get(), + 'current_page' => $data['page'] ?? 1, + 'total_page' => ceil($totalGames / $size) + ]); + } + + /** + * 奖品列表 + */ + public function getPrizeList(Request $request) + { + $player = checkPlayer(); + $prizes = Prize::query() + ->select('pic', 'name', 'id', 'type') + ->where('department_id', $player->department_id) + ->where('status', 1) + ->orderBy('probability') + ->get() + ->toArray(); + $data = [ + 'point' => $player->wallet->money, + 'description' => Game::query()->where('id', $player->channel->game_id)->value('description'), + 'prize_list' => $prizes, + ]; + return jsonSuccessResponse('success',$data); + } + + /** + * 抽奖 + */ + public function lottery(Request $request): Response + { + $player = checkPlayer(); + if ($player->wallet->money <= 0) { + return jsonFailResponse('玩家暂无抽奖机会', [], 1000); + } + $drawService = new DrawService(); + $result = $drawService->execute($player, $player->channel->game_id, $player->department_id, $request->getRealIp()); + return jsonSuccessResponse('success',$result); + } + + /** + * 抽奖记录 + */ + public function getDrawRecords(Request $request): Response + { + $player = checkPlayer(); + $validator = v::key('page', v::intVal()->setName(trans('page', [], 'message'))) + ->key('size', v::intVal()->setName(trans('size', [], 'message'))) + ->key('start_date', v::stringVal()->setName(trans('start_date', [], 'message'))) + ->key('end_date', v::stringVal()->setName(trans('end_date', [], 'message'))); + $data = $request->all(); + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + $size = $data['size'] ?? 20; + + $query = DrawRecord::query() + ->where('department_id', $player->department_id) + ->where('uid', $player->id) + ->where('game_id', $player->channel->game_id) + ->whereBetween('created_at', [$data['start_date'],date('Y-m-d', strtotime("{$data['end_date']} +1 days"))]); + $record = clone $query; + $list = $query + ->select('consume', 'prize_pic', 'prize_name', 'prize_type', 'draw_time', 'ip') + ->forPage($data['page'] ?? 1, $data['size'] ?? 10) + ->orderBy('id', 'desc') + ->get() + ->toArray(); + $totalRecords = $record->count(); + return jsonSuccessResponse('success', [ + 'list' => $list, + 'total_page' => ceil($totalRecords / $size) + ]); + } + + public function gametest(Request $request): Response + { + return jsonSuccessResponse('', []); + } +} diff --git a/app/api/controller/v1/IndexController.php b/app/api/controller/v1/IndexController.php new file mode 100644 index 0000000..e16e336 --- /dev/null +++ b/app/api/controller/v1/IndexController.php @@ -0,0 +1,751 @@ +all(); + $validator = v::key('bank_name', v::optional(v::stringType()->length(1, 100)->setName(trans('bank_name', [], 'message')))) + ->key('account', v::optional(v::stringType()->length(1, 255)->setName(trans('bank_account', [], 'message')))) + ->key('account_name', v::optional(v::stringType()->length(1, 100)->setName(trans('bank_account_name', [], 'message')))) + ->key('bank_code', v::optional(v::stringType()->length(1, 100)->setName(trans('bank_code', [], 'message')))) + ->key('wallet_address', v::optional(v::stringType()->length(1, 255)->setName(trans('wallet_address', [], 'message')))) + ->key('qr_code', v::optional(v::stringType()->setName(trans('qr_code', [], 'message')))); + + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + if (!empty($data['account']) && PlayerBank::query()->where('account', $data['account']) + ->where('pay_type', $player->channel->pay_type)->exists()) { + return jsonFailResponse(trans('bank_card_has_bind', [], 'message')); + } + $payType = $player->channel->pay_type; + + //USDT判断 + if (!empty($data['wallet_address'])) { + $payType = 4; + if (PlayerBank::query()->where('wallet_address', $data['wallet_address'])->where('pay_type', 4)->exists()) { + return jsonFailResponse(trans('bank_card_has_bind', [], 'message')); + } + } + $bankNum = PlayerBank::query() + ->where('player_id', $player->id) + ->where('status', 1) + ->where('pay_type', $player->channel->pay_type) + ->count(); + if ($bankNum > 2) { + return jsonFailResponse(trans('bank_card_max_three', [], 'message')); + } + $playerBank = new PlayerBank(); + $playerBank->player_id = $player->id; + $playerBank->bank_name = $data['bank_name']; + $playerBank->account = $data['account']; + $playerBank->account_name = $data['account_name']; + $playerBank->wallet_address = $data['wallet_address'] ?? ''; + $playerBank->qr_code = $data['qr_code'] ?? ''; + $playerBank->bank_code = $data['bank_code']; + $playerBank->pay_type = $payType; + if (!$playerBank->save()) { + return jsonFailResponse(trans('add_bank_card_fail', [], 'message')); + } + + return jsonSuccessResponse(trans('add_bank_card_success', [], 'message')); + } + + /** + * 修改银行卡 + * @param Request $request + * @return Response + * @throws GameException + * @throws PlayerCheckException + */ + public function editBankCard(Request $request): Response + { + $player = checkPlayer(); + $data = $request->all(); + $validator = v::key('bank_name', v::notEmpty()->stringType()->length(1, 100)->setName(trans('bank_name', [], 'message'))) + ->key('account_name', v::notEmpty()->stringType()->length(1, 100)->setName(trans('bank_account_name', [], 'message'))) + ->key('bank_code', v::notEmpty()->stringType()->length(1, 100)->setName(trans('bank_code', [], 'message'))) + ->key('id', v::notEmpty()->stringType()->length(1, 100)->setName(trans('id', [], 'message'))); + + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + if (PlayerBank::query()->where('player_id', $player->id)->where('status', 1)->count() > 2) { + return jsonFailResponse(trans('bank_card_max_three', [], 'message')); + } + $playerBank = PlayerBank::query()->find($data['id']); + if ($playerBank->player_id != $player->id) { + return jsonFailResponse(trans('edit_bank_card_fail', [], 'message')); + } + $playerBank->bank_name = $data['bank_name']; + $playerBank->account = $data['account']; + $playerBank->account_name = $data['account_name']; + $playerBank->bank_code = $data['bank_code']; + if (!$playerBank->save()) { + return jsonFailResponse(trans('edit_bank_card_fail', [], 'message')); + } + return jsonSuccessResponse(trans('edit_bank_card_success', [], 'message')); + } + + /** + * 银行卡列表 + * @param Request $request + * @return Response + * @throws PlayerCheckException|GameException + */ + public function bankCardList(Request $request): Response + { + $player = checkPlayer(); + $data = $request->all(); + $validator = v::key('page', v::intVal()->setName(trans('page', [], 'message'))) + ->key('size', v::intVal()->setName(trans('size', [], 'message'))); + + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + + return jsonSuccessResponse('success', [ + 'bank_list' => PlayerBank::query() + ->where('player_id', $player->id) + ->where('status', 1) + ->where('pay_type', $player->channel->pay_type) + ->whereNull('deleted_at') + ->select(['id', 'bank_name', 'account', 'account_name']) + ->forPage($data['page'] ?? 1, $data['size'] ?? 10) + ->orderBy('created_at', 'desc') + ->get() + ->toArray(), + ]); + } + + /** + * 银行卡列表 + * @return Response + * @throws PlayerCheckException|GameException|\think\Exception + */ + public function bankList(): Response + { + $player = checkPlayer(false); + return jsonSuccessResponse('success', [ + 'bank_list' => BankList::query() + ->select(['bank_name', 'bank_code']) + ->where('pay_type', $player->channel->pay_type) + ->where('type', '!=', 1) + ->whereNull('deleted_at') + ->get() + ->toArray(), + ]); + } + + /** + * 删除银行卡 + * @param Request $request + * @return Response + * @throws PlayerCheckException|GameException + */ + public function deleteBankCard(Request $request): Response + { + $player = checkPlayer(); + $data = $request->all(); + $validator = v::key('id', v::intVal()->notEmpty()->setName(trans('bank_card_id', [], 'message'))); + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + + $bankCard = PlayerBank::withTrashed()->where('player_id', $player->id)->where('id', $data['id'])->first(); + if (!$bankCard) { + return jsonFailResponse(trans('bank_card_not_found', [], 'message')); + } + if ($bankCard->status == 0) { + return jsonFailResponse(trans('bank_card_disabled', [], 'message')); + } + if (!empty($bankCard->deleted_at)) { + return jsonFailResponse(trans('bank_card_deleted', [], 'message')); + } + $bankCard->delete(); + + return jsonSuccessResponse(trans('success', [], 'message')); + } + + /** + * 上传支付凭证 + * @param Request $request + * @return Response + * @throws GameException + * @throws PlayerCheckException + */ + public function uploadCertificate(Request $request): Response + { + checkPlayer(); + $file = $request->file('certificate'); + $filePath = ''; + if ($file && $file->isValid()) { + if ($file->getSize() > 3 * 1024 * 1024) { + return jsonFailResponse(trans('image_upload_size_fail', ['{size}' => '3M'], 'message')); + } + $allowedExtensions = ['png', 'jpg', 'jpeg']; + $extension = $file->getUploadExtension(); + if (!in_array($extension, $allowedExtensions)) { + return jsonFailResponse(trans('image_upload_fail', [], 'message')); + } + $savePath = '/storage/certificate/' . date("Ymd", time()) . "/"; + $newPath = public_path() . $savePath; + if (!file_exists($newPath)) { + //检查是否有该文件夹,如果没有就创建,并给予最高权限 + mkdir($newPath, 0755, true); + } + $extension = $file->getUploadExtension(); + $filename = time() . '_' . uniqid() . ".{$extension}"; //文件名 + $newPath = $newPath . $filename; + $file->move($newPath); + $filePath = env('APP_URL', 'http://127.0.0.1:8787') . $savePath . $filename; + } + if (!$filePath) { + return jsonFailResponse(trans('failed_to_upload_recharge_voucher', [], 'message')); + } + + return jsonSuccessResponse('success', ['file_path' => $filePath]); + } + + /** + * 玩家充值 + * @param Request $request + * @return Response + * @throws PlayerCheckException + * @throws Exception + */ + public function playerRecharge(Request $request): Response + { + $player = checkPlayer(); + $data = $request->all(); + $validator = v::key('id', v::notEmpty()->intVal()->setName(trans('recharge_setting_id', [], 'message'))) + ->key('certificate', v::notEmpty()->url()->notEmpty()->setName(trans('certificate', [], 'message'))); + + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + + $rechargeRecord = PlayerRechargeRecord::where('player_id', $player->id) + ->where('status', PlayerRechargeRecord::STATUS_WAIT) + ->where('type', PlayerRechargeRecord::TYPE_REGULAR) + ->first(); + if (!empty($rechargeRecord)) { + return jsonFailResponse(trans('has_not_unfinished_recharge', [], 'message')); + } + /** @var Channel $channel */ + $channel = Channel::where('department_id', $player->department_id)->first(); + if (empty($channel)) { + return jsonFailResponse(trans('channel_not_found', [], 'message')); + } + if ($channel->recharge_status == 0) { + return jsonFailResponse(trans('recharge_closed', [], 'message')); + } + $lang = locale(); + $lang = Str::replace('_', '-', $lang); + /** @var ChannelRechargeSetting $channelRechargeSetting */ + $channelRechargeSetting = ChannelRechargeSetting::with(['channel_recharge_method' => function ($query) use ($lang) { + $query->select(['id', 'account', 'currency'])->with(['methodLang' => function ($query) use ($lang) { + $query->select(['id', 'bank_name', 'sub_bank', 'owner', 'name', 'method_id', 'lang'])->where('lang', $lang); + }]); + }])->whereHas('channel_recharge_method', function ($query) { + $query->whereNull('deleted_at')->where('status', 1); + }) + ->where('department_id', $player->department_id) + ->where('status', 1) + ->where('id', $data['id']) + ->whereNull('deleted_at') + ->first(); + if (empty($channelRechargeSetting)) { + return jsonFailResponse(trans('channel_recharge_setting_not_found', [], 'message')); + } + try { + $allCoins = bcadd($channelRechargeSetting->coins_num, $channelRechargeSetting->gift_coins, 2); + // 生成充值订单 + $playerRechargeRecord = new PlayerRechargeRecord(); + $playerRechargeRecord->player_id = $player->id; + $playerRechargeRecord->department_id = $player->department_id; + $playerRechargeRecord->tradeno = createOrderNo(); + $playerRechargeRecord->player_name = $player->name ?? ''; + $playerRechargeRecord->money = $channelRechargeSetting->money; + $playerRechargeRecord->inmoney = $channelRechargeSetting->money; + $playerRechargeRecord->setting_id = $channelRechargeSetting->id; + $playerRechargeRecord->coins = $channelRechargeSetting->coins_num; + $playerRechargeRecord->gift_coins = $channelRechargeSetting->gift_coins; + $playerRechargeRecord->currency = $channelRechargeSetting->channel_recharge_method->currency; + $playerRechargeRecord->type = $channelRechargeSetting->type; + $playerRechargeRecord->status = PlayerRechargeRecord::STATUS_RECHARGING; + $playerRechargeRecord->certificate = $data['certificate'] ?? ''; + $playerRechargeRecord->bank_name = $channelRechargeSetting->channel_recharge_method->methodLang[0]['bank_name'] ?? ''; + $playerRechargeRecord->sub_bank = $channelRechargeSetting->channel_recharge_method->methodLang[0]['sub_bank'] ?? ''; + $playerRechargeRecord->owner = $channelRechargeSetting->channel_recharge_method->methodLang[0]['owner'] ?? ''; + $playerRechargeRecord->account = $channelRechargeSetting->channel_recharge_method->account; + $playerRechargeRecord->chip_amount = bcmul($allCoins, $channelRechargeSetting->chip_multiple, 2); + $playerRechargeRecord->save(); + } catch (Exception $e) { + return jsonFailResponse($e->getMessage()); + } + + sendSocketMessage('private-admin_group-channel-' . request()->department_id, [ + 'msg_type' => 'player_examine_recharge_order', + 'id' => $rechargeRecord->id, + 'player_id' => $player->id, + 'player_name' => $player->name, + 'player_phone' => $player->phone, + 'money' => $playerRechargeRecord->money, + 'status' => $playerRechargeRecord->status, + 'tradeno' => $playerRechargeRecord->tradeno, + ]); + + return jsonSuccessResponse('success', [ + 'tradeno' => $playerRechargeRecord->tradeno, + 'order_id' => $playerRechargeRecord->id, + 'money' => $playerRechargeRecord->money, + 'coins' => $allCoins, + 'currency' => $playerRechargeRecord->currency, + 'status' => $playerRechargeRecord->status, + 'created_at' => strtotime($playerRechargeRecord->created_at), + 'recharge_setting' => $channelRechargeSetting + ]); + } + + /** + * 提现记录 + * @param Request $request + * @return Response + * @throws PlayerCheckException|GameException + */ + public function cashOutList(Request $request): Response + { + $player = checkPlayer(); + $data = $request->all(); + $validator = v::key('page', v::intVal()->setName(trans('page', [], 'message'))) + ->key('size', v::intVal()->setName(trans('size', [], 'message'))); + + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + $size = $data['size'] ?? 10; + $totalRecords = PlayerWithdrawRecord::query() + ->where('player_id', $player->id) + ->count(); + + return jsonSuccessResponse('success', [ + 'list' => PlayerWithdrawRecord::where('player_id', $player->id) + ->select(['id', 'coins', 'after_coins', 'created_at', 'status']) + ->forPage($data['page'] ?? 1, $data['size'] ?? 10) + ->orderBy('created_at', 'desc') + ->get() + ->toArray(), + 'total_page' => ceil($totalRecords / $size) + ]); + } + + /** + * 玩家提现 + * @param Request $request + * @return Response + * @throws PlayerCheckException + * @throws Exception + */ + public function playerWithdrawal(Request $request): Response + { + $player = checkPlayer(); + $data = $request->all(); + $validator = v::key('amount', v::intVal()->notEmpty()->min(100)->setName(trans('withdrawal_amount', [], 'message'))) + ->key('bank_id', v::intVal()->setName(trans('withdrawal_bank', [], 'message'))); + + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + /** @var Channel $channel */ + $channel = Channel::where('department_id', $player->department_id)->first(); + if ($player->status_withdraw != 1) { + return jsonFailResponse(trans('player_withdraw_closed', [], 'message')); + } + if ($player->wallet->money < $data['amount']) { + return jsonFailResponse(trans('insufficient_balance', [], 'message')); + } + if ($channel->withdraw_status == 0) { + return jsonFailResponse(trans('self_withdraw_closed', [], 'message')); + } + if (empty($data['bank_id'])) { + return jsonFailResponse(trans('please_select_player_bank', [], 'message')); + } + /** @var Currency $currency */ + $currency = Currency::where('identifying', $channel->currency)->where('status', 1)->whereNull('deleted_at')->first(); + if (empty($currency)) { + return jsonFailResponse(trans('currency_no_setting', [], 'message')); + } + /** @var PlayerBank $playerBank */ + $playerBank = PlayerBank::where('id', $data['bank_id'])->where('player_id', $player->id)->where('status', 1)->whereNull('deleted_at')->first(); + if (empty($playerBank)) { + return jsonFailResponse(trans('player_bank_not_found', [], 'message')); + } + if ($player->must_chip_amount > $player->chip_amount) { + return jsonFailResponse(trans('must_chip_amount_incomplete', [], 'message')); + } + DB::beginTransaction(); + try { + $money = bcdiv($data['amount'], $currency->ratio, 2); + // 生成订单 + $playerWithdrawRecord = new PlayerWithdrawRecord(); + $beforeGameAmount = $player->wallet->money; + // 玩家钱包扣减 + $player->wallet->money = bcsub($player->wallet->money, $data['amount'], 2); + $playerWithdrawRecord->player_id = $player->id; + $playerWithdrawRecord->department_id = $player->department_id; + $playerWithdrawRecord->tradeno = createOrderNo(); + $playerWithdrawRecord->player_name = $player->name ?? ''; + $playerWithdrawRecord->player_phone = $player->phone ?? ''; + $playerWithdrawRecord->money = $money; + $playerWithdrawRecord->coins = $data['amount']; + $playerWithdrawRecord->after_coins = $player->wallet->money; + $playerWithdrawRecord->fee = 0; + $playerWithdrawRecord->inmoney = bcsub($playerWithdrawRecord->money, $playerWithdrawRecord->fee, 2); // 实际提现金额 + $playerWithdrawRecord->currency = $channel->currency; + $playerWithdrawRecord->bank_name = $playerBank->bank_name; + $playerWithdrawRecord->account = $playerBank->account; + $playerWithdrawRecord->account_name = $playerBank->account_name; + $playerWithdrawRecord->type = PlayerWithdrawRecord::TYPE_SELF; + $playerWithdrawRecord->status = PlayerWithdrawRecord::STATUS_WAIT; + $playerWithdrawRecord->save(); + + // 更新玩家统计 + $player->player_extend->withdraw_amount = bcadd($player->player_extend->withdraw_amount, $playerWithdrawRecord->coins, 2); + $player->push(); + //寫入金流明細 + $playerDeliveryRecord = new PlayerDeliveryRecord; + $playerDeliveryRecord->player_id = $playerWithdrawRecord->player_id; + $playerDeliveryRecord->department_id = $playerWithdrawRecord->department_id; + $playerDeliveryRecord->target = $playerWithdrawRecord->getTable(); + $playerDeliveryRecord->target_id = $playerWithdrawRecord->id; + $playerDeliveryRecord->type = PlayerDeliveryRecord::TYPE_WITHDRAWAL; + $playerDeliveryRecord->source = 'channel_withdrawal'; + $playerDeliveryRecord->amount = $playerWithdrawRecord->coins; + $playerDeliveryRecord->amount_before = $beforeGameAmount; + $playerDeliveryRecord->amount_after = $player->wallet->money; + $playerDeliveryRecord->tradeno = $playerWithdrawRecord->tradeno ?? ''; + $playerDeliveryRecord->remark = $playerWithdrawRecord->remark ?? ''; + $playerDeliveryRecord->save(); + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return jsonFailResponse(trans('system_error', [], 'message') . $e->getMessage()); + } + + $notice = new Notice(); + $notice->department_id = $playerWithdrawRecord->department_id; + $notice->player_id = $playerWithdrawRecord->player_id; + $notice->source_id = $playerWithdrawRecord->id; + $notice->type = Notice::TYPE_EXAMINE_WITHDRAW; + $notice->receiver = Notice::RECEIVER_DEPARTMENT; + $notice->is_private = 0; + $notice->title = '渠道提现待审核'; + $notice->content = '提现订单待审核,玩家' . (empty($playerWithdrawRecord->player_name) ? $playerWithdrawRecord->player_name : $playerWithdrawRecord->player_phone) . ', 提现游戏点: ' . $playerWithdrawRecord->point . ' 提现金额: ' . $playerWithdrawRecord->money; + $notice->save(); + + if ($playerWithdrawRecord->status == PlayerWithdrawRecord::STATUS_FAIL) { + return jsonFailResponse(trans('withdraw_fail', [], 'message')); + } + sendSocketMessage('private-admin_group-channel-' . $channel->department_id, [ + 'msg_type' => 'player_create_withdraw_order', + 'id' => $playerWithdrawRecord->id, + 'player_id' => $player->id, + 'player_name' => $player->name, + 'player_phone' => $player->phone, + 'money' => $playerWithdrawRecord->money, + 'status' => $playerWithdrawRecord->status, + 'tradeno' => $playerWithdrawRecord->tradeno, + ]); + return jsonSuccessResponse('success', [ + 'tradeno' => $playerWithdrawRecord->tradeno, + 'order_id' => $playerWithdrawRecord->id, + 'money' => $playerWithdrawRecord->money, + 'currency' => $playerWithdrawRecord->currency, + 'status' => $playerWithdrawRecord->status, + ]); + } + + /** + * 首页活动 + * @return Response + * @throws PlayerCheckException|GameException + */ + public function homeActivity(): Response + { + $player = checkPlayer(); + $list = Activity::query() + ->where('department_id', $player->department_id) + ->where('status', 1) + ->limit(3) + ->orderBy('sort', 'desc') + ->get(); + + $lang = locale(); + $lang = Str::replace('_', '-', $lang); + $activityList = []; + /** @var Activity $activity */ + foreach ($list as $activity) { + /** @var ActivityContent $activityContent */ + $activityContent = $activity->activity_content->where('lang', $lang)->first(); + if ($activity->type == Activity::TYPE_CUSTOM) { + if (strtotime($activity->start_time) > time() || strtotime($activity->end_time) < time()) { + continue; + } + } + if ($activity->type == Activity::TYPE_CYCLE) { + if ($activity->cycle_type == 'Week' && $activity->cycle_data != Carbon::now()->dayOfWeek) { + continue; + } + if ($activity->cycle_type == 'Month' && $activity->cycle_data != Carbon::now()->day) { + continue; + } + } + $activityList[] = [ + 'id' => $activity->id, + 'start_time' => $activity->start_time, + 'end_time' => $activity->end_time, + 'name' => $activityContent->name ?? '', + 'lang' => $activityContent->lang, + 'picture' => $activityContent->picture ?? '', + 'recharge_id' => $activity->recharge_id, + 'method_id' => $activity->channelRechargeSetting->method_id, + ]; + } + + return jsonSuccessResponse('success', [ + 'list' => $activityList, + ]); + } + + /** + * cash in记录 + * @param Request $request + * @return Response + * @throws PlayerCheckException|GameException + */ + public function cashInList(Request $request): Response + { + $player = checkPlayer(); + $data = $request->all(); + $validator = v::key('page', v::intVal()->setName(trans('page', [], 'message'))) + ->key('size', v::intVal()->setName(trans('size', [], 'message'))); + + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + $size = $data['size'] ?? 10; + $totalRecords = PlayerRechargeRecord::query() + ->where('player_id', $player->id) + ->count(); + $list = PlayerRechargeRecord::leftJoin('player_delivery_record as pdr',function ($join){ + $join->on( 'pdr.target_id', '=', 'player_recharge_record.id') + ->where('pdr.type', '=', PlayerDeliveryRecord::TYPE_RECHARGE); + })->where('player_recharge_record.player_id', $player->id) + ->select(['player_recharge_record.id', 'player_recharge_record.status', 'player_recharge_record.coins', 'pdr.amount_after', 'player_recharge_record.created_at']) + ->forPage($data['page'] ?? 1, $data['size'] ?? 10) + ->orderBy('player_recharge_record.created_at', 'desc') + ->get() + ->toArray(); + foreach ($list as &$item) { + $item['created_at'] = Carbon::parse($item['created_at'])->format('Y/m/d H:i'); + $item['amount_after'] = round($item['amount_after'], 2); + } + return jsonSuccessResponse('success', [ + 'list' => $list, + 'total_page' => ceil($totalRecords / $size) + ]); + } + + /** + * 消息列表 + * @param Request $request + * @return Response + * @throws PlayerCheckException|GameException + */ + public function noticeList(Request $request): Response + { + $player = checkPlayer(); + $data = $request->all(); + $validator = v::key('page', v::intVal()->setName(trans('page', [], 'message'))) + ->key('size', v::intVal()->setName(trans('size', [], 'message'))); + + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + $noticeList = Notice::query() + ->leftJoin('player_withdraw_record', 'player_withdraw_record.id', '=', 'notice.source_id') + ->select(['notice.id', 'notice.player_id', 'notice.title', 'notice.type', 'notice.content', 'notice.created_at', 'player_withdraw_record.status', 'player_withdraw_record.money']) + ->where('notice.player_id', $player->id) + ->where('notice.receiver', Notice::RECEIVER_PLAYER) + ->where('notice.is_private', 1) + ->whereNull('notice.deleted_at') + ->forPage($data['page'], $data['size']) + ->orderBy('notice.status', 'asc') + ->orderBy('notice.id', 'desc') + ->get(); + foreach ($noticeList as &$item) { + $item['title'] = trans('title.' . $item->type.'.'.$item->status, + ['{point}' => $item->money], + 'notice'); + $item['content'] = trans('content.' . $item->type.'.'.$item->status, + ['{point}' => $item->money], + 'notice'); + } + // 更新为已读状态 + Notice::where('status', 0) + ->where('receiver', Notice::RECEIVER_PLAYER) + ->where('is_private', 1) + ->where('player_id', $player->id) + ->whereNull('deleted_at') + ->update([ + 'status' => 1 + ]); + + return jsonSuccessResponse('success', [ + 'list' => $noticeList + ]); + } + + /** + * 渠道信息 + * @return Response + * @throws PlayerCheckException|GameException + */ + public function channelInfo(): Response + { + $player = checkPlayer(); + return jsonSuccessResponse('success', [ + 'channel_info' => Channel::query() + ->where('department_id', $player->department_id) + ->first(), + ]); + } + + /** + * 提现记录 + * @param Request $request + * @return Response + * @throws PlayerCheckException|GameException + */ + public function withdrawList(Request $request): Response + { + checkPlayer(); + $date = date('Y-m-d'); + $list = PlayerWithdrawRecord::with('player:id,uuid,phone') + ->where('status', 2) + ->whereDate('finish_time', $date) + ->select(['money', 'player_id', 'updated_at']) + ->orderBy('finish_time', 'desc') + ->get() + ->toArray(); + foreach ($list as &$item) { + $PlayerWalletTransfer = PlayerWalletTransfer::query()->where('player_id', $item['player_id']) + ->where('type', PlayerWalletTransfer::TYPE_IN) + ->where('created_at', '<=', $item['updated_at']) + ->orderBy('id', 'desc') + ->first(); + $item['game'] = $PlayerWalletTransfer->gamePlatform->title; + } + unset($item); + $copyList = []; + $broadcast = Broadcast::query() + ->select('title','num','phone','updated_at') + ->where('status', 1) + ->where('type', 1) + ->wheredate('date', $date) + ->get() + ->toArray(); + foreach ($broadcast as $item) { + $copyList[] = [ + 'money' => $item['num'], + 'player_id' => 0, + 'updated_at' => $item['updated_at'], + 'player' => [ + 'id' => 0, + 'uuid' => 0, + 'phone' => $item['phone'], + ], + 'game' => $item['title'] + ]; + } + $data = array_merge($list, $copyList); + $key = array_column($data,'updated_at'); + array_multisort($key, SORT_DESC, $data); + return jsonSuccessResponse('success', [ + 'list' => $data, + ]); + } +} diff --git a/app/api/controller/v1/PlayerController.php b/app/api/controller/v1/PlayerController.php new file mode 100644 index 0000000..eadcd8a --- /dev/null +++ b/app/api/controller/v1/PlayerController.php @@ -0,0 +1,1251 @@ +notEmpty()->setName(trans('phone', [], 'message'))) + ->key('type', v::in([1, 2])->notEmpty()->setName(trans('type', [], 'message'))) + ->key('code', v::stringType()->setName(trans('code', [], 'message')), false) + ->key('password', v::stringType()->setName(trans('password', [], 'message')), false); + $data = $request->all(); + try { + $validator->assert($data); + //手机号规则 + if(!validateMalaysianPhoneNumber($data['phone'])){ + throw new Exception(trans('phone_val_error', [], 'message')); + } + $pattern = '/(\+60|60|0060)01\d{8,9}/'; + if (preg_match($pattern, $data['phone'])) { + $data['phone'] = substr_replace($data['phone'], '601', 0, 4); + } + /** @var Player $player */ + $player = Player::where('phone', $data['phone']) + ->where('department_id', request()->department_id) + ->first(); + if(empty($player)){ + throw new Exception(trans('player_not_found', [], 'message')); + } + //密码登录 + if($data['type'] == 1){ + if(!isset($data['password']) || !password_verify($data['password'],$player->password)){ + throw new Exception(trans('password_error', [], 'message')); + } + }else{ + //验证码错误 + $phone_code = Redis::get(setSmsKey($data['phone'], PhoneSmsLog::TYPE_LOGIN)); + if(!$phone_code){ + throw new Exception(trans('phone_sms_expire', [], 'message')); + } + if(!isset($data['code']) || empty($data['code']) || $phone_code != $data['code']){ + throw new Exception(trans('phone_sms_error', [], 'message')); + } + } + if ($player->status == Player::STATUS_STOP) { + throw new Exception(trans('account_stop', [], 'message')); + } + $player->last_login = date('Y-m-d H:i:s'); + addLoginRecord($player->id); + } catch (AllOfException $e) { + throw new Exception(getValidationMessages($e)); + } catch (Exception $e) { + throw new Exception($e->getMessage()); + } + + return jsonSuccessResponse('success', [ + 'token' => JwtToken::generateToken([ + 'id' => $player->id, + 'avatar' => $player->avatar, + 'name' => $player->name, + 'type' => $player->type, + 'currency' => $player->currency, + 'recommended_code' => $player->recommended_code, + ]), + ]); + } + + /** + * 手机号注册 + * @param Request $request + * @return Response + * @throws Exception + */ + public function phoneRegister(Request $request): Response + { + $data = $request->all(); + $validator = v::key('phone', v::stringType()->notEmpty()->setName(trans('phone', [], 'message'))) + ->key('code', v::stringType()->setName(trans('code', [], 'message'))) + ->key('password', v::stringType()->setName(trans('password', [], 'message'))) + ->key('confim_password', v::stringType()->setName(trans('confim_password', [], 'message'))) + ->key('nickname', v::stringType()->setName(trans('nickname', [], 'message'))); + try { + $validator->assert($data); + //网页注册 + if(!empty($data['web_register']) && empty($data['recommended_code'])){ + throw new Exception(trans('recommend_player_not_found', [], 'message')); + } + //手机号规则 + if(!validateMalaysianPhoneNumber($data['phone'])){ + throw new Exception(trans('phone_val_error', [], 'message')); + } + $pattern = '/(\+60|60|0060)01\d{8,9}/'; + if (preg_match($pattern, $data['phone'])) { + $data['phone'] = substr_replace($data['phone'], '601', 0, 4); + } + //两次密码不一致 + if($data['password'] != $data['confim_password']){ + throw new Exception(trans('confim_password_differ', [], 'message')); + } + //验证码错误 + $phone_code = Redis::get(setSmsKey($data['phone'], PhoneSmsLog::TYPE_REGISTER)); + if(!$phone_code){ + throw new Exception(trans('phone_sms_expire', [], 'message')); + } + if(!isset($data['code']) || empty($data['code']) || $phone_code != $data['code']){ + throw new Exception(trans('phone_sms_error', [], 'message')); + } + /** @var Player $player */ + $player = Player::where('phone', $data['phone']) + ->where('department_id', request()->department_id) + ->first(); + //手机号已被注册 + if($player){ + throw new Exception(trans('phone_has_registered', [], 'message')); + } + $create_player['phone'] = $data['phone']; + $create_player['password'] = $data['password']; + $create_player['name'] = $data['nickname']; + $player = createPlayer(request()->department_id,$create_player); + } catch (AllOfException $e) { + throw new Exception(getValidationMessages($e)); + } catch (Exception $e) { + throw new Exception(trans('create_player_fail', [], 'message') . $e->getMessage()); + } + return jsonSuccessResponse('success', [ + 'token' => JwtToken::generateToken([ + 'id' => $player->id, + 'avatar' => $player->avatar, + 'name' => $player->name, + 'type' => $player->type, + 'currency' => $player->currency, + 'recommended_code' => $player->recommended_code, + ]), + ]); + } + + /** + * 忘记密码 + * @param Request $request + * @return Response + * @throws \Exception + */ + public function forgetPassword(Request $request): Response + { + $data = $request->all(); + $validator = v::key('phone', v::stringType()->notEmpty()->setName(trans('phone', [], 'message'))) + ->key('code', v::stringType()->setName(trans('code', [], 'message'))) + ->key('password', v::stringType()->setName(trans('password', [], 'message'))) + ->key('confim_password', v::stringType()->setName(trans('confim_password', [], 'message'))); + try { + $validator->assert($data); + //手机号规则 + if(!validateMalaysianPhoneNumber($data['phone'])){ + throw new Exception(trans('phone_val_error', [], 'message')); + } + $pattern = '/(\+60|60|0060)01\d{8,9}/'; + if (preg_match($pattern, $data['phone'])) { + $data['phone'] = substr_replace($data['phone'], '601', 0, 4); + } + //两次密码不一致 + if($data['password'] != $data['confim_password']){ + throw new Exception(trans('confim_password_differ', [], 'message')); + } + //验证码错误 + $phone_code = Redis::get(setSmsKey($data['phone'], PhoneSmsLog::TYPE_CHANGE_PASSWORD)); + if(!$phone_code){ + throw new Exception(trans('phone_sms_expire', [], 'message')); + } + if(!isset($data['code']) || empty($data['code']) || $phone_code != $data['code']){ + throw new Exception(trans('phone_sms_error', [], 'message')); + } + + /** @var Player $player */ + $player = Player::where('phone', $data['phone']) + ->where('department_id', request()->department_id) + ->first(); + if(empty($player)){ + throw new Exception(trans('player_not_found', [], 'message')); + } + $player->password = $data['password']; + $player->push(); + } catch (AllOfException $e) { + throw new Exception(getValidationMessages($e)); + } catch (Exception $e) { + throw new Exception($e->getMessage()); + } + return jsonSuccessResponse(trans('password_revise_suc', [], 'message')); + } + + /** + * 发送验证码 + * @param Request $request + * @return Response + * @throws \Exception + */ + public function sendMsg(Request $request): Response + { + $data = $request->all(); + $validator = v::key('phone', v::stringType()->notEmpty()->setName(trans('phone', [], 'message'))) + ->key('type', v::stringType()->setName(trans('type', [], 'message')), false); + try { + $validator->assert($data); + //手机号规则 + if(!validateMalaysianPhoneNumber($data['phone'])){ + throw new Exception(trans('phone_val_error', [], 'message')); + } + $pattern = '/(\+60|60|0060)01\d{8,9}/'; + if (preg_match($pattern, $data['phone'])) { + $data['phone'] = substr_replace($data['phone'], '601', 0, 4); + } + if ($data['type'] == 1 || $data['type'] == 3) { + $player = Player::query()->where('phone', $data['phone'])->first(); + if(empty($player)){ + throw new Exception(trans('player_not_found', [], 'message')); + } + } + $env = config('app.env'); + $config = config('sms'); + $code = ($env == 'pro' ? random_int(10000, 99999) : config('sms.default_code')); + //发送验证码 + $params = [ + "userId" => $config['userId'], + "account"=> $config['account'], + "password"=> $config['password'], + "mobile"=> $data['phone'], + "content"=> '【Samsung88】您的验证码为'.$code.',5分钟内有效。', + "sendTime"=> "", + "action"=> "sendhy", + "custom"=> "1" + ]; + $result = doCurl($config['aliwy_url'], $params); + if($result['code'] == 200 && $result['data']['status'] == 'Success'){ + $key = setSmsKey($data['phone'], $data['type']); + $phoneSmsLog = new PhoneSmsLog(); + $phoneSmsLog->player_id = isset($data['player_id']) ? $data['player_id'] : 0; + $phoneSmsLog->code = $code; + $phoneSmsLog->phone = $data['phone']; + $phoneSmsLog->send_times = 1; + $phoneSmsLog->type = $data['type']; + $phoneSmsLog->expire_time = date("Y-m-d H:i:s", time() + 300); + $phoneSmsLog->response = $result ? json_encode($result) : ''; + Redis::set($key, $code, 'EX', 300); + $phoneSmsLog->status = 1; + $phoneSmsLog->save(); + }else{ + throw new Exception($result['data']['message']); + } + } catch (AllOfException $e) { + throw new Exception(getValidationMessages($e)); + }catch (Exception $e) { + throw new Exception($e->getMessage()); + } + return jsonSuccessResponse(trans('phone_sms_send_success', [], 'message')); + } + + /** + * 获取用户信息 + * @param Request $request + * @return Response + * @throws GameException + * @throws PlayerCheckException + */ + public function playerInfo(Request $request): Response + { + $player = checkPlayer(); + + $prizes = Prize::query() + ->select('pic', 'name', 'id', 'type') + ->where('department_id', $player->department_id) + ->where('status', 1) + ->orderBy('probability') + ->get() + ->toArray(); + $game = Game::query()->select('description', 'game_url')->first(); + return jsonSuccessResponse('success', [ + 'id' => $player->id, + 'phone' => $player->phone, + 'avatar' => $player->avatar, + 'currency' => $player->currency, + 'uuid' => $player->uuid, + 'money' => $player->wallet->money, + 'name' => $player->name, + 'recharge_amount' => $player->player_extend->recharge_amount ?? 0, + 'game_description' => $game->description, + 'game_url' => $game->game_url, + 'prize_list' => $prizes, + 'bank_list' => PlayerBank::query() + ->select('id', 'bank_name', 'account', 'account_name', 'bank_code') + ->where('player_id', $player->id) + ->where('status', 1) + ->where('pay_type', '!=', 4) + ->get(), + 'usdt' => PlayerBank::query() + ->select('id', 'wallet_address', 'qr_code') + ->where('player_id', $player->id) + ->where('status', 1) + ->where('pay_type', 4) + ->first(), + 'whats_app' => Channel::query()->where('department_id', $player->department_id)->value('telegram_url'), + ]); + } + + /** + * 获取充值列表 + * @return Response + * @throws PlayerCheckException|GameException + */ + public function rechargeList(): Response + { + $player = checkPlayer(); + $lang = locale(); + $lang = Str::replace('_', '-', $lang); + $channelRechargeMethod = ChannelRechargeMethod::query() + ->with(['methodLang' => function ($query) use ($lang) { + $query->select(['id', 'bank_name', 'sub_bank', 'owner', 'name', 'method_id', 'lang'])->where('lang', $lang); + }]) + ->where('status', 1) + ->where('department_id', $player->department_id) + ->orderBy('created_at', 'desc') + ->select(['id', 'account', 'currency']) + ->get(); + $list = []; + /** @var ChannelRechargeMethod $item */ + foreach ($channelRechargeMethod as $item) { + $list[] = [ + 'id' => $item->id, + 'account' => $item->account, + 'currency' => $item->currency, + 'name' => $item->methodLang[0]['name'] ?? '', + 'bank_name' => $item->methodLang[0]['bank_name'] ?? '', + 'sub_bank' => $item->methodLang[0]['sub_bank'] ?? '', + 'owner' => $item->methodLang[0]['sub_bank'] ?? '', + ]; + } + + return jsonSuccessResponse('success', [ + 'list' => $list, + ]); + } + + /** + * 获取充值项列表 + * @param Request $request + * @return Response + * @throws PlayerCheckException|GameException + */ + public function rechargeSettingList(Request $request): Response + { + $player = checkPlayer(); + $data = $request->all(); + $validator = v::key('method_id', v::oneOf(v::intVal(), v::equals(''))->setName(trans('method_id', [], 'message')), false) + ->key('setting_id', v::oneOf(v::intVal(), v::equals(''))->setName(trans('setting_id', [], 'message')), false) + ->key('type', v::in([ChannelRechargeSetting::TYPE_REGULAR, ChannelRechargeSetting::TYPE_ACTIVITY, ''])->setName(trans('recharge_type', [], 'message')), false); + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + $list = ChannelRechargeSetting::query() + ->whereHas('channel_recharge_method', function ($query) { + $query->where('status', 1); + }) + ->when(!empty($data['method_id']), function ($query) use ($data) { + $query->where('method_id', $data['method_id']); + }) + ->when(!empty($data['setting_id']), function ($query) use ($data) { + $query->where('id', $data['setting_id']); + }) + ->when(!empty($data['type']), function ($query) use ($data) { + $query->where('type', $data['type']); + }) + ->where('department_id', $player->department_id) + ->where('status', 1) + ->orderBy('coins_num', 'asc') + ->select(['id', 'title', 'chip_multiple', 'coins_num', 'money', 'type', 'method_id']) + ->get(); + + return jsonSuccessResponse('success', [ + 'list' => $list, + ]); + } + + /** + * 充值详情 + * @param Request $request + * @return Response + * @throws PlayerCheckException|GameException + */ + public function rechargeInfo(Request $request): Response + { + $player = checkPlayer(); + $data = $request->all(); + $validator = v::key('id', v::intVal()->notEmpty()->setName(trans('recharge_id', [], 'message'))); + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + $lang = locale(); + $lang = Str::replace('_', '-', $lang); + /** @var ChannelRechargeSetting $recharge */ + $recharge = ChannelRechargeSetting::query() + ->with(['channel_recharge_method' => function ($query) use ($lang) { + $query->select(['id', 'account', 'currency'])->with(['methodLang' => function ($query) use ($lang) { + $query->select(['id', 'bank_name', 'sub_bank', 'owner', 'name', 'method_id', 'lang'])->where('lang', $lang); + }]); + }]) + ->where('department_id', $player->department_id) + ->where('id', $data['id']) + ->select(['id', 'title', 'chip_multiple', 'coins_num', 'gift_coins', 'money', 'type', 'method_id', 'status']) + ->first(); + + if (!$recharge) { + return jsonFailResponse(trans('recharge_setting_not_found', [], 'message')); + } + if ($recharge->status == 0) { + return jsonFailResponse(trans('recharge_setting_disabled', [], 'message')); + } + + return jsonSuccessResponse(trans('success', [], 'message'), [ + 'recharge_setting' => $recharge + ]); + } + + /** + * 编辑玩家名称 + * @param Request $request + * @return Response + * @throws PlayerCheckException|GameException + */ + public function editPlayerName(Request $request): Response + { + $player = checkPlayer(); + $data = $request->all(); + $validator = v::key('player_name', v::stringVal()->length(1, 50)->setName(trans('player_name', [], 'message'))); + + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + if (Player::withTrashed()->where('name', $data['player_name'])->where('id', '!=', $player->id)->exists()) { + return jsonFailResponse(trans('player_name_has_exist', [], 'message')); + } + $player->name = $data['player_name'] ?? ''; + $player->save(); + + return jsonSuccessResponse('success'); + } + + /** + * 數據中心 + * @return Response + * @throws PlayerCheckException|GameException + */ + public function giftCenter(): Response + { + $player = checkPlayer(); + + return jsonSuccessResponse('success', [ + 'chip_amount' => $player->chip_amount, + 'must_chip_amount' => $player->must_chip_amount, + 'coins' => $player->wallet->money, + ]); + } + + /** + * 获取四方充值列表 + * @return Response + * @throws PlayerCheckException|GameException + */ + public function seRechargeList(): Response + { + $player = checkPlayer(false); + $list = SepayRecharge::query()->where('department_id', $player->department_id) + ->where('status', 1) + ->orderBy('money') + ->select(['id', 'title', 'coins_num', 'gift_coins', 'first_coins', 'money']) + ->get()->toArray(); + $time = date('H:i:s'); + foreach ($list as &$value){ + $value['P2PDEPOSIT'] = 0; + $value['DUITNOWP2P'] = 0; + if ($value['money'] >= 5 && $value['money'] <= 1000) { + $value['P2PDEPOSIT'] = 1; + if ($time >= '23:50:00' || $time <= '01:05:00') { + $value['P2PDEPOSIT'] = 0; + } + } + if ($value['money'] >= 30 && $value['money'] <= 20000) { + $value['DUITNOWP2P'] = 1; + } + $firstRecharge = PlayerRechargeRecord::query() + ->where('player_id', $player->id) + ->where('status', 2) + ->where('setting_id', $value['id']) + ->first(); + if ($firstRecharge) { + $value['first_coins'] = '0.00'; + } + } + unset($value); + $bankList = []; + $bankSelect = 0; + + if (in_array($player->channel->pay_type, [2, 3])) { + $bankSelect = 1; + $bankList = BankList::query() + ->select(['bank_name', 'bank_code']) + ->where('pay_type', $player->channel->pay_type) + ->where('type', 1) + ->whereNull('deleted_at') + ->get() + ->toArray(); + } + $rechargeSetting = ChannelRechargeMethod::query() + ->with('methodLang') + ->select(['id', 'account', 'wallet_address', 'qr_code', 'type']) + ->where('department_id', $player->department_id) + ->where('status', 1) + ->get()->toArray(); + foreach ($rechargeSetting as &$item) { + if ($item['type'] == 1) { + $item['name'] = 'artificial'; + } else { + $item['name'] = 'usdt'; + } + } + unset($item); + $rechargeSetting[] = [ + 'name' => 'SKL', + 'type' => 3, + ]; + return jsonSuccessResponse('success', [ + 'list' => $list, + 'bank_select' => $bankSelect, + 'bank_list' => $bankList, + 'recharge_setting' => $rechargeSetting + ]); + } + + /** + * 玩家充值 + * @param Request $request + * @return Response + * @throws PlayerCheckException + * @throws GameException + */ + public function seRecharge(Request $request): Response + { + $player = checkPlayer(); + $data = $request->all(); + $validator = v::key('amount', v::notEmpty()->intVal()->setName(trans('recharge_amount', [], 'message'))) + ->key('type', v::notEmpty()->intVal()->setName(trans('type', [], 'message'))); + + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + /** @var Channel $channel */ + $channel = Channel::where('department_id', $player->department_id)->first(); + if (empty($channel)) { + return jsonFailResponse(trans('channel_not_found', [], 'message')); + } + /** @var SepayRecharge $sepayInfo */ + $sepayInfo = SepayRecharge::query()->where('department_id', $player->department_id) + ->where('money', $data['amount'])->first(); + $firstCoins = 0; + $allCoins = $data['amount']; + if(!empty($sepayInfo)) { + if ($sepayInfo->first_coins > 0) { + $firstRecharge = PlayerRechargeRecord::query() + ->where('player_id', $player->id) + ->where('status', 2) + ->where('setting_id', $sepayInfo->id) + ->doesntExist(); + if ($firstRecharge) { + $firstCoins = $sepayInfo->first_coins; + } + } + $allCoins = bcadd($sepayInfo->coins_num, $firstCoins, 2); + } + $orderNo = createOrderNo(); + // 生成充值订单 + $playerRechargeRecord = new PlayerRechargeRecord(); + $playerRechargeRecord->player_id = $player->id; + $playerRechargeRecord->department_id = $player->department_id; + $playerRechargeRecord->tradeno = $orderNo; + $playerRechargeRecord->player_name = $player->name ?? ''; + $playerRechargeRecord->money = $data['amount']; + $playerRechargeRecord->inmoney = $data['amount']; + $playerRechargeRecord->setting_id = $sepayInfo->id ?? 0; + $playerRechargeRecord->coins = $data['amount']; + $playerRechargeRecord->gift_coins = $firstCoins; + $playerRechargeRecord->currency = 'RM'; + //手动支付 + if ($data['type'] == 1) { + $playerRechargeRecord->type = PlayerRechargeRecord::TYPE_REGULAR; + $playerRechargeRecord->status = PlayerRechargeRecord::STATUS_WAIT; + $playerRechargeRecord->save(); + //USDT支付 + } elseif ($data['type'] == 2) { + $rate = ChannelRechargeMethod::query() + ->where('department_id', $player->department_id) + ->where('type', 2) + ->value('rate'); + $playerRechargeRecord->rate = $rate; + $playerRechargeRecord->currency = 'USDT'; + $playerRechargeRecord->type = PlayerRechargeRecord::TYPE_REGULAR; + $playerRechargeRecord->status = PlayerRechargeRecord::STATUS_WAIT; + $playerRechargeRecord->save(); + //三方支付 + }elseif ($data['type'] == 3) { + if ($data['payment_code'] == 'DUITNOWP2P') { + $paymentCode = 'QR'; + } else { + $paymentCode = $data['bank_code']; + } + $params = [ + 'amount' => $data['amount'], + 'paymentCode' => $paymentCode, + 'name' => 'ggl-ds ' . $player->uuid, + 'orderNo' => $orderNo, + ]; + $res = (new SklPayServices())->deposit($params); + + if (!isset($res['status']) && empty($res['code'])) { + DB::beginTransaction(); + try { + $pay_url = $res['transaction_link']; + $playerRechargeRecord->payment_method = $params['paymentCode'] == 'QR' ? 'QR' : 'P2P'; + $playerRechargeRecord->external_reference = $res['transaction_id']; + $playerRechargeRecord->type = PlayerRechargeRecord::TYPE_REGULAR; + $playerRechargeRecord->status = PlayerRechargeRecord::STATUS_WAIT; + $playerRechargeRecord->remark = 'SKL99'; + $playerRechargeRecord->save(); + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return jsonFailResponse($e->getMessage()); + } + return jsonSuccessResponse('success', ['pay_url' => $pay_url]); + } else { + return jsonFailResponse($res['error']); + } + } + + sendSocketMessage('private-admin_group-channel-' . request()->department_id, [ + 'msg_type' => 'player_examine_recharge_order', + 'id' => $playerRechargeRecord->id, + 'player_id' => $player->id, + 'player_name' => $player->name, + 'player_phone' => $player->phone, + 'money' => $playerRechargeRecord->money, + 'status' => $playerRechargeRecord->status, + 'tradeno' => $playerRechargeRecord->tradeno, + ]); + + $rechargeSetting = ChannelRechargeMethod::query() + ->with('methodLang') + ->select(['id', 'account', 'wallet_address', 'qr_code', 'type']) + ->where('department_id', $player->department_id) + ->where('status', 1) + ->where('type', $data['type']) + ->get()->toArray(); + return jsonSuccessResponse('success', [ + 'tradeno' => $playerRechargeRecord->tradeno, + 'order_id' => $playerRechargeRecord->id, + 'money' => $playerRechargeRecord->money, + 'coins' => $allCoins, + 'currency' => $playerRechargeRecord->currency, + 'status' => $playerRechargeRecord->status, + 'created_at' => strtotime($playerRechargeRecord->created_at), + 'recharge_setting' => $rechargeSetting + ]); + } + + /** + * 完成充值 + * @param Request $request + * @return Response + * @throws PlayerCheckException + * @throws PushException|GameException + */ + public function completeRecharge(Request $request): Response { + $player = checkPlayer(); + $data = $request->post(); + $validator = v::key('id', v::notEmpty()->intVal()->setName(trans('recharge_record_id', [], 'message'))) + ->key('certificate', v::notEmpty()->stringVal()->setName(trans('certificate', [], 'message'))); + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + /** @var PlayerRechargeRecord $rechargeRecord */ + $rechargeRecord = PlayerRechargeRecord::query() + ->where('player_id', $player->id) + ->where('id', $data['id']) + ->first(); + if (empty($rechargeRecord)) { + return jsonFailResponse(trans('recharge_record_not_found', [], 'message')); + } + switch ($rechargeRecord->status) { + case PlayerRechargeRecord::STATUS_RECHARGING: + return jsonFailResponse(trans('recharge_record_review_in_progress', [], 'message')); + case PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS: + return jsonFailResponse(trans('recharge_completed', [], 'message')); + case PlayerRechargeRecord::STATUS_RECHARGED_FAIL: + return jsonFailResponse(trans('recharge_failed', [], 'message')); + case PlayerRechargeRecord::STATUS_RECHARGED_CANCEL: + return jsonFailResponse(trans('player_has_cancelled_recharge', [], 'message')); + case PlayerRechargeRecord::STATUS_RECHARGED_REJECT: + return jsonFailResponse(trans('recharge_order_review_failed', [], 'message')); + case PlayerRechargeRecord::STATUS_RECHARGED_SYSTEM_CANCEL: + return jsonFailResponse(trans('system_cancels_order', [], 'message')); + } + $rechargeRecord->status = PlayerRechargeRecord::STATUS_RECHARGING; + $rechargeRecord->certificate = $data['certificate']; + $rechargeRecord->save(); + + sendSocketMessage('private-admin_group-channel-' . $player->department_id, [ + 'msg_type' => 'player_examine_recharge_order', + 'id' => $rechargeRecord->id, + 'player_id' => $player->id, + 'player_name' => $player->name, + 'player_phone' => $player->phone, + 'money' => $rechargeRecord->money, + 'status' => $rechargeRecord->status, + 'tradeno' => $rechargeRecord->tradeno, + ]); + + return jsonSuccessResponse('success'); + } + + /** + * 玩家提现 + * @param Request $request + * @return Response + * @throws PlayerCheckException + * @throws GameException + */ + public function seWithdrawal(Request $request): Response + { + $player = checkPlayer(); + $data = $request->all(); + $validator = v::key('amount', v::intVal()->notEmpty()->min(100)->max(20000)->setName(trans('withdrawal_amount', [], 'message'))) + ->key('bank_id', v::intVal()->setName(trans('withdrawal_bank', [], 'message'))) + ->key('type', v::intVal()->setName(trans('type', [], 'message'))); + + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + + /** @var Channel $channel */ + $channel = Channel::where('department_id', $player->department_id)->first(); + if ($player->status_withdraw != 1) { + return jsonFailResponse(trans('player_withdraw_closed', [], 'message')); + } + if ($player->wallet->money < $data['amount']) { + return jsonFailResponse(trans('insufficient_balance', [], 'message')); + } + if ($channel->withdraw_status == 0) { + return jsonFailResponse(trans('self_withdraw_closed', [], 'message')); + } + if (empty($data['bank_id'])) { + return jsonFailResponse(trans('please_select_player_bank', [], 'message')); + } + /** @var Currency $currency */ + $currency = Currency::where('identifying', $channel->currency)->where('status', 1)->whereNull('deleted_at')->first(); + if (empty($currency)) { + return jsonFailResponse(trans('currency_no_setting', [], 'message')); + } + /** @var PlayerBank $playerBank */ + $playerBank = PlayerBank::where('id', $data['bank_id']) + ->where('player_id', $player->id) + ->where('status', 1) + ->whereNull('deleted_at') + ->first(); + if (empty($playerBank)) { + return jsonFailResponse(trans('player_bank_not_found', [], 'message')); + } + //计算汇率 + $money = bcdiv($data['amount'], $currency->ratio, 2); + //大于5000需要后台审核 + /*if ($money >= 5000) { + DB::beginTransaction(); + try { + $money = bcdiv($data['amount'], $currency->ratio, 2); + // 生成订单 + $playerWithdrawRecord = new PlayerWithdrawRecord(); + $beforeGameAmount = $player->wallet->money; + // 玩家钱包扣减 + $player->wallet->money = bcsub($player->wallet->money, $data['amount'], 2); + $playerWithdrawRecord->player_id = $player->id; + $playerWithdrawRecord->department_id = $player->department_id; + $playerWithdrawRecord->tradeno = createOrderNo(); + $playerWithdrawRecord->player_name = $player->name ?? ''; + $playerWithdrawRecord->player_phone = $player->phone ?? ''; + $playerWithdrawRecord->money = $money; + $playerWithdrawRecord->coins = $data['amount']; + $playerWithdrawRecord->after_coins = $player->wallet->money; + $playerWithdrawRecord->fee = 0; + $playerWithdrawRecord->inmoney = bcsub($playerWithdrawRecord->money, $playerWithdrawRecord->fee, 2); // 实际提现金额 + $playerWithdrawRecord->currency = $channel->currency; + $playerWithdrawRecord->bank_name = $playerBank->bank_name; + $playerWithdrawRecord->bank_code = $playerBank->bank_code; + $playerWithdrawRecord->account = $playerBank->account; + $playerWithdrawRecord->account_name = $playerBank->account_name; + $playerWithdrawRecord->type = PlayerWithdrawRecord::TYPE_SELF; + $playerWithdrawRecord->status = PlayerWithdrawRecord::STATUS_WAIT; + $playerWithdrawRecord->save(); + + // 更新玩家统计 + $player->player_extend->withdraw_amount = bcadd($player->player_extend->withdraw_amount, $playerWithdrawRecord->coins, 2); + $player->push(); + //寫入金流明細 + $playerDeliveryRecord = new PlayerDeliveryRecord; + $playerDeliveryRecord->player_id = $playerWithdrawRecord->player_id; + $playerDeliveryRecord->department_id = $playerWithdrawRecord->department_id; + $playerDeliveryRecord->target = $playerWithdrawRecord->getTable(); + $playerDeliveryRecord->target_id = $playerWithdrawRecord->id; + $playerDeliveryRecord->type = PlayerDeliveryRecord::TYPE_WITHDRAWAL; + $playerDeliveryRecord->source = 'channel_withdrawal'; + $playerDeliveryRecord->amount = $playerWithdrawRecord->coins; + $playerDeliveryRecord->amount_before = $beforeGameAmount; + $playerDeliveryRecord->amount_after = $player->wallet->money; + $playerDeliveryRecord->tradeno = $playerWithdrawRecord->tradeno ?? ''; + $playerDeliveryRecord->remark = $playerWithdrawRecord->remark ?? ''; + $playerDeliveryRecord->save(); + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return jsonFailResponse(trans('system_error', [], 'message') . $e->getMessage()); + } + + $notice = new Notice(); + $notice->department_id = $playerWithdrawRecord->department_id; + $notice->player_id = $playerWithdrawRecord->player_id; + $notice->source_id = $playerWithdrawRecord->id; + $notice->type = Notice::TYPE_EXAMINE_WITHDRAW; + $notice->receiver = Notice::RECEIVER_DEPARTMENT; + $notice->is_private = 0; + $notice->title = '渠道提现待审核'; + $notice->content = '提现订单待审核,玩家' . (empty($playerWithdrawRecord->player_name) ? $playerWithdrawRecord->player_name : $playerWithdrawRecord->player_phone) . ', 提现游戏点: ' . $playerWithdrawRecord->point . ' 提现金额: ' . $playerWithdrawRecord->money; + $notice->save(); + + if ($playerWithdrawRecord->status == PlayerWithdrawRecord::STATUS_FAIL) { + return jsonFailResponse(trans('withdraw_fail', [], 'message')); + } + sendSocketMessage('private-admin_group-channel-' . $channel->department_id, [ + 'msg_type' => 'player_create_withdraw_order', + 'id' => $playerWithdrawRecord->id, + 'player_id' => $player->id, + 'player_name' => $player->name, + 'player_phone' => $player->phone, + 'money' => $playerWithdrawRecord->money, + 'status' => $playerWithdrawRecord->status, + 'tradeno' => $playerWithdrawRecord->tradeno, + ]); + return jsonSuccessResponse('success', [ + 'tradeno' => $playerWithdrawRecord->tradeno, + 'order_id' => $playerWithdrawRecord->id, + 'money' => $playerWithdrawRecord->money, + 'currency' => $playerWithdrawRecord->currency, + 'status' => $playerWithdrawRecord->status, + ]); + }*/ + + // 生成订单 + $orderNo = createOrderNo(); + $playerWithdrawRecord = new PlayerWithdrawRecord(); + $beforeGameAmount = $player->wallet->money; + // 玩家钱包扣减 + $player->wallet->money = bcsub($player->wallet->money, $data['amount'], 2); + $playerWithdrawRecord->player_id = $player->id; + $playerWithdrawRecord->department_id = $player->department_id; + $playerWithdrawRecord->tradeno = $orderNo; + $playerWithdrawRecord->player_name = $player->name ?? ''; + $playerWithdrawRecord->player_phone = $player->phone ?? ''; + $playerWithdrawRecord->money = $money; + $playerWithdrawRecord->coins = $data['amount']; + $playerWithdrawRecord->after_coins = $player->wallet->money; + $playerWithdrawRecord->fee = 0; + $playerWithdrawRecord->inmoney = bcsub($playerWithdrawRecord->money, $playerWithdrawRecord->fee, 2); // 实际提现金额 + $playerWithdrawRecord->currency = $channel->currency; + + DB::beginTransaction(); + try { + //银行卡提现 + if ($data['type'] == 1) { + $playerWithdrawRecord->bank_name = $playerBank->bank_name; + $playerWithdrawRecord->bank_code = $playerBank->bank_code; + $playerWithdrawRecord->account = $playerBank->account; + $playerWithdrawRecord->account_name = $playerBank->account_name; + $playerWithdrawRecord->type = PlayerWithdrawRecord::TYPE_SELF; + $playerWithdrawRecord->status = PlayerWithdrawRecord::STATUS_WAIT; + $playerWithdrawRecord->save(); + //USDT提现 + } elseif ($data['type'] == 2) { + $rate = ChannelRechargeMethod::query() + ->where('department_id', $player->department_id) + ->where('type', 2) + ->value('rate'); + $playerWithdrawRecord->rate = $rate; + $playerWithdrawRecord->currency = 'USDT'; + $playerWithdrawRecord->wallet_address = $playerBank->wallet_address; + $playerWithdrawRecord->qr_code = $playerBank->qr_code; + $playerWithdrawRecord->type = PlayerWithdrawRecord::TYPE_USDT; + $playerWithdrawRecord->status = PlayerWithdrawRecord::STATUS_WAIT; + $playerWithdrawRecord->save(); + //三方提现 + } else { + $params = [ + 'amount' => $money, + 'bankCode' => $playerBank->bank_code, + 'bankAccountNo' => $playerBank->account, + 'bankAccountName' => $playerBank->account_name, + 'orderNo' => $orderNo, + ]; + $res = (new SklPayServices())->payout($params); + if ($res['code'] == 'success') { + $playerWithdrawRecord->bank_name = $playerBank->bank_name; + $playerWithdrawRecord->bank_code = $playerBank->bank_code; + $playerWithdrawRecord->account = $playerBank->account; + $playerWithdrawRecord->account_name = $playerBank->account_name; + $playerWithdrawRecord->talk_tradeno = $res['data']['reference_number']; + $playerWithdrawRecord->type = PlayerWithdrawRecord::TYPE_SKLPAYOUT; + $playerWithdrawRecord->status = PlayerWithdrawRecord::STATUS_WAIT; + $playerWithdrawRecord->save(); + } else { + return jsonFailResponse($res['error']); + } + } + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + return jsonFailResponse(trans('system_error', [], 'message') . $e->getMessage()); + } + + // 更新玩家统计 + $player->player_extend->withdraw_amount = bcadd($player->player_extend->withdraw_amount, $playerWithdrawRecord->coins, 2); + $player->push(); + + //寫入金流明細 + $playerDeliveryRecord = new PlayerDeliveryRecord; + $playerDeliveryRecord->player_id = $playerWithdrawRecord->player_id; + $playerDeliveryRecord->department_id = $playerWithdrawRecord->department_id; + $playerDeliveryRecord->target = $playerWithdrawRecord->getTable(); + $playerDeliveryRecord->target_id = $playerWithdrawRecord->id; + $playerDeliveryRecord->type = PlayerDeliveryRecord::TYPE_WITHDRAWAL; + $playerDeliveryRecord->source = 'channel_withdrawal'; + $playerDeliveryRecord->amount = $playerWithdrawRecord->coins; + $playerDeliveryRecord->amount_before = $beforeGameAmount; + $playerDeliveryRecord->amount_after = $player->wallet->money; + $playerDeliveryRecord->tradeno = $playerWithdrawRecord->tradeno ?? ''; + $playerDeliveryRecord->remark = ''; + $playerDeliveryRecord->save(); + + return jsonSuccessResponse('success', [ + 'tradeno' => $playerWithdrawRecord->tradeno, + 'money' => $playerWithdrawRecord->money, + 'currency' => $playerWithdrawRecord->currency, + 'status' => $playerWithdrawRecord->status, + ]); + } + + + /** + * 玩家账变记录 + * @param Request $request + * @return Response + * @throws PlayerCheckException|PromoterCheckException + */ + public function playerDeliveryRecord(Request $request): Response + { + $player = checkPlayer(false); + $validator = v::key('page', v::intVal()->setName(trans('page', [], 'message'))) + ->key('type', v::stringVal()->setName(trans('date_type', [], 'message'))) + ->key('size', v::intVal()->setName(trans('size', [], 'message'))); + $data = $request->all(); + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + try { + $playerDeliveryRecordModel = PlayerDeliveryRecord::where('player_id', $player->id); + switch ($data['type']) { + case 'today': // 今天 + $playerDeliveryRecordModel->whereDate('created_at', date('Y-m-d')); + break; + case 'week': // 本周 + $playerDeliveryRecordModel->where('created_at', '>=', \Carbon\Carbon::today()->startOfWeek())->where('created_at', '<=', Carbon::today()->endOfWeek()); + break; + case 'month': // 本月 + $playerDeliveryRecordModel->where('created_at', '>=', Carbon::today()->firstOfMonth())->where('created_at', '<=', Carbon::today()->endOfMonth()); + break; + case 'sub_month': // 上月 + $playerDeliveryRecordModel->where('created_at', '>=', Carbon::today()->subMonth()->firstOfMonth())->where('created_at', '<=', Carbon::today()->subMonth()->endOfMonth()); + break; + default: + $playerDeliveryRecordModel->whereDate('created_at', date('Y-m-d')); + break; + } + $inType = implode(',', [ + PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD, + PlayerDeliveryRecord::TYPE_PRESENT_IN, + PlayerDeliveryRecord::TYPE_GAME_IN, + PlayerDeliveryRecord::TYPE_ACTIVITY_BONUS, + PlayerDeliveryRecord::TYPE_REGISTER_PRESENT, + PlayerDeliveryRecord::TYPE_PROFIT, + PlayerDeliveryRecord::TYPE_LOTTERY, + ]); + $outType = implode(',', [ + PlayerDeliveryRecord::TYPE_PRESENT_OUT, + PlayerDeliveryRecord::TYPE_GAME_OUT, + PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT, + ]); + $totalModel = clone $playerDeliveryRecordModel; + $totalData = $totalModel->selectRaw('sum(IF(type in (' . $inType . '), amount, 0)) as total_in, sum(IF(type in (' . $outType . '), amount, 0)) as total_out, sum(IF(type = ' . PlayerDeliveryRecord::TYPE_WITHDRAWAL . ', amount, 0)) as total_withdrawal, sum(IF(type = ' . PlayerDeliveryRecord::TYPE_WITHDRAWAL_BACK . ', amount, 0)) as total_withdrawal_back, sum(IF(type = ' . PlayerDeliveryRecord::TYPE_RECHARGE . ', amount, 0)) as total_recharge')->first(); + + $playerDeliveryRecord = $playerDeliveryRecordModel->forPage($data['page'], $data['size']) + ->orderBy('id', 'desc') + ->get(); + $list = []; + /** @var PlayerDeliveryRecord $item */ + foreach ($playerDeliveryRecord as $item) { + switch ($item->type) { + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD: + $item->target = trans('target.modified_amount_add', [], 'message'); + break; + case PlayerDeliveryRecord::TYPE_PRESENT_IN: + $item->target = trans('target.present_in', [], 'message'); + break; + case PlayerDeliveryRecord::TYPE_PRESENT_OUT: + $item->target = trans('target.present_out', [], 'message'); + $item->amount = '-' . $item->amount; + break; + case PlayerDeliveryRecord::TYPE_GAME_OUT: + $item->target = trans('target.machine_up', [], 'message'); + $item->amount = '-' . $item->amount; + break; + case PlayerDeliveryRecord::TYPE_GAME_IN: + $item->target = trans('target.machine_down', [], 'message'); + break; + case PlayerDeliveryRecord::TYPE_RECHARGE: + switch ($item->source) { + case 'artificial_recharge': + $item->target = trans('target.artificial_recharge', [], 'message'); + break; + case 'self_recharge': + $item->target = trans('target.self_recharge', [], 'message'); + break; + case 'talk_recharge': + $item->target = trans('target.talk_recharge', [], 'message'); + break; + case 'coin_recharge': + $item->target = trans('target.coin_recharge', [], 'message'); + break; + } + break; + case PlayerDeliveryRecord::TYPE_WITHDRAWAL: + switch ($item['source']) { + case 'artificial_withdrawal': + $item->target = trans('target.artificial_withdrawal', [], 'message'); + break; + case 'talk_withdrawal': + $item->target = trans('target.talk_withdrawal', [], 'message'); + break; + case 'channel_withdrawal': + $item->target = trans('target.channel_withdrawal', [], 'message'); + break; + } + $item->amount = '-' . $item->amount; + break; + case PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT: + $item->target = trans('target.modified_amount_deduct', [], 'message'); + $item->amount = '-' . $item->amount; + break; + case PlayerDeliveryRecord::TYPE_WITHDRAWAL_BACK: + $item->target = trans('target.withdrawal_back', [], 'message'); + break; + case PlayerDeliveryRecord::TYPE_ACTIVITY_BONUS: + $item->target = trans('target.activity_bonus', [], 'message'); + break; + case PlayerDeliveryRecord::TYPE_REGISTER_PRESENT: + $item->target = trans('target.register_present', [], 'message'); + break; + case PlayerDeliveryRecord::TYPE_PROFIT: + $item->target = trans('target.profit', [], 'message'); + break; + default: + break; + } + $list[] = [ + 'id' => $item->id, + 'amount' => $item->amount, + 'source' => $item->target, + 'amount_after' => $item->amount_after, + 'created_at' => date('Y-m-d H:i:s', strtotime($item->created_at)), + ]; + } + } catch (\Exception $e) { + return jsonFailResponse($e->getMessage()); + } + + return jsonSuccessResponse('success', [ + 'list' => $list, + 'player' => [ + 'uuid' => $player->uuid, + 'name' => $player->name, + 'promoter_uuid' => $player->uuid, + ], + 'total_data' => [ + 'total_in' => $totalData['total_in'] ?? 0, + 'total_out' => $totalData['total_out'] ?? 0, + 'total_withdrawal' => bcsub($totalData['total_withdrawal'] ?? 0, $totalData['total_withdrawal_back'] ?? 0, 2), + 'total_recharge' => $totalData['total_recharge'] ?? 0, + ], + 'date_type' => [ + 'today' => Carbon::today()->format('Y-m-d'), + 'week' => Carbon::today()->startOfWeek()->format('Y-m-d') . '~' . Carbon::today()->endOfWeek()->format('Y-m-d'), + 'month' => Carbon::today()->firstOfMonth()->format('Y-m-d') . '~' . Carbon::today()->endOfMonth()->format('Y-m-d'), + 'sub_month' => Carbon::today()->subMonth()->firstOfMonth()->format('Y-m-d') . '~' . Carbon::today()->subMonth()->endOfMonth()->format('Y-m-d'), + ] + ]); + } + + /** + * 游戏记录 + * @param Request $request + * @return Response + * @throws PlayerCheckException|GameException + */ + public function gameRecord(Request $request): Response + { + $player = checkPlayer(); + $data = $request->all(); + $validator = v::key('page', v::intVal()->setName(trans('page', [], 'message'))) + ->key('size', v::intVal()->setName(trans('size', [], 'message'))); + + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + + $records = DrawRecord::query() + ->select('prize_pic', 'prize_name', 'prize_type', 'draw_time', 'ip') + ->where('uid', $player->id) + ->orderBy('id', 'desc') + ->forPage($data['page'], $data['size']) + ->get() + ->toArray(); + return jsonSuccessResponse('success', $records); + } + + /** + * 充提记录 + * @param Request $request + * @return Response + * @throws PlayerCheckException|GameException + */ + public function depositWithdrawalRecord(Request $request): Response + { + $player = checkPlayer(); + $data = $request->all(); + $validator = v::key('page', v::intVal()->setName(trans('page', [], 'message'))) + ->key('size', v::intVal()->setName(trans('size', [], 'message'))) + ->key('type', v::intVal()->setName(trans('type', [], 'message'))) + ->key('start_date', v::stringVal()->setName(trans('start_date', [], 'message'))) + ->key('end_date', v::stringVal()->setName(trans('end_date', [], 'message'))); + + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + // 1. 构建充值查询 + $rechargeQuery = DB::table('player_recharge_record') + ->select('money', 'created_at', 'status', DB::raw("1 as type")) + ->where('player_id', $player->id) + ->whereBetween('created_at', [$data['start_date'],date('Y-m-d', strtotime("{$data['end_date']} +1 days"))]); + + // 2. 构建提现查询 + $withdrawQuery = DB::table('player_withdraw_record') + ->select('money', 'created_at', 'status', DB::raw("2 as type")) + ->where('player_id', $player->id) + ->whereBetween('created_at', [$data['start_date'],date('Y-m-d', strtotime("{$data['end_date']} +1 days"))]); + // 3. 根据类型参数过滤 + if ($data['type'] == 1) { + $query = $rechargeQuery; + } elseif ($data['type'] == 2) { + $query = $withdrawQuery; + } else { + $query = $rechargeQuery->unionAll($withdrawQuery); + } + // 4. 处理排序和分页 + $records = DB::table(DB::raw("({$query->toSql()}) as combined_transactions")) + ->mergeBindings($query) // 重要:合并 SQL 绑定参数 + ->orderBy('created_at', 'desc') + ->forPage($data['page'], $data['size']) + ->get()->toArray(); + return jsonSuccessResponse('success', $records); + } +} diff --git a/app/api/controller/v1/VersionController.php b/app/api/controller/v1/VersionController.php new file mode 100644 index 0000000..399c5b6 --- /dev/null +++ b/app/api/controller/v1/VersionController.php @@ -0,0 +1,42 @@ +header('app-version-key', ''); + // 传入检测的系统 + $system_key = $request->header('system-key', ''); + if (empty($version_key) || empty($system_key)) { + return jsonFailResponse(trans('incomplete_parameters', [], 'message')); + } + $data = AppVersion::query() + ->where('app_version_key', '>=', $version_key) + ->where(['status' => 1]) + ->where('status', 1) + ->where('system_key', $system_key) + ->where('department_id', request()->department_id) + ->whereDate('regular_update', '<', date("Y-m-d H:i:s", time())) + ->select(['id', 'system_key', 'app_version', 'app_version_key', 'apk_url', 'hot_update_url', 'force_update', 'hot_update', 'regular_update', 'update_content', 'notes']) + ->orderBy('id', 'desc') + ->first(); + + return jsonSuccessResponse('success', [ + 'data' => $data + ]); + } +} \ No newline at end of file diff --git a/app/exception/ApiHandler.php b/app/exception/ApiHandler.php new file mode 100644 index 0000000..7dc84b1 --- /dev/null +++ b/app/exception/ApiHandler.php @@ -0,0 +1,50 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace app\exception; + +use Respect\Validation\Exceptions\NestedValidationException; +use Respect\Validation\Exceptions\ValidationException; +use Throwable; +use Tinywan\Jwt\Exception\JwtTokenException; +use Tinywan\Jwt\Exception\JwtTokenExpiredException; +use Webman\Exception\ExceptionHandler; +use Webman\Http\Request; +use Webman\Http\Response; + +/** + * Class Handler + * @package support\exception + */ +class ApiHandler extends ExceptionHandler +{ + public $dontReport = [ + NestedValidationException::class, + ValidationException::class, + ]; + + public function render(Request $request, Throwable $exception): Response + { + if ($exception instanceof JwtTokenExpiredException || $exception instanceof JwtTokenException) { + return json([ + 'code' => 401, + 'msg' => $exception->getMessage() + ]); + } + return json([ + 'code' => $exception->getCode(), + 'msg' => $exception->getMessage() + ]); + } +} \ No newline at end of file diff --git a/app/exception/GameException.php b/app/exception/GameException.php new file mode 100644 index 0000000..3bb5c71 --- /dev/null +++ b/app/exception/GameException.php @@ -0,0 +1,6 @@ +all(); + if ($data['status'] && $data['invoice_no']) { + /** @var PlayerRechargeRecord $playerRechargeRecord */ + $playerRechargeRecord = PlayerRechargeRecord::query()->where('tradeno', $data['invoice_no'])->where('status', 0)->first(); + if(empty($playerRechargeRecord) || $playerRechargeRecord->money != $data['amount']){ + return 'FAIL'; + } + if ($data['status'] == 'SUCCESS') { + if ($playerRechargeRecord->gift_coins > 0) { + $firstRecharge = PlayerRechargeRecord::query() + ->where('player_id', $playerRechargeRecord->player_id) + ->where('status', 2) + ->where('setting_id', $playerRechargeRecord->setting_id) + ->first(); + if ($firstRecharge) { + $playerRechargeRecord->gift_coins = 0; + } + } + $addMoney = bcadd($playerRechargeRecord->coins, $playerRechargeRecord->gift_coins, 2); + DB::beginTransaction(); + try { + /** @var Player $player */ + $player = Player::query()->find($playerRechargeRecord->player_id); + $playerRechargeRecord->status = PlayerRechargeRecord::STATUS_RECHARGED_SUCCESS; + $playerRechargeRecord->finish_time = date("Y-m-d H:i:s"); + $playerRechargeRecord->notify_result = json_encode($data); + $playerRechargeRecord->save(); + $beforeGameAmount = $player->wallet->money; + // 更新钱包 + $player->wallet->money = bcadd($player->wallet->money, $addMoney, 2); + $player->player_extend->recharge_amount = bcadd($player->player_extend->recharge_amount, $addMoney, 2); + $player->push(); + //寫入金流明細 + $playerDeliveryRecord = new PlayerDeliveryRecord; + $playerDeliveryRecord->player_id = $player->id; + $playerDeliveryRecord->department_id = $player->department_id; + $playerDeliveryRecord->target = $playerRechargeRecord->getTable(); + $playerDeliveryRecord->target_id = $playerRechargeRecord->id; + $playerDeliveryRecord->type = PlayerDeliveryRecord::TYPE_RECHARGE; + $playerDeliveryRecord->source = 'self_recharge'; + $playerDeliveryRecord->amount = $addMoney; + $playerDeliveryRecord->amount_before = $beforeGameAmount; + $playerDeliveryRecord->amount_after = $player->wallet->money; + $playerDeliveryRecord->tradeno = ''; + $playerDeliveryRecord->remark = ''; + $playerDeliveryRecord->save(); + DB::commit(); + sendSocketMessage('private-recharge_withdrawal', [ + 'msg_type' => 'recharge', + 'player_id' => $player->id, + 'amount' => $player->wallet->money, + ]); + } catch (\Exception $e) { + DB::rollBack(); + Log::info('sklRecharge', (array)$data); + return json_encode(['status' => 'RECEIVED']); + } + return json_encode(['status' => 'RECEIVED']); + } else { + $playerRechargeRecord->status = PlayerRechargeRecord::STATUS_RECHARGED_FAIL; + $playerRechargeRecord->cancel_time = date('Y-m-d H:i:s'); + $playerRechargeRecord->notify_result = json_encode($data); + $playerRechargeRecord->save(); + return json_encode(['status' => 'RECEIVED']); + } + } else { + return json_encode(['status' => 'RECEIVED']); + } + } + + /** + * SKL代付回调 + * @param Request $request + * @return string + */ + public function sklWithdrawalNotify(Request $request): string + { + $data = $request->all(); + if ($data['status'] && $data['invoice_no']) { + //查询订单是否存在 + /** @var PlayerWithdrawRecord $playerWithdrawRecord */ + $playerWithdrawRecord = PlayerWithdrawRecord::query()->where('tradeno', $data['invoice_no'])->where('status', 1)->first(); + if(empty($playerWithdrawRecord) || $playerWithdrawRecord->money != $data['amount']){ + return 'FAIL'; + } + if ($data['status'] == 'SUCCESS') { + $playerWithdrawRecord->status = PlayerWithdrawRecord::STATUS_SUCCESS; + $playerWithdrawRecord->finish_time = date('Y-m-d H:i:s'); + $playerWithdrawRecord->notify_result = json_encode($data); + $playerWithdrawRecord->talk_tradeno = $data['transferOut_id']; + $playerWithdrawRecord->save(); + $broadcast = Broadcast::query() + ->where('type', 2) + ->where('status', 1) + ->where('min_money', '<=', $data['amount']) + ->first(); + if (isset($broadcast)){ + $queue = 'broadcast_tasks'; + $broadcast_data = [ + 'user_id' => substr($playerWithdrawRecord->player->phone, 2), + 'money' => $data['amount'] + ]; + for ($i = 0; $i < $broadcast->copy_num; $i++) { + Redis::send($queue, $broadcast_data); + } + } + $notice = new Notice(); + $notice->department_id = $playerWithdrawRecord->player->department_id; + $notice->player_id = $playerWithdrawRecord->player_id; + $notice->source_id = $playerWithdrawRecord->id; + $notice->type = Notice::TYPE_WITHDRAW; + $notice->receiver = Notice::RECEIVER_PLAYER; + $notice->is_private = 1; + $notice->title = '下分成功'; + $notice->content = '本次申请已成功处理,下分 ' . $playerWithdrawRecord->money . ' ,请查收。 '; + $notice->save(); + return json_encode(['status' => 'RECEIVED']); + } else { + DB::beginTransaction(); + try { + /** @var Player $player */ + $player = Player::query()->find($playerWithdrawRecord->player_id); + $playerWithdrawRecord->status = PlayerWithdrawRecord::STATUS_FAIL; + $playerWithdrawRecord->cancel_time = date('Y-m-d H:i:s'); + $playerWithdrawRecord->notify_result = json_encode($data); + $playerWithdrawRecord->talk_tradeno = $data['transferOut_id']; + $playerWithdrawRecord->save(); + $beforeGameAmount = $player->wallet->money; + // 更新钱包 + $player->wallet->money = bcadd($player->wallet->money, $playerWithdrawRecord->coins, 2); + $player->push(); + //寫入金流明細 + $playerDeliveryRecord = new PlayerDeliveryRecord; + $playerDeliveryRecord->player_id = $player->id; + $playerDeliveryRecord->department_id = $player->department_id; + $playerDeliveryRecord->target = $playerWithdrawRecord->getTable(); + $playerDeliveryRecord->target_id = $playerWithdrawRecord->id; + $playerDeliveryRecord->type = PlayerDeliveryRecord::TYPE_WITHDRAWAL_BACK; + $playerDeliveryRecord->source = 'channel_withdrawal'; + $playerDeliveryRecord->amount = $playerWithdrawRecord->coins; + $playerDeliveryRecord->amount_before = $beforeGameAmount; + $playerDeliveryRecord->amount_after = $player->wallet->money; + $playerDeliveryRecord->tradeno = ''; + $playerDeliveryRecord->remark = '提现失败返还金额'; + $playerDeliveryRecord->save(); + $notice = new Notice(); + $notice->department_id = $player->department_id; + $notice->player_id = $player->id; + $notice->source_id = $playerWithdrawRecord->id; + $notice->type = Notice::TYPE_WITHDRAW; + $notice->receiver = Notice::RECEIVER_PLAYER; + $notice->is_private = 1; + $notice->title = '下分失败'; + $notice->content = '本次申请下分 ' . $playerWithdrawRecord->money . ' 已退回,请查收。 '; + $notice->save(); + DB::commit(); + sendSocketMessage('private-recharge_withdrawal', [ + 'msg_type' => 'withdrawal', + 'player_id' => $player->id, + 'amount' => $player->wallet->money, + ]); + } catch (\Exception $e) { + DB::rollBack(); + Log::info('sklWithdrawal', (array)$data); + return json_encode(['status' => 'RECEIVED']); + } + return json_encode(['status' => 'RECEIVED']); + } + } else { + return json_encode(['status' => 'RECEIVED']); + } + } + + /** + * SKL订单查询 + * @param Request $request + * @return Response + */ + public function sklQuery(Request $request): Response + { + $validator = v::key('transactionId', v::stringType()->notEmpty()->setName(trans('certificate', [], 'message'))); + $data = $request->get(); + try { + $validator->assert($data); + } catch (AllOfException $e) { + return jsonFailResponse(getValidationMessages($e)); + } + $params = [ + 'orderNo' => $data['transactionId'], + ]; + $res = (new SklPayServices())->query($params); + if ($res['status'] == 'SUCCESS') { + return view('skl/detail_success'); + } elseif ($res['status'] == 'FAILED') { + return view('skl/detail_fail'); + } elseif ($res['status'] == 'PENDING_QR') { + return view('skl/detail_paying'); + } elseif ($res['status'] == 'VERIFIED') { + return view('skl/detail_paying'); + } else { + return view('sepay/detail_fail'); + } + } + +} diff --git a/app/external/view/login/download.html b/app/external/view/login/download.html new file mode 100644 index 0000000..afe9833 --- /dev/null +++ b/app/external/view/login/download.html @@ -0,0 +1,14 @@ + + + + + + + SamSung88 + + + + +
+ + diff --git a/app/external/view/login/index.html b/app/external/view/login/index.html new file mode 100644 index 0000000..5985cd9 --- /dev/null +++ b/app/external/view/login/index.html @@ -0,0 +1,14 @@ + + + + + + + SamSung88 + + + + +
+ + diff --git a/app/external/view/sepay/detail.html b/app/external/view/sepay/detail.html new file mode 100644 index 0000000..f24e5e1 --- /dev/null +++ b/app/external/view/sepay/detail.html @@ -0,0 +1,126 @@ + + + + + + + 页面 + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/external/view/sepay/detail_fail.html b/app/external/view/sepay/detail_fail.html new file mode 100644 index 0000000..cc7d0ed --- /dev/null +++ b/app/external/view/sepay/detail_fail.html @@ -0,0 +1,91 @@ + + + + + + + 页面 + + + + + + + + + + + \ No newline at end of file diff --git a/app/external/view/sepay/detail_paying.html b/app/external/view/sepay/detail_paying.html new file mode 100644 index 0000000..8b4211b --- /dev/null +++ b/app/external/view/sepay/detail_paying.html @@ -0,0 +1,90 @@ + + + + + + + 页面 + + + + + + + + + + + \ No newline at end of file diff --git a/app/external/view/sepay/detail_success.html b/app/external/view/sepay/detail_success.html new file mode 100644 index 0000000..df256dd --- /dev/null +++ b/app/external/view/sepay/detail_success.html @@ -0,0 +1,91 @@ + + + + + + + 页面 + + + + + + + +
+ 关闭 +
支付成功
+
+ +
+ + + \ No newline at end of file diff --git a/app/external/view/skl/detail.html b/app/external/view/skl/detail.html new file mode 100644 index 0000000..ffe9cf2 --- /dev/null +++ b/app/external/view/skl/detail.html @@ -0,0 +1,126 @@ + + + + + + + 页面 + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/external/view/skl/detail_fail.html b/app/external/view/skl/detail_fail.html new file mode 100644 index 0000000..3ec0709 --- /dev/null +++ b/app/external/view/skl/detail_fail.html @@ -0,0 +1,97 @@ + + + + + + + 页面 + + + + + + + + + + + \ No newline at end of file diff --git a/app/external/view/skl/detail_paying.html b/app/external/view/skl/detail_paying.html new file mode 100644 index 0000000..c77646d --- /dev/null +++ b/app/external/view/skl/detail_paying.html @@ -0,0 +1,97 @@ + + + + + + + 页面 + + + + + + + + + + + \ No newline at end of file diff --git a/app/external/view/skl/detail_success.html b/app/external/view/skl/detail_success.html new file mode 100644 index 0000000..917114b --- /dev/null +++ b/app/external/view/skl/detail_success.html @@ -0,0 +1,97 @@ + + + + + + + 页面 + + + + + + + +
+ 关闭 +
支付成功
+
+ +
+ + + \ No newline at end of file diff --git a/app/functions.php b/app/functions.php new file mode 100644 index 0000000..dab1d54 --- /dev/null +++ b/app/functions.php @@ -0,0 +1,1379 @@ + 'application/json'], json_encode([ + 'code' => 200, + 'msg' => $message, + 'data' => $data, + ], JSON_UNESCAPED_UNICODE)); +} + +/** + * @param array $data + * @param string $message + * @param integer $code + * @return Response + */ +function jsonFailResponse(string $message = '', array $data = [], int $code = 100): Response +{ + return new Response(200, ['Content-Type' => 'application/json'], json_encode([ + 'code' => $code, + 'msg' => $message, + 'data' => $data, + ], JSON_UNESCAPED_UNICODE)); +} + +/** + * 生成唯一邀请码 + * @return string + */ +function createCode(): string +{ + + $code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + $rand = $code[rand(0, 25)] . strtoupper(dechex(date('m'))) . date('d') . substr(time(), -5) . substr(microtime(), 2, 5) . sprintf('%02d', rand(0, 99)); + + for ($a = md5($rand, true), $s = '0123456789ABCDEFGHIJKLMNOPQRSTUV', $d = '', $f = 0; $f < 8; $g = ord($a[$f]), $d .= $s[($g ^ ord($a[$f + 8])) - $g & 0x1F], $f++) ; + + return $d; +} + +/** + * 获取验证消息 + * @param AllOfException $e + * @return mixed + */ +function getValidationMessages(AllOfException $e) +{ + $message = $e->getMessages([ + 'notOptional' => trans('required', [], 'validator'), + 'notEmpty' => trans('required', [], 'validator'), + 'email' => trans('email', [], 'validator'), + 'idCard' => trans('idCard', [], 'validator'), + 'url' => trans('url', [], 'validator'), + 'number' => trans('number', [], 'validator'), + 'integer' => trans('integer', [], 'validator'), + 'float' => trans('float', [], 'validator'), + 'mobile' => trans('mobile', [], 'validator'), + 'length' => trans('length', [], 'validator'), + 'alpha' => trans('alpha', [], 'validator'), + 'alnum' => trans('alnum', [], 'validator'), + 'alphaDash' => trans('alphaDash', [], 'validator'), + 'chs' => trans('chs', [], 'validator'), + 'chsAlpha' => trans('chsAlpha', [], 'validator'), + 'chsAlphaNum' => trans('chsAlphaNum', [], 'validator'), + 'chsDash' => trans('chsDash', [], 'validator'), + 'equals' => trans('equals', [], 'validator'), + 'in' => trans('in', [], 'validator'), + 'image' => trans('image', [], 'validator'), + 'creditCard' => trans('creditCard', [], 'validator'), + 'digit' => trans('digit', [], 'validator'), + 'base64' => trans('base64', [], 'validator'), + 'arrayVal' => trans('arrayVal', [], 'validator'), + ])['key']; + $message = is_array($message) ? Arr::first($message) : $message; + + return $message ?? trans('validation_error', [], 'message'); +} + +/** + * 生成uuid + * @return string + */ +function gen_uuid(): string +{ + do { + $timestamp = time(); + $randomNumber = str_pad(rand(0, 9999), 4, '0', STR_PAD_LEFT); + $uniqueNumericId = substr($timestamp, -5) . $randomNumber; + + } while (Player::query()->where('uuid', $uniqueNumericId)->withTrashed()->exists()); + + return $uniqueNumericId; +} + +/** + * 金额转换 + * @param $number + * @return float|int + */ +function floorToCoinsSecondNumber($number) +{ + return floor($number * 100) / 100; +} + +/** + * 添加用户登录信息 + * @param $id + * @return PlayerLoginRecord|Model + */ +function addLoginRecord($id) +{ + $ip = request()->getRealIp(); + if (!empty($ip)) { + try { + $location = new Location(); + $result = $location->getLocation($ip); + } catch (IpAttributionException $exception) { + Log::error('获取ip信息错误'); + } + } + $country_name = ($result['country'] ?? '') . ($result['city'] ?? ''); + $domain = isset($_SERVER['HTTP_ORIGIN']) ? parse_url($_SERVER['HTTP_ORIGIN']) : null; + + return PlayerLoginRecord::create([ + 'player_id' => $id, + 'login_domain' => !empty($domain) ? $domain['host'] : null, + 'ip' => $ip, + 'country_name' => $country_name, + 'city_name' => $result['city'] ?? '', + 'remark' => $request->remark ?? null, + 'department_id' => request()->department_id, + ]); +} + +/** + * 添加用户注册信息 + * @param $id + * @param $type + * @param $department_id + * @return PlayerRegisterRecord|Model + */ +function addRegisterRecord($id, $type, $department_id) +{ + $ip = request()->getRealIp(); + if (!empty($ip)) { + try { + $location = new Location(); + $result = $location->getLocation($ip); + } catch (IpAttributionException $exception) { + Log::error('获取ip信息错误'); + } + } + $country_name = ($result['country'] ?? '') . ($result['city'] ?? ''); + $domain = isset($_SERVER['HTTP_ORIGIN']) ? parse_url($_SERVER['HTTP_ORIGIN']) : null; + + return PlayerRegisterRecord::create([ + 'player_id' => $id, + 'register_domain' => !empty($domain) ? $domain['host'] : null, + 'ip' => $ip, + 'country_name' => $country_name, + 'city_name' => $result['city'] ?? '', + 'device' => 'app', + 'type' => $type, + 'department_id' => $department_id, + ]); +} + +/** + * 保存头像到本地 + * @param $avatar + * @return string + */ +function saveAvatar($avatar): string +{ + if (empty($avatar)) { + return ''; + } + try { + if (strpos($avatar, 'http://') === 0 || strpos($avatar, 'https://') === 0) { + $client = new Client(['verify' => false]); //忽略SSL错误 + $fileName = md5($avatar) . '.jpg'; + $path = public_path() . '/storage/avatar/'; + if (!is_dir($path) && !mkdir($path, 0777, true)) { + throw new Exception('创建文件夹失败'); + } + $client->request('GET', $avatar, ['sink' => public_path('/storage/avatar/' . $fileName)]); + } else { + throw new Exception('网络地址错误'); + } + } catch (Exception|GuzzleException $e) { + Log::error('保存头像错误' . $e->getMessage()); + return ''; + } + + return '/storage/avatar/' . $fileName; +} + +/** + * 生成唯一单号 + * @return string + */ +function createOrderNo(): string +{ + + $yCode = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']; + return $yCode[intval(date('Y')) - 2011] . strtoupper(dechex(date('m'))) . date('d') . substr(time(), -5) . substr(microtime(), 2, 5) . sprintf('%02d', rand(0, 99)); +} + +/** + * 设置短信key + * @param string $phone 手机号 + * @param int $type 模式 1 为修改密码短信 + * @return string + */ +function setSmsKey(string $phone, int $type): string +{ + switch ($type) { + case PhoneSmsLog::TYPE_LOGIN: + return 'sms-login' . $phone; + case PhoneSmsLog::TYPE_REGISTER: + return 'sms-register' . $phone; + case PhoneSmsLog::TYPE_CHANGE_PASSWORD: + return 'sms-change-password' . $phone; + case PhoneSmsLog::TYPE_CHANGE_PAY_PASSWORD: + return 'sms-change-pay-password' . $phone; + case PhoneSmsLog::TYPE_CHANGE_PHONE: + return 'sms-change-phone' . $phone; + case PhoneSmsLog::TYPE_BIND_NEW_PHONE: + return 'sms-type-bind-new-phone' . $phone; + case PhoneSmsLog::TYPE_TALK_BIND: + return 'sms-type-talk-bind' . $phone; + default: + return 'sms-' . $phone; + } +} + +/** + * 验证短信 + * @param string $country_code 国家编号 + * @param string $phone 手机号 + * @param string $code 验证码 + * @param int $type 类型 + * @return string + */ +function verifySMS(string $country_code, string $phone, string $code, int $type): string +{ + switch ($country_code) { + case PhoneSmsLog::COUNTRY_CODE_JP: + $phone = ltrim($phone, '0'); + break; + case PhoneSmsLog::COUNTRY_CODE_MY: + $phone = ltrim($phone, '0'); + break; + default: + break; + } + $phoneCode = Cache::get(setSmsKey($phone, $type)); + + return $phoneCode == $code; +} + +/** + * 获取短信消息 + * @param int $type 模式 1 为修改密码短信 + * @param string $source 来源 + * @return string + */ +function getContent(int $type, string $source): string +{ + switch ($type) { + case PhoneSmsLog::TYPE_LOGIN: + return config($source . '-sms.login_content'); + case PhoneSmsLog::TYPE_REGISTER: + return config($source . '-sms.register_content'); + case PhoneSmsLog::TYPE_CHANGE_PASSWORD: + return config($source . '-sms.change_password_content'); + case PhoneSmsLog::TYPE_CHANGE_PAY_PASSWORD: + return config($source . '-sms.change_pay_password'); + case PhoneSmsLog::TYPE_CHANGE_PHONE: + return config($source . '-sms.change_phone'); + case PhoneSmsLog::TYPE_BIND_NEW_PHONE: + return config($source . '-sms.bind_new_phone'); + case PhoneSmsLog::TYPE_TALK_BIND: + return config($source . '-sms.talk_bind'); + default: + return config($source . '-sms.sm_content'); + } +} + +/** + * 提现订单回滚 + * @param PlayerWithdrawRecord $playerWithdrawRecord + * @param string $rejectReason + * @param int $withdrawStatus + * @return string + * @throws Exception + */ +function withdrawBack(PlayerWithdrawRecord $playerWithdrawRecord, string $rejectReason = '', int $withdrawStatus = PlayerWithdrawRecord::STATUS_PENDING_REJECT): string +{ + DB::beginTransaction(); + try { + // 更新提现订单 + $playerWithdrawRecord->status = $withdrawStatus; + $playerWithdrawRecord->reject_reason = $rejectReason; + $playerWithdrawRecord->finish_time = date('Y-m-d H:i:s'); + $playerWithdrawRecord->user_id = Admin::id() ?? 0; + $playerWithdrawRecord->user_name = !empty(Admin::user()) ? Admin::user()->username : ''; + // 更新玩家钱包 + $beforeGameAmount = $playerWithdrawRecord->player->wallet->money; + $playerWithdrawRecord->player->wallet->money = bcadd($playerWithdrawRecord->player->wallet->money, $playerWithdrawRecord->coins, 2); + // 跟新玩家统计 + $playerWithdrawRecord->player->player_extend->withdraw_amount = bcsub($playerWithdrawRecord->player->player_extend->withdraw_amount, $playerWithdrawRecord->coins, 2); + $playerWithdrawRecord->push(); + //寫入金流明細 + $playerDeliveryRecord = new PlayerDeliveryRecord; + $playerDeliveryRecord->player_id = $playerWithdrawRecord->player_id; + $playerDeliveryRecord->department_id = $playerWithdrawRecord->department_id; + $playerDeliveryRecord->target = $playerWithdrawRecord->getTable(); + $playerDeliveryRecord->target_id = $playerWithdrawRecord->id; + $playerDeliveryRecord->type = PlayerDeliveryRecord::TYPE_WITHDRAWAL_BACK; + $playerDeliveryRecord->source = 'withdraw_back'; + $playerDeliveryRecord->amount = $playerWithdrawRecord->coins; + $playerDeliveryRecord->amount_before = $beforeGameAmount; + $playerDeliveryRecord->amount_after = $playerWithdrawRecord->player->wallet->money; + $playerDeliveryRecord->tradeno = $playerWithdrawRecord->tradeno ?? ''; + $playerDeliveryRecord->remark = $playerWithdrawRecord->remark ?? ''; + $playerDeliveryRecord->save(); + + DB::commit(); + sendSocketMessage('private-recharge_withdrawal', [ + 'msg_type' => 'withdrawal', + 'player_id' => $playerWithdrawRecord->player_id, + 'amount' => $playerWithdrawRecord->player->wallet->money, + ]); + } catch (\Exception $e) { + DB::rollBack(); + throw new Exception($e->getMessage()); + } + return true; +} + +/** + * 添加渠道财务操作 + * @param $target + * @param $action + * @return void + */ +function saveChannelFinancialRecord($target, $action) +{ + $channelFinancialRecord = new ChannelFinancialRecord(); + $channelFinancialRecord->action = $action; + $channelFinancialRecord->department_id = Admin::user()->department_id ?? 0; + $channelFinancialRecord->player_id = $target->player_id ?? 0; + $channelFinancialRecord->target = $target->getTable(); + $channelFinancialRecord->target_id = $target->id; + $channelFinancialRecord->user_id = Admin::id() ?? 0; + $channelFinancialRecord->tradeno = $target->tradeno ?? ''; + $channelFinancialRecord->user_name = Admin::user()->username ?? ''; + $channelFinancialRecord->save(); +} + +/** + * 上传base64图片 + * @param $img + * @param $path + * @return false|string + */ +function uploadBaseImg($img, $path) +{ + if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $img, $result)) { + $type = $result[2];//图片后缀 + $savePath = '/storage/' . $path . '/' . date("Ymd", time()) . "/"; + $newPath = public_path() . $savePath; + if (!file_exists($newPath)) { + //检查是否有该文件夹,如果没有就创建,并给予最高权限 + mkdir($newPath, 0755, true); + } + + $filename = time() . '_' . uniqid() . ".{$type}"; //文件名 + $newPath = $newPath . $filename; + //写入操作 + if (file_put_contents($newPath, base64_decode(str_replace($result[1], '', $img)))) { + return env('APP_URL', 'http://127.0.0.1:8787') . $savePath . $filename; + } + return false; + } + return false; +} + +/** + * 检查充值订单取消超时订单 + * @throws Exception + */ +function cancelRecharge() +{ + /** @var SystemSetting $setting */ + $setting = SystemSetting::where('status', 1)->where('feature', 'recharge_order_expiration')->first(); + if (!empty($setting)) { + $playerRechargeRecord = PlayerRechargeRecord::where('type', PlayerRechargeRecord::TYPE_REGULAR) + ->where('status', PlayerRechargeRecord::STATUS_WAIT) + ->where('created_at', '<', Carbon::now()->subMinutes($setting->num)) + ->get(); + /** @var PlayerRechargeRecord $order */ + foreach ($playerRechargeRecord as $order) { + $order->status = PlayerRechargeRecord::STATUS_RECHARGED_SYSTEM_CANCEL; + $order->cancel_time = date('Y-m-d H:i:s'); + $order->save(); + } + } +} + +/** + * 发送socket消息 + * @param $channels + * @param $content + * @param string $form + * @return bool|string + * @throws PushException + */ +function sendSocketMessage($channels, $content, string $form = 'system') +{ + try { + // 发送进入保留状态消息 + $api = new Api( + config('plugin.webman.push.app.api'), + config('plugin.webman.push.app.app_key'), + config('plugin.webman.push.app.app_secret') + ); + return $api->trigger($channels, 'message', [ + 'from_uid' => $form, + 'content' => json_encode($content) + ]); + } catch (Exception $e) { + Log::error('sendSocketMessage', [$e->getMessage()]); + return false; + } +} + +/** + * 获取渠道信息 + * @param $siteId + * @return array + */ +function getChannel($siteId): array +{ + $cacheKey = "channel_" . $siteId; + $channel = Cache::get($cacheKey); + if (empty($channel)) { + $channel = Channel::where('id', $siteId)->whereNull('deleted_at')->first()->toArray(); + if (!empty($channel)) { + $cacheKey = "channel_" . $channel->site_id; + Cache::set($cacheKey, $channel->toArray()); + } else { + return []; + } + } + return $channel; +} + +/** + * 获取堆栈信息 + * @return void + */ +function getStackList(): void +{ + $line = []; + $debugList = array_reverse(debug_backtrace()); + foreach ($debugList as $key => $val) { + $class = $val['class'] ?? ""; + $arg = $val['args']; + $parameter = ''; + $stringLine = ''; + if (!empty($arg) && is_array($arg)) { + foreach ($arg as $v) { + $className = $v; + if (is_object($v)) { + $className = get_class($v); + } elseif (is_array($v)) { + $className = json_encode($v); + } + $parameter .= $className . ','; + } + } + $stringLine .= '程序执行' . $key . ':=>'; + $stringLine .= '[1.所在文件(' . $val['file'] . ')],'; + $stringLine .= '[2.函数调用情况[第' . $val['line'] . '行]:' . $class . '->' . $val['function'] . '(' . $parameter . ')]' . "\n"; + $line[] = $stringLine; + } + Log::error("堆栈信息", $line); +} + +/** + * 获取毫秒级 + * @return float + */ +function millisecond(): float +{ + list($millisecond, $sec) = explode(' ', microtime()); + return (float)sprintf('%.0f', (floatval($millisecond) + floatval($sec)) * 1000); +} + +/** + * 创建玩家 + * @param $departmentId + * @param $data + * @return Player + * @throws Exception + */ +function createPlayer($departmentId, $data): Player +{ + /** @var Channel $channel */ + $channel = Channel::where('department_id', $departmentId)->first(); + if (empty($channel)) { + throw new Exception(trans('channel_not_found', [], 'message')); + } + DB::beginTransaction(); + try { + $count = Player::whereBetween('created_at', [date('Y-m-d') . ' 00:00:00', date('Y-m-d') . ' 23:59:59'])->count('*'); + if (empty($data['avatar'])) { + $defAvatars = config('def_avatar') ?? []; + $randomKey = array_rand($defAvatars); + $randomAvatar = $defAvatars[$randomKey] ?? ''; + } else { + $randomAvatar = $data['avatar']; + } + $player = new Player(); + $player->uuid = gen_uuid(); + $player->type = Player::TYPE_PLAYER; + $player->currency = $channel->currency; + $player->department_id = $channel->department_id; + $player->avatar = $randomAvatar; + $player->device_number = $data['device_number'] ?? ''; + $player->name = $data['name'] ?? 'channel_' . $departmentId . date('Ymd') . $count; + $player->facebook_id = $data['facebook_id'] ?? ''; + $player->phone = $data['phone'] ?? ''; + if(isset($data['password'])){ + $player->password = $data['password']; + } + if(isset($data['recommend_id'])){ + $player->recommend_id = $data['recommend_id']; + } + $player->recommended_code = $data['recommended_code'] ?? ''; + $player->status = Player::STATUS_ENABLE; + $player->recommend_code = createCode(); + $player->save(); + + addPlayerExtend($player, [ + 'email' => $data['email'] ?? '' + ]); + + addRegisterRecord($player->id, PlayerRegisterRecord::TYPE_CLIENT, $player->department_id); + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + Log::error(trans('register_player_failed', [], 'message') . $e->getMessage()); + throw new Exception(); + } + unset($player->password); + return $player; +} + + +/** + * 增加玩家扩展信息 + * @param Player $player + * @param array $extend + * @return void + */ +function addPlayerExtend(Player $player, array $extend = []) +{ + $registerPresent = SystemSetting::where('feature', 'register_present')->where('status', 1)->value('num') ?? 0; + $playerPlatformCash = new PlayerPlatformCash(); + $playerPlatformCash->player_id = $player->id; + $playerPlatformCash->platform_id = PlayerPlatformCash::PLATFORM_SELF; + $playerPlatformCash->money = $registerPresent; + $playerPlatformCash->save(); + + $playerExtend = new PlayerExtend(); + $playerExtend->player_id = $player->id; + $playerExtend->email = $extend['email']; + $playerExtend->save(); + + if (isset($registerPresent) && $registerPresent > 0) { + //添加玩家钱包日志 + $playerMoneyEditLog = new PlayerMoneyEditLog; + $playerMoneyEditLog->player_id = $player->id; + $playerMoneyEditLog->department_id = $player->department_id; + $playerMoneyEditLog->type = PlayerMoneyEditLog::TYPE_INCREASE; + $playerMoneyEditLog->action = PlayerMoneyEditLog::OTHER; + $playerMoneyEditLog->tradeno = date('YmdHis') . rand(10000, 99999); + $playerMoneyEditLog->currency = $player->currency; + $playerMoneyEditLog->money = $registerPresent; + $playerMoneyEditLog->inmoney = $registerPresent; + $playerMoneyEditLog->remark = ''; + $playerMoneyEditLog->user_id = Admin::id() ?? 0; + $playerMoneyEditLog->user_name = !empty(Admin::user()) ? Admin::user()->toArray()['username'] : trans('system_automatic', [], 'message'); + $playerMoneyEditLog->save(); + //寫入金流明細 + $playerDeliveryRecord = new PlayerDeliveryRecord; + $playerDeliveryRecord->player_id = $player->id; + $playerDeliveryRecord->department_id = $player->department_id; + $playerDeliveryRecord->target = $playerMoneyEditLog->getTable(); + $playerDeliveryRecord->target_id = $playerMoneyEditLog->id; + $playerDeliveryRecord->type = PlayerDeliveryRecord::TYPE_REGISTER_PRESENT; + $playerDeliveryRecord->source = 'register_present'; + $playerDeliveryRecord->amount = $playerMoneyEditLog->money; + $playerDeliveryRecord->amount_before = 0; + $playerDeliveryRecord->amount_after = $registerPresent; + $playerDeliveryRecord->tradeno = $playerMoneyEditLog->tradeno ?? ''; + $playerDeliveryRecord->remark = $playerMoneyEditLog->remark ?? ''; + $playerDeliveryRecord->save(); + } +} + +/** + * @return Player + * @throws GameException + * @throws PlayerCheckException + * @throws \Exception + */ +function checkPlayer(): Player +{ + $departmentId = request()->department_id; + $id = JwtToken::getCurrentId(); + /** @var Player $player */ + $player = Player::where('id', $id)->where('department_id', $departmentId)->first(); + if (empty($player)) { + throw new PlayerCheckException(trans('player_not_fount', [], 'message'), 100); + } + + if ($player->status == Player::STATUS_STOP) { + throw new PlayerCheckException(trans('player_stop', [], 'message'), 100); + } + + return $player; +} + + +/** + * 组装请求 + * @param string $url + * @param array $params + * @return array|mixed + * @throws Exception + */ +function doCurl(string $url, array $params = []) +{ + $response = Http::timeout(7) + ->contentType('application/json') + ->accept('application/json') + ->asJson() + ->post($url, $params); + if (!$response->ok()) { + throw new Exception(trans('system_busy', [], 'message')); + } + $data = $response->json(); + if (empty($data)) { + throw new Exception(trans('system_busy', [], 'message')); + } + + return $data; +} + +/** + * 组装请求 + * @param $id + * @param array $range + * @return array|mixed|null + */ +function getGamePlayerNum($id, array $range = []) +{ + $cacheKey = 'game_player_num_' . $id; + $playerNum = Cache::get($cacheKey); + if ($playerNum === null) { + $playerNum = rand($range[0] ?? 0, $range[1] ?? 0); + Cache::set($cacheKey, $playerNum, 30 * 60); + } + + return $playerNum; +} + +/** + * 分润结算 + * @return void + */ +function commissionSettlement() +{ + $date = Carbon::now()->subDay()->format('Y-m-d'); + $data = PlayGameRecord::query() + ->selectRaw('SUM(bet) - SUM(win) AS damage_amount, player_id, parent_player_id, department_id,sum(deficit) as deficit') + ->whereDate('created_at', $date) + ->where('status', 0) + ->groupBy('player_id', 'parent_player_id', 'department_id') + ->get(); + Log::info('分润结算开始------------------'); + if ($data->isEmpty()) { + return; + } + // 提取父玩家ID + $playerIds = $data->pluck('parent_player_id')->unique()->toArray(); + // 获取玩家数据 + $players = Player::query() + ->with(['player_extend']) + ->whereIn('id', $playerIds) + ->get() + ->keyBy('id'); + // 获取系统设置 + $systemSettingMap = SystemSetting::query() + ->where('status', 1) + ->where('feature', 'commission_setting') + ->get() + ->keyBy('department_id'); + $commissionRecord = []; + $unsettledCommissionAmount = []; + foreach ($data->toArray() as $item) { + /** @var SystemSetting $systemSettingData */ + //边玩边赚,只返给上级 + $systemSettingData = $systemSettingMap->get($item['department_id']); + if(empty($systemSettingData)){ + continue; + } + $systemSetting = json_decode($systemSettingData->content, true); + if ($item['deficit'] == 0) { + continue; + } + if ($systemSetting && !empty($systemSetting['commission_damage']) && is_numeric($systemSetting['commission_damage']) && $systemSetting['commission_damage'] > 0) { + $commissionAmount = max(bcmul($item['damage_amount'], bcdiv($systemSetting['commission_damage'], 100, 2), 2), 0); + /** @var Player $player */ + $player = $players->get($item['parent_player_id']); + if ($player) { + $commissionRecord[] = [ + 'player_id' => $item['player_id'], + 'department_id' => $item['department_id'], + 'parent_player_id' => $item['parent_player_id'], + 'recharge_amount' => 0, + 'chip_amount' => 0, + 'total_amount' => $player->player_extend->commission_amount, + 'damage_amount' => $item['damage_amount'], + 'amount' => $commissionAmount, + 'ratio' => $systemSetting['commission_damage'], + 'date' => $date, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]; + + if (!isset($unsettledCommissionAmount[$item['parent_player_id']])) { + $unsettledCommissionAmount[$item['parent_player_id']] = $commissionAmount; + } else { + $unsettledCommissionAmount[$item['parent_player_id']] = bcadd($unsettledCommissionAmount[$item['parent_player_id']], $commissionAmount, 2); + } + } + } + } + + // 前天发生账变的玩家 + $playerList = Player::with(['wallet']) + ->whereHas('wallet', function ($query) use ($date) { + $query->where('updated_at', '>=', $date . ' 00:00:00'); + }) + ->get(); + // 账变记录 + $playerDeliveryRecords = collect(PlayerDeliveryRecord::whereDate('updated_at', '2024-11-26') + ->groupBy('player_id') + ->whereIn('type', [ + PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD, + PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT, + PlayerDeliveryRecord::TYPE_REGISTER_PRESENT, + PlayerDeliveryRecord::TYPE_GAME_OUT, + PlayerDeliveryRecord::TYPE_GAME_IN, + PlayerDeliveryRecord::TYPE_RECHARGE, + ]) + ->get([ + DB::raw("SUM(if(`type`=" . PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_ADD . ",`amount`,0)) as admin_add_amount"), + DB::raw("SUM(if(`type`=" . PlayerDeliveryRecord::TYPE_MODIFIED_AMOUNT_DEDUCT . ",`amount`,0)) as admin_deduct_amount"), + DB::raw("SUM(if(`type`=" . PlayerDeliveryRecord::TYPE_REGISTER_PRESENT . ",`amount`,0)) as present_amount"), + DB::raw("SUM(if(`type`=" . PlayerDeliveryRecord::TYPE_RECHARGE . ",`amount`,0)) as recharge_amount"), + 'player_id' + ])->toArray()) + ->keyBy('player_id') + ->toArray(); + // 提现记录 + $playerWithdrawRecord = collect(PlayerWithdrawRecord::whereDate('updated_at', $date) + ->where('status', PlayerWithdrawRecord::STATUS_SUCCESS) + ->groupBy('player_id') + ->get([ + DB::raw('SUM(`money`) as withdraw_amount'), + 'player_id' + ])) + ->keyBy('player_id') + ->toArray(); + /** @var Player $player */ + foreach ($playerList as $player) { + $change = [ + 'recharge_amount' => $playerDeliveryRecords[$player->id]['recharge_amount'] ?? 0, + 'admin_add_amount' => $playerDeliveryRecords[$player->id]['admin_add_amount'] ?? 0, + 'admin_deduct_amount' => $playerDeliveryRecords[$player->id]['admin_deduct_amount'] ?? 0, + 'present_amount' => $playerDeliveryRecords[$player->id]['present_amount'] ?? 0, + 'bonus_amount' => $playerDeliveryRecords[$player->id]['bonus_amount'] ?? 0, + 'withdraw_amount' => $playerWithdrawRecord[$player->id]['withdraw_amount'] ?? 0, + 'date' => $date, + ]; + $change_list[$player->id] = $change; + } + + DB::beginTransaction(); + try { + $playerUpdates = []; + $playerDeliveryRecord = []; + $promoterProfitRecords = []; // 保存所有的PromoterProfitRecord + foreach ($unsettledCommissionAmount as $key => $amount) { + /** @var Player $player */ + $player = $players->get($key); + if ($player) { + $commissionAmount = bcadd($amount, $player->player_extend->unsettled_commission_amount, 2); + if ($commissionAmount > 0) { + $player->player_extend->commission_amount = bcadd($player->player_extend->commission_amount, $commissionAmount, 2); + $player->player_extend->unsettled_commission_amount = 0; + $beforeAmount = $player->wallet->money; + $player->wallet->money = bcadd($player->wallet->money, $commissionAmount, 2); + $playerDeliveryRecord[] = [ + 'player_id' => $player->id, + 'department_id' => $player->department_id, + 'target' => 'commission_record', + 'target_id' => 0, + 'type' => PlayerDeliveryRecord::TYPE_COMMISSION, + 'source' => 'commission', + 'amount' => $commissionAmount, + 'amount_before' => $beforeAmount, + 'amount_after' => $player->wallet->money, + 'tradeno' => '', + 'remark' => '', + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]; + } else { + $player->player_extend->unsettled_commission_amount = $commissionAmount; + } + $playerUpdates[] = $player; + } + } + if (!empty($playerUpdates)) { + /** @var Player $player */ + foreach ($playerUpdates as $player) { + $player->push(); + } + } + if (!empty($commissionRecord)) { + CommissionRecord::query()->insert($commissionRecord); + } + if (!empty($playerDeliveryRecord)) { + PlayerDeliveryRecord::query()->insert($playerDeliveryRecord); + } + PlayGameRecord::query() + ->whereDate('created_at', $date) + ->update([ + 'status' => 1, + 'action_at' => date('Y-m-d H:i:s'), + ]); + foreach ($data as $value) { + $up_ids = []; + //玩家为代理 + if(isset($value->player->player_promoter->path)){ + $path = $value->player->player_promoter->path; + $up_ids = explode(',',$path); + //代理不给自己返利 + array_pop($up_ids); + }else{ + //查询玩家无限上级 + if(isset($value->player->recommend_id)){ + $path = PlayerPromoter::where('player_id',$value->player->recommend_id)->value('path'); + $up_ids = explode(',',$path); + }else{ + //未绑定上级的玩家不参与返利计算 + continue; + } + } + $up_list = PlayerPromoter::whereIn('player_id',$up_ids)->orderBy('id','asc')->get(); + foreach($up_list as $k => &$up_val){ + $player_profit_amount = 0;//直属玩家提供的分润 + $diff_ratio = 0;//每级代理获得的分润比例 + if(isset($up_list[$k+1])){ + //上级代理获得的返利比例 + $diff_ratio = bcsub($up_val->ratio, $up_list[$k+1]->ratio, 2); + }else{ + $diff_ratio = $up_val->ratio; + $player_profit_amount = bcdiv(bcmul($diff_ratio, $value->deficit, 2),100,2); + } + $rebate = bcdiv(bcmul($diff_ratio, $value->deficit, 2),100,2); + //更新推广员信息表 + $up_val->player_profit_amount = bcadd($up_val->player_profit_amount,$player_profit_amount,2);//直属玩家提供的分润 + $up_val->profit_amount = bcadd($up_val->profit_amount,$rebate,2);//总分润 + $team_withdraw_total_amount = isset($change_list[$up_val->player_id]['withdraw_amount']) ? $change_list[$up_val->player_id]['withdraw_amount'] : 0; + $up_val->team_withdraw_total_amount = bcadd($up_val->team_withdraw_total_amount, $team_withdraw_total_amount, 2); + $team_recharge_total_amount = isset($change_list[$up_val->player_id]['recharge_amount']) ? $change_list[$up_val->player_id]['recharge_amount'] : 0; + $up_val->team_recharge_total_amount = bcadd($up_val->team_recharge_total_amount, $team_recharge_total_amount, 2); + $up_val->total_profit_amount = bcadd($up_val->total_profit_amount, $rebate, 2); + $up_val->team_total_profit_amount = bcadd($up_val->team_total_profit_amount, bcmul($value->deficit,bcdiv($up_val->ratio,100,2), 2),2); + $up_val->team_profit_amount = bcadd($up_val->team_profit_amount, bcmul($value->deficit,bcdiv($up_val->ratio,100,2), 2), 2); + + $up_val->save(); + $promoter_profit_record = []; + $promoter_profit_record['player_id'] = $value->player_id;//玩家id + $promoter_profit_record['department_id'] = $up_val->department_id; + $promoter_profit_record['promoter_player_id'] = $up_val->player_id;//获得分润的id + $promoter_profit_record['source_player_id'] = $value->player->recommend_id;//玩家上级id + $promoter_profit_record['withdraw_amount'] = isset($change_list[$up_val->player_id]['withdraw_amount']) ? $change_list[$up_val->player_id]['withdraw_amount'] : 0; + $promoter_profit_record['recharge_amount'] = isset($change_list[$up_val->player_id]['recharge_amount']) ? $change_list[$up_val->player_id]['recharge_amount'] : 0; + $promoter_profit_record['bonus_amount'] = isset($change_list[$up_val->player_id]['bonus_amount']) ? $change_list[$up_val->player_id]['bonus_amount'] : 0; + $promoter_profit_record['admin_deduct_amount'] = isset($change_list[$up_val->player_id]['admin_deduct_amount']) ? $change_list[$up_val->player_id]['admin_deduct_amount'] : 0; + $promoter_profit_record['admin_add_amount'] = isset($change_list[$up_val->player_id]['admin_add_amount']) ? $change_list[$up_val->player_id]['admin_add_amount'] : 0; + $promoter_profit_record['present_amount'] = isset($change_list[$up_val->player_id]['present_amount']) ? $change_list[$up_val->player_id]['present_amount'] : 0; + $promoter_profit_record['ratio'] = $up_val->ratio; + $promoter_profit_record['actual_ratio'] = $diff_ratio; + $promoter_profit_record['date'] = $date; + $promoter_profit_record['model'] = PromoterProfitRecord::MODEL_TASK; + $promoter_profit_record['profit_amount'] = $rebate; + $promoter_profit_record['player_profit_amount'] = $player_profit_amount; + $created_at = Carbon::now(); + $promoter_profit_record['created_at'] = $created_at; + $promoter_profit_record['updated_at'] = $created_at; + $promoterProfitRecords[] = $promoter_profit_record; + + } + unset($up_val); + } + PromoterProfitRecord::insert($promoterProfitRecords); + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + Log::error('CommissionSettlement', [$e->getMessage(), $e->getTraceAsString()]); + } + Log::info('分润结算结束------------------'); +} + +/** + * 客损返水结算 + * @return void + */ +function damageRebate() +{ + $date = Carbon::now()->subDay()->format('Y-m-d'); + $data = CommissionRecord::query()->where('date', $date)->get(); + Log::info('客损返水结算------------------'); + if ($data->isEmpty()) { + return; + } + // 提取玩家ID + $playerIds = $data->pluck('player_id')->unique()->toArray(); + // 获取玩家数据 + $players = Player::query() + ->with(['wallet', 'player_level']) + ->whereIn('id', $playerIds) + ->get() + ->keyBy('id'); + + DB::beginTransaction(); + try { + /** @var CommissionRecord $item */ + foreach ($data as $item) { + /** @var Player $player */ + $player = $players->get($item->player_id); + $playerLevel = $player->player_level; + if (!empty($playerLevel) && $playerLevel->damage_rebate_ratio > 0 && $item->damage_amount > 0) { + $damageAmount = bcmul($item->damage_amount, $playerLevel->damage_rebate_ratio, 2); + $beforeGameAmount = $player->wallet->money; + if ($damageAmount > 0) { + // 更新钱包 + $player->wallet->money = bcadd($player->wallet->money, $damageAmount, 2); + if ($playerLevel->chip_multiple) { + $chipAmount = bcmul($damageAmount, $playerLevel->chip_multiple); + if ($chipAmount) { + $beforeMustChipAmount = $player->must_chip_amount; + $player->must_chip_amount = bcadd($player->must_chip_amount, $chipAmount, 2); + // 记录打码量明细 + $playerChipRecord = new PlayerChipRecord(); + $playerChipRecord->player_id = $player->id; + $playerChipRecord->department_id = $player->department_id; + $playerChipRecord->type = PlayerChipRecord::TYPE_INC; + $playerChipRecord->record_type = PlayerChipRecord::RECORD_TYPE_BET_REBATE; + $playerChipRecord->amount = $chipAmount; + + $playerChipRecord->chip_amount = 0; + $playerChipRecord->before_chip_amount = $player->chip_amount; + $playerChipRecord->after_chip_amount = $player->chip_amount; + + $playerChipRecord->must_chip_amount = $chipAmount; + $playerChipRecord->before_must_chip_amount = $beforeMustChipAmount; + $playerChipRecord->after_must_chip_amount = $player->must_chip_amount; + + $playerChipRecord->source_type = CommissionRecord::class; + $playerChipRecord->source_id = $item->id; + $playerChipRecord->save(); + } + } + // 根据打码量返水玩家 + $playerDeliveryRecord = new PlayerDeliveryRecord; + $playerDeliveryRecord->player_id = $player->id; + $playerDeliveryRecord->department_id = $player->department_id; + $playerDeliveryRecord->target = $item->getTable(); + $playerDeliveryRecord->target_id = $item->id; + $playerDeliveryRecord->type = PlayerDeliveryRecord::TYPE_DAMAGE_REBATE; + $playerDeliveryRecord->source = 'damage_rebate'; + $playerDeliveryRecord->amount = $damageAmount; + $playerDeliveryRecord->amount_before = $beforeGameAmount; + $playerDeliveryRecord->amount_after = $player->wallet->money; + $playerDeliveryRecord->tradeno = ''; + $playerDeliveryRecord->remark = ''; + $playerDeliveryRecord->save(); + } + } + $player->push(); + } + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + Log::error('damageRebate', [$e->getMessage(), $e->getTraceAsString()]); + } + Log::info('客损返水结算结束------------------'); +} + +/** + * 玩家等级选项 + * @return array + */ +function playerLevelOptions(): array +{ + $options = []; + for ($i = 0; $i <= 13; $i++) { + if ($i == 0) { + $options[$i] = admin_trans('player.no_level'); + } else { + $options[$i] = admin_trans('player.level.' . $i); + } + } + return $options; +} + +/** + * 自动生成密码 + * @return string + */ +function generateRandomPassword(): string +{ + $uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + $lowercase = 'abcdefghijklmnopqrstuvwxyz'; + $numbers = '0123456789'; + + $password = ''; + + $password .= $uppercase[rand(0, strlen($uppercase) - 1)]; + + $password .= $lowercase[rand(0, strlen($lowercase) - 1)]; + + $password .= $numbers[rand(0, strlen($numbers) - 1)]; + + $length = rand(7, 12); // Random length between 7 and 12 + $remainingLength = $length - 3; + + $allChars = $uppercase . $lowercase . $numbers; + + for ($i = 0; $i < $remainingLength; $i++) { + $password .= $allChars[rand(0, strlen($allChars) - 1)]; + } + + return str_shuffle($password); +} + +/** + * 生成用户名 + * @param int $length + * @return string + */ +function generateUniqueUsername(int $length = 10): string +{ + $characters = 'abcdefghijklmnopqrstuvwxyz0123456789'; // 可选的字符集合 + $uniqueUsername = ''; // 初始化唯一用户名 + + // 生成不重复的用户名 + for ($i = 0; $i < $length; $i++) { + $uniqueUsername .= $characters[rand(0, strlen($characters) - 1)]; + } + + return $uniqueUsername; +} + + +/** + * 组装请求 + * @param string $url + * @param array $params + * @return array|mixed|null + * @throws Exception + */ +function dogGetCurl(string $url, array $params = []) +{ + $response = Http::timeout(7) + ->contentType('application/json') + ->accept('application/json') + ->asJson() + ->get($url, $params); + if (!$response->ok()) { + throw new Exception(trans('system_busy', [], 'message')); + } + $data = $response->json(); + if (empty($data)) { + throw new Exception(trans('system_busy', [], 'message')); + } + return $data; +} + +/** + * 设置推广员 + * @param $id + * @param $ratio + * @param $name + * @return true + * @throws Exception + */ +function setPromoter($id, $ratio, $name,$recommend_id): bool +{ + DB::beginTransaction(); + try { + /** @var Player $player */ + $player = Player::find($id); + if (empty($player)) { + throw new Exception(trans('player_not_found', [], 'message')); + } + if (!empty($player->player_promoter)) { + throw new Exception(trans('player_is_promoter', [], 'message')); + } + if ($player->status == Player::STATUS_STOP) { + throw new Exception(trans('player_stop', [], 'message')); + } + if($recommend_id != $player->recommend_id){ + throw new Exception(trans('not_sub_recommend_player', [], 'message')); + } + $promoter = new PlayerPromoter(); + + /** @var PlayerPromoter $parentPromoter */ + $parentPromoter = PlayerPromoter::where('player_id', $player->recommend_id)->first(); + $maxRatio = $parentPromoter->ratio ?? 100; + if ($ratio > $maxRatio) { + throw new Exception(trans('ratio_max_error', ['{max_ratio}' => $maxRatio], 'message')); + } + + $orgPromoter = $player->is_promoter; + $path = []; + if (isset($parentPromoter->path) && !empty($parentPromoter->path)) { + $path = explode(',', $parentPromoter->path); + } + $path[] = $player->id; + $promoter->ratio = $ratio; + $promoter->player_id = $player->id; + $promoter->recommend_id = $parentPromoter->player_id ?? 0; + $promoter->department_id = $player->department_id; + $promoter->name = !empty($name) ? $name : $player->name; + $promoter->path = implode(',', $path); + $promoter->save(); + // 更新玩家信息 + $player->is_promoter = 1; + $player->recommend_code = createCode(); + $player->save(); + $parentPromoter && $orgPromoter == 0 && $parentPromoter->increment('team_num'); + DB::commit(); + } catch (\Exception $e) { + DB::rollBack(); + throw new Exception($e->getMessage()); + } + + return true; +} + +/** + * 验证手机号格式 + * @param $phoneNumber + * @return true + */ +function validateMalaysianPhoneNumber($phoneNumber): bool +{ + $pattern = '/^(01\d{8,9}|(\+60|60|0060)(0?1)\d{8,9})$/'; + return preg_match($pattern, $phoneNumber); +} + +/** + * post表单请求 + * @param string $url + * @param array $params + * @return array|mixed + * @throws Exception + */ +function doFormCurl(string $url, array $params = []) +{ + $response = Http::timeout(10)->asForm()->post($url, $params); + if (!$response->ok()) { + throw new Exception(trans('system_busy', [], 'message')); + } + $data = $response->json(); + if (empty($data)) { + throw new Exception(trans('system_busy', [], 'message')); + } + + return $data; +} + +/** + * 结算 + * @param $id + * @param int $userId + * @param string $userName + * @return void + * @throws Exception + */ +function doSettlement($id, int $userId = 0, string $userName = '') +{ + /** @var PlayerPromoter $playerPromoter */ + $playerPromoter = PlayerPromoter::where('player_id', $id)->first(); + if (empty($playerPromoter)) { + throw new Exception(trans('profit_amount_not_found', [], 'message')); + } + if ($playerPromoter->status == 0) { + throw new Exception(trans('player_promoter_has_disable', [], 'message')); + } + if (!isset($playerPromoter->profit_amount)) { + throw new Exception(trans('profit_amount_not_found', [], 'message')); + } + $profitAmount = PromoterProfitRecord::where('status', PromoterProfitRecord::STATUS_UNCOMPLETED) + ->where('promoter_player_id', $id) + ->first([ + DB::raw('SUM(`withdraw_amount`) as total_withdraw_amount'), + DB::raw('SUM(`recharge_amount`) as total_recharge_amount'), + DB::raw('SUM(`bonus_amount`) as total_bonus_amount'), + DB::raw('SUM(`admin_deduct_amount`) as total_admin_deduct_amount'), + DB::raw('SUM(`admin_add_amount`) as total_admin_add_amount'), + DB::raw('SUM(`present_amount`) as total_present_amount'), + DB::raw('SUM(`profit_amount`) as total_profit_amount'), + DB::raw('SUM(`player_profit_amount`) as total_player_profit_amount'), + ]) + ->toArray(); + + DB::beginTransaction(); + try { + $promoterProfitSettlementRecord = new PromoterProfitSettlementRecord(); + $promoterProfitSettlementRecord->department_id = $playerPromoter->player->department_id; + $promoterProfitSettlementRecord->promoter_player_id = $playerPromoter->player_id; + $promoterProfitSettlementRecord->total_withdraw_amount = $profitAmount['total_withdraw_amount'] ?? 0; + $promoterProfitSettlementRecord->total_recharge_amount = $profitAmount['total_recharge_amount'] ?? 0; + $promoterProfitSettlementRecord->total_bonus_amount = $profitAmount['total_bonus_amount'] ?? 0; + $promoterProfitSettlementRecord->total_admin_deduct_amount = $profitAmount['total_admin_deduct_amount'] ?? 0; + $promoterProfitSettlementRecord->total_admin_add_amount = $profitAmount['total_admin_add_amount'] ?? 0; + $promoterProfitSettlementRecord->total_present_amount = $profitAmount['total_present_amount'] ?? 0; + $promoterProfitSettlementRecord->total_profit_amount = $profitAmount['total_profit_amount'] ?? 0; + $promoterProfitSettlementRecord->total_player_profit_amount = $profitAmount['total_player_profit_amount'] ?? 0; + $promoterProfitSettlementRecord->last_profit_amount = $playerPromoter->last_profit_amount; + $promoterProfitSettlementRecord->adjust_amount = $playerPromoter->adjust_amount; + $promoterProfitSettlementRecord->type = PromoterProfitSettlementRecord::TYPE_SETTLEMENT; + $promoterProfitSettlementRecord->tradeno = createOrderNo(); + $promoterProfitSettlementRecord->user_id = $userId; + $promoterProfitSettlementRecord->user_name = $userName; + $settlement = $amount = bcadd($promoterProfitSettlementRecord->total_profit_amount, + $promoterProfitSettlementRecord->adjust_amount, 2); + if ($amount > 0) { + if ($playerPromoter->settlement_amount < 0) { + $diffAmount = bcadd($amount, $playerPromoter->settlement_amount, 2); + $settlement = max($diffAmount, 0); + } + } + $promoterProfitSettlementRecord->actual_amount = $settlement; + $promoterProfitSettlementRecord->save(); + // 更新结算报表 + PromoterProfitRecord::where('status', PromoterProfitRecord::STATUS_UNCOMPLETED) + ->where('promoter_player_id', $id) + ->update([ + 'status' => PromoterProfitRecord::STATUS_COMPLETED, + 'settlement_time' => date('Y-m-d H:i:s'), + 'settlement_tradeno' => $promoterProfitSettlementRecord->tradeno, + 'settlement_id' => $promoterProfitSettlementRecord->id, + ]); + // 结算后这些数据清零 + $playerPromoter->profit_amount = 0; + $playerPromoter->player_profit_amount = 0; + $playerPromoter->team_recharge_total_amount = 0; + $playerPromoter->team_withdraw_total_amount = 0; + $playerPromoter->adjust_amount = 0; + // 更新数据 + $playerPromoter->team_profit_amount = bcsub($playerPromoter->team_profit_amount, + $promoterProfitSettlementRecord->total_profit_amount, 2); + $playerPromoter->last_profit_amount = $settlement; + $playerPromoter->settlement_amount = bcadd($playerPromoter->settlement_amount, $amount, 2); + $playerPromoter->team_settlement_amount = bcadd($playerPromoter->team_settlement_amount, + $promoterProfitSettlementRecord->total_profit_amount, 2); + $playerPromoter->last_settlement_time = date('Y-m-d', strtotime('-1 day')); + + if (!empty($playerPromoter->path)) { + PlayerPromoter::where('player_id', '!=', $playerPromoter->player_id) + ->whereIn('player_id', explode(',', $playerPromoter->path)) + ->update([ + 'team_profit_amount' => DB::raw("team_profit_amount - {$promoterProfitSettlementRecord->total_profit_amount}"), + 'team_settlement_amount' => DB::raw("team_settlement_amount + $promoterProfitSettlementRecord->total_profit_amount"), + ]); + } + if ($settlement > 0) { + // 增加钱包余额 + $amountBefore = $playerPromoter->player->wallet->money; + $amountAfter = bcadd($amountBefore, $settlement, 2); + $playerDeliveryRecord = new PlayerDeliveryRecord; + $playerDeliveryRecord->player_id = $playerPromoter->player_id; + $playerDeliveryRecord->department_id = $playerPromoter->department_id; + $playerDeliveryRecord->target = $promoterProfitSettlementRecord->getTable(); + $playerDeliveryRecord->target_id = $promoterProfitSettlementRecord->id; + $playerDeliveryRecord->type = PlayerDeliveryRecord::TYPE_PROFIT; + $playerDeliveryRecord->source = 'profit'; + $playerDeliveryRecord->amount = $settlement; + $playerDeliveryRecord->amount_before = $amountBefore; + $playerDeliveryRecord->amount_after = $amountAfter; + $playerDeliveryRecord->tradeno = $promoterProfitSettlementRecord->tradeno ?? ''; + $playerDeliveryRecord->remark = ''; + $playerDeliveryRecord->save(); + $playerPromoter->player->wallet->money = $amountAfter; + } + $playerPromoter->push(); + DB::commit(); + } catch (\Exception $e) { + DB::rollback(); + throw new Exception($e->getMessage()); + } +} \ No newline at end of file diff --git a/app/middleware/AccessControl.php b/app/middleware/AccessControl.php new file mode 100644 index 0000000..3291469 --- /dev/null +++ b/app/middleware/AccessControl.php @@ -0,0 +1,25 @@ +method() == 'OPTIONS' ? response('') : $handler($request); + + // 给响应添加跨域相关的http头 + $response->withHeaders([ + 'Access-Control-Allow-Credentials' => 'true', + 'Access-Control-Allow-Origin' => $request->header('origin', '*'), + 'Access-Control-Allow-Methods' => $request->header('access-control-request-method', '*'), + 'Access-Control-Allow-Headers' => $request->header('access-control-request-headers', '*'), + ]); + + return $response; + } +} \ No newline at end of file diff --git a/app/middleware/AppVersionMiddleware.php b/app/middleware/AppVersionMiddleware.php new file mode 100644 index 0000000..5c9eadb --- /dev/null +++ b/app/middleware/AppVersionMiddleware.php @@ -0,0 +1,57 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace app\middleware; + +use addons\webman\model\AppVersion; +use Webman\Http\Request; +use Webman\Http\Response; +use Webman\MiddlewareInterface; + +/** + * 站点验证中间件 + * Class SiteAuthMiddleware + * @package app\middleware + */ +class AppVersionMiddleware implements MiddlewareInterface +{ + public function process(Request $request, callable $handler): Response + { + // 更新比较时,查询的是版本标识,大于传入的版本标识时,返回新版本的数据 + $versionKey = $request->header('app-version-key'); + $systemKey = $request->header('system-key'); + // 传入检测的系统 + if (empty($versionKey) || empty($systemKey)) { + return jsonFailResponse('缺少版本号或版本标识'); + } + $data = AppVersion::query() + ->where('app_version_key', '>', $versionKey) + ->where(['status' => 1]) + ->where('status', 1) + ->where('force_update', 1) + ->where('system_key', $systemKey) + ->where('department_id', request()->department_id) + ->whereDate('regular_update', '<', date("Y-m-d H:i:s", time())) + ->select(['id', 'system_key', 'app_version', 'app_version_key', 'apk_url', 'hot_update_url', 'force_update', 'hot_update', 'regular_update', 'update_content', 'notes']) + ->orderBy('id', 'desc') + ->first(); + if (!empty($data)) { + return jsonFailResponse('有新版本', [ + 'data' => $data + ], 406); + } + + return $handler($request); + } +} diff --git a/app/middleware/ExternalAppMiddleware.php b/app/middleware/ExternalAppMiddleware.php new file mode 100644 index 0000000..f1cc7ce --- /dev/null +++ b/app/middleware/ExternalAppMiddleware.php @@ -0,0 +1,35 @@ +whereNull('deleted_at')->where('status', 1)->first(); + if (empty($externalApp)) { + throw new \Exception('应用不存在'); + } + // 验证服务器ip + if (!empty($externalApp->white_ip) && !in_array(request()->getRealIp(), explode(',', $externalApp->white_ip))) { + throw new \Exception('IP认证不通过'); + } + } catch (\Exception $e) { + return jsonFailResponse($e->getMessage(), [], 0); + } + return $handler($request); + } +} \ No newline at end of file diff --git a/app/middleware/Lang.php b/app/middleware/Lang.php new file mode 100644 index 0000000..421ceb5 --- /dev/null +++ b/app/middleware/Lang.php @@ -0,0 +1,17 @@ +header('Lang') ?? 'zh_CN'; + locale(session('lang', Str::replace('-', '_', $lang))); + return $handler($request); + } +} diff --git a/app/middleware/SiteAuthMiddleware.php b/app/middleware/SiteAuthMiddleware.php new file mode 100644 index 0000000..e5a9832 --- /dev/null +++ b/app/middleware/SiteAuthMiddleware.php @@ -0,0 +1,61 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace app\middleware; + +use addons\webman\model\Channel; +use support\Cache; +use Webman\Http\Request; +use Webman\Http\Response; +use Webman\MiddlewareInterface; + +/** + * 站点验证中间件 + * Class SiteAuthMiddleware + * @package app\middleware + */ +class SiteAuthMiddleware implements MiddlewareInterface +{ + public function process(Request $request, callable $handler): Response + { + // 站点标识 + $siteId = $request->header('Site-Id'); + // 排除接口 + if ($request->path() == '/api/v1/talk-pay-notify') { + return $handler($request); + } + if (empty($siteId)) { + return response('fail', 400); + } + $cacheKey = "channel_" . $siteId; + $channel = Cache::get($cacheKey); + if (empty($channel)) { + /** @var Channel $channel */ + $channel = Channel::where('site_id', $siteId)->whereNull('deleted_at')->first(); + if (!empty($channel)) { + $cacheKey = "channel_" . $channel->site_id; + Cache::set($cacheKey, $channel->toArray()); + } else { + return response('fail', 400); + } + } + if ($channel['status'] == 0 || !empty($channel['deleted_at'])) { + return response('fail', 400); + } + $request->department_id = $channel['department_id']; + $request->site_id = $siteId; + + return $handler($request); + } +} diff --git a/app/middleware/StaticFile.php b/app/middleware/StaticFile.php new file mode 100644 index 0000000..cce75dc --- /dev/null +++ b/app/middleware/StaticFile.php @@ -0,0 +1,42 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace app\middleware; + +use Webman\Http\Request; +use Webman\Http\Response; +use Webman\MiddlewareInterface; + +/** + * Class StaticFile + * @package app\middleware + */ +class StaticFile implements MiddlewareInterface +{ + public function process(Request $request, callable $next): Response + { + // Access to files beginning with. Is prohibited + if (strpos($request->path(), '/.') !== false) { + return response('

403 forbidden

', 403); + } + /** @var Response $response */ + $response = $next($request); + // Add cross domain HTTP header + /*$response->withHeaders([ + 'Access-Control-Allow-Origin' => '*', + 'Access-Control-Allow-Credentials' => 'true', + ]);*/ + return $response; + } +} diff --git a/app/queue/redis/CancelRecharge.php b/app/queue/redis/CancelRecharge.php new file mode 100644 index 0000000..ee06305 --- /dev/null +++ b/app/queue/redis/CancelRecharge.php @@ -0,0 +1,35 @@ +where('status', PlayerRechargeRecord::STATUS_WAIT) + ->where('id', $data['id']) + ->first(); + if (!empty($playerRechargeRecord)) { + $playerRechargeRecord->status = PlayerRechargeRecord::STATUS_RECHARGED_SYSTEM_CANCEL; + $playerRechargeRecord->cancel_time = date('Y-m-d H:i:s'); + $playerRechargeRecord->save(); + } + } +} \ No newline at end of file diff --git a/app/queue/redis/SendBroadcasts.php b/app/queue/redis/SendBroadcasts.php new file mode 100644 index 0000000..5bfd623 --- /dev/null +++ b/app/queue/redis/SendBroadcasts.php @@ -0,0 +1,27 @@ +getMessage()); + } + } +} diff --git a/app/service/BaseSmsServices.php b/app/service/BaseSmsServices.php new file mode 100644 index 0000000..28c7319 --- /dev/null +++ b/app/service/BaseSmsServices.php @@ -0,0 +1,16 @@ +where('game_id', $gameId) + ->where('department_id', $departmentId) + ->where('status', 1) + ->where('total_remaining', '>', 0) + ->where('daily_remaining', '>', 0) + ->lockForUpdate() + ->get() + ->toArray(); + + if (empty($prizes)) { + DB::rollBack(); + return [ + 'success' => false, + 'message' => '当前游戏不可用' + ]; + } + + $game = Game::query()->select('id', 'game_type', 'consume')->where('id', $gameId)->first()->toArray(); + // 2. 计算中奖结果 + $result = $this->calculateWinning($player,$prizes, $game['consume']); + $prizeId = $result['prize_id']; + $prizeName = $result['prize_name']; + $prizeType = $result['prize_type']; + + $game['department_id'] = $departmentId; + // 3. 记录抽奖信息 + $this->createRecord($player->id, $result, $game, $ip); + + if ($result['prize_type'] == 3) { + $message = '很遗憾,未中奖'; + } else { + $message = '恭喜获得' . $prizeName; + } + DB::commit(); + return [ + 'prize_id' => $prizeId, + 'prize_name' => $prizeName, + 'prize_type' => $prizeType, + 'consume' => $game['consume'], + 'message' => $message + ]; + } catch (Exception $e) { + DB::rollBack(); + Log::error("抽奖失败:{$e->getMessage()}", [ + 'user_id' => $player->id, + 'trace' => $e->getTraceAsString() + ]); + return [ + 'success' => false, + 'message' => '抽奖过程异常,请稍后再试' + ]; + } + } + + /** + * 计算中奖结果 + * @param array $prizes 有效奖品列表 + * @return array 中奖信息 + * @throws Exception + */ + private function calculateWinning($player, array $prizes, $consume): array + { + // 计算总概率权重 + $totalProb = array_sum(array_column($prizes, 'probability')); + if ($totalProb <= 0) { + return ['prize_id' => null, 'type' => Prize::PRIZE_TYPE_LOSE, 'prize_name' => '未中奖', 'prize_pic' => null]; + } + $player->wallet->decrement('money', $consume); + // 生成随机数(0到总权重之间) + $random = mt_rand(1, $totalProb * 10000) / 10000; // 提高精度 + + $currentSum = 0; + foreach ($prizes as $prize) { + $currentSum += $prize['probability']; + if ($random <= $currentSum) { + // 检查并扣减库存 + $this->deductStock($prize['id']); + return [ + 'prize_id' => $prize['id'], + 'prize_type' => $prize['type'], + 'prize_name' => $prize['name'], + 'prize_pic' => $prize['pic'] + ]; + } + } + + return ['prize_id' => null, 'type' => Prize::PRIZE_TYPE_LOSE, 'prize_name' => '未中奖', 'prize_pic' => null]; + } + + /** + * 扣减库存 + * @param int $prizeId 奖品ID + * @throws Exception + */ + private function deductStock(int $prizeId): void + { + $prize = Prize::query()->findOrFail($prizeId); + + // 再次检查库存(防止并发超卖) + if ($prize->total_remaining <= 0 || $prize->daily_remaining <= 0) { + throw new \Exception("奖品库存不足"); + } + + $prize->decrement('total_remaining'); + $prize->decrement('daily_remaining'); + $prize->save(); + } + + /** + * 创建抽奖记录 + * @param int $userId 用户ID + * @param array|null $prize 奖品 + * @param string $ip IP地址 + */ + private function createRecord(int $userId, ?array $prize, array $game, string $ip): void + { + DrawRecord::query()->create([ + 'uid' => $userId, + 'prize_id' => $prize['prize_id'], + 'prize_type' => $prize['prize_type'], + 'prize_name' => $prize['prize_name'], + 'prize_pic' => $prize['prize_pic'], + 'game_id' => $game['id'], + 'consume' => $game['consume'], + 'game_type' => $game['game_type'], + 'department_id' => $game['department_id'], + 'draw_time' => date('Y-m-d H:i:s'), + 'ip' => $ip + ]); + } +} \ No newline at end of file diff --git a/app/service/JpSmsServicesServices.php b/app/service/JpSmsServicesServices.php new file mode 100644 index 0000000..8cae9d9 --- /dev/null +++ b/app/service/JpSmsServicesServices.php @@ -0,0 +1,103 @@ +domain = config('jp-sms.domain'); + $this->appKey = config('jp-sms.app_key'); + $this->appcode = config('jp-sms.appcode'); + $this->appSecret = config('jp-sms.app_secret'); + } + + /** + * 执行请求 + * @param string $api 接口 + * @param array $params 参数 + * @return mixed + */ + public function doCurl(string $api, array $params) + { + $result = Http::timeout(10)->get($this->domain . $api, $params); + + return json_decode($result, true); + } + + /** + * 日本供应商短信发送 + * @param $phone + * @param $type + * @param int $playerId + * @return bool + * @throws Exception + */ + public function send($phone, $type, int $playerId = 0): bool + { + $env = config('app.env'); + $api = config('jp-sms.batchSend'); + $code = ($env == 'pro' ? random_int(10000, 99999) : config('sms.default_code')); + $key = setSmsKey($phone, $type); + $uid = gen_uuid(); + $msg = Str::replaceFirst('{code}', $code, getContent($type, 'jp')); + //驗證通過 + if ($env == 'pro') { + $result = $this->doCurl($api, [ + 'appKey' => $this->appKey, + 'appcode' => $this->appcode, + 'appSecret' => $this->appSecret, + 'uid' => $uid, + 'phone' => PhoneSmsLog::COUNTRY_CODE_JP . $phone, + 'msg' => $msg + ]); + } else { + $result = $env; + } + $phoneSmsLog = new PhoneSmsLog(); + $phoneSmsLog->player_id = $playerId; + $phoneSmsLog->code = $code; + $phoneSmsLog->phone = PhoneSmsLog::COUNTRY_CODE_JP . $phone; + $phoneSmsLog->uid = $uid; + $phoneSmsLog->send_times = 1; + $phoneSmsLog->type = $type; + $phoneSmsLog->expire_time = date("Y-m-d H:i:s", time() + $this->expireTime); + $phoneSmsLog->response = $result ? json_encode($result) : ''; + if ($env == 'pro') { + if (isset($result) && $result['code'] == '00000') { + if (isset($result['result']) && $result['result'][0]['status'] == '00000') { + Cache::set($key, $code, $this->expireTime); + $phoneSmsLog->status = 1; + $phoneSmsLog->save(); + return true; + } + } + } else { + Cache::set($key, $code, $this->expireTime); + $phoneSmsLog->status = 1; + $phoneSmsLog->save(); + return true; + } + $phoneSmsLog->status = 0; + $phoneSmsLog->save(); + + throw new Exception(trans('phone_code_send_failed', [], 'message')); + } +} diff --git a/app/service/OnePayServices.php b/app/service/OnePayServices.php new file mode 100644 index 0000000..f4589e3 --- /dev/null +++ b/app/service/OnePayServices.php @@ -0,0 +1,147 @@ +merchantId = config('one_pay.merchantId'); + $this->key = config('one_pay.key'); + $this->api_key = config('one_pay.api_key'); + $this->domain = config('one_pay.domain'); + $this->notifyUrl = config('one_pay.notifyUrl'); + $this->payoutNotifyUrl = config('one_pay.payoutNotifyUrl'); + $this->returnUrl = config('one_pay.returnUrl'); + } + + /** + * 执行请求 + * @param string $api 接口 + * @param array $params 参数 + */ + public function doCurl(string $api, array $params): array + { + $result = Http::timeout(10)->asForm()->post($this->domain.$api, $params); + Log::channel('pay_log')->info('onepay:'.$api,json_decode($result, true)); + return json_decode($result, true); + } + + /** + * 创建签名 + * @throws GameException + */ + public function getAuth(): string + { + $data = [ + 'username' => $this->merchantId, + 'api_key' => $this->api_key, + ]; + $result = $this->doCurl('merchant/auth',$data); + if ($result['status'] == 'true') { + return $result['auth']; + } else { + throw new GameException($result['message'], 0); + } + } + + /** + * 创建签名 + * @param array $params 参数 + */ + public function calculateSignature(array $params): string + { + ksort($params); + $signature_string = ''; + foreach ($params as $key => $value) { + $signature_string .= $key . ':' . $value . '&'; + } + $signature_string .= 'key:' . $this->key; + return strtoupper(md5($signature_string)); + } + + /** + * 验证返回签名 + * @param array $params 参数 + */ + public function verifySign(array $params): string + { + return md5($this->key.$params['order_id']); + } + + /** + * 存款 + * @param array $params 参数 + * @throws GameException + */ + public function deposit(array $params): array + { + $data = [ + 'username' => $params['uuid'], + 'auth' => $this->getAuth(), + 'amount' => $params['amount'], + 'currency' => 'MYR', + 'orderid' => $params['orderNo'], + 'email' => $params['email'], + 'phone_number' => $params['phone'], + 'redirect_url' => $this->returnUrl.'?orderNo='.$params['orderNo'], + 'pay_method' => $params['paymentCode'], + 'callback_url' => $this->notifyUrl, + ]; + if ($data['pay_method'] == 'online_banking') { + $data['bank_id'] = $params['bank_id']; + } + return $this->doCurl('merchant/generate_orders',$data); + } + + /** + * 代付 + * @param array $params 参数 + * @throws GameException + */ + public function payout(array $params): array + { + $data = [ + 'auth' => $this->getAuth(), + 'amount' => $params['amount'], + 'currency' => 'MYR', + 'orderid' => $params['orderNo'], + 'bank_id' => $params['bankCode'], + 'holder_name' => $params['bankAccountName'], + 'account_no' => $params['bankAccountNo'], + 'callback_url' => $this->payoutNotifyUrl, + ]; + return $this->doCurl('merchant/withdraw_orders',$data); + } + + /** + * 订单查询 + * @param array $params 参数 + */ + public function query(array $params): array + { + $data = [ + 'username' => $this->merchantId, + 'id' => $params['orderNo'], + ]; + return $this->doCurl('merchant/check_status',$data); + } + +} diff --git a/app/service/SePayServices.php b/app/service/SePayServices.php new file mode 100644 index 0000000..981399c --- /dev/null +++ b/app/service/SePayServices.php @@ -0,0 +1,130 @@ +merchantId = config('se-pay.merchantId'); + $this->key = config('se-pay.MD5'); + $this->domain = config('se-pay.domain'); + $this->notifyUrl = config('se-pay.notifyUrl'); + $this->payoutNotifyUrl = config('se-pay.payoutNotifyUrl'); + $this->returnUrl = config('se-pay.returnUrl'); + } + + /** + * 执行请求 + * @param string $api 接口 + * @param array $params 参数 + */ + public function doCurl(string $api, array $params): array + { + $result = Http::timeout(10)->asForm()->post($this->domain.$api, $params); + Log::channel('pay_log')->info('sepay:'.$api,json_decode($result, true)); + return json_decode($result, true); + } + + /** + * 创建签名 + * @param array $params 参数 + */ + public function calculateSignature(array $params): string + { + ksort($params); + $signature_string = ''; + foreach ($params as $key => $value) { + $signature_string .= $key . ':' . $value . '&'; + } + $signature_string .= 'key:' . $this->key; + return strtoupper(md5($signature_string)); + } + + /** + * 验证返回签名 + * @param array $params 参数 + */ + public function verifySign(array $params): string + { + ksort($params); + unset($params['signMsg']); + $signature_string = ''; + foreach ($params as $key => $value) { + $signature_string .= $key . ':' . $value . '&'; + } + $signature_string .= 'key:' . $this->key; + return strtoupper(md5($signature_string)); + } + + /** + * 存款 + * @param array $params 参数 + */ + public function deposit(array $params): array + { + $params['notifyUrl'] = $this->notifyUrl; + $params['returnUrl'] = $this->returnUrl.'?orderNo='.$params['orderNo']; + $request_str = base64_encode(json_encode($params)); + $data = [ + 'merchantNo' => $this->merchantId, + 'request' => $request_str, + 'version' => '1.0', + ]; + $signature = $this->calculateSignature($data); + $data['signMsg'] = $signature; + return $this->doCurl('qrh5',$data); + } + + /** + * 代付 + * @param array $params 参数 + */ + public function payout(array $params): array + { + $params['notifyUrl'] = $this->payoutNotifyUrl; + $request_str = base64_encode(json_encode($params)); + $data = [ + 'merchantNo' => $this->merchantId, + 'request' => $request_str, + 'version' => '1.0', + ]; + $signature = $this->calculateSignature($data); + $data['signMsg'] = $signature; + return $this->doCurl('payout',$data); + } + + /** + * 订单查询 + * @param array $params 参数 + */ + public function query(array $params): array + { + $request_str = base64_encode(json_encode($params)); + $data = [ + 'merchantNo' => $this->merchantId, + 'request' => $request_str, + 'version' => '1.0', + ]; + $signature = $this->calculateSignature($data); + $data['signMsg'] = $signature; + return $this->doCurl('query',$data); + } + +} diff --git a/app/service/SklPayServices.php b/app/service/SklPayServices.php new file mode 100644 index 0000000..9946fcf --- /dev/null +++ b/app/service/SklPayServices.php @@ -0,0 +1,96 @@ +merchantId = config('skl_pay.merchantId'); + $this->api_key = config('skl_pay.api_key'); + $this->domain = config('skl_pay.domain'); + $this->notifyUrl = config('skl_pay.notifyUrl'); + $this->payoutNotifyUrl = config('skl_pay.payoutNotifyUrl'); + $this->returnUrl = config('skl_pay.returnUrl'); + } + + /** + * 执行请求 + * @param string $api 接口 + * @param array $params 参数 + */ + public function doCurl(string $api, array $params): array + { + $result = Http::timeout(10)->asJson()->post($this->domain.$api, $params); + Log::channel('pay_log')->info('sklpay:'.$api,json_decode($result, true)); + return json_decode($result, true); + } + + /** + * 存款 + * @param array $params 参数 + * @throws GameException + */ + public function deposit(array $params): array + { + $data = [ + 'api_token' => $this->api_key, + 'amount' => $params['amount'], + 'gateway' => $params['paymentCode'], + 'pusername' => $params['name'], + 'invoice_no' => $params['orderNo'], + ]; + return $this->doCurl('/api/transaction/init',$data); + } + + /** + * 代付 + * @param array $params 参数 + * @throws GameException + */ + public function payout(array $params): array + { + $data = [ + 'api_token' => $this->api_key, + 'amount' => $params['amount'], + 'to_bank' => $params['bankCode'], + 'to_bank_account_no' => $params['bankAccountNo'], + 'account_holder' => $params['bankAccountName'], + 'invoice_no' => $params['orderNo'], + ]; + return $this->doCurl('/api/transfer_out/init',$data); + } + + /** + * 订单查询 + * @param array $params 参数 + */ + public function query(array $params): array + { + $data = [ + 'transaction_id' => $params['orderNo'], + ]; + return $this->doCurl('/api/transaction/get_status',$data); + } + +} diff --git a/app/service/SmsServicesServices.php b/app/service/SmsServicesServices.php new file mode 100644 index 0000000..fd391e2 --- /dev/null +++ b/app/service/SmsServicesServices.php @@ -0,0 +1,41 @@ +send($phone, $type, $playerId, $name); + case PhoneSmsLog::COUNTRY_CODE_JP: + return (new JpSmsServicesServices())->send($phone, $type, $playerId); + default: + throw new Exception(trans('country_code_error', [], 'message')); + } + } +} diff --git a/app/service/TwSmsServicesServices.php b/app/service/TwSmsServicesServices.php new file mode 100644 index 0000000..8c05312 --- /dev/null +++ b/app/service/TwSmsServicesServices.php @@ -0,0 +1,121 @@ +domain = config('tw-sms.domain'); + $this->username = config('tw-sms.username'); + $this->password = config('tw-sms.password'); + } + + /** + * 执行请求 + * @param string $api 接口 + * @param array $params 参数 + * @return mixed + * @throws Exception + */ + public function doCurl(string $api, array $params) + { + $result = Http::timeout(10)->post($this->domain . $api . '?' . http_build_query($params)); + if ($result->ok()) { + $arr = preg_split('/[;\r\n]+/s', $result->body()); + $data = []; + foreach ($arr as $item) { + $arr = explode('=', $item); + if (!empty($arr) && isset($arr[0]) && isset($arr[1])) { + $data[$arr[0]] = $arr[1]; + } + } + return $data; + } + throw new Exception(trans('phone_code_send_failed', [], 'message')); + } + + /** + * 日本供应商短信发送 + * @param $phone + * @param $type + * @param int $playerId + * @param string $name + * @return bool + * @throws Exception + */ + public function send($phone, $type, int $playerId = 0, string $name = ''): bool + { + $env = config('app.env'); + $api = config('tw-sms.sm_send_api'); + $code = ($env == 'pro' ? random_int(10000, 99999) : config('sms.default_code')); + $key = setSmsKey($phone, $type); + $uid = gen_uuid(); + $msg = Str::replaceFirst('{code}', $code, getContent($type, 'tw')); + //驗證通過 + if ($env == 'pro') { + $result = $this->doCurl($api, [ + 'username' => $this->username, + 'password' => $this->password, + 'dstaddr' => $phone, + 'destname' => $name, + 'dlvtime' => '', + 'vldtime' => $this->expireTime, + 'smbody' => $msg, + 'CharsetURL' => 'UTF-8', + ]); + Log::info('短信发送结果', [$result]); + } else { + $result = $env; + } + $phoneSmsLog = new PhoneSmsLog(); + $phoneSmsLog->player_id = $playerId; + $phoneSmsLog->code = $code; + $phoneSmsLog->phone = PhoneSmsLog::COUNTRY_CODE_TW . $phone; + $phoneSmsLog->uid = $uid; + $phoneSmsLog->send_times = 1; + $phoneSmsLog->type = $type; + $phoneSmsLog->expire_time = date("Y-m-d H:i:s", time() + $this->expireTime); + $phoneSmsLog->response = $result ? json_encode($result) : ''; + if ($env == 'pro') { + if (isset($result['statuscode'])) { + /* 0 預約傳送中1 已送達業者2 已送達業者4 已送達⼿機5 內容有錯誤6 ⾨號有錯誤7 簡訊已停⽤8 逾時無送達9 預約已取消*/ + switch ($result['statuscode']) { + case '0': + case '1': + case '2': + case '4': + Cache::set($key, $code, $this->expireTime); + $phoneSmsLog->status = 1; + $phoneSmsLog->save(); + return true; + } + } + } else { + Cache::set($key, $code, $this->expireTime); + $phoneSmsLog->status = 1; + $phoneSmsLog->save(); + return true; + } + $phoneSmsLog->status = 0; + $phoneSmsLog->save(); + + throw new Exception(trans('phone_code_send_failed', [], 'message')); + } +} diff --git a/app/service/game/BigGamingServiceInterface.php b/app/service/game/BigGamingServiceInterface.php new file mode 100644 index 0000000..e309a5e --- /dev/null +++ b/app/service/game/BigGamingServiceInterface.php @@ -0,0 +1,759 @@ + 'Casino', + '5' => 'Fishing', + '8' => 'Bingo', + '1' => 'Slot', + ]; + + public $localGameType = [ + '2' => '2',//赌场 + '4' => '4',//捕鱼 + '5' => '5',//真人视讯 + ]; + + public $failCode = [ + 'S200' => '重復請求', + 'F0001' => '無效的簽名', + 'F0002' => '無效的SN', + 'F0003' => '無效的參數', + 'F0004' => '無效的貨幣', + 'F0005' => '玩家已存在', + 'F0006' => '玩家不存在', + 'F0007' => '會員不存在', + 'F0008' => '執行失敗', + 'F0009' => '無效的方法', + 'F0010' => '無效的用戶狀態', + 'F0011' => '玩家狀態無需更新', + 'F0012' => '超出數據範圍', + 'F0013' => '無匹配數據', + 'F0014' => '登入位置被禁止', + 'F0015' => '分數不足夠', + 'F0016' => '不支持禮碼', + 'F0017' => '交易流水號不得重複', + 'F0018' => '系統繁忙', + 'F0019' => '日期時間各式錯誤', + 'F0020' => '超出時間限制範圍(開始時間與結束時間之間不能大於120分鐘)', + 'F0021' => '執行取消', + 'M0001' => '系統維護', + 'M0002' => '系統錯誤', + ]; + + /** + * @param Player|null $player + * @param $type + * @throws Exception + */ + public function __construct($type, Player $player = null) + { + $config = config('game_platform.' . $type); + $this->appId = $config['app_id']; + $this->apiDomain = $config['api_domain']; + $this->domain = $config['domain']; + $this->appSecret = $config['app_secret']; + $this->sn = $config['sn']; + $this->adminUser = $config['admin_user']; + $this->secretCode = base64_encode(sha1($config['admin_pass'], true)); + $this->platform = GamePlatform::query()->where('name', $type)->first(); + if (!empty($player)) { + $this->player = $player; + $this->getLoginId(); + } + } + + /** + * 生成请求url + * @return string + */ + public function createUrl(): string + { + return $this->apiDomain; + } + + //生成签名 + public function createSign($params): string + { + $str = ''; + foreach ($params as $v) { + $str .= $v; + } + return md5($str); + } + + /** + * 生成请求数据 + * @param $postData + * @param $method + * @return array + */ + public function buildParams($postData, $method): array + { + return array( + "jsonrpc" => "2.0", + "method" => $method, + "params" => $postData, + "id" => $this->player->uuid ?? uniqid() + ); + } + + /** + * 创建代理账号 + * @throws GameException|\think\Exception + */ + public function createAgent() + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'loginId' => 'testagent123', + 'secretKey' => $this->appSecret, + ]; + $params['sign'] = $this->createSign($params); + unset($params['secretKey']); + $params['password'] = '123456ss'; + $postData = $this->buildParams($params, 'open.agent.create'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['result']) && empty($result['error'])){ + return $result; + }else{ + throw new GameException($result['error']['message'], 0); + } + } + + /** + * 更新游戏列表 + * @return false + */ + public function getSimpleGameList(): bool + { + return false; + } + + /** + * 获取玩家ID + * @throws Exception + */ + protected function getLoginId() + { + /** @var PlayerGamePlatform $playerGamePlatform */ + $playerGamePlatform = PlayerGamePlatform::query()->where('platform_id', $this->platform->id)->where('player_id',$this->player->id)->first(); + if (!empty($playerGamePlatform)) { + return $this->loginId = $playerGamePlatform->player_code; + } + return $this->createPlayer([ + 'uuid' => $this->player->uuid, + 'name' => $this->player->name, + ]); + } + + /** + * 创建玩家 + * @param array $data + * @return array|mixed|Response + * @throws GameException|Exception + */ + public function createPlayer(array $data = []) + { + $params = [ + 'random' => $data['uuid'], + 'sn' => $this->sn, + 'secretCode' => $this->secretCode, + ]; + $params['digest'] = $this->createSign($params); + $params['loginId'] = $data['uuid']; + $params['nickname'] = $data['name']; + $params['agentLoginId'] = $this->adminUser; + unset($params['secretCode']); + $postData = $this->buildParams($params, 'open.user.create'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['result']) && empty($result['error'])){ + $playerGamePlatform = new PlayerGamePlatform(); + $playerGamePlatform->player_id = $this->player->id; + $playerGamePlatform->platform_id = $this->platform->id; + $playerGamePlatform->player_name = $data['name']; + $playerGamePlatform->player_code = $result['result']['loginId']; + $playerGamePlatform->save(); + $this->loginId = $playerGamePlatform->player_code; + return $result; + }else{ + throw new GameException($result['error']['message'], 0); + } + } + + /** + * 获取玩家信息 + * @return array|mixed|Response + * @throws GameException|Exception + */ + public function getPlayer() + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'loginId' => $this->loginId, + 'secretCode' => $this->secretCode, + ]; + $params['digest'] = $this->createSign($params); + unset($params['secretCode']); + $postData = $this->buildParams($params, 'open.user.get'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['result']) && empty($result['error'])){ + return $result; + }else{ + throw new GameException($result['error']['message'], 0); + } + } + + /** + * 玩家进入游戏 + * @param array $data + * @return string + * @throws GameException|\think\Exception + */ + public function login(array $data = []): string + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'loginId' => $this->loginId, + 'secretCode' => $this->secretCode, + ]; + $params['digest'] = $this->createSign($params); + $params['isMobileUrl'] = 1; + unset($params['secretCode']); + $postData = $this->buildParams($params, 'open.video.game.url'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['error'])) { + throw new GameException($result['error']['message'], 0); + } + return $result['result']; + } + + /** + * 获取玩家游戏平台余额 + * @throws GameException|\think\Exception + */ + public function getBalance() + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'loginId' => $this->loginId, + 'secretCode' => $this->secretCode, + ]; + $params['digest'] = $this->createSign($params); + unset($params['secretCode']); + $postData = $this->buildParams($params, 'open.balance.get'); + $result = doCurl($this->apiDomain,$postData); + if (empty($result['error'])){ + return $result['result']; + }else{ + throw new GameException('Big Gaming System Error,Please contact the administrator', 0); + } + } + + /** + * 玩家钱包转入游戏平台 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferOut() + { + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_OUT, $this->player->wallet->money); + } + + /** + * 游戏平台转入玩家钱包 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferIn() + { + $balance = $this->getBalance(); + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_IN, -$balance); + } + + /** + * 轉帳進出額度 + * @param $type + * @param float $amount + * @param float $reward + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + protected function setBalanceTransfer($type, float $amount = 0, float $reward = 0) + { + if ($amount == 0) { + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer($type, $amount, $reward); + return true; + } + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'loginId' => $this->loginId, + 'amount' => $amount, + 'secretCode' => $this->secretCode, + ]; + $params['digest'] = $this->createSign($params); + unset($params['secretCode']); + $postData = $this->buildParams($params, 'open.balance.transfer'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['error'])) { + throw new GameException($result['error']['message'], 0); + } + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer($type, $amount, $reward); + return $result; + } + + /** + * 查询额度转移纪录 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getTransferList(string $startTime = '', string $endTime = '', int $page = 1, int $pageSize = 15) + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'secretKey' => $this->appSecret, + ]; + $params['sign'] = $this->createSign($params); + $params['loginId'] = $this->loginId; + $params['startTime'] = $startTime; + $params['endTime'] = $endTime; + $params['timeZone'] = 1; + unset($params['secretKey']); + $postData = $this->buildParams($params, 'open.balance.transfer.query'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['error'])) { + throw new GameException($result['error']['message'], 0); + } + return $result; + } + + /** + * 查询注单统计结果 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getOrderSum(string $startTime = '', string $endTime = '', int $page = 1, int $pageSize = 500) + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'secretKey' => $this->appSecret, + ]; + $params['sign'] = $this->createSign($params); + $params['loginIds'] = [$this->loginId]; + $params['startTime'] = $startTime; + $params['endTime'] = $endTime; + unset($params['secretKey']); + $postData = $this->buildParams($params, 'open.sn.order.sum'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['error'])) { + throw new GameException($result['error']['message'], 0); + } + return $result; + } + + /** + * 按玩家统计注单 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getUserOrderSum(string $startTime = '', string $endTime = '') + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'secretKey' => $this->appSecret, + ]; + $params['sign'] = $this->createSign($params); + $params['startTime'] = $startTime; + $params['endTime'] = $endTime; + unset($params['secretKey']); + $postData = $this->buildParams($params, 'open.user.order.sum'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['error'])) { + throw new GameException($result['error']['message'], 0); + } + return $result['result']; + } + + /** + * 查询玩家游戏记录 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getUserGameRecord(string $startTime = '', string $endTime = '') + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'loginId' => $this->loginId, + 'secretKey' => $this->appSecret, + ]; + $params['sign'] = $this->createSign($params); + $params['startTime'] = $startTime; + $params['endTime'] = $endTime; + unset($params['secretKey']); + $postData = $this->buildParams($params, 'open.video.round.query'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['error'])) { + throw new GameException($result['error']['message'], 0); + } + return $result['result']; + } + + /** + * 查询玩家游戏记录 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function handleOrderHistories() + { + try { + $page = 1; + $list = []; + $timezone = new DateTimeZone('America/New_York'); + $start = new DateTime('-6 minutes', $timezone); + $end = new DateTime('-5 minutes', $timezone); + $startTime = $start->format('Y-m-d H:i:s'); + $endTime = $end->format('Y-m-d H:i:s'); + $data = $this->getAgentOrderRecord($startTime, $endTime, $page); + $fishData = $this->getUserFishOrderRecord($startTime, $endTime, $page); + if (!empty($data['result'])) { + $total = $data['result']['total'] ?? 0; + if ($total > 0) { + $pageSize = 200; + if (!empty($data['result']['items'])) { + foreach ($data['result']['items'] as $item) { + $list[] = [ + 'uuid' => $item['loginId'], + 'platform_id' => $this->platform->id, + 'game_code' => $item['playNameEn'], + 'bet' => abs($item['bAmount']), + 'win' => $item['aAmount'], + 'order_no' => $item['orderId'], + 'original_data' => json_encode($item,JSON_UNESCAPED_UNICODE), + 'platform_action_at' => $item['lastUpdateTime'], + 'game_type' => 5, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]; + + } + } + if ($total > $pageSize) { + $totalPages = ceil($total / $pageSize); + for ($page = 2; $page <= $totalPages; $page++) { + $nextData = $this->getAgentOrderRecord($startTime,$endTime,$page); + if (!empty($nextData['result']['items'])) { + foreach ($nextData['result']['items'] as $item) { + $list[] = [ + 'uuid' => $item['loginId'], + 'platform_id' => $this->platform->id, + 'game_code' => $item['playNameEn'], + 'bet' => abs($item['bAmount']), + 'win' => $item['aAmount'], + 'order_no' => $item['orderId'], + 'original_data' => json_encode($item,JSON_UNESCAPED_UNICODE), + 'platform_action_at' => $item['lastUpdateTime'], + 'game_type' => 5, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]; + } + } + } + } + } + } + if (!empty($fishData['result'])) { + $fishTotal = $fishData['result']['total'] ?? 0; + if ($fishTotal > 0) { + $pageSize = 200; + if (!empty($fishData['result']['items'])) { + foreach ($fishData['result']['items'] as $item) { + $list[] = [ + 'uuid' => $item['loginId'], + 'platform_id' => $this->platform->id, + 'game_code' => $item['gameType'], + 'bet' => abs($item['betAmount']), + 'win' => $item['calcAmount'], + 'order_no' => $item['betId'], + 'original_data' => json_encode($item, JSON_UNESCAPED_UNICODE), + 'platform_action_at' => $item['orderTimeBj'], + 'game_type' => 4, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]; + } + } + if ($fishTotal > $pageSize) { + $totalPages = ceil($fishTotal / $pageSize); + for ($page = 2; $page <= $totalPages; $page++) { + $nextFishData = $this->getUserFishOrderRecord($startTime,$endTime,$page); + if (!empty($nextFishData['result']['items'])) { + foreach ($nextFishData['result']['items'] as $item) { + $list[] = [ + 'uuid' => $item['loginId'], + 'platform_id' => $this->platform->id, + 'game_code' => $item['gameType'], + 'bet' => abs($item['betAmount']), + 'win' => $item['calcAmount'], + 'order_no' => $item['betId'], + 'original_data' => json_encode($item, JSON_UNESCAPED_UNICODE), + 'platform_action_at' => $item['orderTimeBj'], + 'game_type' => 4, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]; + } + } + } + } + } + } + } catch (Exception $e) { + return []; + } + + return $list; + } + + /** + * 查询玩家注单 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getUserOrderRecord(string $startTime = '', string $endTime = '', $page = 1) + { + $pageSize = 200; + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'secretKey' => $this->appSecret, + ]; + $params['sign'] = $this->createSign($params); + $params['startTime'] = $startTime; + $params['endTime'] = $endTime; + $params['pageIndex'] = $page; + $params['pageSize'] = $pageSize; + unset($params['secretKey']); + $postData = $this->buildParams($params, 'open.order.query'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['error'])) { + throw new GameException($result['error']['message'], 0); + } + return $result; + } + + /** + * 查询玩家注单详情 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getUserOrderDetail($orderId) + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'orderId' => $orderId, + 'reqTime' => date('Y-m-d H:i:s'), + 'secretKey' => $this->appSecret, + ]; + $params['sign'] = $this->createSign($params); + unset($params['secretKey']); + $postData = $this->buildParams($params, 'open.sn.video.order.detail'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['error'])) { + throw new GameException($result['error']['message'], 0); + } + return $result['result']; + } + + /** + * 查询玩家注单详情地址 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getUserOrderDetailUrl($orderId) + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'orderId' => $orderId, + 'secretKey' => $this->appSecret, + ]; + $params['sign'] = $this->createSign($params); + unset($params['secretKey']); + $postData = $this->buildParams($params, 'open.sn.video.order.detail.url.get'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['error'])) { + throw new GameException($result['error']['message'], 0); + } + + return $result['result']; + } + + /** + * 查询玩家捕鱼注单 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getUserFishOrderRecord(string $startTime = '', string $endTime = '', $page = 1) + { + $pageSize = 200; + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'secretKey' => $this->appSecret, + ]; + $params['sign'] = $this->createSign($params); + $params['gameType'] = 1; + $params['agentLoginId'] = $this->adminUser; + $params['startTime'] = $startTime; + $params['endTime'] = $endTime; + $params['pageIndex'] = $page; + $params['pageSize'] = $pageSize; + unset($params['secretKey']); + $postData = $this->buildParams($params, 'open.order.bg.query'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['error'])) { + throw new GameException($result['error']['message'], 0); + } + return $result; + } + + /** + * 查询代理注单 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getAgentOrderRecord(string $startTime = '', string $endTime = '', $page = 1) + { + $pageSize = 200; + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'secretCode' => $this->secretCode, + ]; + $params['digest'] = $this->createSign($params); + $params['agentLoginId'] = $this->adminUser; + $params['startTime'] = $startTime; + $params['endTime'] = $endTime; + $params['pageIndex'] = $page; + $params['pageSize'] = $pageSize; + unset($params['secretCode']); + $postData = $this->buildParams($params, 'open.order.agent.query'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['error'])) { + throw new GameException($result['error']['message'], 0); + } + return $result; + } + + /** + * 查询投注限红盘口 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getLimitations() + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'time' => date('Y-m-d H:i:s'), + 'secretKey' => $this->appSecret, + ]; + $params['sign'] = $this->createSign($params); + unset($params['secretKey']); + $postData = $this->buildParams($params, 'open.game.limitations.get'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['error'])) { + throw new GameException($result['error']['message'], 0); + } + return $result; + } + + /** + * 修改投注限红盘口 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function setLimitations($value) + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'time' => date('Y-m-d H:i:s'), + 'secretKey' => $this->appSecret, + ]; + $params['sign'] = $this->createSign($params); + $params['loginId'] = $this->loginId; + $params['value'] = $value; + unset($params['secretKey']); + $postData = $this->buildParams($params, 'open.game.limitations.set'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['error'])) { + throw new GameException($result['error']['message'], 0); + } + return $result; + } + + /** + * 获取限红盘口列表 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getLimitationsList() + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'time' => date('Y-m-d H:i:s'), + 'secretKey' => $this->appSecret, + ]; + $params['sign'] = $this->createSign($params); + unset($params['secretKey']); + $postData = $this->buildParams($params, 'open.game.limitations.list'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['error'])) { + throw new GameException($result['error']['message'], 0); + } + return $result; + } + +} \ No newline at end of file diff --git a/app/service/game/CSServiceInterface.php b/app/service/game/CSServiceInterface.php new file mode 100644 index 0000000..7a3d031 --- /dev/null +++ b/app/service/game/CSServiceInterface.php @@ -0,0 +1,371 @@ + 'CARD & BOARDGAME', + 'ES' => 'E-GAMES', + 'SB' => 'SPORTBOOK', + 'LC' => 'LIVE-CASINO', + 'SL' => 'SLOTS', + 'LK' => 'LOTTO', + 'FH' => 'FISH HUNTER', + 'PK' => 'POKER', + 'MG' => 'MINI GAME', + 'OT' => 'OTHERS' + ]; + public $failCode = [ + '61' => '货币不兼容', + '70' => '集成系统余额不足', + '71' => '单据号不正确', + '72' => '余额不足', + '73' => '转账金额不正确', + '74' => '转账金额不能多过两个小数点 0.00', + '75' => '不允许在游戏中进行转移', + '81' => '会员账号不存在', + '82' => '会员账号已存在', + '83' => '代理号已存在', + '90' => '请求参数不正确', + '91' => '代理号不正确', + '92' => '供应商代号不正确', + '93' => '请求参数类型不正确', + '94' => '账号不正确', + '95' => '密码不正确', + '96' => '旧密码不正确', + '97' => '请求链接/域名不正确', + '98' => '账号/密码错误', + '99' => '加密错误', + '600' => '前期检验失败。 存款/取款 操作已被无视', + '601' => '此产品的存款 功能暂时停用维修', + '602' => '此产品的取款 功能暂时停用维修', + '603' => '即将执行在线系统维护,为了避免维护时导致的系统不稳定,转账API暂时停止(暂停时间大约5~10分钟,若提早完毕会提早解放)', + '992' => '平台不兼容请求的游戏类型', + '991' => '代理号已冻结', + '994' => '接口访问被禁止', + '995' => '平台未开通', + '996' => '平台不支持', + '998' => '请联系客服', + '999' => '系统维护中', + '9999' => '未知错误', + '-987' => '交易单号不存在;产品不支持', + '-997' => '系统错误,请联络客服。', + '-998' => '集成系统接口余额不足', + '-999' => '接口错误', + ]; + private $apiDomain; + private $providerCode; + private $appId; + private $appSecret; + private $path = [ + 'createPlayer' => '/createMember.aspx', + 'getGameList' => '/getGameList.aspx', + 'getBalance' => '/getBalance.aspx', + 'getLoginH5' => '/launchGames.aspx', + 'getDLoginH5' => '/launchDGames.ashx', + 'changePassword' => '/changePassword.aspx', + 'checkAgentCredit' => '/checkAgentCredit.aspx', + 'checkMemberProductUsername' => '/checkMemberProductUsername.aspx', + 'launchAPP' => '/launchAPP.ashx', + 'checkTransaction' => '/checkTransaction.ashx', + 'setBalanceTransfer' => '/makeTransfer.aspx', + 'getDailyWager' => '/getDailyWager.ashx', + 'fetchArchieve' => '/fetchArchieve.aspx', + 'markbyjson' => '/markbyjson.aspx', + 'markArchieve' => '/markArchieve.ashx', + 'getGameRecord' => '/fetchbykey.aspx', + ]; + private $lang = [ + 'zh-CN' => 'zh-ch', + 'en' => 'en_us', + 'zh_tc' => 'zh_tc', + 'en-us' => 'en-us', + 'id' => 'id', + 'th' => 'th', + 'my' => 'my', + 'vi' => 'vi', + 'fi_fi' => 'fi_fi', + 'kr_ko' => 'kr_ko', + 'hi_hi' => 'hi_hi', + 'br_po' => 'br_po', + 'lo_la' => 'lo_la', + 'cam_dia' => 'cam_dia', // 柬埔寨语 + ]; + + /** + * @param Player|null $player + * @param $type + * @throws Exception + */ + public function __construct($type, Player $player = null) + { + $config = config('game_platform.' . $type); + $this->appId = $config['app_id']; + $this->appSecret = $config['app_secret']; + $this->apiDomain = $config['api_domain']; + $this->providerCode = $config['provider_code']; + $this->platform = GamePlatform::query()->where('name', $type)->first(); + if (!empty($player)) { + $this->player = $player; + /** @var PlayerGamePlatform $playerGamePlatform */ + $playerGamePlatform = $this->player->playerGamePlatform->where('platform_id', $this->platform->id)->first(); + if (empty($playerGamePlatform)) { + $this->createPlayer(); + } else { + $this->playerGamePlatform = $playerGamePlatform; + } + } + } + + /** + * 创建玩家 MD5(operatorcode + username +secret_key) + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function createPlayer() + { + $userName = mb_strtolower($this->providerCode . generateUniqueUsername()); + $params = [ + 'operatorcode' => $this->appId, + 'username' => $userName, + ]; + $params['signature'] = mb_strtoupper(md5($this->appId . $userName . $this->appSecret)); + $res = dogGetCurl($this->createUrl('createPlayer'), $params); + if ($res['errCode'] != $this->successCode) { + throw new GameException($this->failCode[$res['errCode']], 0); + } + $playerGamePlatform = new PlayerGamePlatform(); + $playerGamePlatform->player_id = $this->player->id; + $playerGamePlatform->platform_id = $this->platform->id; + $playerGamePlatform->player_name = $this->player->name; + $playerGamePlatform->player_code = $userName; + $playerGamePlatform->player_password = generateRandomPassword(); + $playerGamePlatform->save(); + $this->playerGamePlatform = $playerGamePlatform; + return $res; + } + + /** + * 生成请求url + * @param $method + * @return string + */ + public function createUrl($method): string + { + return $this->apiDomain . $this->path[$method]; + } + + /** + * 查询玩家游戏平台帐号接口 MD5(operatorcode + providercode + username + secret_key) + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getPlayer() + { + $params = [ + 'operatorcode' => $this->appId, + 'providercode' => $this->providerCode, + 'username' => $this->playerGamePlatform->player_code, + ]; + $params['signature'] = mb_strtoupper(md5($this->appId . $this->providerCode . $this->playerGamePlatform->player_code . $this->appSecret)); + $res = dogGetCurl($this->createUrl('checkMemberProductUsername'), $params); + if ($res['errCode'] != $this->successCode) { + throw new GameException($this->failCode[$res['errCode']], 0); + } + + return $res; + } + + /** + * 获取游戏列表 MD5(operatorcode.toLower() + providercode.toUpper() + secret_key) + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getSimpleGameList() + { + $params = [ + 'providercode' => $this->providerCode, + 'operatorcode' => $this->appId, + 'lang' => 'en', + 'html' => '0', + 'reformatJson' => 'yes', + ]; + $params['signature'] = strtoupper(md5(mb_strtolower($this->appId) . mb_strtoupper($this->providerCode) . $this->appSecret)); + $data = dogGetCurl($this->createUrl('getGameList'), $params); + if ($data['errCode'] != $this->successCode) { + throw new GameException($this->failCode[$data['errCode']], 0); + } + if (!empty($data['gamelist'])) { + $gameList = json_decode($data['gamelist'], true); + foreach ($gameList as $game) { + try { + Game::query()->updateOrCreate( + [ + 'platform_id' => $this->platform->id, + 'game_code' => $game['g_code'] + ], + [ + 'platform_game_type' => $game['p_type'], + 'game_data' => json_encode($game), + 'name' => $game['gameName']['gameName_enus'] ?? '', + 'game_image' => $game['imgFileName'] ?? '', + ] + ); + } catch (Exception $e) { + Log::error($e->getMessage()); + } + } + } + return $data; + } + + /** + * 登录游戏MD5(operatorcode + password + providercode + type + username + secret_key) + * @param array $data + * @return string + * @throws GameException|\think\Exception + */ + public function login(array $data = []): string + { + $params = [ + 'operatorcode' => $this->appId, + 'providercode' => $this->providerCode, + 'username' => $this->playerGamePlatform->player_code, + 'password' => $this->playerGamePlatform->player_password, + 'type' => $data['platformGameType'], + 'gameid' => $data['gameCode'] ?? 0, + 'lang' => 'en', + 'html5' => 1, + ]; + $params['signature'] = mb_strtoupper(md5($this->appId . $this->playerGamePlatform->player_password . $this->providerCode . $data['platformGameType'] . $this->playerGamePlatform->player_code . $this->appSecret)); + $res = dogGetCurl($this->createUrl('getLoginH5'), $params); + + if ($res['errCode'] != $this->successCode) { + Log::error($this->failCode[$res['errCode']], ['res' => $res]); + throw new GameException($this->failCode[$res['errCode']], 0); + } + return $res['gameUrl']; + } + + + /** + * 玩家钱包转入游戏平台 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferOut() + { + + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_OUT, intval($this->player->wallet->money)); + } + + /** + * 资金转账接口MD5(amount + operatorcode + password + providercode + referenceid + type + username + secret_key) + * @param $type + * @param float $amount + * @return array|mixed|null + * @throws GameException + * @throws \think\Exception + */ + protected function setBalanceTransfer($type, float $amount = 0) + { + if ($type == PlayerWalletTransfer::TYPE_OUT) { + $platformType = 0; + } else { + $platformType = 1; + } + + $no = createOrderNo(); + $params = [ + 'operatorcode' => $this->appId, + 'providercode' => $this->providerCode, + 'username' => $this->playerGamePlatform->player_code, + 'password' => $this->playerGamePlatform->player_password, + 'referenceid' => $no, + 'type' => $platformType, + 'amount' => $amount + ]; + $params['signature'] = mb_strtoupper(md5($amount . $this->appId . $this->playerGamePlatform->player_password . $this->providerCode . $no . $platformType . $this->playerGamePlatform->player_code . $this->appSecret)); + $res = dogGetCurl($this->createUrl('setBalanceTransfer'), $params); + if ($res['errCode'] != $this->successCode) { + throw new GameException($this->failCode[$res['errCode']], 0); + } + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer($type, $amount, 0, $res['innerCode'] ?? ''); + + return $res; + } + + /** + * 玩家钱包转入游戏平台 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferIn() + { + $balance = $this->getBalance(); + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_IN, $balance['balance'] ?? 0); + } + + /** + * 獲取玩家餘額信息 + * 簽名密鑰方式 MD5(operatorcode + password + providercode + username + secret_key) + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getBalance() + { + $params = [ + 'operatorcode' => $this->appId, + 'providercode' => $this->providerCode, + 'username' => $this->playerGamePlatform->player_code, + 'password' => $this->playerGamePlatform->player_password + ]; + $params['signature'] = mb_strtoupper(md5($this->appId . $this->playerGamePlatform->player_password . $this->providerCode . $this->playerGamePlatform->player_code . $this->appSecret)); + $res = dogGetCurl($this->createUrl('getBalance'), $params); + if ($res['errCode'] != $this->successCode) { + throw new GameException($this->failCode[$res['errCode']], 0); + } + + return $res; + } + + /** + * 依據時間獲取遊戲紀錄 + * MD5 (Id+Method+SN+StartTime+EndTime+APISecretKey) + * @param int $pageIndex + * @param string $startTime + * @param string $endTime + * @return array|mixed|null + * @throws GameException + */ + public function getGameRecordByTime(int $pageIndex = 1, string $startTime = '', string $endTime = '') + { + + } + + /** + * 獲取玩家遊戲歷史紀錄 + * MD5 (Id+Method+SN+APISecretKey) + * @return array|mixed|null + * @throws GameException + */ + public function getGameRecord() + { + } +} \ No newline at end of file diff --git a/app/service/game/GameServiceFactory.php b/app/service/game/GameServiceFactory.php new file mode 100644 index 0000000..405e31d --- /dev/null +++ b/app/service/game/GameServiceFactory.php @@ -0,0 +1,141 @@ +player_id = $this->player->id; + $playerWalletTransfer->platform_id = $this->platform->id; + $playerWalletTransfer->department_id = $this->player->department_id; + $playerWalletTransfer->type = $type; + $playerWalletTransfer->amount = abs($amount); + $playerWalletTransfer->reward = abs($reward); + $playerWalletTransfer->platform_no = $platformNo; + $playerWalletTransfer->tradeno = createOrderNo(); + $playerWalletTransfer->save(); + $beforeGameAmount = $this->player->wallet->money; + $playerDeliveryRecord = new PlayerDeliveryRecord; + if ($type == PlayerWalletTransfer::TYPE_OUT) { + $this->player->wallet->money = 0; + $playerDeliveryRecord->type = PlayerDeliveryRecord::TYPE_GAME_OUT; + } + if ($type == PlayerWalletTransfer::TYPE_IN) { + $this->player->wallet->money = bcadd($this->player->wallet->money, bcadd(abs($amount), abs($reward), 2), 2); + $playerDeliveryRecord->type = PlayerDeliveryRecord::TYPE_GAME_IN; + } + $this->player->push(); + //寫入金流明細 + $playerDeliveryRecord->player_id = $playerWalletTransfer->player_id; + $playerDeliveryRecord->department_id = $playerWalletTransfer->department_id; + $playerDeliveryRecord->target = $playerWalletTransfer->getTable(); + $playerDeliveryRecord->target_id = $playerWalletTransfer->id; + $playerDeliveryRecord->source = 'play_game'; + $playerDeliveryRecord->amount = $playerWalletTransfer->amount; + $playerDeliveryRecord->amount_before = $beforeGameAmount; + $playerDeliveryRecord->amount_after = $this->player->wallet->money; + $playerDeliveryRecord->tradeno = ''; + $playerDeliveryRecord->remark = ''; + $playerDeliveryRecord->save(); + } +} \ No newline at end of file diff --git a/app/service/game/GameServiceInterface.php b/app/service/game/GameServiceInterface.php new file mode 100644 index 0000000..8887440 --- /dev/null +++ b/app/service/game/GameServiceInterface.php @@ -0,0 +1,30 @@ + 'Slot', + '12' => 'Casino', + '13' => 'Arcade', + '16' => 'Fishing' + ]; + public $failCode = [ + '0000' => '成功', + '9999' => '失敗', + '9001' => '未授權訪問', + '9002' => '域名為空或域名長度小於 2', + '9003' => '域名驗證失敗。', + '9004' => '加密數據為空或加密數據的長度等於 0。', + '9005' => '斷言(SAML)未通過時間戳驗證。', + '9006' => '從加密數據中提取 SAML 參數失敗。', + '9007' => '未知操作。', + '9008' => '與之前的值相同。', + '9009' => '超時。', + '9010' => '讀取超時。', + '9011' => '重複交易。', + '9012' => '請稍後再試。', + '9013' => '系統正在維護。', + '9014' => '檢測到多帳戶登錄。', + '9015' => '數據不存在。', + '9016' => '無效令牌。', + '9019' => '請求速率限制超過。', + '9020' => '每次登錄只能獲得一次遊戲票。', + '9021' => '違反一次性會話策略。', + '9022' => '遊戲正在維護。', + '9023' => '不支持的貨幣。', + '9024' => '贏取倍數必須大於或等於 10 倍。', + '9025' => '不支持重放遊戲。', + '9026' => '获胜金额应大于0。', + '9027' => '不支持演示。', + '8000' => '輸入參數錯誤,請檢查您的參數是否正確。', + '8001' => '參數不能為空。', + '8002' => '參數必須是正整數。', + '8003' => '參數不能為負數。', + '8005' => '日期秒格式錯誤', + '8006' => '時間不符合。', + '8007' => '參數只能使用數字。', + '8008' => '找不到參數。', + '8009' => '時間間隔超過允許範圍。', + '8010' => '參數長度太長。', + '8013' => '日期分鐘格式參數錯誤。', + '8014' => '參數不得超過指定的小數位。', + '7001' => '找不到指定的父 ID。', + '7002' => '父級已暫停。', + '7003' => '父級已鎖定。', + '7004' => '父級已關閉。', + '7405' => '您已登出!', + '7501' => '找不到用戶 ID。', + '7502' => '用戶已暫停。', + '7503' => '用戶已鎖定。', + '7504' => '用戶已關閉。', + '7505' => '用戶未在玩遊戲。', + '7506' => '演示帳戶已滿。', + '7601' => '無效的用戶 ID。請僅使用 a-z、0-9 之間的字符。', + '7602' => '帳戶已存在。請選擇其他用戶 ID。', + '7603' => '無效的用戶名。', + '7604' => '密碼必須至少 6 個字符,包含 1 個字母和 1 個數字。', + '7605' => '無效的操作代碼。請僅使用數字 2、3、4、5。', + '6001' => '您的現金餘額不足以取款。', + '6002' => '用戶餘額為零。', + '6003' => '取款金額為負。', + '6004' => '重複轉帳。', + '6005' => '重複的序列號。', + '6009' => '存款金額超過上限。', + '6010' => '餘額超過上限。', + '6011' => '分配的信用額超過上限。', + '6012' => '序列號正在進行中。', + '6901' => '用戶正在玩遊戲,不允許轉移餘額。' + ]; + private $apiDomain; + private $domain; + private $iv; + private $key; + private $dc; + private $parent; + private $lang = [ + 'zh-CN' => 'cn', + 'zh-TW' => 'cn', + 'jp' => 'jpn', + 'en' => 'en', + 'th' => 'th', + 'vi' => 'vi', + 'kr_ko' => 'ko', + 'id' => 'id', + ]; + + public $localGameType = [ + '0' => '1',//斯洛 + '32' => '1',//斯洛 + '50' => '1',//斯洛 + '55' => '1',//斯洛 + '57' => '1',//斯洛 + '58' => '1',//斯洛 + '66' => '1',//斯洛 + '80' => '1',//斯洛 + '90' => '1',//斯洛 + '130' => '1',//斯洛 + '7' => '4',//捕鱼 + '31' => '4',//捕鱼 + '70' => '4',//捕鱼 + '59' => '4',//捕鱼 + '67' => '4',//捕鱼 + '91' => '4',//捕鱼 + '8' => '8',//宾果 + '12' => '8',//宾果 + '60' => '8',//宾果 + '9' => '8',//宾果 + '22' => '8',//宾果 + '30' => '8',//宾果 + '56' => '8',//宾果 + '75' => '8',//宾果 + '81' => '8',//宾果 + '92' => '8',//宾果 + '131' => '8',//宾果 + '120' => '8',//宾果 + '18' => '2',//赌场 + '93' => '2',//赌场 + '132' => '2',//赌场 + '41' => '5',//真人视讯 + '101' => '5',//真人视讯 + ]; + + /** + * @param Player|null $player + * @param $type + * @throws Exception + */ + public function __construct($type, Player $player = null) + { + $config = config('game_platform.' . $type); + $this->iv = $config['iv']; + $this->apiDomain = $config['api_domain'].'/apiRequest.do'; + $this->domain = $config['domain']; + $this->key = $config['key']; + $this->dc = $config['dc']; + $this->parent = $config['admin_user']; + $this->platform = GamePlatform::query()->where('name', $type)->first(); + if (!empty($player)) { + $this->player = $player; + $this->getLoginId(); + } + } + + /** + * 生成请求数据 + * @param $source + * @return string + */ + public function padString($source): string + { + $paddingChar = ' '; + $size = 16; + $x = strlen($source) % $size; + $padLength = $size - $x; + $source .= str_repeat($paddingChar, $padLength); + return $source; + } + + /** + * 生成请求数据 + * @param $params + * @return array + */ + public function buildParams($params): array + { + $data = $this->padString(json_encode($params)); + $encryptData = openssl_encrypt($data, 'AES-128-CBC', $this->key, OPENSSL_NO_PADDING, $this->iv); + $reqBase64 = base64_encode($encryptData); + return [ + 'dc' => $this->dc, + 'x' => str_replace(array('+','/','=') , array('-','_','') , $reqBase64) + ]; + } + + /** + * @throws Exception + */ + protected function getLoginId() + { + /** @var PlayerGamePlatform $playerGamePlatform */ + $playerGamePlatform = PlayerGamePlatform::query() + ->where('platform_id', $this->platform->id) + ->where('player_id',$this->player->id) + ->first(); + if (!empty($playerGamePlatform)) { + return $this->loginId = $playerGamePlatform->player_code; + } + return $this->createPlayer([ + 'uuid' => $this->player->uuid, + 'name' => $this->player->name, + ]); + } + + /** + * 创建玩家 + * @param array $data + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function createPlayer(array $data = []) + { + $params = [ + 'action' => 12, + 'ts' => round(microtime(true) * 1000), + 'lang' => 'cn', + 'parent' => $this->parent, + 'uid' => $this->player->uuid, + 'name' => $this->player->name ?: $this->player->uuid + ]; + $request = $this->buildParams($params); + $res = doFormCurl($this->apiDomain, $request); + if ($res['status'] != $this->successCode) { + throw new GameException($this->failCode[$res['status']], 0); + } + $playerGamePlatform = new PlayerGamePlatform(); + $playerGamePlatform->player_id = $this->player->id; + $playerGamePlatform->platform_id = $this->platform->id; + $playerGamePlatform->player_name = $data['name']; + $playerGamePlatform->player_code = $data['uuid']; + $playerGamePlatform->save(); + $this->loginId = $playerGamePlatform->player_code; + return $res; + } + + public function getPlayer() + { + // TODO: Implement getPlayer() method. + } + + /** + * 获取游戏摘要MD5 (id+method+sn+APlSecretKey) + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getSimpleGameList() + { + $params = [ + 'action' => 49, + 'ts' => round(microtime(true) * 1000), + 'parent' => $this->parent, + 'lang' => 'en', + ]; + $request = $this->buildParams($params); + $res = doFormCurl($this->apiDomain, $request); + if ($res['status'] != $this->successCode) { + throw new GameException($this->failCode[$res['status']], 0); + } + $insertData = []; + if (!empty($res['data'])) { + foreach ($res['data'] as $data) { + foreach($data['list'] as $item){ + $insertData[] = [ + 'platform_id' => $this->platform->id, + 'game_code' => $item['mType'], + 'platform_game_type' => $data['gType'], + 'game_type' => $this->localGameType[$data['gType']], + 'name' => $item['name'], + 'game_image' => $item['image'], + ]; + } + } + } + if (!empty($insertData)) { + Game::query()->upsert($insertData, ['platform_id', 'game_code']); + } + return $insertData; + } + + /** + * 获取游戏摘要MD5 (id+method+sn+APlSecretKey) + * @param array $data + * @return string + * @throws GameException|\think\Exception + */ + public function login(array $data = []): string + { + $params = [ + 'action' => 11, + 'ts' => round(microtime(true) * 1000), + 'lang' => $this->lang[$data['lang']] ?? 'en', + 'uid' => $this->loginId, + 'gType' => $data['platformGameType'], + 'mType' => $data['gameCode'], + 'windowMode' => 2, + 'isAPP' => true, + ]; +// if($data['platformGameType'] || $data['gameCode']){ +// $params['gType'] = $data['platformGameType']; +// $params['mType'] = $data['gameCode']; +// $params['windowMode'] = 2; +// $params['isAPP'] = true; +// } + $request = $this->buildParams($params); + $res = doFormCurl($this->apiDomain, $request); + if ($res['status'] != $this->successCode) { + throw new GameException($this->failCode[$res['status']], 0); + } + return $res['path'] ?? ''; + } + + /** + * 玩家钱包转入游戏平台 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferOut() + { + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_OUT, $this->player->wallet->money); + } + + /** + * 转入游戏平台玩家钱包 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferIn() + { + //提现之前把用户踢下线 + if($this->checkPlay()){ + $this->userLogout(); + sleep(1); + } + $balance = $this->getBalance(); + if($balance == 0){ + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer(PlayerWalletTransfer::TYPE_IN, 0, 0); + return true; + } + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_IN, $balance ? -$balance : 0); + } + + /** + * 轉帳進出額度 + * @param $type + * @param float $amount + * @param float $reward + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + protected function setBalanceTransfer($type, float $amount = 0, float $reward = 0) + { + $params = [ + 'action' => 19, + 'ts' => round(microtime(true) * 1000), + 'parent' => $this->parent, + 'uid' => $this->loginId, + 'serialNo' => createOrderNo(), + 'amount' => $amount ?? 0, + ]; + $request = $this->buildParams($params); + $res = doFormCurl($this->apiDomain, $request); + if ($res['status'] != $this->successCode) { + throw new GameException($this->failCode[$res['status']], 0); + } + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer($type, $amount, $reward); + return $res; + } + + /** + * 獲取玩家餘額信息 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getBalance() + { + $params = [ + 'action' => 15, + 'ts' => round(microtime(true) * 1000), + 'parent' => $this->parent, + 'uid' => $this->loginId, + ]; + + $request = $this->buildParams($params); + $res = doFormCurl($this->apiDomain, $request); + if ($res['status'] != $this->successCode) { + throw new GameException('JDB System Error,Please contact the administrator', 0); + } + + return $res['data'][0]['balance'] ?? 0; + } + + /** + * 查询玩家状态 + * @throws GameException|\think\Exception + */ + public function checkPlay(): bool + { + $params = [ + 'action' => 52, + 'ts' => round(microtime(true) * 1000), + 'parent' => $this->parent, + 'uid' => $this->loginId, + ]; + + $request = $this->buildParams($params); + $res = doFormCurl($this->apiDomain, $request); + //游戏中 + if($res['status'] == $this->successCode){ + return true; + } + //不在游戏中 + if($res['status'] == 7505){ + return false; + } + throw new GameException($this->failCode[$res['status']], 0); + } + + /** + * 玩家踢下线 + * @throws GameException|\think\Exception + */ + public function userLogout(): bool + { + $params = [ + 'action' => 17, + 'ts' => round(microtime(true) * 1000), + 'parent' => $this->parent, + 'uid' => $this->loginId, + ]; + + $request = $this->buildParams($params); + $res = doFormCurl($this->apiDomain, $request); + if ($res['status'] != $this->successCode) { + throw new GameException($this->failCode[$res['status']], 0); + } + + return true; + } + + /** + * 取得區間內遊戲紀錄 + * @return array + * @throws Exception + */ + public function handleOrderHistories(): array + { + $list = []; + try { + $data = $this->getGameHistories(); + if (!empty($data)) { + foreach ($data as $item) { + if ($item['gType'] == 9 && !empty($item['hasGamble'])) { + $item['bet'] = $item['gambleBet']; + } + $list[] = [ + 'uuid' => $item['playerId'], + 'platform_id' => $this->platform->id, + 'game_code' => $item['mtype'], + 'bet' => abs($item['bet']), + 'win' => max($item['win'], 0), + 'order_no' => $item['historyId'], + 'game_type' => $item['gType'], + 'original_data' => json_encode($item,JSON_UNESCAPED_UNICODE), + 'platform_action_at' => date('Y-m-d H:i:s', strtotime($item['lastModifyTime'])), + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]; + } + } + } catch (Exception $e) { + return []; + } + + return $list; + } + + /** + * 取得區間內遊戲紀錄 + * @return array + * @throws GameException|\think\Exception + */ + public function getGameHistories(): array + { + $params = [ + 'action' => 29, + 'ts' => round(microtime(true) * 1000), + 'parent' => $this->parent, + 'starttime' => date('d-m-Y H:i:00', strtotime('-5 minutes')), + 'endtime' => date('d-m-Y H:i:00', strtotime('-4 minutes')), + ]; + $request = $this->buildParams($params); + $res = doFormCurl($this->apiDomain, $request); + if ($res['status'] != $this->successCode) { + throw new GameException($this->failCode[$res['status']], 0); + } + return $res['data'] ?? []; + } +} \ No newline at end of file diff --git a/app/service/game/JiLiServiceInterface.php b/app/service/game/JiLiServiceInterface.php new file mode 100644 index 0000000..9ad6bf5 --- /dev/null +++ b/app/service/game/JiLiServiceInterface.php @@ -0,0 +1,529 @@ + 'Casino', + '5' => 'Fishing', + '8' => 'Bingo', + '1' => 'Slot', + ]; + + public $localGameType = [ + '2' => '2',//赌场 + '5' => '4',//捕鱼 + '8' => '8',//宾果 + '1' => '1',//斯洛 + ]; + + public $failCode = [ + 'S200' => '重復請求', + 'F0001' => '無效的簽名', + 'F0002' => '無效的SN', + 'F0003' => '無效的參數', + 'F0004' => '無效的貨幣', + 'F0005' => '玩家已存在', + 'F0006' => '玩家不存在', + 'F0007' => '會員不存在', + 'F0008' => '執行失敗', + 'F0009' => '無效的方法', + 'F0010' => '無效的用戶狀態', + 'F0011' => '玩家狀態無需更新', + 'F0012' => '超出數據範圍', + 'F0013' => '無匹配數據', + 'F0014' => '登入位置被禁止', + 'F0015' => '分數不足夠', + 'F0016' => '不支持禮碼', + 'F0017' => '交易流水號不得重複', + 'F0018' => '系統繁忙', + 'F0019' => '日期時間各式錯誤', + 'F0020' => '超出時間限制範圍(開始時間與結束時間之間不能大於120分鐘)', + 'F0021' => '執行取消', + 'M0001' => '系統維護', + 'M0002' => '系統錯誤', + ]; + + /** + * @param Player|null $player + * @param $type + * @throws Exception + */ + public function __construct($type, Player $player = null) + { + $config = config('game_platform.' . $type); + $this->appId = $config['app_id']; + $this->apiDomain = $config['api_domain']; + $this->domain = $config['domain']; + $this->appSecret = $config['app_secret']; + $this->platform = GamePlatform::query()->where('name', $type)->first(); + if (!empty($player)) { + $this->player = $player; + $this->getLoginId(); + } + } + + /** + * 生成请求url + * @param $method + * @return string + */ + public function createUrl($method): string + { + return $this->apiDomain.$method; + } + + public function createSign($params): string + { + $date = new DateTime('now', new DateTimeZone('UTC')); + $date->setTimezone(new DateTimeZone('America/Puerto_Rico')); + $key_g = md5($date->format('ymj').$this->appId.$this->appSecret); + $paramStr = urldecode(http_build_query($params)); + $key = mt_rand(100000,999999).MD5($paramStr.$key_g).mt_rand(100000,999999); + return $key; + } + + /** + * 更新游戏列表 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getSimpleGameList() + { + $params = [ + 'AgentId' => $this->appId + ]; + $signature = $this->createSign($params); + $params['Key'] = $signature; + $result = doFormCurl($this->createUrl('GetGameList'), $params); + if ($result['ErrorCode'] == 0 && !empty($result['Data'])) { + foreach ($result['Data'] as $game) { + if($game['GameCategoryId'] == 3){ + continue; + } + Game::query()->updateOrCreate( + [ + 'platform_id' => $this->platform->id, + 'game_code' => $game['GameId'], + ], + [ + 'platform_game_type' => $game['GameCategoryId'], + 'game_type' => $this->localGameType[$game['GameCategoryId']], + 'name' => $game['name']['en-US'], + ] + ); + } + }else{ + throw new GameException($result['Message'], 0); + } + return $result; + } + + /** + * 获取游戏列表 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getGamesList() + { + $params = [ + 'AgentId' => $this->appId + ]; + $signature = $this->createSign($params); + $params['Key'] = $signature; + $result = doFormCurl($this->createUrl('GetGameList'), $params); + if ($result['ErrorCode'] == 0 && !empty($result['Data'])) { + return $result; + }else{ + throw new GameException($result['Message'], 0); + } + } + + /** + * 获取玩家ID + * @throws Exception + */ + protected function getLoginId() + { + /** @var PlayerGamePlatform $playerGamePlatform */ + $playerGamePlatform = PlayerGamePlatform::query()->where('platform_id', $this->platform->id)->where('player_id',$this->player->id)->first(); + if (!empty($playerGamePlatform)) { + return $this->loginId = $playerGamePlatform->player_code; + } + return $this->createPlayer([ + 'uuid' => $this->player->uuid, + 'name' => $this->player->name, + ]); + } + + /** + * 创建玩家 + * @param array $data + * @return array|mixed|Response + * @throws GameException|Exception + */ + public function createPlayer(array $data = []) + { + $params = [ + 'Account' => $data['uuid'], + 'AgentId' => $this->appId + ]; + $signature = $this->createSign($params); + $params['Key'] = $signature; + $result = doFormCurl($this->createUrl('CreateMember'), $params); + + if (!in_array($result['ErrorCode'],[0,101])) { + Log::error($result['Message'], ['res' => $result]); + throw new GameException($result['Message'], 0); + } + $playerGamePlatform = new PlayerGamePlatform(); + $playerGamePlatform->player_id = $this->player->id; + $playerGamePlatform->platform_id = $this->platform->id; + $playerGamePlatform->player_name = $data['name']; + $playerGamePlatform->player_code = $data['uuid']; + $playerGamePlatform->save(); + $this->loginId = $playerGamePlatform->player_code; + return $result; + } + + /** + * 获取玩家 + * @return array|mixed|Response + * @throws GameException|Exception + */ + public function getPlayer() + { + $params = [ + 'Accounts' => $this->loginId, + 'AgentId' => $this->appId + ]; + $signature = $this->createSign($params); + $params['Key'] = $signature; + $result = doFormCurl($this->createUrl('GetMemberInfo'), $params); + if ($result['ErrorCode'] != 0) { + throw new GameException($result['Message'], 0); + } + return $result; + } + + /** + * 玩家进入游戏 + * @param array $data + * @return string + * @throws GameException|\think\Exception + */ + public function login(array $data = []): string + { + $params = [ + 'Account'=> $this->loginId, + 'GameId'=> intval($data['gameCode']), + 'Lang'=> $data['lang'], + 'AgentId' => $this->appId + ]; + $signature = $this->createSign($params); + $params['Key'] = $signature; + $result = doFormCurl($this->createUrl('LoginWithoutRedirect'), $params); + if ($result['ErrorCode'] == 0 && !empty($result['Data'])) { + $link = $result['Data']; + }else{ + throw new GameException($result['Message'], 0); + } + return $link; + } + + /** + * 获取玩家游戏平台余额 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getBalance() + { + $params = [ + 'Accounts' => $this->loginId, + 'AgentId' => $this->appId + ]; + $signature = $this->createSign($params); + $params['Key'] = $signature; + $result = doFormCurl($this->createUrl('GetMemberInfo'), $params); + if ($result['ErrorCode'] != 0) { + throw new GameException('JiLi System Error,Please contact the administrator', 0); + } + return bcdiv($result['Data'][0]['Balance'], 100 , 2); + } + + /** + * 玩家钱包转入游戏平台 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferOut() + { + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_IN, $this->player->wallet->money); + } + + /** + * 游戏平台转入玩家钱包 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferIn() + { + $balance = $this->getBalance(); + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_OUT, $balance); + } + + /** + * 轉帳進出額度 + * @param $type + * @param float $amount + * @param float $reward + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + protected function setBalanceTransfer($type, float $amount = 0, float $reward = 0) + { + + if ($type == 2 && $amount == 0 && $reward == 0) { + throw new GameException('转出/入金额错误', 0); + } + $params = [ + 'Account' => $this->loginId, + 'TransactionId' => createOrderNo(), + 'Amount' => $amount, + 'TransferType' => $type, + 'AgentId' => $this->appId + ]; + $signature = $this->createSign($params); + $params['Key'] = $signature; + $result = doFormCurl($this->createUrl('ExchangeTransferByAgentId'), $params); + if ($result['ErrorCode'] != 0) { + throw new GameException($result['Message'], 0); + } + if($type == 1){ + $type = 2; + }else{ + $type = 1; + } + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer($type, $amount, $reward, $result['Data']['TransactionId'] ?? ''); + return $result; + } + + /** + * 查询额度转移纪录 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getTransferList(string $startTime = '', string $endTime = '', int $page = 1, int $pageSize = 10) + { + $params = [ + 'StartTime' => $startTime, + 'EndTime' => $endTime, + 'Page' => $page, + 'PageLimit' => $pageSize, + 'AgentId' => $this->appId + ]; + $signature = $this->createSign($params); + $params['Key'] = $signature; + $result = doFormCurl($this->createUrl('GetTransferRecordByTime'), $params); + if ($result['ErrorCode'] != 0) { + throw new GameException($result['Message'], 0); + } + return $result['Data']; + } + + /** + * 查询一笔额度转移纪录 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getTransferById(string $transactionId) + { + $params = [ + 'TransactionId' => $transactionId, + 'AgentId' => $this->appId + ]; + $signature = $this->createSign($params); + $params['Key'] = $signature; + $result = doFormCurl($this->createUrl('CheckTransferByTransactionId'), $params); + if ($result['ErrorCode'] != 0) { + throw new GameException($result['Message'], 0); + } + return $result['Data']; + } + + /** + * 查询游戏纪录 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getGameRecordList(string $startTime = '', string $endTime = '', int $page = 1, int $pageSize = 10000, int $gameId = null) + { + $params = [ + 'StartTime' => $startTime, + 'EndTime' => $endTime, + 'Page' => $page, + 'PageLimit' => $pageSize, + 'AgentId' => $this->appId + ]; + $signature = $this->createSign($params); + $params['Key'] = $signature; + if(!empty($gameId)){ + $params['GameId'] = $gameId; + } + $result = doFormCurl($this->createUrl('GetBetRecordByTime'), $params); + if ($result['ErrorCode'] != 0) { + throw new GameException($result['Message'], 0); + } + return $result['Data']; + } + + /** + * 查询指定游戏记录详情 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getGameRecordById(string $wagersId) + { + $params = [ + 'WagersId' => $wagersId, + 'AgentId' => $this->appId + ]; + $signature = $this->createSign($params); + $params['Key'] = $signature; + $lang = locale(); + $lang = Str::replace('_', '-', $lang); + $params['Lang'] = $lang; + $result = doFormCurl($this->createUrl('GetGameDetailUrl'), $params); + if ($result['ErrorCode'] != 0) { + throw new GameException($result['Message'], 0); + } + return $result['Data']; + } + + /** + * 查询指定玩家游戏记录 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getUserGameRecord(string $startTime = '', string $endTime = '', int $page = 1, int $pageSize = 10, int $gameId = null, int $gameType = null) + { + $params = [ + 'StartTime' => $startTime, + 'EndTime' => $endTime, + 'Page' => $page, + 'PageLimit' => $pageSize, + 'Account' => $this->loginId, + 'AgentId' => $this->appId + ]; + $signature = $this->createSign($params); + $params['Key'] = $signature; + if(!empty($gameId)){ + $params['GameId'] = $gameId; + } + if(!empty($gameType)){ + $params['GameType'] = $gameType; + } + $lang = locale(); + $lang = Str::replace('_', '-', $lang); + $params['Lang'] = $lang; + $result = doFormCurl($this->createUrl('GetUserBetRecordByTime'), $params); + if ($result['ErrorCode'] != 0) { + throw new GameException($result['Message'], 0); + } + return $result['Data']; + } + + /** + * 查询玩家游戏记录 + * @param string $startTime + * @param string $endTime + * @return array + */ + public function handleOrderHistories(string $startTime = '', string $endTime = ''): array + { + try { + $page = 1; + $list = []; + $timezone = new DateTimeZone('Etc/GMT+4'); + $start = new DateTime('-6 minutes', $timezone); + $end = new DateTime('-5 minutes', $timezone); + $startTime = $start->format('Y-m-d\TH:i:s'); + $endTime = $end->format('Y-m-d\TH:i:s'); + $data = $this->getGameRecordList($startTime, $endTime, $page); + if (!empty($data['Result'])) { + $total = $data['Pagination']['TotalNumber'] ?? 0; + if ($total > 0) { + $pageSize = 10000; + if (!empty($data['Result'])) { + foreach ($data['Result'] as $item) { + $list[] = [ + 'uuid' => $item['Account'], + 'platform_id' => $this->platform->id, + 'game_code' => $item['GameId'], + 'bet' => abs(bcdiv($item['Turnover'], 100, 2)), + 'win' => bcdiv($item['PayoffAmount'],100, 2), + 'order_no' => $item['WagersId'], + 'original_data' => json_encode($item,JSON_UNESCAPED_UNICODE), + 'platform_action_at' => date('Y-m-d H:i:s', strtotime($item['SettlementTime'])), + 'game_type' => $item['GameCategoryId'], + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]; + + } + } + if ($total > $pageSize) { + $totalPages = ceil($total / $pageSize); + for ($page = 2; $page <= $totalPages; $page++) { + $nextData = $this->getGameRecordList($startTime,$endTime,$page); + if (!empty($nextData['Result'])) { + foreach ($nextData['Result'] as $item) { + $list[] = [ + 'uuid' => $item['Account'], + 'platform_id' => $this->platform->id, + 'game_code' => $item['GameId'], + 'bet' => abs(bcdiv($item['Turnover'], 100, 2)), + 'win' => bcdiv($item['PayoffAmount'],100, 2), + 'order_no' => $item['WagersId'], + 'original_data' => json_encode($item,JSON_UNESCAPED_UNICODE), + 'platform_action_at' => date('Y-m-d H:i:s', strtotime($item['SettlementTime'])), + 'game_type' => $item['GameCategoryId'], + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]; + } + } + } + } + } + } + } catch (Exception $e) { + return []; + } + + return $list; + } + +} \ No newline at end of file diff --git a/app/service/game/JokerServiceInterface.php b/app/service/game/JokerServiceInterface.php new file mode 100644 index 0000000..fd7c720 --- /dev/null +++ b/app/service/game/JokerServiceInterface.php @@ -0,0 +1,465 @@ + 'Casino', + 'Fishing' => 'Fishing', + 'Bingo' => 'Bingo', + 'Slot' => 'Slot', + ]; + + public $localGameType = [ + 'ECasino' => '2', + 'Fishing' => '4', + 'Bingo' => '8', + 'Slot' => '1', + ]; + + public $failCode = [ + 'S200' => '重復請求', + 'F0001' => '無效的簽名', + 'F0002' => '無效的SN', + 'F0003' => '無效的參數', + 'F0004' => '無效的貨幣', + 'F0005' => '玩家已存在', + 'F0006' => '玩家不存在', + 'F0007' => '會員不存在', + 'F0008' => '執行失敗', + 'F0009' => '無效的方法', + 'F0010' => '無效的用戶狀態', + 'F0011' => '玩家狀態無需更新', + 'F0012' => '超出數據範圍', + 'F0013' => '無匹配數據', + 'F0014' => '登入位置被禁止', + 'F0015' => '分數不足夠', + 'F0016' => '不支持禮碼', + 'F0017' => '交易流水號不得重複', + 'F0018' => '系統繁忙', + 'F0019' => '日期時間各式錯誤', + 'F0020' => '超出時間限制範圍(開始時間與結束時間之間不能大於120分鐘)', + 'F0021' => '執行取消', + 'M0001' => '系統維護', + 'M0002' => '系統錯誤', + ]; + + private $lang = [ + 'zh-CN' => 'zh_ch', + 'en' => 'en_us', + 'zh_tc' => 'zh_tc', + 'th_th' => 'th_th', + 'Ma_my' => 'Ma_my', + 'vi_nam' => 'vi_nam', + 'Fi_fi' => 'Fi_fi', + 'Kr_ko' => 'Kr_ko', + 'Hi_hi' => 'Hi_hi', + 'My_mar' => 'My_mar', + 'Br_po' => 'Br_po', + 'cam_dia' => 'cam_dia', // 柬埔寨语 + ]; + + /** + * @param Player|null $player + * @param $type + * @throws Exception + */ + public function __construct($type, Player $player = null) + { + $config = config('game_platform.' . $type); + $this->appId = $config['app_id']; + $this->apiDomain = $config['api_domain']; + $this->domain = $config['domain']; + $this->appSecret = $config['app_secret']; + $this->platform = GamePlatform::query()->where('name', $type)->first(); + if (!empty($player)) { + $this->player = $player; + $this->getLoginId(); + } + } + + /** + * 生成请求url + * @param $method + * @return string + */ + public function createUrl($signature): string + { + return $this->apiDomain."?AppID=".$this->appId."&Signature=".$signature; + } + + public function createSign($params): string + { + ksort($params); + $signature = urlencode(base64_encode(hash_hmac("sha1", urldecode(http_build_query($params,'', '&')), $this->appSecret, TRUE))); + + return $signature; + } + + /** + * 更新游戏列表 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getSimpleGameList() + { + $params = [ + 'Method' => 'ListGames', + 'Timestamp' => time(), + ]; + $signature = $this->createSign($params); + + $result = doCurl($this->createUrl($signature), $params); + if (isset($result['ListGames'])) { + foreach ($result['ListGames'] as $game) { + Game::query()->updateOrCreate( + [ + 'platform_id' => $this->platform->id, + 'game_code' => $game['GameCode'], + ], + [ + 'platform_game_type' => $game['GameType'], + 'game_type' => $this->localGameType[$game['GameType']], + 'name' => $game['GameName'], + ] + ); + } + }else{ + throw new GameException($result['Message'], 0); + } + return $result; + } + + /** + * 获取游戏列表 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getGamesList() + { + $params = [ + 'Method' => 'ListGames', + 'Timestamp' => time(), + ]; + $signature = $this->createSign($params); + + $result = doCurl($this->createUrl($signature), $params); + if (isset($result['ListGames'])) { + return $result; + }else{ + throw new GameException($result['Message'], 0); + } + } + + /** + * 获取游戏列表 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function playFreeGame() + { + $params = [ + 'Method' => 'PLAY', + 'Username' => $this->player->name, + 'Timestamp' => time(), + ]; + $signature = $this->createSign($params); + + $result = doCurl($this->createUrl($signature), $params); + if (isset($result['Token'])) { + return $forwardUrl = $this->domain."?token=".$result['Token']."&game=1jeqx59c7ztqg&mobile=false"; + }else{ + throw new GameException($result['Message'], 0); + } + } + + /** + * 玩游戏 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function playGame() + { + $params = [ + 'Method' => 'PLAY', + 'Username' => $this->player->name, + 'RequestID' => createOrderNo(), + 'Amount' => $amount, + 'Timestamp' => time(), + ]; + $signature = $this->createSign($params); + + $result = doCurl($this->createUrl($signature), $params); + if (isset($result['Token'])) { + return $forwardUrl = $this->domain."?token=".$result['Token']."&game=1jeqx59c7ztqg&mobile=false"; + }else{ + throw new GameException($result['Message'], 0); + } + } + + /** + * @throws Exception + */ + protected function getLoginId() + { + /** @var PlayerGamePlatform $playerGamePlatform */ + $playerGamePlatform = $this->player->playerGamePlatform->where('platform_id', $this->platform->id)->first(); + if (!empty($playerGamePlatform)) { + return $this->loginId = $playerGamePlatform->player_code; + } + return $this->createPlayer([ + 'uuid' => $this->player->uuid, + 'name' => $this->player->name, + ]); + } + + /** + * 创建玩家 + * @param array $data + * @return array|mixed|Response + * @throws GameException|Exception + */ + public function createPlayer(array $data = []) + { + $params = [ + 'Method' => 'CU', + 'Username' => $data['uuid'], + 'Timestamp' => time(), + ]; + $signature = $this->createSign($params); + + $res = doCurl($this->createUrl($signature), $params); + if (empty($res['Status']) || $res['Status'] != 'OK') { + Log::error($res['Message'], ['res' => $res]); + throw new GameException($res['Message'], 0); + } + $playerGamePlatform = new PlayerGamePlatform(); + $playerGamePlatform->player_id = $this->player->id; + $playerGamePlatform->platform_id = $this->platform->id; + $playerGamePlatform->player_name = $data['name']; + $playerGamePlatform->player_code = $data['uuid']; + $playerGamePlatform->save(); + $this->loginId = $playerGamePlatform->player_code; + return $res; + } + + /** + * 获取玩家 + * @return array|mixed|Response + * @throws GameException|Exception + */ + public function getPlayer() + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetPlayer', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + $data = doCurl($this->createUrl('getPlayer'), $params); + if ($data['code'] != $this->successCode) { + throw new GameException($this->failCode[$data['code']], 0); + } + + return $data; + } + + /** + * 玩家进入游戏 + * @param array $data + * @return string + * @throws GameException|\think\Exception + */ + public function login(array $data = []): string + { + $params = [ + 'Method' => 'PLAY', + 'Username' => $this->loginId, + 'RequestID' => createOrderNo(), + 'Amount' => 0, + 'Timestamp' => time(), + ]; + $signature = $this->createSign($params); + + $res = doCurl($this->createUrl($signature), $params); + if (empty($res['Token'])) { + Log::error($res['Message'], ['res' => $res]); + throw new GameException($res['Message'], 0); + } + if (!empty($data['gameCode'])) { + $link = $this->domain.'?token='.$res['Token'].'&game='.$data['gameCode'].'&mobile=1&lang=en'; + }else{ + $link = $this->domain . ($res['data']['loginUrl'] ?? '') . '&' . $parametersValue; + } + return $link; + } + + /** + * 设置用户状态 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function setPlayerStatus($status) + { + + $params = [ + 'Method' => 'SS', + 'Username' => $this->loginId, + 'Status' => $status, + 'Timestamp' => time(), + ]; + $signature = $this->createSign($params); + + $res = doCurl($this->createUrl($signature), $params); + if ($res['Status'] != 'OK') { + throw new GameException($this->failCode[$res['Status']], 0); + } + + return $res; + } + + /** + * 获取玩家游戏平台余额 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getBalance() + { + + $params = [ + 'Method' => 'GC', + 'Username' => $this->loginId, + 'Timestamp' => time(), + ]; + $signature = $this->createSign($params); + + $res = doCurl($this->createUrl($signature), $params); + + if (empty($res['Credit']) && !empty($res['Message'])) { + throw new GameException($res['Message'], 0); + } + + return $res; + } + + /** + * 玩家钱包转入游戏平台 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferOut() + { + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_OUT, $this->player->wallet->money); + } + + /** + * 游戏平台转入玩家钱包 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferIn() + { + $params = [ + 'Method' => 'WAC', + 'Username' => $this->loginId, + 'Timestamp' => time(), + 'RequestID' => createOrderNo(), + ]; + $signature = $this->createSign($params); + + $res = doCurl($this->createUrl($signature), $params); + + if (empty($res['RequestID']) || $res['RequestID'] != $params['RequestID'] || $res['Amount'] == 0) { + throw new GameException($res['Message'], 0); + } + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer(PlayerWalletTransfer::TYPE_IN, $res['Amount'], 0, $res['RequestID'] ?? ''); + + return $res; + } + + /** + * 轉帳進出額度 + * 簽名密鑰方式 MD5 (Id+Method+SN+LoginId+APISecretKey) + * @param $type + * @param float $amount + * @param float $reward + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + protected function setBalanceTransfer($type, float $amount = 0, float $reward = 0) + { + if ($amount == 0 && $reward == 0) { + throw new GameException('转出/入金额错误', 0); + } + + $params = [ + 'Method' => 'TC', + 'Username' => $this->loginId, + 'Timestamp' => time(), + 'RequestID' => createOrderNo(), + 'Amount' => $amount, + ]; + $signature = $this->createSign($params); + + $res = doCurl($this->createUrl($signature), $params); + + if (empty($res['RequestID']) || $res['RequestID'] != $params['RequestID']) { + // Log::error($res['Message'], ['res' => $res]); + throw new GameException($res['Message'], 0); + } + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer($type, $amount, $reward, $res['RequestID'] ?? ''); + + return $res; + } + + /** + * 依據時間獲取遊戲紀錄 + * MD5 (Id+Method+SN+StartTime+EndTime+APISecretKey) + * @param int $pageIndex + * @param string $startTime + * @param string $endTime + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function getGameRecordByTime(string $startTime = '', string $endTime = '') + { + $params = [ + 'Method' => 'TSM', + 'StartDate' => $startTime, + 'EndDate' => $endTime, + 'NextId' => '', + 'Delay' => 0, + 'Timestamp' => time(), + ]; + $signature = $this->createSign($params); + + $res = doCurl($this->createUrl($signature), $params); + + // if (empty($res['data'])) { + // throw new GameException($res['Message'], 0); + // } + + return $res; + } +} \ No newline at end of file diff --git a/app/service/game/Kiss918ServiceInterface.php b/app/service/game/Kiss918ServiceInterface.php new file mode 100644 index 0000000..d5997ee --- /dev/null +++ b/app/service/game/Kiss918ServiceInterface.php @@ -0,0 +1,389 @@ + 'Casino', + '5' => 'Fishing', + '8' => 'Bingo', + '1' => 'Slot', + ]; + + public $localGameType = [ + '2' => '2',//赌场 + '5' => '4',//捕鱼 + '8' => '2',//宾果 + '1' => '1',//斯洛 + ]; + + public $failCode = [ + 'S200' => '重復請求', + 'F0001' => '無效的簽名', + 'F0002' => '無效的SN', + 'F0003' => '無效的參數', + 'F0004' => '無效的貨幣', + 'F0005' => '玩家已存在', + 'F0006' => '玩家不存在', + 'F0007' => '會員不存在', + 'F0008' => '執行失敗', + 'F0009' => '無效的方法', + 'F0010' => '無效的用戶狀態', + 'F0011' => '玩家狀態無需更新', + 'F0012' => '超出數據範圍', + 'F0013' => '無匹配數據', + 'F0014' => '登入位置被禁止', + 'F0015' => '分數不足夠', + 'F0016' => '不支持禮碼', + 'F0017' => '交易流水號不得重複', + 'F0018' => '系統繁忙', + 'F0019' => '日期時間各式錯誤', + 'F0020' => '超出時間限制範圍(開始時間與結束時間之間不能大於120分鐘)', + 'F0021' => '執行取消', + 'M0001' => '系統維護', + 'M0002' => '系統錯誤', + ]; + private $admin_user; + + /** + * @param Player|null $player + * @param $type + * @throws Exception + */ + public function __construct($type, Player $player = null) + { + $config = config('game_platform.' . $type); + $this->auth = $config['auth']; + $this->admin_user = $config['admin_user']; + $this->apiDomain = $config['api_domain']; + $this->recordApi = $config['record_api']; + $this->domain = $config['domain']; + $this->appSecret = $config['app_secret']; + $this->platform = GamePlatform::query()->where('name', $type)->first(); + if (!empty($player)) { + $this->player = $player; + $this->getLoginId(); + } + } + + public function createSign($params): string + { + $str = implode('', $params); + return strtoupper(md5(strtolower($str))); + } + + /** + * 更新游戏列表 + * @return false + */ + public function getSimpleGameList(): bool + { + return false; + } + + /** + * 获取玩家ID + * @throws Exception + */ + protected function getLoginId() + { + /** @var PlayerGamePlatform $playerGamePlatform */ + $playerGamePlatform = PlayerGamePlatform::query()->where('platform_id', $this->platform->id)->where('player_id',$this->player->id)->first(); + if (!empty($playerGamePlatform)) { + $this->password = $playerGamePlatform->player_password; + return $this->loginId = $playerGamePlatform->player_code; + } + return $this->createPlayer([ + 'uuid' => $this->player->uuid, + 'name' => $this->player->name, + ]); + } + + /** + * 创建玩家 + * @param array $data + * @return array|mixed|Response + * @throws GameException|Exception + */ + public function createPlayer(array $data = []) + { + $time = round(microtime(true)*1000); + $randomParams = [ + 'action' => 'RandomUserName', + 'userName' => $this->admin_user, + 'time' => $time, + 'authcode' => $this->auth, + ]; + $signature = $this->createSign([$this->auth, $randomParams['userName'], $time ,$this->appSecret]); + $randomParams['sign'] = $signature; + $randomUser = dogGetCurl($this->apiDomain.'ashx/account/account.ashx', $randomParams);; + if(!$randomUser['success'] || empty($randomUser['account'])){ + throw new GameException($randomUser['msg'], 0); + } + $password = uniqid(); + $params = [ + 'action' => 'addUser', + 'agent' => $this->admin_user, + 'PassWd' => $password, + 'pwdtype' => 1, + 'userName' => $randomUser['account'], + 'Name' => $data['name'], + 'Tel' => $this->player->phone ?? '', + 'Memo' => $data['name'], + 'UserType' => 1, + 'time' => $time, + 'authcode' => $this->auth, + ]; + $signature = $this->createSign([$this->auth, $params['userName'], $time ,$this->appSecret]); + $params['sign'] = $signature; + $result = dogGetCurl($this->apiDomain.'ashx/account/account.ashx', $params);; + if ($result['code'] == 0 && $result['success']) { + $playerGamePlatform = new PlayerGamePlatform(); + $playerGamePlatform->player_id = $this->player->id; + $playerGamePlatform->platform_id = $this->platform->id; + $playerGamePlatform->player_name = $data['name']; + $playerGamePlatform->player_code = $randomUser['account']; + $playerGamePlatform->player_password = $password; + $playerGamePlatform->save(); + $this->loginId = $playerGamePlatform->player_code; + $this->password = $playerGamePlatform->player_password; + return $result; + }else{ + throw new GameException($result['msg'], 0); + } + } + + /** + * 获取玩家 + * @return array|mixed|Response + * @throws Exception + */ + public function getPlayer() + { + $time = round(microtime(true)*1000); + $params = [ + 'action' => 'getUserInfo', + 'userName' => $this->loginId, + 'time' => $time, + 'authcode' => $this->auth, + ]; + $signature = $this->createSign([$this->auth, $this->loginId, $time ,$this->appSecret]); + $params['sign'] = $signature; + $result = dogGetCurl($this->apiDomain.'ashx/account/account.ashx', $params); + if($result['success']){ + return $result; + }else{ + throw new GameException('Kiss 918 System Error,Please contact the administrator', 0); + } + } + + /** + * 玩家进入游戏 + * @param array $data + * @return array + */ + public function login(array $data = []): array + { + return ['url' => 'https://yop1.918kiss.com/', 'account' => $this->loginId, 'password' => $this->password]; + } + + /** + * 获取玩家游戏平台余额 + * @return string|null + * @throws Exception + */ + public function getBalance(): string + { + $playerInfo = $this->getPlayer(); + return $playerInfo['MoneyNum']; + } + + /** + * 玩家钱包转入游戏平台 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferOut() + { + if($this->player->wallet->money <= 0){ + return true; + } + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_OUT, $this->player->wallet->money); + } + + /** + * 游戏平台转入玩家钱包 + * @return array|mixed|null + * @throws Exception + */ + public function balanceTransferIn() + { + $balance = $this->getBalance(); + if($balance == 0){ + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer(PlayerWalletTransfer::TYPE_IN, 0, 0); + return true; + } + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_IN, -$balance); + } + + /** + * 轉帳進出額度 + * @param $type + * @param float $amount + * @param float $reward + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + protected function setBalanceTransfer($type, float $amount = 0, float $reward = 0) + { + $time = round(microtime(true)*1000); + $params = [ + 'action' => 'setServerScore', + 'orderid' => date('YmdHis').uniqid(), + 'scoreNum' => $amount, + 'userName' => $this->loginId, + 'ActionUser' => $this->loginId, + 'ActionIp' => request()->getRealIp(), + 'time' => $time, + 'authcode' => $this->auth, + ]; + $signature = $this->createSign([$this->auth, $this->loginId, $time ,$this->appSecret]); + $params['sign'] = $signature; + $result = dogGetCurl($this->apiDomain.'ashx/account/setScore.ashx', $params); + if($result['code'] != 0 || !$result['success']){ + throw new GameException($result['msg'], 0); + } + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer($type, $amount, $reward, $params['orderid']); + return $result; + } + + /** + * 查询游戏纪录 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getGameRecordList(string $startTime = '', string $endTime = '', $uuid, int $page = 1, int $pageSize = 1000) + { + $time = round(microtime(true)*1000); + $params = [ + 'pageIndex' => $page, + 'pageSize' => $pageSize, + 'userName' => $this->loginId, + 'sDate' => $startTime, + 'eDate' => $endTime, + 'time' => $time, + 'authcode' => $this->auth, + ]; + $signature = $this->createSign([$this->auth, $this->loginId, $time ,$this->appSecret]); + $params['sign'] = $signature; + $result = dogGetCurl($this->apiDomain, $params); + if($result['code'] == 0 || !$result['success']){ + throw new GameException($result['msg'], 0); + } + return $result; + } + + /** + * 查询全部玩家账单 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getReportRecord(string $startTime = '', string $endTime = '') + { + $time = round(microtime(true)*1000); + $params = [ + 'userName' => $this->admin_user, + 'sDate' => $startTime, + 'eDate' => $endTime, + 'Type' => 'ServerTotalReport', + 'time' => $time, + 'authcode' => $this->auth, + ]; + $signature = $this->createSign([$this->auth, $this->admin_user, $time ,$this->appSecret]); + $params['sign'] = $signature; + $result = dogGetCurl($this->recordApi.'ashx/AgentTotalReport.ashx', $params); + if(!$result['success'] && !empty($result['results'])){ + throw new GameException($result['msg'], 0); + } + return $result['results']; + } + + /** + * 查询单个玩家单日输赢 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getAccountReport(string $startTime = '', string $endTime = '', $playerCode) + { + $time = round(microtime(true)*1000); + $params = [ + 'userName' => $playerCode, + 'sDate' => $startTime, + 'eDate' => $endTime, + 'time' => $time, + 'authcode' => $this->auth, + ]; + $signature = $this->createSign([$this->auth, $playerCode, $time ,$this->appSecret]); + $params['sign'] = $signature; + $result = dogGetCurl($this->apiDomain.'ashx/AccountReport.ashx', $params); + if($result['code'] == 0 || !$result['success']){ + throw new GameException($result['msg'], 0); + } + return $result; + } + + /** + * 查询玩家游戏记录 + * @return array + */ + public function handleOrderHistories(): array + { + try { + $list = []; + $startTime = date('Y-m-d'); + $endTime = date('Y-m-d'); + $data = $this->getReportRecord($startTime, $endTime); + if (!empty($data)) { + foreach ($data as $item) { + $list[] = [ + 'player_code' => $item['Account'], + 'platform_id' => $this->platform->id, + 'game_code' => 'Kiss918', + 'bet' => $item['press'], + 'win' => $item['win'], + 'order_no' => $item['idx'].date('Ymd'), + 'original_data' => json_encode($item,JSON_UNESCAPED_UNICODE), + 'platform_action_at' => $startTime, + 'game_type' => 1, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]; + + } + } + } catch (Exception $e) { + return []; + } + return $list; + } + +} \ No newline at end of file diff --git a/app/service/game/LionKingServiceInterface.php b/app/service/game/LionKingServiceInterface.php new file mode 100644 index 0000000..ae7bd85 --- /dev/null +++ b/app/service/game/LionKingServiceInterface.php @@ -0,0 +1,435 @@ + '/UserInfo/CreatePlayer', + 'getPlayer' => '/UserInfo/GetPlayer', + 'getGameList' => '/Game/GetGameList', + 'getSimpleGameList' => '/Game/GetSimpleGameList', + 'getLoginH5' => '/UserInfo/GetLoginH5', + 'setPlayerStatus' => '/UserInfo/SetPlayerStatus', + 'getBalance' => '/Account/GetBalance', + 'setBalanceTransfer' => '/Account/SetBalanceTransfer', + 'getGameRecordByTime' => '/Game/GetGameRecordByTime', + 'getGameRecord' => '/Game/GetGameRecord', + 'removeRecords' => '/Game/RemoveRecords', + ]; + + public $successCode = 'S100'; + + public $loginId; + + public $gameType = [ + '10' => 'Slot', + '12' => 'Casino', + '13' => 'Arcade', + '16' => 'Fishing' + ]; + + public $failCode = [ + 'S200' => '重復請求', + 'F0001' => '無效的簽名', + 'F0002' => '無效的SN', + 'F0003' => '無效的參數', + 'F0004' => '無效的貨幣', + 'F0005' => '玩家已存在', + 'F0006' => '玩家不存在', + 'F0007' => '會員不存在', + 'F0008' => '執行失敗', + 'F0009' => '無效的方法', + 'F0010' => '無效的用戶狀態', + 'F0011' => '玩家狀態無需更新', + 'F0012' => '超出數據範圍', + 'F0013' => '無匹配數據', + 'F0014' => '登入位置被禁止', + 'F0015' => '分數不足夠', + 'F0016' => '不支持禮碼', + 'F0017' => '交易流水號不得重複', + 'F0018' => '系統繁忙', + 'F0019' => '日期時間各式錯誤', + 'F0020' => '超出時間限制範圍(開始時間與結束時間之間不能大於120分鐘)', + 'F0021' => '執行取消', + 'M0001' => '系統維護', + 'M0002' => '系統錯誤', + ]; + + private $lang = [ + 'zh-CN' => 'zh_ch', + 'en' => 'en_us', + 'zh_tc' => 'zh_tc', + 'th_th' => 'th_th', + 'Ma_my' => 'Ma_my', + 'vi_nam' => 'vi_nam', + 'Fi_fi' => 'Fi_fi', + 'Kr_ko' => 'Kr_ko', + 'Hi_hi' => 'Hi_hi', + 'My_mar' => 'My_mar', + 'Br_po' => 'Br_po', + 'cam_dia' => 'cam_dia', // 柬埔寨语 + ]; + + /** + * @param Player|null $player + * @param $type + * @throws Exception + */ + public function __construct($type, Player $player = null) + { + $config = config('game_platform.' . $type); + $this->appId = $config['app_id']; + $this->apiDomain = $config['api_domain']; + $this->domain = $config['domain']; + $this->appSecret = $config['app_secret']; + $this->platform = GamePlatform::query()->where('name', $type)->first(); + if (!empty($player)) { + $this->player = $player; + $this->getLoginId(); + } + } + + /** + * @throws Exception + */ + protected function getLoginId() + { + /** @var PlayerGamePlatform $playerGamePlatform */ + $playerGamePlatform = $this->player->playerGamePlatform->where('platform_id', $this->platform->id)->first(); + if (!empty($playerGamePlatform)) { + return $this->loginId = $playerGamePlatform->player_code; + } + return $this->createPlayer([ + 'uuid' => $this->player->uuid, + 'name' => $this->player->name, + ]); + } + + /** + * 创建玩家 + * @param array $data + * @return array|mixed|Response + * @throws GameException|Exception + */ + public function createPlayer(array $data = []) + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'CreatePlayer', + 'SN' => $this->appId, + 'PlayerCode' => $data['uuid'], + ]; + $params['Signature'] = $this->createSign($params); + $params['PlayerName'] = $data['uuid']; + $res = doCurl($this->createUrl('createPlayer'), $params); + if ($res['code'] != $this->successCode) { + throw new GameException($this->failCode[$res['code']], 0); + } + $playerGamePlatform = new PlayerGamePlatform(); + $playerGamePlatform->player_id = $this->player->id; + $playerGamePlatform->platform_id = $this->platform->id; + $playerGamePlatform->player_name = $data['name']; + $playerGamePlatform->player_code = $data['uuid']; + $playerGamePlatform->save(); + $this->loginId = $playerGamePlatform->player_code; + return $res; + } + + /** + * 创建玩家 + * @return array|mixed|Response + * @throws GameException|Exception + */ + public function getPlayer() + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetPlayer', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + $data = doCurl($this->createUrl('getPlayer'), $params); + if ($data['code'] != $this->successCode) { + throw new GameException($this->failCode[$data['code']], 0); + } + + return $data; + } + + /** + * 获取游戏摘要MD5 (id+method+sn+APlSecretKey) + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getSimpleGameList() + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetSimpleGameList', + 'SN' => $this->appId, + ]; + $params['Signature'] = $this->createSign($params); + $data = doCurl($this->createUrl('getSimpleGameList'), $params); + if ($data['code'] != $this->successCode) { + throw new GameException($this->failCode[$data['code']], 0); + } + if (!empty($data['data']['games'])) { + foreach ($data['data']['games'] as $game) { + Game::query()->updateOrCreate( + [ + 'platform_id' => $this->platform->id, + 'game_code' => $game['gameCode'], + ], + [ + 'platform_game_type' => $game['type'], + ] + ); + } + } + return $data; + } + + /** + * 获取游戏摘要MD5 (id+method+sn+APlSecretKey) + * @param array $data + * @return string + * @throws GameException|\think\Exception + */ + public function login(array $data = []): string + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetLoginH5', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + $res = doCurl($this->createUrl('getLoginH5'), $params); + if ($res['code'] != $this->successCode) { + Log::error($this->failCode[$res['code']], ['res' => $res]); + throw new GameException($this->failCode[$res['code']], 0); + } + $responseH5 = [ + 'Language' => $this->lang[$data['lang']] ?? 'ch', + "GameId" => $data['gameCode'], + 'CallbackAddress' => $data['callBackUrl'] ?? '', + "AppType" => $data['appType'] ?? 1, + "DeviceType" => 1, + ]; + $jsonString = json_encode($responseH5); + $parametersValue = base64_encode($jsonString); + $link = $this->domain . '/linkgame' . ($res['data']['loginUrl'] ?? '') . '&' . $parametersValue; + if (!empty($data['gameCode'])) { + $link .= '&' . $data['gameCode']; + } + return $link; + } + + /** + * 設置登入玩家狀態。當玩家處於禁用狀態,該玩家無法在平台進行任何操作,如果玩家在遊戲進行中該玩家將會自動退出遊戲。 + * 簽名密鑰方式 Md5(Id+Method+SN+LoginId+APISecretKey) + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function setPlayerStatus($status) + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetSimpleGameList', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + $params['Status'] = $status; + $data = doCurl($this->createUrl('setPlayerStatus'), $params); + if ($data['code'] != $this->successCode) { + throw new GameException($this->failCode[$data['code']], 0); + } + + return $data; + } + + /** + * 獲取玩家餘額信息 + * 簽名密鑰方式 MD5 (Id+Method+SN+LoginId+APISecretKey) + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getBalance() + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetBalance', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + $data = doCurl($this->createUrl('getBalance'), $params); + if ($data['code'] != $this->successCode) { + throw new GameException($this->failCode[$data['code']], 0); + } + + return $data; + } + + /** + * 玩家钱包转入游戏平台 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferOut() + { + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_OUT, $this->player->wallet->money); + } + + /** + * 玩家钱包转入游戏平台 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferIn() + { + $balance = $this->getBalance(); + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_IN, !empty($balance['data']['result']) ? -$balance['data']['result'] : 0, !empty($balance['data']['reward']) ? -$balance['data']['reward'] : 0); + } + + /** + * 轉帳進出額度 + * 簽名密鑰方式 MD5 (Id+Method+SN+LoginId+APISecretKey) + * @param $type + * @param float $amount + * @param float $reward + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + protected function setBalanceTransfer($type, float $amount = 0, float $reward = 0) + { + if ($amount == 0 && $reward == 0) { + throw new GameException('转出/入金额错误', 0); + } + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'SetBalanceTransfer', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + $params['Amount'] = $amount; + $params['Reward'] = $reward; + $res = doCurl($this->createUrl('setBalanceTransfer'), $params); + if ($res['code'] != $this->successCode) { + throw new GameException($this->failCode[$res['code']], 0); + } + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer($type, $amount, $reward, $res['data']['refId'] ?? ''); + + return $res; + } + + /** + * 依據時間獲取遊戲紀錄 + * MD5 (Id+Method+SN+StartTime+EndTime+APISecretKey) + * @param int $pageIndex + * @param string $startTime + * @param string $endTime + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function getGameRecordByTime(int $pageIndex = 1, string $startTime = '', string $endTime = '') + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetGameRecordByTime', + 'SN' => $this->appId, + 'StartTime' => $startTime, + 'EndTime' => $endTime, + ]; + $pageSize = 500; + $params['Signature'] = $this->createSign($params); + $params['PageSize'] = $pageSize; + $params['PageIndex'] = $pageIndex; + $res = doCurl($this->createUrl('getGameRecordByTime'), $params); + if ($res['code'] != $this->successCode) { + throw new GameException($this->failCode[$res['code']], 0); + } + + return $res; + } + + /** + * 獲取玩家遊戲歷史紀錄 + * MD5 (Id+Method+SN+APISecretKey) + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function getGameRecord() + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetGameRecord', + 'SN' => $this->appId, + ]; + $params['Signature'] = $this->createSign($params); + $res = doCurl($this->createUrl('getGameRecord'), $params); + if ($res['code'] != $this->successCode) { + throw new GameException($this->failCode[$res['code']], 0); + } + + return $res; + } + + /** + * 刪除遊戲紀錄 + * MD5 (Id+Method+SN+IdsToBeRemoved+APISecretKey) + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function removeRecords($idsToBeRemoved) + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'RemoveRecords', + 'SN' => $this->appId, + 'IdsToBeRemoved' => implode(',', $idsToBeRemoved), + ]; + $params['Signature'] = $this->createSign($params); + $res = doCurl($this->createUrl('removeRecords'), $params); + if ($res['code'] != $this->successCode) { + throw new GameException($this->failCode[$res['code']], 0); + } + + return $res; + } + + public function createSign($params): string + { + return md5(implode('', $params) . $this->appSecret); + } + + /** + * 生成请求url + * @param $method + * @return string + */ + public function createUrl($method): string + { + return $this->apiDomain . $this->path[$method]; + } +} \ No newline at end of file diff --git a/app/service/game/Lucky365ServiceInterface.php b/app/service/game/Lucky365ServiceInterface.php new file mode 100644 index 0000000..81c5bc3 --- /dev/null +++ b/app/service/game/Lucky365ServiceInterface.php @@ -0,0 +1,444 @@ + '/UserInfo/CreatePlayer', + 'getPlayer' => '/UserInfo/GetPlayer', + 'getGameList' => '/Game/GetGameList', + 'getSimpleGameList' => '/Game/GetSimpleGameList', + 'getLoginH5' => '/UserInfo/GetLoginH5', + 'setPlayerStatus' => '/UserInfo/SetPlayerStatus', + 'getBalance' => '/Account/GetBalance', + 'setBalanceTransfer' => '/Account/SetBalanceTransfer', + 'getGameRecordByTime' => '/Game/GetGameRecordByTime', + 'getGameRecord' => '/Game/GetGameRecord', + 'removeRecords' => '/Game/RemoveRecords', + ]; + + public $successCode = 'S100'; + + public $loginId; + + public $gameType = [ + '10' => 'Slot', + '12' => 'Casino', + '13' => 'Arcade', + '16' => 'Fishing' + ]; + + public $localGameType = [ + '10' => '1', + '12' => '2', + '13' => '3', + '16' => '4', + ]; + + public $failCode = [ + 'S200' => '重復請求', + 'F0001' => '無效的簽名', + 'F0002' => '無效的SN', + 'F0003' => '無效的參數', + 'F0004' => '無效的貨幣', + 'F0005' => '玩家已存在', + 'F0006' => '玩家不存在', + 'F0007' => '會員不存在', + 'F0008' => '執行失敗', + 'F0009' => '無效的方法', + 'F0010' => '無效的用戶狀態', + 'F0011' => '玩家狀態無需更新', + 'F0012' => '超出數據範圍', + 'F0013' => '無匹配數據', + 'F0014' => '登入位置被禁止', + 'F0015' => '分數不足夠', + 'F0016' => '不支持禮碼', + 'F0017' => '交易流水號不得重複', + 'F0018' => '系統繁忙', + 'F0019' => '日期時間各式錯誤', + 'F0020' => '超出時間限制範圍(開始時間與結束時間之間不能大於120分鐘)', + 'F0021' => '執行取消', + 'M0001' => '系統維護', + 'M0002' => '系統錯誤', + ]; + + private $lang = [ + 'zh-CN' => 'zh_ch', + 'en' => 'en_us', + 'zh_tc' => 'zh_tc', + 'th_th' => 'th_th', + 'Ma_my' => 'Ma_my', + 'vi_nam' => 'vi_nam', + 'Fi_fi' => 'Fi_fi', + 'Kr_ko' => 'Kr_ko', + 'Hi_hi' => 'Hi_hi', + 'My_mar' => 'My_mar', + 'Br_po' => 'Br_po', + 'cam_dia' => 'cam_dia', // 柬埔寨语 + ]; + + /** + * @param Player|null $player + * @param $type + * @throws Exception + */ + public function __construct($type, Player $player = null) + { + $config = config('game_platform.' . $type); + $this->appId = $config['app_id']; + $this->apiDomain = $config['api_domain']; + $this->domain = $config['domain']; + $this->appSecret = $config['app_secret']; + $this->platform = GamePlatform::query()->where('name', $type)->first(); + if (!empty($player)) { + $this->player = $player; + $this->getLoginId(); + } + } + + /** + * @throws Exception + */ + protected function getLoginId() + { + /** @var PlayerGamePlatform $playerGamePlatform */ + $playerGamePlatform = PlayerGamePlatform::query()->where('platform_id', $this->platform->id)->where('player_id',$this->player->id)->first(); + if (!empty($playerGamePlatform)) { + return $this->loginId = $playerGamePlatform->player_code; + } + return $this->createPlayer([ + 'uuid' => $this->player->uuid, + 'name' => $this->player->name, + ]); + } + + /** + * 创建玩家 + * @param array $data + * @return array|mixed|Response + * @throws GameException|Exception + */ + public function createPlayer(array $data = []) + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'CreatePlayer', + 'SN' => $this->appId, + 'PlayerCode' => $data['uuid'], + ]; + $params['Signature'] = $this->createSign($params); + $params['PlayerName'] = $data['uuid']; + $res = doCurl($this->createUrl('createPlayer'), $params); + + if ($res['code'] != $this->successCode) { + throw new GameException($this->failCode[$res['code']], 0); + } + $playerGamePlatform = new PlayerGamePlatform(); + $playerGamePlatform->player_id = $this->player->id; + $playerGamePlatform->platform_id = $this->platform->id; + $playerGamePlatform->player_name = $data['name']; + $playerGamePlatform->player_code = $data['uuid']; + $playerGamePlatform->save(); + $this->loginId = $playerGamePlatform->player_code; + return $res; + } + + /** + * 创建玩家 + * @return array|mixed|Response + * @throws GameException|Exception + */ + public function getPlayer() + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetPlayer', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + $data = doCurl($this->createUrl('getPlayer'), $params); + if ($data['code'] != $this->successCode) { + throw new GameException($this->failCode[$data['code']], 0); + } + + return $data; + } + + /** + * 获取游戏摘要MD5 (id+method+sn+APlSecretKey) + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getSimpleGameList() + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetSimpleGameList', + 'SN' => $this->appId, + ]; + $params['Signature'] = $this->createSign($params); + $data = doCurl($this->createUrl('getSimpleGameList'), $params); + if ($data['code'] != $this->successCode) { + throw new GameException($this->failCode[$data['code']], 0); + } + if (!empty($data['data']['games'])) { + foreach ($data['data']['games'] as $game) { + Game::query()->updateOrCreate( + [ + 'platform_id' => $this->platform->id, + 'game_code' => $game['gameCode'], + ], + [ + 'platform_game_type' => $game['type'], + 'game_type' => $this->localGameType[$game['type']], + 'name' => $game['gameName'], + ] + ); + } + } + return $data; + } + + /** + * 获取游戏摘要MD5 (id+method+sn+APlSecretKey) + * @param array $data + * @return string + * @throws GameException|\think\Exception + */ + public function login(array $data = []): string + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetLoginH5', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + $res = doCurl($this->createUrl('getLoginH5'), $params); + if ($res['code'] != $this->successCode) { + Log::error($this->failCode[$res['code']], ['res' => $res]); + throw new GameException($this->failCode[$res['code']], 0); + } + $responseH5 = [ + 'Language' => $this->lang[$data['lang']] ?? 'ch', + "GameId" => $data['gameCode'], + 'CallbackAddress' => $data['callBackUrl'] ?? '', + "AppType" => $data['appType'] ?? 1, + "DeviceType" => 1, + ]; + $jsonString = json_encode($responseH5); + $parametersValue = base64_encode($jsonString); + + if (!empty($data['gameCode'])) { + $link = $this->domain .'/linkgame'. ($res['data']['loginUrl'] ?? '') . '&' . $parametersValue . '&' . $data['gameCode']; + }else{ + $link = $this->domain . ($res['data']['loginUrl'] ?? '') . '&' . $parametersValue; + } + return $link; + } + + /** + * 設置登入玩家狀態。當玩家處於禁用狀態,該玩家無法在平台進行任何操作,如果玩家在遊戲進行中該玩家將會自動退出遊戲。 + * 簽名密鑰方式 Md5(Id+Method+SN+LoginId+APISecretKey) + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function setPlayerStatus($status) + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetSimpleGameList', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + $params['Status'] = $status; + $data = doCurl($this->createUrl('setPlayerStatus'), $params); + if ($data['code'] != $this->successCode) { + throw new GameException($this->failCode[$data['code']], 0); + } + + return $data; + } + + /** + * 獲取玩家餘額信息 + * 簽名密鑰方式 MD5 (Id+Method+SN+LoginId+APISecretKey) + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getBalance() + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetBalance', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + $data = doCurl($this->createUrl('getBalance'), $params); + if ($data['code'] != $this->successCode) { + throw new GameException('Lucky365 System Error,Please contact the administrator', 0); + } + + return $data; + } + + /** + * 玩家钱包转入游戏平台 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferOut() + { + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_OUT, $this->player->wallet->money); + } + + /** + * 玩家钱包转入游戏平台 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferIn() + { + $balance = $this->getBalance(); + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_IN, !empty($balance['data']['result']) ? -$balance['data']['result'] : 0, !empty($balance['data']['reward']) ? -$balance['data']['reward'] : 0); + } + + /** + * 轉帳進出額度 + * 簽名密鑰方式 MD5 (Id+Method+SN+LoginId+APISecretKey) + * @param $type + * @param float $amount + * @param float $reward + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + protected function setBalanceTransfer($type, float $amount = 0, float $reward = 0) + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'SetBalanceTransfer', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + $params['Amount'] = $amount; + $params['Reward'] = $reward; + $res = doCurl($this->createUrl('setBalanceTransfer'), $params); + if ($res['code'] != $this->successCode) { + throw new GameException($this->failCode[$res['code']], 0); + } + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer($type, $amount, $reward, $res['data']['refId'] ?? ''); + + return $res; + } + + /** + * 依據時間獲取遊戲紀錄 + * MD5 (Id+Method+SN+StartTime+EndTime+APISecretKey) + * @param int $pageIndex + * @param string $startTime + * @param string $endTime + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function getGameRecordByTime(int $pageIndex = 1, string $startTime = '', string $endTime = '') + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetGameRecordByTime', + 'SN' => $this->appId, + 'StartTime' => $startTime, + 'EndTime' => $endTime, + ]; + $pageSize = 500; + $params['Signature'] = $this->createSign($params); + $params['PageSize'] = $pageSize; + $params['PageIndex'] = $pageIndex; + $res = doCurl($this->createUrl('getGameRecordByTime'), $params); + if ($res['code'] != $this->successCode) { + throw new GameException($this->failCode[$res['code']], 0); + } + + return $res; + } + + /** + * 獲取玩家遊戲歷史紀錄 + * MD5 (Id+Method+SN+APISecretKey) + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function getGameRecord() + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetGameRecord', + 'SN' => $this->appId, + ]; + $params['Signature'] = $this->createSign($params); + $res = doCurl($this->createUrl('getGameRecord'), $params); + if ($res['code'] != $this->successCode) { + throw new GameException($this->failCode[$res['code']], 0); + } + + return $res; + } + + /** + * 刪除遊戲紀錄 + * MD5 (Id+Method+SN+IdsToBeRemoved+APISecretKey) + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function removeRecords($idsToBeRemoved) + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'RemoveRecords', + 'SN' => $this->appId, + 'IdsToBeRemoved' => implode(',', $idsToBeRemoved), + ]; + $params['Signature'] = $this->createSign($params); + $res = doCurl($this->createUrl('removeRecords'), $params); + if ($res['code'] != $this->successCode) { + throw new GameException($this->failCode[$res['code']], 0); + } + + return $res; + } + + public function createSign($params): string + { + return md5(implode('', $params) . $this->appSecret); + } + + /** + * 生成请求url + * @param $method + * @return string + */ + public function createUrl($method): string + { + return $this->apiDomain . $this->path[$method]; + } +} \ No newline at end of file diff --git a/app/service/game/MarioClubServiceInterface.php b/app/service/game/MarioClubServiceInterface.php new file mode 100644 index 0000000..6fd4f9b --- /dev/null +++ b/app/service/game/MarioClubServiceInterface.php @@ -0,0 +1,411 @@ + 'Casino', + '5' => 'Fishing', + '8' => 'Bingo', + '1' => 'Slot', + ]; + + public $localGameType = [ + 'FISHING' => '4',//捕鱼 + 'SLOT' => '1',//斯洛 + '1' => '1', + '4' => '4', + ]; + + public $failCode = [ + 'S200' => '重復請求', + 'F0001' => '無效的簽名', + 'F0002' => '無效的SN', + 'F0003' => '無效的參數', + 'F0004' => '無效的貨幣', + 'F0005' => '玩家已存在', + 'F0006' => '玩家不存在', + 'F0007' => '會員不存在', + 'F0008' => '執行失敗', + 'F0009' => '無效的方法', + 'F0010' => '無效的用戶狀態', + 'F0011' => '玩家狀態無需更新', + 'F0012' => '超出數據範圍', + 'F0013' => '無匹配數據', + 'F0014' => '登入位置被禁止', + 'F0015' => '分數不足夠', + 'F0016' => '不支持禮碼', + 'F0017' => '交易流水號不得重複', + 'F0018' => '系統繁忙', + 'F0019' => '日期時間各式錯誤', + 'F0020' => '超出時間限制範圍(開始時間與結束時間之間不能大於120分鐘)', + 'F0021' => '執行取消', + 'M0001' => '系統維護', + 'M0002' => '系統錯誤', + ]; + + /** + * @param Player|null $player + * @param $type + * @throws Exception + */ + public function __construct($type, Player $player = null) + { + $config = config('game_platform.' . $type); + $this->appId = $config['app_id']; + $this->apiDomain = $config['api_domain']; + $this->appSecret = $config['app_secret']; + $this->platform = GamePlatform::query()->where('name', $type)->first(); + if (!empty($player)) { + $this->player = $player; + $this->getLoginId(); + } + } + + /** + * 生成签名 + * @param $time + * @return string + */ + public function createSign($time): string + { + return md5($this->appId.$time.$this->appSecret); + } + + /** + * 更新游戏列表 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getSimpleGameList() + { + $time = time(); + $params = [ + 'api_id' => $this->appId, + 'timestamp' => $time, + ]; + $params['sign'] = $this->createSign($time); + $result = doFormCurl($this->apiDomain.'/getGames',$params); + if ($result['code'] == 0 && !empty($result['gameList'])) { + foreach ($result['gameList'] as $game) { + Game::query()->updateOrCreate( + [ + 'platform_id' => $this->platform->id, + 'game_code' => $game['gameCode'], + ], + [ + 'platform_game_type' => $game['gameType'], + 'game_type' => $this->localGameType[$game['gameType']] ?? '', + 'name' => $game['gameName'], + 'game_image' => $game['gameIconUrl'] + ] + ); + } + }else{ + throw new GameException($result['Message'], 0); + } + return $result; + } + + /** + * 获取游戏列表 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getGamesList() + { + $time = time(); + $params = [ + 'api_id' => $this->appId, + 'timestamp' => $time, + ]; + $params['sign'] = $this->createSign($time); + $result = doFormCurl($this->apiDomain.'/getGames',$params); + if ($result['code'] == 0 && !empty($result['gameList'])) { + return $result; + }else{ + throw new GameException($result['Message'], 0); + } + } + + /** + * 获取玩家ID + * @throws Exception + */ + protected function getLoginId() + { + /** @var PlayerGamePlatform $playerGamePlatform */ + $playerGamePlatform = PlayerGamePlatform::query()->where('platform_id', $this->platform->id)->where('player_id',$this->player->id)->first(); + if (!empty($playerGamePlatform)) { + return $this->loginId = $playerGamePlatform->player_code; + } + return $this->createPlayer([ + 'uuid' => $this->player->uuid, + 'name' => $this->player->name, + ]); + } + + /** + * 创建玩家 + * @param array $data + * @return array|mixed|Response + * @throws GameException|Exception + */ + public function createPlayer(array $data = []) + { + $time = time(); + $params = [ + 'api_id' => $this->appId, + 'timestamp' => $time, + 'user_id' => $data['uuid'], + ]; + $params['sign'] = $this->createSign($time); + $result = doFormCurl($this->apiDomain.'/api/acc/created',$params); + + if ($result['code'] != 0) { + Log::error($result['msg'], ['res' => $result]); + throw new GameException($result['msg'], 0); + } + $playerGamePlatform = new PlayerGamePlatform(); + $playerGamePlatform->player_id = $this->player->id; + $playerGamePlatform->platform_id = $this->platform->id; + $playerGamePlatform->player_name = $data['name']; + $playerGamePlatform->player_code = $data['uuid']; + $playerGamePlatform->save(); + $this->loginId = $playerGamePlatform->player_code; + return $result; + } + + /** + * 获取玩家 + * @return array|mixed|Response + * @throws GameException|Exception + */ + public function getPlayer() + { + $time = time(); + $params = [ + 'api_id' => $this->appId, + 'timestamp' => $time, + 'user_id' => $this->loginId, + 'language' => 'en', + ]; + $params['sign'] = $this->createSign($time); + $result = doFormCurl($this->apiDomain.'/api/acc/gameLogIn',$params); + if ($result['code'] != 0) { + throw new GameException($result['msg'], 0); + } + return $result; + } + + /** + * 玩家进入游戏 + * @param array $data + * @return string + * @throws GameException|\think\Exception + */ + public function login(array $data = []): string + { + $time = time(); + $params = [ + 'api_id' => $this->appId, + 'timestamp' => $time, + 'user_id' => $this->loginId, + 'game_code' => $data['gameCode'], + 'language' => 'en', + ]; + $params['sign'] = $this->createSign($time); + $result = doFormCurl($this->apiDomain.'/api/acc/gameLogIn',$params); + if ($result['code'] == 0 && !empty($result['gameUrl'])) { + $link = $result['gameUrl']; + }else{ + throw new GameException($result['msg'], 0); + } + return $link; + } + + /** + * 获取玩家游戏平台余额 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getBalance() + { + $time = time(); + $params = [ + 'api_id' => $this->appId, + 'timestamp' => $time, + 'user_id' => $this->loginId, + ]; + $params['sign'] = $this->createSign($time); + $result = doFormCurl($this->apiDomain.'/api/acc/getBalance',$params); + if ($result['code'] != 0) { + throw new GameException('MarioClub System Error,Please contact the administrator', 0); + } + return $result['balance']; + } + + /** + * 玩家钱包转入游戏平台 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferOut() + { + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_OUT, $this->player->wallet->money); + } + + /** + * 游戏平台转入玩家钱包 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferIn() + { + $balance = $this->getBalance(); + if($balance == 0){ + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer(PlayerWalletTransfer::TYPE_IN, 0, 0); + return true; + } + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_IN, $balance); + } + + /** + * 轉帳進出額度 + * @param $type + * @param float $amount + * @param float $reward + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + protected function setBalanceTransfer($type, float $amount = 0, float $reward = 0) + { + if ($type == 1) { + $action = 'deposit'; + } else { + $action = 'withdraw'; + } + $time = time(); + $params = [ + 'api_id' => $this->appId, + 'timestamp' => $time, + 'user_id' => $this->loginId, + 'amount' => $amount, + 'action' => $action, + ]; + $params['sign'] = $this->createSign($time); + $result = doFormCurl($this->apiDomain.'/api/acc/updateBalance',$params); + if ($result['code'] != 0) { + throw new GameException($result['msg'], 0); + } + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer($type, $amount, $reward, $result['transId'] ?? ''); + return $result; + } + + /** + * 查询额度转移纪录 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getTransferList(string $startTime = '', string $endTime = '', int $page = 1, int $pageSize = 10) + { + $time = time(); + $params = [ + 'api_id' => $this->appId, + 'timestamp' => $time, + 'user_id' => $this->loginId, + 'date_from' => date('d/m/Y', strtotime($startTime)), + 'date_to' => date('d/m/Y', strtotime($endTime)), + ]; + $params['sign'] = $this->createSign($time); + $result = doFormCurl($this->apiDomain.'/api/acc/getTransactionLog',$params); + if ($result['code'] != 0) { + throw new GameException($result['msg'], 0); + } + return $result['walletLogDTO']; + } + + /** + * 查询游戏纪录 + * @param string $startTime + * @param string $endTime + * @return array + * @throws GameException + * @throws \think\Exception + */ + public function getGameRecordList(string $startTime = '', string $endTime = ''): array + { + $time = time(); + $params = [ + 'api_id' => $this->appId, + 'timestamp' => $time, + 'date_from' => $startTime, + 'date_to' => $endTime, + ]; + $params['sign'] = $this->createSign($time); + $result = doFormCurl($this->apiDomain.'/api/acc/getGameLog',$params); + if ($result['code'] != 0) { + throw new GameException($result['msg'], 0); + } + return $result['userGameLogDTO']; + } + + /** + * 查询玩家游戏记录 + * @return array + */ + public function handleOrderHistories(): array + { + try { + $list = []; + $startTime = date('d/m/Y H:i:s', strtotime('-3 minutes')); + $endTime = date('d/m/Y H:i:s', strtotime('-2 minutes')); + $data = $this->getGameRecordList($startTime, $endTime); + if (!empty($data)) { + foreach ($data as $item) { + $list[] = [ + 'uuid' => $item['loginId'], + 'platform_id' => $this->platform->id, + 'game_code' => $item['gameCode'], + 'bet' => $item['betAmount'], + 'win' => bcadd($item['betAmount'], $item['winAmount'], 2), + 'order_no' => $item['logId'], + 'original_data' => json_encode($item,JSON_UNESCAPED_UNICODE), + 'platform_action_at' => date('Y-m-d H:i:s', $item['createdDate']/1000), + 'game_type' => $item['gameTypeId'], + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]; + + } + } + } catch (Exception $e) { + return []; + } + + return $list; + } + +} \ No newline at end of file diff --git a/app/service/game/MeGa888ServiceInterface.php b/app/service/game/MeGa888ServiceInterface.php new file mode 100644 index 0000000..e2c4d0b --- /dev/null +++ b/app/service/game/MeGa888ServiceInterface.php @@ -0,0 +1,472 @@ + 'Casino', + '5' => 'Fishing', + '8' => 'Bingo', + '1' => 'Slot', + ]; + + public $localGameType = [ + '2' => '2',//赌场 + '5' => '4',//捕鱼 + '8' => '8',//宾果 + '1' => '1',//斯洛 + ]; + + public $failCode = [ + 'S200' => '重復請求', + 'F0001' => '無效的簽名', + 'F0002' => '無效的SN', + 'F0003' => '無效的參數', + 'F0004' => '無效的貨幣', + 'F0005' => '玩家已存在', + 'F0006' => '玩家不存在', + 'F0007' => '會員不存在', + 'F0008' => '執行失敗', + 'F0009' => '無效的方法', + 'F0010' => '無效的用戶狀態', + 'F0011' => '玩家狀態無需更新', + 'F0012' => '超出數據範圍', + 'F0013' => '無匹配數據', + 'F0014' => '登入位置被禁止', + 'F0015' => '分數不足夠', + 'F0016' => '不支持禮碼', + 'F0017' => '交易流水號不得重複', + 'F0018' => '系統繁忙', + 'F0019' => '日期時間各式錯誤', + 'F0020' => '超出時間限制範圍(開始時間與結束時間之間不能大於120分鐘)', + 'F0021' => '執行取消', + 'M0001' => '系統維護', + 'M0002' => '系統錯誤', + ]; + + /** + * @param Player|null $player + * @param $type + * @throws Exception + */ + public function __construct($type, Player $player = null) + { + $config = config('game_platform.' . $type); + $this->appId = $config['app_id']; + $this->apiDomain = $config['api_domain']; + $this->appSecret = $config['app_secret']; + $this->sn = $config['sn']; + $this->platform = GamePlatform::query()->where('name', $type)->first(); + if (!empty($player)) { + $this->player = $player; + $this->getLoginId(); + } + } + + /** + * 生成请求url + * @return string + */ + public function createUrl(): string + { + return $this->apiDomain; + } + + //生成签名 + public function createSign($params): string + { + $str = ''; + foreach ($params as $v) { + $str .= $v; + } + return md5($str); + } + + /** + * 生成请求数据 + * @param $postData + * @param $method + * @return array + */ + function buildParams($postData, $method): array + { + return array( + "jsonrpc" => "2.0", + "method" => $method, + "params" => $postData, + "id" => $this->player->uuid ?? uniqid() + ); + } + + /** + * 获取下载地址 + * @throws GameException|\think\Exception + */ + public function getDownload() + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'secretCode' => $this->appSecret, + ]; + $params['digest'] = $this->createSign($params); + $params['agentLoginId'] = $this->appId; + $postData = $this->buildParams($params, 'open.mega.app.url.download'); + $result = doCurl($this->apiDomain,$postData); + if(!empty($result['result'])){ + return $result['result']; + }else{ + throw new GameException($result['error']['message'], 0); + } + } + + /** + * 更新游戏列表 + * @return false + */ + public function getSimpleGameList(): bool + { + return false; + } + + /** + * 获取玩家ID + * @throws Exception + */ + protected function getLoginId() + { + /** @var PlayerGamePlatform $playerGamePlatform */ + $playerGamePlatform = PlayerGamePlatform::query()->where('platform_id', $this->platform->id)->where('player_id',$this->player->id)->first(); + if (!empty($playerGamePlatform)) { + $this->password = $playerGamePlatform->player_password; + return $this->loginId = $playerGamePlatform->player_code; + } + return $this->createPlayer([ + 'uuid' => $this->player->uuid, + 'name' => $this->player->name, + ]); + } + + /** + * 创建玩家 + * @param array $data + * @return array|mixed|Response + * @throws GameException|Exception + */ + public function createPlayer(array $data = []) + { + $params = [ + 'random' => $data['uuid'] ?? uniqid(), + 'sn' => $this->sn, + 'secretCode' => $this->appSecret, + ]; + $params['digest'] = $this->createSign($params); + $params['agentLoginId'] = $this->appId; + $params['nickname'] = $data['name']; + $postData = $this->buildParams($params, 'open.mega.user.create'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['result']) && empty($result['error'])) { + $playerGamePlatform = new PlayerGamePlatform(); + $playerGamePlatform->player_id = $this->player->id; + $playerGamePlatform->platform_id = $this->platform->id; + $playerGamePlatform->player_name = $data['name']; + $playerGamePlatform->player_code = $result['result']['loginId']; + $playerGamePlatform->player_password = uniqid(); + $playerGamePlatform->save(); + $this->loginId = $playerGamePlatform->player_code; + $this->password = $playerGamePlatform->player_password; + return $result; + }else{ + throw new GameException($result['error']['message'], 0); + } + } + + /** + * 获取玩家信息 + * @return array|mixed|Response + * @throws GameException|Exception + */ + public function getPlayer() + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'loginId' => $this->loginId, + 'secretCode' => $this->appSecret, + ]; + $params['digest'] = $this->createSign($params); + $postData = $this->buildParams($params, 'open.mega.user.get'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['result']) && empty($result['error'])) { + return $result; + }else{ + throw new GameException($result['error']['message'], 0); + } + } + + /** + * 玩家进入游戏 + * @param array $data + * @return array + * @throws GameException + * @throws \think\Exception + */ + public function login(array $data = []): array + { + return ['url' => $this->getDownload(), 'account' => $this->loginId, 'password' => $this->password]; + } + + /** + * 获取玩家游戏平台余额 + * @throws GameException|\think\Exception + */ + public function getBalance() + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'loginId' => $this->loginId, + 'secretCode' => $this->appSecret, + ]; + $params['digest'] = $this->createSign($params); + $postData = $this->buildParams($params, 'open.mega.balance.get'); + $result = doCurl($this->apiDomain,$postData); + if (empty($result['error'])) { + return $result['result']; + }else{ + throw new GameException('MeGa888 System Error,Please contact the administrator', 0); + } + } + + /** + * 玩家钱包转入游戏平台 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferOut() + { + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_OUT, $this->player->wallet->money); + } + + /** + * 游戏平台转入玩家钱包 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferIn() + { + if($this->getBalance() == 0){ + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer(PlayerWalletTransfer::TYPE_IN, 0, 0); + return true; + } + return $this->autoTransfer(); + } + + /** + * 轉帳進出額度 + * @param $type + * @param float $amount + * @param float $reward + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + protected function setBalanceTransfer($type, float $amount = 0, float $reward = 0) + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'loginId' => $this->loginId, + 'amount' => $amount, + 'secretCode' => $this->appSecret, + ]; + $params['digest'] = $this->createSign($params); + $postData = $this->buildParams($params, 'open.mega.balance.transfer'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['error'])) { + throw new GameException($result['error']['message'], 0); + } + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer($type, $amount, $reward); + return $result; + } + + /** + * 自动下分 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function autoTransfer() + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'loginId' => $this->loginId, + 'secretCode' => $this->appSecret, + ]; + $params['digest'] = $this->createSign($params); + $postData = $this->buildParams($params, 'open.mega.balance.auto.transfer.out'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['error'])) { + throw new GameException($result['error']['message'], 0); + } + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer(PlayerWalletTransfer::TYPE_IN, $result['result'], 0); + return $result; + } + + /** + * 查询额度转移纪录 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getTransferList(string $startTime = '', string $endTime = '', int $page = 1, int $pageSize = 15) + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'secretCode' => $this->appSecret, + ]; + $params['digest'] = $this->createSign($params); + $params['loginId'] = $this->loginId; + $params['agentLoginId'] = $this->appId; + $params['startTime'] = $startTime; + $params['endTime'] = $endTime; + $params['timeZone'] = 1; + $postData = $this->buildParams($params, 'open.mega.balance.transfer.query'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['error'])) { + throw new GameException($result['error']['message'], 0); + } + return $result; + } + + /** + * 查询玩家游戏记录 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getUserGameRecord(string $startTime = '', string $endTime = '') + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'loginId' => $this->loginId, + 'secretCode' => $this->appSecret, + ]; + $params['digest'] = $this->createSign($params); + $params['startTime'] = $startTime; + $params['endTime'] = $endTime; + $params['timeZone'] = 1; + $postData = $this->buildParams($params, 'open.mega.player.game.log.url.get'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['error'])) { + throw new GameException($result['error']['message'], 0); + } + return $result['result']; + } + + /** + * 查询全部玩家账单 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getReportRecord(string $startTime = '', string $endTime = '') + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'agentLoginId' => $this->appId, + 'secretCode' => $this->appSecret, + ]; + $params['digest'] = $this->createSign($params); + $params['startTime'] = $startTime; + $params['endTime'] = $endTime; + $params['timeZone'] = 1; + $params['type'] = 1; + $postData = $this->buildParams($params, 'open.mega.player.total.report'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['error'])) { + throw new GameException($result['error']['message'], 0); + } + return $result['result']; + } + + /** + * 获取电子游戏注单分页列表 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getGameOrderById(string $startTime = '', string $endTime = '') + { + $params = [ + 'random' => $this->player->uuid ?? uniqid(), + 'sn' => $this->sn, + 'loginId' => $this->loginId, + 'secretCode' => $this->appSecret, + ]; + $params['digest'] = $this->createSign($params); + $params['startTime'] = $startTime; + $params['endTime'] = $endTime; + $params['timeZone'] = 1; + $postData = $this->buildParams($params, 'open.mega.game.order.page'); + $result = doCurl($this->apiDomain,$postData); + if (!empty($result['error'])) { + throw new GameException($result['error']['message'], 0); + } + return $result; + } + + /** + * 查询玩家游戏记录 + * @return array + */ + public function handleOrderHistories(): array + { + try { + $list = []; + $startTime = date('Y-m-d'); + $endTime = date('Y-m-d'); + $data = $this->getReportRecord($startTime, $endTime); + if (!empty($data)) { + foreach ($data as $item) { + $list[] = [ + 'player_code' => $item['loginId'], + 'platform_id' => $this->platform->id, + 'game_code' => 'MeGa888', + 'bet' => $item['bet'], + 'win' => $item['win'], + 'order_no' => $item['userId'].date('Ymd'), + 'original_data' => json_encode($item,JSON_UNESCAPED_UNICODE), + 'platform_action_at' => $startTime, + 'game_type' => 1, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]; + + } + } + } catch (Exception $e) { + return []; + } + + return $list; + } +} \ No newline at end of file diff --git a/app/service/game/MonkeyKingServiceInterface.php b/app/service/game/MonkeyKingServiceInterface.php new file mode 100644 index 0000000..ccac132 --- /dev/null +++ b/app/service/game/MonkeyKingServiceInterface.php @@ -0,0 +1,444 @@ + 'Slot', + '12' => 'Casino', + '13' => 'Arcade', + '16' => 'Fishing' + ]; + public $failCode = [ + 'S200' => '重復請求', + '150001' => '無效的簽名', + '150002' => '無效的SN', + '150003' => '無效的參數', + '150004' => '無效的貨幣', + '150005' => '玩家已存在', + '150006' => '玩家不存在', + '150007' => '次级代理不存在', + '150008' => '執行失敗', + '150009' => '無效的方法', + '150010' => '無效的用戶狀態', + '150011' => '玩家狀態無需更新', + '150012' => '超出數據範圍', + '150013' => '無匹配數據', + '150014' => '登入位置被禁止', + '150015' => '分數不足夠', + '150016' => '不支持禮碼', + '150017' => '交易流水號不得重複', + '150018' => '系統繁忙', + '150019' => '日期時間各式錯誤', + '150020' => '超出時間限制範圍(開始時間與結束時間之間不能大於120分鐘)', + ]; + private $apiDomain; + private $domain; + private $appId; + private $appSecret; + private $path = [ + 'createPlayer' => '/UserInfo/CreatePlayer', + 'getPlayer' => '/UserInfo/GetPlayer', + 'getGameList' => '/Game/GetGameList', + 'getSimpleGameList' => '/Game/GetSimpleGameList', + 'getLoginH5' => '/UserInfo/GetLoginH5', + 'setPlayerStatus' => '/UserInfo/SetPlayerStatus', + 'getBalance' => '/Account/GetBalance', + 'setBalanceTransfer' => '/Account/SetBalanceTransfer', + 'getGameRecordByTime' => '/Game/GetGameRecordByTime', + 'getGameRecord' => '/Game/GetGameRecord', + 'removeRecords' => '/Game/RemoveRecords', + ]; + private $lang = [ + 'zh-CN' => 'zh-ch', + 'en' => 'en_us', + 'zh_tc' => 'zh_tc', + 'en-us' => 'en-us', + 'id' => 'id', + 'th' => 'th', + 'my' => 'my', + 'vi' => 'vi', + 'fi_fi' => 'fi_fi', + 'kr_ko' => 'kr_ko', + 'hi_hi' => 'hi_hi', + 'br_po' => 'br_po', + 'lo_la' => 'lo_la', + 'cam_dia' => 'en_us', // 柬埔寨语 + ]; + + /** + * @param Player|null $player + * @param $type + * @throws Exception + */ + public function __construct($type, Player $player = null) + { + $config = config('game_platform.' . $type); + $this->appId = $config['app_id']; + $this->apiDomain = $config['api_domain']; + $this->domain = $config['domain']; + $this->appSecret = $config['app_secret']; + $this->platform = GamePlatform::query()->where('name', $type)->first(); + if (!empty($player)) { + $this->player = $player; + $this->getLoginId(); + } + } + + /** + * @throws Exception + */ + protected function getLoginId() + { + /** @var PlayerGamePlatform $playerGamePlatform */ + $playerGamePlatform = $this->player->playerGamePlatform->where('platform_id', $this->platform->id)->first(); + if (!empty($playerGamePlatform)) { + return $this->loginId = $playerGamePlatform->player_code; + } + return $this->createPlayer([ + 'uuid' => $this->player->uuid, + 'name' => $this->player->name, + ]); + } + + /** + * 创建玩家 + * @param array $data + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function createPlayer(array $data = []) + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'CreatePlayer', + 'SN' => $this->appId, + 'PlayerCode' => $data['uuid'], + ]; + $params['Signature'] = $this->createSign($params); + $params['PlayerName'] = $data['uuid']; + Log::info('MonkeyKing请求参数', [$params]); + $res = doCurl($this->createUrl('createPlayer'), $params); + Log::info('MonkeyKing请求返回数据', [$res]); + if ($res['code'] != $this->successCode) { + throw new GameException($this->failCode[$res['code']], 0); + } + $playerGamePlatform = new PlayerGamePlatform(); + $playerGamePlatform->player_id = $this->player->id; + $playerGamePlatform->platform_id = $this->platform->id; + $playerGamePlatform->player_name = $data['name']; + $playerGamePlatform->player_code = $data['uuid']; + $playerGamePlatform->save(); + $this->loginId = $playerGamePlatform->player_code; + return $res; + } + + public function createSign($params): string + { + return md5(implode('', $params) . $this->appSecret); + } + + /** + * 生成请求url + * @param $method + * @return string + */ + public function createUrl($method): string + { + return $this->apiDomain . $this->path[$method]; + } + + /** + * 创建玩家 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getPlayer() + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetPlayer', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + Log::info('MonkeyKing请求参数', [$params]); + $data = doCurl($this->createUrl('getPlayer'), $params); + Log::info('MonkeyKing请求返回数据', [$data]); + if ($data['code'] != $this->successCode) { + throw new GameException($this->failCode[$data['code']], 0); + } + + return $data; + } + + /** + * 获取游戏摘要MD5 (id+method+sn+APlSecretKey) + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getSimpleGameList() + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetSimpleGameList', + 'SN' => $this->appId, + ]; + $params['Signature'] = $this->createSign($params); + Log::info('MonkeyKing请求参数', [$params]); + $data = doCurl($this->createUrl('getSimpleGameList'), $params); + Log::info('MonkeyKing请求返回数据', [$data]); + if ($data['code'] != $this->successCode) { + throw new GameException($this->failCode[$data['code']], 0); + } + if (!empty($data['data']['games'])) { + foreach ($data['data']['games'] as $game) { + Game::query()->updateOrCreate( + [ + 'platform_id' => $this->platform->id, + 'game_code' => $game['gameCode'], + 'platform_game_type' => $game['type'], + ] + ); + } + } + return $data; + } + + /** + * 获取游戏摘要MD5 (id+method+sn+APlSecretKey) + * @param array $data + * @return string + * @throws GameException|\think\Exception + */ + public function login(array $data = []): string + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetLoginH5', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + Log::info('MonkeyKing请求参数', [$params]); + $res = doCurl($this->createUrl('getLoginH5'), $params); + Log::info('MonkeyKing请求返回数据', [$res]); + if ($res['code'] != $this->successCode) { + throw new GameException($this->failCode[$res['code']], 0); + } + $responseH5 = [ + 'Language' => $this->lang[$data['lang']] ?? 'ch', + "GameId" => $data['gameCode'], + 'CallbackAddress' => $data['callBackUrl'] ?? '', + "AppType" => $data['appType'] ?? 1, + "DeviceType" => 1, + ]; + $jsonString = json_encode($responseH5); + $parametersValue = base64_encode($jsonString); + + return $this->domain . '/linkgame' . ($res['data']['loginUrl'] ?? '') . '&' . $parametersValue . '&' . $data['gameCode']; + } + + /** + * 設置登入玩家狀態。當玩家處於禁用狀態,該玩家無法在平台進行任何操作,如果玩家在遊戲進行中該玩家將會自動退出遊戲。 + * 簽名密鑰方式 Md5(Id+Method+SN+LoginId+APISecretKey) + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function setPlayerStatus($status) + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetSimpleGameList', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + $params['Status'] = $status; + Log::info('MonkeyKing请求参数', [$params]); + $data = doCurl($this->createUrl('setPlayerStatus'), $params); + Log::info('MonkeyKing请求返回数据', [$data]); + if ($data['code'] != $this->successCode) { + throw new GameException($this->failCode[$data['code']], 0); + } + + return $data; + } + + /** + * 玩家钱包转入游戏平台 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferOut() + { + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_OUT, $this->player->wallet->money); + } + + /** + * 轉帳進出額度 + * 簽名密鑰方式 MD5 (Id+Method+SN+LoginId+APISecretKey) + * @param $type + * @param float $amount + * @param float $reward + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + protected function setBalanceTransfer($type, float $amount = 0, float $reward = 0) + { + if ($amount == 0 && $reward == 0) { + throw new GameException('转出/入金额错误', 0); + } + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'SetBalanceTransfer', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + $params['Amount'] = $amount; + $params['Reward'] = $reward; + Log::info('MonkeyKing请求参数', [$params]); + $res = doCurl($this->createUrl('setBalanceTransfer'), $params); + Log::info('MonkeyKing请求返回数据', [$res]); + if ($res['code'] != $this->successCode) { + Log::error($this->failCode[$res['code']], ['res' => $res]); + throw new GameException($this->failCode[$res['code']], 0); + } + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer($type, $amount, $reward, $res['data']['refId'] ?? ''); + + return $res; + } + + /** + * 玩家钱包转入游戏平台 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferIn() + { + $balance = $this->getBalance(); + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_IN, !empty($balance['data']['result']) ? -$balance['data']['result'] : 0, !empty($balance['data']['reward']) ? -$balance['data']['reward'] : 0); + } + + /** + * 獲取玩家餘額信息 + * 簽名密鑰方式 MD5 (Id+Method+SN+LoginId+APISecretKey) + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getBalance() + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetBalance', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + Log::info('MonkeyKing请求参数', [$params]); + $data = doCurl($this->createUrl('getBalance'), $params); + Log::info('MonkeyKing请求返回数据', [$data]); + if ($data['code'] != $this->successCode) { + throw new GameException($this->failCode[$data['code']], 0); + } + + return $data; + } + + /** + * 依據時間獲取遊戲紀錄 + * MD5 (Id+Method+SN+StartTime+EndTime+APISecretKey) + * @param int $pageIndex + * @param string $startTime + * @param string $endTime + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function getGameRecordByTime(int $pageIndex = 1, string $startTime = '', string $endTime = '') + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetGameRecordByTime', + 'SN' => $this->appId, + 'StartTime' => $startTime, + 'EndTime' => $endTime, + ]; + $pageSize = 500; + $params['Signature'] = $this->createSign($params); + $params['PageSize'] = $pageSize; + $params['PageIndex'] = $pageIndex; + Log::info('MonkeyKing请求参数', [$params]); + $res = doCurl($this->createUrl('getGameRecordByTime'), $params); + Log::info('MonkeyKing请求返回数据', [$res]); + if ($res['code'] != $this->successCode) { + throw new GameException($this->failCode[$res['code']], 0); + } + + return $res; + } + + /** + * 獲取玩家遊戲歷史紀錄 + * MD5 (Id+Method+SN+APISecretKey) + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function getGameRecord() + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetGameRecord', + 'SN' => $this->appId, + ]; + $params['Signature'] = $this->createSign($params); + Log::info('MonkeyKing请求参数', [$params]); + $res = doCurl($this->createUrl('getGameRecord'), $params); + Log::info('MonkeyKing请求返回数据', [$res]); + if ($res['code'] != $this->successCode) { + throw new GameException($this->failCode[$res['code']], 0); + } + + return $res; + } + + /** + * 刪除遊戲紀錄 + * MD5 (Id+Method+SN+IdsToBeRemoved+APISecretKey) + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function removeRecords($idsToBeRemoved) + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'RemoveRecords', + 'SN' => $this->appId, + 'IdsToBeRemoved' => implode(',', $idsToBeRemoved), + ]; + $params['Signature'] = $this->createSign($params); + Log::info('MonkeyKing请求参数', [$params]); + $res = doCurl($this->createUrl('removeRecords'), $params); + Log::info('MonkeyKing请求返回数据', [$res]); + if ($res['code'] != $this->successCode) { + throw new GameException($this->failCode[$res['code']], 0); + } + + return $res; + } +} \ No newline at end of file diff --git a/app/service/game/NextSpinServiceInterface.php b/app/service/game/NextSpinServiceInterface.php new file mode 100644 index 0000000..35aa202 --- /dev/null +++ b/app/service/game/NextSpinServiceInterface.php @@ -0,0 +1,504 @@ + 'ListGames',//获取游戏列表 + 'createPlayer' => '/UserInfo/CreatePlayer', + 'getPlayer' => '/UserInfo/GetPlayer', + 'getGameList' => '/Game/GetGameList', + 'getSimpleGameList' => '/Game/GetSimpleGameList', + 'getLoginH5' => '/UserInfo/GetLoginH5', + 'setPlayerStatus' => '/UserInfo/SetPlayerStatus', + 'getBalance' => '/Account/GetBalance', + 'setBalanceTransfer' => '/Account/SetBalanceTransfer', + 'getGameRecordByTime' => '/Game/GetGameRecordByTime', + 'getGameRecord' => '/Game/GetGameRecord', + 'removeRecords' => '/Game/RemoveRecords', + ]; + + public $successCode = 'S100'; + + public $loginId; + + public $gameType = [ + 'AD' => 'Casino', + 'SM' => 'Fishing', + ]; + + public $localGameType = [ + 'AD' => '2', + 'SM' => '4', + ]; + + public $failCode = [ + 'S200' => '重復請求', + 'F0001' => '無效的簽名', + 'F0002' => '無效的SN', + 'F0003' => '無效的參數', + 'F0004' => '無效的貨幣', + 'F0005' => '玩家已存在', + 'F0006' => '玩家不存在', + 'F0007' => '會員不存在', + 'F0008' => '執行失敗', + 'F0009' => '無效的方法', + 'F0010' => '無效的用戶狀態', + 'F0011' => '玩家狀態無需更新', + 'F0012' => '超出數據範圍', + 'F0013' => '無匹配數據', + 'F0014' => '登入位置被禁止', + 'F0015' => '分數不足夠', + 'F0016' => '不支持禮碼', + 'F0017' => '交易流水號不得重複', + 'F0018' => '系統繁忙', + 'F0019' => '日期時間各式錯誤', + 'F0020' => '超出時間限制範圍(開始時間與結束時間之間不能大於120分鐘)', + 'F0021' => '執行取消', + 'M0001' => '系統維護', + 'M0002' => '系統錯誤', + ]; + + private $lang = [ + 'zh-CN' => 'zh_ch', + 'en' => 'en_us', + 'zh_tc' => 'zh_tc', + 'th_th' => 'th_th', + 'Ma_my' => 'Ma_my', + 'vi_nam' => 'vi_nam', + 'Fi_fi' => 'Fi_fi', + 'Kr_ko' => 'Kr_ko', + 'Hi_hi' => 'Hi_hi', + 'My_mar' => 'My_mar', + 'Br_po' => 'Br_po', + 'cam_dia' => 'cam_dia', // 柬埔寨语 + ]; + + /** + * @param Player|null $player + * @param $type + * @throws Exception + */ + public function __construct($type, Player $player = null) + { + $config = config('game_platform.' . $type); + $this->appId = $config['app_id']; + $this->apiDomain = $config['api_domain']; + $this->domain = $config['domain']; + $this->appSecret = $config['app_secret']; + $this->platform = GamePlatform::query()->where('name', $type)->first(); + if (!empty($player)) { + $this->player = $player; + $this->getLoginId(); + } + } + + public function httpRequest($url,$api,$method = 'POST',$fields) + { + $fields = json_encode(["merchantCode"=> "ZCH6747", + "serialNo"=>"20240722224255982841"]); + $curl = curl_init(); + curl_setopt_array($curl, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => $method, + CURLOPT_POSTFIELDS => $fields, + CURLOPT_HTTPHEADER => [ + "API: $api", + "Accept: */*", + "Accept-Encoding: gzip, deflate, br", + "Connection: keep-alive", + "Content-Type: application/json", + "DataType: JSON", + "User-Agent: PostmanRuntime-ApipostRuntime/1.1.0" + ], + ]); + $response = curl_exec($curl); + curl_close($curl); + $data = json_decode($response,true); + return $data; + } + + /** + * 更新游戏列表 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getSimpleGameList() + { + $api = 'getGames'; + $method = 'POST'; + $serialNo = createOrderNo(); + $fields = json_encode([ + "merchantCode" => $this->appId, + "serialNo" => $serialNo + ]); + + $result = $this->httpRequest($this->apiDomain,$api,$method,$fields); + if (isset($result['games']) && $result['code'] == 0) { + foreach ($result['games'] as $game) { + Game::query()->updateOrCreate( + [ + 'platform_id' => $this->platform->id, + 'game_code' => $game['gameCode'], + ], + [ + 'platform_game_type' => $game['category'], + 'game_type' => $this->localGameType[$game['category']], + 'name' => $game['gameName'], + ] + ); + } + }else{ + throw new GameException($result['msg'], 0); + } + return $result; + } + + /** + * 获取游戏列表 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getGamesList() + { + $api = 'getGames'; + $method = 'POST'; + $serialNo = createOrderNo(); + $fields = json_encode([ + "merchantCode" => $this->appId, + "serialNo" => $serialNo + ]); + + $result = $this->httpRequest($this->apiDomain,$api,$method,$fields); + if (isset($result['games']) && $result['code'] == 0) { + return $result['games']; + }else{ + throw new GameException($result['msg'], 0); + } + } + + /** + * 玩游戏 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function playGame() + { + $params = [ + 'Method' => 'PLAY', + 'Username' => $this->player->name, + 'RequestID' => createOrderNo(), + 'Amount' => $amount, + 'Timestamp' => time(), + ]; + $signature = $this->createSign($params); + + $result = doCurl($this->createUrl($signature), $params); + if (isset($result['Token'])) { + return $forwardUrl = $this->domain."?token=".$result['Token']."&game=1jeqx59c7ztqg&mobile=false"; + }else{ + throw new GameException($result['Message'], 0); + } + } + + /** + * @throws Exception + */ + protected function getLoginId() + { + /** @var PlayerGamePlatform $playerGamePlatform */ + $playerGamePlatform = $this->player->playerGamePlatform->where('platform_id', $this->platform->id)->first(); + if (!empty($playerGamePlatform)) { + return $this->loginId = $playerGamePlatform->player_code; + } + return $this->createPlayer([ + 'uuid' => $this->player->uuid, + 'name' => $this->player->name, + ]); + } + + /** + * 创建玩家 + * @param array $data + * @return array|mixed|Response + * @throws GameException|Exception + */ + public function createPlayer(array $data = []) + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'CreatePlayer', + 'SN' => $this->appId, + 'PlayerCode' => $data['uuid'], + ]; + $params['Signature'] = $this->createSign($params); + $params['PlayerName'] = $data['uuid']; + $res = doCurl($this->createUrl('createPlayer'), $params); + if ($res['code'] != $this->successCode) { + throw new GameException($this->failCode[$res['code']], 0); + } + $playerGamePlatform = new PlayerGamePlatform(); + $playerGamePlatform->player_id = $this->player->id; + $playerGamePlatform->platform_id = $this->platform->id; + $playerGamePlatform->player_name = $data['name']; + $playerGamePlatform->player_code = $data['uuid']; + $playerGamePlatform->save(); + $this->loginId = $playerGamePlatform->player_code; + return $res; + } + + /** + * 创建玩家 + * @return array|mixed|Response + * @throws GameException|Exception + */ + public function getPlayer() + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetPlayer', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + $data = doCurl($this->createUrl('getPlayer'), $params); + if ($data['code'] != $this->successCode) { + throw new GameException($this->failCode[$data['code']], 0); + } + + return $data; + } + + /** + * 获取游戏摘要MD5 (id+method+sn+APlSecretKey) + * @param array $data + * @return string + * @throws GameException|\think\Exception + */ + public function login(array $data = []): string + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetLoginH5', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + $res = doCurl($this->createUrl('getLoginH5'), $params); + if ($res['code'] != $this->successCode) { + Log::error($this->failCode[$res['code']], ['res' => $res]); + throw new GameException($this->failCode[$res['code']], 0); + } + $responseH5 = [ + 'Language' => $this->lang[$data['lang']] ?? 'ch', + "GameId" => $data['gameCode'], + 'CallbackAddress' => $data['callBackUrl'] ?? '', + "AppType" => $data['appType'] ?? 1, + "DeviceType" => 1, + ]; + $jsonString = json_encode($responseH5); + $parametersValue = base64_encode($jsonString); + $link = $this->domain . '/linkgame' . ($res['data']['loginUrl'] ?? '') . '&' . $parametersValue; + if (!empty($data['gameCode'])) { + $link .= '&' . $data['gameCode']; + } + return $link; + } + + /** + * 設置登入玩家狀態。當玩家處於禁用狀態,該玩家無法在平台進行任何操作,如果玩家在遊戲進行中該玩家將會自動退出遊戲。 + * 簽名密鑰方式 Md5(Id+Method+SN+LoginId+APISecretKey) + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function setPlayerStatus($status) + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetSimpleGameList', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + $params['Status'] = $status; + $data = doCurl($this->createUrl('setPlayerStatus'), $params); + if ($data['code'] != $this->successCode) { + throw new GameException($this->failCode[$data['code']], 0); + } + + return $data; + } + + /** + * 獲取玩家餘額信息 + * 簽名密鑰方式 MD5 (Id+Method+SN+LoginId+APISecretKey) + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getBalance() + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetBalance', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + $data = doCurl($this->createUrl('getBalance'), $params); + if ($data['code'] != $this->successCode) { + throw new GameException($this->failCode[$data['code']], 0); + } + + return $data; + } + + /** + * 玩家钱包转入游戏平台 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferOut() + { + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_OUT, $this->player->wallet->money); + } + + /** + * 玩家钱包转入游戏平台 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferIn() + { + $balance = $this->getBalance(); + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_IN, !empty($balance['data']['result']) ? -$balance['data']['result'] : 0, !empty($balance['data']['reward']) ? -$balance['data']['reward'] : 0); + } + + /** + * 轉帳進出額度 + * 簽名密鑰方式 MD5 (Id+Method+SN+LoginId+APISecretKey) + * @param $type + * @param float $amount + * @param float $reward + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + protected function setBalanceTransfer($type, float $amount = 0, float $reward = 0) + { + if ($amount == 0 && $reward == 0) { + throw new GameException('转出/入金额错误', 0); + } + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'SetBalanceTransfer', + 'SN' => $this->appId, + 'LoginId' => $this->loginId, + ]; + $params['Signature'] = $this->createSign($params); + $params['Amount'] = $amount; + $params['Reward'] = $reward; + $res = doCurl($this->createUrl('setBalanceTransfer'), $params); + if ($res['code'] != $this->successCode) { + throw new GameException($this->failCode[$res['code']], 0); + } + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer($type, $amount, $reward, $res['data']['refId'] ?? ''); + + return $res; + } + + /** + * 依據時間獲取遊戲紀錄 + * MD5 (Id+Method+SN+StartTime+EndTime+APISecretKey) + * @param int $pageIndex + * @param string $startTime + * @param string $endTime + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function getGameRecordByTime(int $pageIndex = 1, string $startTime = '', string $endTime = '') + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetGameRecordByTime', + 'SN' => $this->appId, + 'StartTime' => $startTime, + 'EndTime' => $endTime, + ]; + $pageSize = 500; + $params['Signature'] = $this->createSign($params); + $params['PageSize'] = $pageSize; + $params['PageIndex'] = $pageIndex; + $res = doCurl($this->createUrl('getGameRecordByTime'), $params); + if ($res['code'] != $this->successCode) { + throw new GameException($this->failCode[$res['code']], 0); + } + + return $res; + } + + /** + * 獲取玩家遊戲歷史紀錄 + * MD5 (Id+Method+SN+APISecretKey) + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function getGameRecord() + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'GetGameRecord', + 'SN' => $this->appId, + ]; + $params['Signature'] = $this->createSign($params); + $res = doCurl($this->createUrl('getGameRecord'), $params); + if ($res['code'] != $this->successCode) { + throw new GameException($this->failCode[$res['code']], 0); + } + + return $res; + } + + /** + * 刪除遊戲紀錄 + * MD5 (Id+Method+SN+IdsToBeRemoved+APISecretKey) + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function removeRecords($idsToBeRemoved) + { + $params = [ + 'ID' => createOrderNo(), + 'Method' => 'RemoveRecords', + 'SN' => $this->appId, + 'IdsToBeRemoved' => implode(',', $idsToBeRemoved), + ]; + $params['Signature'] = $this->createSign($params); + $res = doCurl($this->createUrl('removeRecords'), $params); + if ($res['code'] != $this->successCode) { + throw new GameException($this->failCode[$res['code']], 0); + } + + return $res; + } +} \ No newline at end of file diff --git a/app/service/game/PragmaticServiceInterface.php b/app/service/game/PragmaticServiceInterface.php new file mode 100644 index 0000000..517c925 --- /dev/null +++ b/app/service/game/PragmaticServiceInterface.php @@ -0,0 +1,473 @@ + 'Casino', + '5' => 'Fishing', + '8' => 'Bingo', + '1' => 'Slot', + ]; + + public $localGameType = [ + '2' => '2',//赌场 + '5' => '4',//捕鱼 + '8' => '8',//宾果 + 'vs' => '1',//斯洛 + 'lg' => '5',//真人游戏 + ]; + + public $failCode = [ + 'S200' => '重復請求', + 'F0001' => '無效的簽名', + 'F0002' => '無效的SN', + 'F0003' => '無效的參數', + 'F0004' => '無效的貨幣', + 'F0005' => '玩家已存在', + 'F0006' => '玩家不存在', + 'F0007' => '會員不存在', + 'F0008' => '執行失敗', + 'F0009' => '無效的方法', + 'F0010' => '無效的用戶狀態', + 'F0011' => '玩家狀態無需更新', + 'F0012' => '超出數據範圍', + 'F0013' => '無匹配數據', + 'F0014' => '登入位置被禁止', + 'F0015' => '分數不足夠', + 'F0016' => '不支持禮碼', + 'F0017' => '交易流水號不得重複', + 'F0018' => '系統繁忙', + 'F0019' => '日期時間各式錯誤', + 'F0020' => '超出時間限制範圍(開始時間與結束時間之間不能大於120分鐘)', + 'F0021' => '執行取消', + 'M0001' => '系統維護', + 'M0002' => '系統錯誤', + ]; + + /** + * @param Player|null $player + * @param $type + * @throws Exception + */ + public function __construct($type, Player $player = null) + { + $config = config('game_platform.' . $type); + $this->apiDomain = $config['api_domain']; + $this->domain = $config['domain']; + $this->appId = $config['name']; + $this->secureLogin = $config['secure_login']; + $this->providerId = $config['provider_id']; + $this->appSecret = $config['app_secret']; + $this->platform = GamePlatform::query()->where('name', $type)->first(); + if (!empty($player)) { + $this->player = $player; + $this->getLoginId(); + } + } + + /** + * 生成请求url + * @param $method + * @return string + */ + public function createUrl($method): string + { + return $this->apiDomain.$method; + } + + public function createSign($params): string + { + ksort($params); + return md5(http_build_query($params, '', '&') . $this->appSecret); + } + + /** + * 更新游戏列表 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getSimpleGameList() + { + $params = [ + 'secureLogin' => $this->secureLogin, + ]; + $signature = $this->createSign($params); + $params['hash'] = $signature; + $result = doFormCurl($this->createUrl('/IntegrationService/v3/http/CasinoGameAPI/getCasinoGames/'), $params); + if ($result['error'] == 0 && !empty($result['gameList'])) { + foreach ($result['gameList'] as $game) { + if ($game['gameTypeID'] != 'vs') { + continue; + } + Game::query()->updateOrCreate( + [ + 'platform_id' => $this->platform->id, + 'game_code' => $game['gameID'], + ], + [ + 'platform_game_type' => $game['gameTypeID'], + 'game_type' => $this->localGameType[$game['gameTypeID']], + 'name' => $game['gameName'], +// 'game_image' => $this->apiDomain.'/gs2c/common/lobby/v1/apps/slots-lobby-assets/'.$game['gameID'].'/'.$game['gameID'].'_325x234_NB.png' + ] + ); + } + }else{ + throw new GameException($result['description'], 0); + } + return $result; + } + + /** + * 获取游戏列表 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getGamesList() + { + $params = [ + 'secureLogin' => $this->secureLogin, + ]; + $signature = $this->createSign($params); + $params['hash'] = $signature; + $result = doFormCurl($this->createUrl('/IntegrationService/v3/http/CasinoGameAPI/getCasinoGames/'), $params); + if ($result['error'] == 0 && !empty($result['gameList'])) { + return $result; + }else{ + throw new GameException($result['description'], 0); + } + } + + /** + * 获取玩家ID + * @throws Exception + */ + protected function getLoginId() + { + /** @var PlayerGamePlatform $playerGamePlatform */ + $playerGamePlatform = PlayerGamePlatform::query()->where('platform_id', $this->platform->id)->where('player_id',$this->player->id)->first(); + if (!empty($playerGamePlatform)) { + return $this->loginId = $playerGamePlatform->player_code; + } + return $this->createPlayer([ + 'uuid' => $this->player->uuid, + 'name' => $this->player->name, + ]); + } + + /** + * 创建玩家 + * @param array $data + * @return array|mixed|Response + * @throws GameException|Exception + */ + public function createPlayer(array $data = []) + { + $params = [ + 'secureLogin' => $this->secureLogin, + 'externalPlayerId' => $data['uuid'], + 'currency' => 'MYR', + ]; + $signature = $this->createSign($params); + $params['hash'] = $signature; + $result = doFormCurl($this->createUrl('/IntegrationService/v3/http/CasinoGameAPI/player/account/create/'), $params); + if ($result['error'] != 0 || empty($result['playerId'])) { + Log::error($result['description'], ['res' => $result]); + throw new GameException($result['description'], 0); + } + $playerGamePlatform = new PlayerGamePlatform(); + $playerGamePlatform->player_id = $this->player->id; + $playerGamePlatform->platform_id = $this->platform->id; + $playerGamePlatform->player_name = $data['name']; + $playerGamePlatform->player_code = $data['uuid']; + $playerGamePlatform->save(); + $this->loginId = $playerGamePlatform->player_code; + return $result; + } + + /** + * 获取玩家 + * @return false + * @throws Exception + */ + public function getPlayer(): bool + { + return false; + } + + /** + * 玩家进入游戏 + * @param array $data + * @return string + * @throws GameException|\think\Exception + */ + public function login(array $data = []): string + { + $params = [ + 'secureLogin' => $this->secureLogin, + 'externalPlayerId' => $this->loginId, + 'gameId' => $data['gameCode'], + 'language' => 'en', + ]; + $signature = $this->createSign($params); + $params['hash'] = $signature; + $result = doFormCurl($this->createUrl('/IntegrationService/v3/http/CasinoGameAPI/game/start/'), $params); + if ($result['error'] == 0 && !empty($result['gameURL'])) { + $link = $result['gameURL']; + }else{ + throw new GameException($result['description'], 0); + } + return $link; + } + + /** + * 获取玩家游戏平台余额 + * @return array|mixed|Response + * @throws GameException|\think\Exception + */ + public function getBalance() + { + $params = [ + 'secureLogin' => $this->secureLogin, + 'externalPlayerId' => $this->loginId, + ]; + $signature = $this->createSign($params); + $params['hash'] = $signature; + $result = doFormCurl($this->createUrl('/IntegrationService/v3/http/CasinoGameAPI/balance/current/'), $params); + if ($result['error'] != 0) { + throw new GameException('Pragmatic System Error,Please contact the administrator', 0); + } + return $result['balance']; + } + + /** + * 玩家钱包转入游戏平台 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferOut() + { + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_OUT, $this->player->wallet->money); + } + + /** + * 游戏平台转入玩家钱包 + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + public function balanceTransferIn() + { + $balance = $this->getBalance(); + if($balance == 0){ + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer(PlayerWalletTransfer::TYPE_IN, 0, 0); + return true; + } + return $this->setBalanceTransfer(PlayerWalletTransfer::TYPE_IN, $balance ? -$balance : 0); + } + + /** + * 轉帳進出額度 + * @param $type + * @param float $amount + * @param float $reward + * @return array|mixed|null + * @throws GameException|\think\Exception + */ + protected function setBalanceTransfer($type, float $amount = 0, float $reward = 0) + { + $params = [ + 'secureLogin' => $this->secureLogin, + 'externalPlayerId' => $this->loginId, + 'externalTransactionId' => createOrderNo(), + 'amount' => $amount, + ]; + $signature = $this->createSign($params); + $params['hash'] = $signature; + $result = doFormCurl($this->createUrl('/IntegrationService/v3/http/CasinoGameAPI/balance/transfer/'), $params); + if ($result['error'] != 0) { + throw new GameException($result['description'], 0); + } + // 记录玩家钱包转出转入记录 + $this->createWalletTransfer($type, $amount, $reward, $result['transactionId'] ?? ''); + return $result; + } + + /** + * 转账记录 + * @param $startTime + * @return array|mixed|null + * @throws GameException + * @throws \think\Exception + */ + protected function transferTransactions($startTime) + { + $params = [ + 'secureLogin' => $this->secureLogin, + //'timepoint' => $startTime ?? round(microtime(true) * 1000), + ]; + $signature = $this->createSign($params); + $params['hash'] = $signature; + $result = doFormCurl($this->createUrl('/IntegrationService/v3/http/CasinoGameAPI/balance/transfer/transactions/'), $params); + if ($result['error'] != 0) { + throw new GameException($result['description'], 0); + } + return $result; + } + /** + * 踢出游戏 + * @return array|mixed|Response + * @throws GameException|Exception + */ + public function terminateSession() + { + $params = [ + 'secureLogin' => $this->secureLogin, + 'externalPlayerId' => $this->loginId, + ]; + $signature = $this->createSign($params); + $params['hash'] = $signature; + $result = doFormCurl($this->createUrl('/IntegrationService/v3/http/CasinoGameAPI/game/session/terminate'), $params); + if ($result['error'] == 0) { + throw new GameException($result['description'], 0); + } + return $result; + } + + /** + * 重播链接 + * @return array|mixed|Response + * @throws GameException|Exception + */ + public function replayLink($roundId) + { + $params = [ + 'secureLogin' => $this->secureLogin, + 'externalPlayerId' => $this->loginId, + 'roundId' => $roundId, + ]; + $signature = $this->createSign($params); + $params['hash'] = $signature; + $result = doFormCurl($this->createUrl('/IntegrationService/v3/http/ReplayAPI/getSharedLink'), $params); + if ($result['error'] == 0) { + throw new GameException($result['description'], 0); + } + return $result; + } + + /** + * 查询游戏纪录 + * @return array + */ + public function getGameRecordList(): array + { + $params = [ + 'login' => $this->secureLogin, + 'password' => $this->appSecret, + 'timepoint' => round(microtime(true) * 1000) - 90000, + ]; + $query = http_build_query($params, '', '&'); + $url = $this->createUrl('/IntegrationService/v3/DataFeeds/gamerounds/finished/?' . $query); + $response = Http::timeout(10)->get($url); + $result = $response->body(); + return $this->parseCustomCsv($result); + } + + /** + * CSV转数组 + * @param $input + * @return array + */ + public function parseCustomCsv($input): array + { + $lines = explode("\n", trim($input)); // 分割为行数组 + + // 解析timepoint + $timepoint = (int) substr($lines[0], strpos($lines[0], '=') + 1); + array_shift($lines); // 移除timepoint行 + + // 处理CSV部分 + $header = str_getcsv(array_shift($lines)); // 获取标题行 + $result = [ + 'timepoint' => $timepoint, + 'data' => [] + ]; + + foreach ($lines as $line) { + $row = str_getcsv($line); + if (count($row) !== count($header)) continue; // 跳过列数不匹配的行 + + // 组合关联数组并转换数据类型 + $entry = array_combine($header, array_map(function($value) { + if ($value === 'null') return null; // 转换null字符串 + if (is_numeric($value)) { // 转换数字类型 + return (strpos($value, '.') !== false) ? (float)$value : (int)$value; + } + return $value; + }, $row)); + + $result['data'][] = $entry; + } + + return $result; + } + + /** + * 查询玩家游戏记录 + * @return array + */ + public function handleOrderHistories(): array + { + try { + $list = []; + $data = $this->getGameRecordList(); + if (!empty($data['data'])) { + foreach ($data['data'] as $item) { + $list[] = [ + 'uuid' => $item['extPlayerID'], + 'platform_id' => $this->platform->id, + 'game_code' => $item['gameID'], + 'bet' => $item['bet'], + 'win' => $item['win'], + 'order_no' => $item['playSessionID'], + 'original_data' => json_encode($item,JSON_UNESCAPED_UNICODE), + 'platform_action_at' => date('Y-m-d H:i:s', strtotime($item['endDate'])), + 'game_type' => 'vs', + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + ]; + + } + } + } catch (Exception $e) { + return []; + } + + return $list; + } + +} \ No newline at end of file diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..3433957 --- /dev/null +++ b/composer.json @@ -0,0 +1,82 @@ +{ + "name": "workerman/webman", + "type": "project", + "keywords": [ + "high performance", + "http service" + ], + "homepage": "https://www.workerman.net", + "license": "MIT", + "description": "High performance HTTP Service Framework.", + "authors": [ + { + "name": "walkor", + "email": "walkor@workerman.net", + "homepage": "https://www.workerman.net", + "role": "Developer" + } + ], + "support": { + "email": "walkor@workerman.net", + "issues": "https://github.com/walkor/webman/issues", + "forum": "https://wenda.workerman.net/", + "wiki": "https://workerman.net/doc/webman", + "source": "https://github.com/walkor/webman" + }, + "require": { + "php": ">=7.2", + "workerman/webman-framework": "^1.5.0", + "monolog/monolog": "^2.0", + "rockys/ex-admin-webman": "^1.0", + "ext-pdo": "*", + "zjkal/time-helper": "^1.1", + "psr/container": "1.1.1", + "ext-json": "*", + "gitfei1231/webman-api-sign": "^0.0.21", + "workerman/validation": "^3.0", + "symfony/translation": "^5.4", + "webman/event": "^1.0", + "tinywan/jwt": "^1.6", + "php-di/php-di": "6", + "doctrine/annotations": "1.14", + "webman-tech/laravel-http-client": "^1.1", + "workbunny/webman-ip-attribution": "^1.0", + "workerman/crontab": "^1.0", + "webman/push": "^1.0", + "ext-bcmath": "*", + "yzh52521/webman-lock": "^1.0", + "robmorgan/phinx": "^0.14.0", + "ext-simplexml": "*", + "webman/log": "^1.1", + "webman/redis-queue": "^1.2", + "illuminate/database": "^8.83", + "facebook/graph-sdk": "^5.1", + "ext-zip": "*", + "endroid/qr-code": "^4.6" + }, + "suggest": { + "ext-event": "For better performance. " + }, + "autoload": { + "psr-4": { + "": "./", + "app\\": "./app", + "App\\": "./app", + "app\\View\\Components\\": "./app/view/components" + }, + "files": [ + "./support/helpers.php" + ] + }, + "scripts": { + "post-package-install": [ + "support\\Plugin::install" + ], + "post-package-update": [ + "support\\Plugin::install" + ], + "pre-package-uninstall": [ + "support\\Plugin::uninstall" + ] + } +} diff --git a/config/admin_node.php b/config/admin_node.php new file mode 100644 index 0000000..8458af5 --- /dev/null +++ b/config/admin_node.php @@ -0,0 +1,588 @@ + 'addons\webman\controller\AdminController\updatePassword', + 'pid' => 0, + 'action' => 'updatePassword', + 'method' => '', + 'group' => 'all', + 'url' => 'ex-admin/addons-webman-controller-AdminController/updatePassword', + 'title' => '修改密码', + ], + [ + 'id' => 'addons\webman\controller\AdminController\editInfo', + 'pid' => 0, + 'action' => 'editInfo', + 'method' => '', + 'group' => 'all', + 'url' => 'ex-admin/addons-webman-controller-AdminController/editInfo', + 'title' => '个人信息', + ], + [ + 'id' => 'addons\webman\controller\AdminController\resetPassword', + 'pid' => 0, + 'action' => 'resetPassword', + 'method' => '', + 'group' => 'all', + 'url' => 'ex-admin/addons-webman-controller-AdminController/resetPassword', + 'title' => '重置密码', + ], + [ + 'id' => 'addons\webman\controller\IndexController\index', + 'pid' => 0, + 'action' => 'index', + 'method' => 'get', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-IndexController/index', + 'title' => '数据中心', + ], + // 权限管理 + [ + 'id' => 'addons\webman\controller\AdminController-', + 'pid' => 0, + 'url' => '', + 'group' => 'department', + 'title' => '权限管理', + 'children' => [] + ], + // 用户管理 + [ + 'id' => 'addons\webman\controller\AdminController\index', + 'pid' => 'addons\webman\controller\AdminController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-AdminController/index', + 'title' => '用户管理', + ], + [ + 'id' => 'addons\webman\controller\AdminController\index-delete', + 'pid' => 'addons\webman\controller\AdminController\index', + 'action' => 'index', + 'method' => 'delete', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-AdminController/index', + 'title' => '删除系统用户', + ], + [ + 'id' => 'addons\webman\controller\AdminController\form-post', + 'pid' => 'addons\webman\controller\AdminController\index', + 'action' => 'form', + 'method' => 'post', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-AdminController/form', + 'title' => '系统用户添加', + ], + [ + 'id' => 'addons\webman\controller\AdminController\form-put', + 'pid' => 'addons\webman\controller\AdminController\index', + 'action' => 'form', + 'method' => 'put', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-AdminController/form', + 'title' => '系统用户修改', + ], + // 角色管理 + [ + 'id' => 'addons\webman\controller\RoleController\index', + 'pid' => 'addons\webman\controller\AdminController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-RoleController/index', + 'title' => '角色管理', + ], + [ + 'id' => 'addons\webman\controller\RoleController\index-delete', + 'pid' => 'addons\webman\controller\RoleController\index', + 'action' => 'index', + 'method' => 'delete', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-RoleController/index', + 'title' => '删除系统角色', + ], + [ + 'id' => 'addons\webman\controller\RoleController\form-post', + 'pid' => 'addons\webman\controller\RoleController\index', + 'action' => 'form', + 'method' => 'post', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-RoleController/form', + 'title' => '添加系统角色', + ], + [ + 'id' => 'addons\webman\controller\RoleController\form-put', + 'pid' => 'addons\webman\controller\RoleController\index', + 'action' => 'form', + 'method' => 'put', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-RoleController/form', + 'title' => '编辑系统角色', + ], + [ + 'id' => 'addons\webman\controller\RoleController\data', + 'pid' => 'addons\webman\controller\RoleController\index', + 'action' => 'data', + 'method' => '', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-RoleController/data', + 'title' => '数据权限', + ], + [ + 'id' => 'addons\webman\controller\RoleController\menu-post', + 'pid' => 'addons\webman\controller\RoleController\index', + 'action' => 'menu', + 'method' => 'post', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-RoleController/menu', + 'title' => '添加菜单权限', + ], + [ + 'id' => 'addons\webman\controller\RoleController\menu-put', + 'pid' => 'addons\webman\controller\RoleController\index', + 'action' => 'menu', + 'method' => 'put', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-RoleController/menu', + 'title' => '编辑菜单权限', + ], + [ + 'id' => 'addons\webman\controller\RoleController\auth-post', + 'pid' => 'addons\webman\controller\RoleController\index', + 'action' => 'auth', + 'method' => 'post', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-RoleController/auth', + 'title' => '添加功能权限', + ], + [ + 'id' => 'addons\webman\controller\RoleController\auth-put', + 'pid' => 'addons\webman\controller\RoleController\index', + 'action' => 'auth', + 'method' => 'put', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-RoleController/auth', + 'title' => '编辑功能权限', + ], + //菜单管理 + [ + 'id' => 'addons\webman\controller\MenuController\index', + 'pid' => 'addons\webman\controller\AdminController-', + 'action' => 'index', + 'method' => '', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-MenuController/index', + 'title' => '菜单管理', + ], + [ + 'id' => 'addons\webman\controller\MenuController\form-post', + 'pid' => 'addons\webman\controller\MenuController\index', + 'action' => 'form', + 'method' => 'post', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-MenuController/form', + 'title' => '添加系统菜单', + ], + [ + 'id' => 'addons\webman\controller\MenuController\form-put', + 'pid' => 'addons\webman\controller\MenuController\index', + 'action' => 'form', + 'method' => 'put', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-MenuController/form', + 'title' => '编辑系统菜单', + ], + //部门管理 + [ + 'id' => 'addons\webman\controller\DepartmentController\index', + 'pid' => 'addons\webman\controller\AdminController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-DepartmentController/index', + 'title' => '部门管理', + ], + [ + 'id' => 'addons\webman\controller\DepartmentController\index-delete', + 'pid' => 'addons\webman\controller\DepartmentController\index', + 'action' => 'index', + 'method' => 'delete', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-DepartmentController/index', + 'title' => '删除部门', + ], + [ + 'id' => 'addons\webman\controller\DepartmentController\form-post', + 'pid' => 'addons\webman\controller\DepartmentController\index', + 'action' => 'form', + 'method' => 'post', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-DepartmentController/form', + 'title' => '添加部门', + ], + [ + 'id' => 'addons\webman\controller\DepartmentController\form-put', + 'pid' => 'addons\webman\controller\DepartmentController\index', + 'action' => 'form', + 'method' => 'put', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-DepartmentController/form', + 'title' => '编辑部门', + ], + //岗位管理 + [ + 'id' => 'addons\webman\controller\PostController\index', + 'pid' => 'addons\webman\controller\AdminController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-PostController/index', + 'title' => '岗位管理', + ], + [ + 'id' => 'addons\webman\controller\PostController\index-delete', + 'pid' => 'addons\webman\controller\PostController\index', + 'action' => 'index', + 'method' => 'delete', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-PostController/index', + 'title' => '删除岗位', + ], + [ + 'id' => 'addons\webman\controller\PostController\form-post', + 'pid' => 'addons\webman\controller\PostController\index', + 'action' => 'form', + 'method' => 'post', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-PostController/form', + 'title' => '添加岗位', + ], + [ + 'id' => 'addons\webman\controller\PostController\form-put', + 'pid' => 'addons\webman\controller\PostController\index', + 'action' => 'form', + 'method' => 'put', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-PostController/form', + 'title' => '编辑岗位', + ], + //玩家管理 + [ + 'id' => 'addons\webman\controller\PlayerController-', + 'pid' => 0, + 'url' => '', + 'group' => 'department', + 'title' => '玩家管理', + 'children' => [] + ], + [ + 'id' => 'addons\webman\controller\PlayerDeliveryRecordController\index', + 'pid' => 'addons\webman\controller\PlayerController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-PlayerController/index', + 'title' => '账变记录', + ], + [ + 'id' => 'addons\webman\controller\PlayerController\index', + 'pid' => 'addons\webman\controller\PlayerController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-PlayerController/index', + 'title' => '玩家列表', + ], + [ + 'id' => 'addons\webman\controller\PlayerController\artificialWithdrawal', + 'pid' => 'addons\webman\controller\PlayerController\index', + 'action' => 'artificialWithdrawal', + 'method' => '', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-PlayerController/artificialWithdrawal', + 'title' => '人工提现' + ], + [ + 'id' => 'addons\webman\controller\PlayerController\artificialRecharge', + 'pid' => 'addons\webman\controller\PlayerController\index', + 'action' => 'artificialRecharge', + 'method' => '', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-PlayerController/artificialRecharge', + 'title' => '人工充值' + ], + [ + 'id' => 'addons\webman\controller\PlayerController\index-delete', + 'pid' => 'addons\webman\controller\PlayerController\index', + 'action' => 'index', + 'method' => 'delete', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-PlayerController/index', + 'title' => '删除玩家', + ], + [ + 'id' => 'addons\webman\controller\PlayerController\form-post', + 'pid' => 'addons\webman\controller\PlayerController\index', + 'action' => 'form', + 'method' => 'post', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-PlayerController/form', + 'title' => '添加玩家', + ], + [ + 'id' => 'addons\webman\controller\PlayerController\form-put', + 'pid' => 'addons\webman\controller\PlayerController\index', + 'action' => 'form', + 'method' => 'put', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-PlayerController/form', + 'title' => '编辑玩家', + ], + [ + 'id' => 'addons\webman\controller\PlayerController\resetPassword', + 'pid' => 'addons\webman\controller\PlayerController\index', + 'action' => 'resetPassword', + 'method' => '', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-PlayerController/resetPassword', + 'title' => '重置密码', + ], + [ + 'id' => 'addons\webman\controller\PlayerController\playerWallet', + 'pid' => 'addons\webman\controller\PlayerController\index', + 'action' => 'playerWallet', + 'method' => '', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-PlayerController/playerWallet', + 'title' => '玩家钱包', + ], + [ + 'id' => 'addons\webman\controller\PlayerController\playerRecord', + 'pid' => 'addons\webman\controller\PlayerController\index', + 'action' => 'playerRecord', + 'method' => '', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-PlayerController/playerRecord', + 'title' => '钱包记录', + ], + //渠道管理 + [ + 'id' => 'addons\webman\controller\ChannelController-', + 'pid' => 0, + 'url' => '', + 'group' => 'department', + 'title' => '渠道管理', + 'children' => [] + ], + [ + 'id' => 'addons\webman\controller\CurrencyController\index', + 'pid' => 'addons\webman\controller\ChannelController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-CurrencyController/index', + 'title' => '货币列表', + ], + [ + 'id' => 'addons\webman\controller\CurrencyController\form-post', + 'pid' => 'addons\webman\controller\CurrencyController\index', + 'action' => 'form', + 'method' => 'post', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-CurrencyController/form', + 'title' => '添加货币', + ], + [ + 'id' => 'addons\webman\controller\CurrencyController\form-put', + 'pid' => 'addons\webman\controller\CurrencyController\index', + 'action' => 'form', + 'method' => 'put', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-CurrencyController/form', + 'title' => '编辑货币', + ], + [ + 'id' => 'addons\webman\controller\ChannelController\index', + 'pid' => 'addons\webman\controller\ChannelController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-ChannelController/index', + 'title' => '渠道列表', + ], + [ + 'id' => 'addons\webman\controller\ChannelController\index-delete', + 'pid' => 'addons\webman\controller\ChannelController\index', + 'action' => 'index', + 'method' => 'delete', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-ChannelController/index', + 'title' => '删除渠道', + ], + [ + 'id' => 'addons\webman\controller\ChannelController\form-post', + 'pid' => 'addons\webman\controller\ChannelController\index', + 'action' => 'form', + 'method' => 'post', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-ChannelController/form', + 'title' => '添加渠道', + ], + [ + 'id' => 'addons\webman\controller\ChannelController\form-put', + 'pid' => 'addons\webman\controller\ChannelController\index', + 'action' => 'form', + 'method' => 'put', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-ChannelController/form', + 'title' => '编辑渠道', + ], + //客户端管理 + [ + 'id' => 'addons\webman\controller\AnnouncementController-', + 'pid' => 0, + 'url' => '', + 'group' => 'department', + 'title' => '客户端管理', + 'children' => [] + ], + [ + 'id' => 'addons\webman\controller\SystemSettingController\index', + 'pid' => 'addons\webman\controller\AnnouncementController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-SystemSettingController/form', + 'title' => '系统设置', + ], + [ + 'id' => 'addons\webman\controller\AnnouncementController\index', + 'pid' => 'addons\webman\controller\AnnouncementController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-AnnouncementController/index', + 'title' => '公告列表', + ], + [ + 'id' => 'addons\webman\controller\AnnouncementController\index-delete', + 'pid' => 'addons\webman\controller\AnnouncementController\index', + 'action' => 'index', + 'method' => 'delete', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-AnnouncementController/index', + 'title' => '删除公告', + ], + [ + 'id' => 'addons\webman\controller\AnnouncementController\form-post', + 'pid' => 'addons\webman\controller\AnnouncementController\index', + 'action' => 'form', + 'method' => 'post', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-AnnouncementController/form', + 'title' => '添加公告', + ], + [ + 'id' => 'addons\webman\controller\AnnouncementController\form-put', + 'pid' => 'addons\webman\controller\AnnouncementController\index', + 'action' => 'form', + 'method' => 'put', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-AnnouncementController/form', + 'title' => '编辑公告', + ], + [ + 'id' => 'addons\webman\controller\SliderController\index', + 'pid' => 'addons\webman\controller\AnnouncementController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-SliderController/index', + 'title' => '轮播图列表', + ], + [ + 'id' => 'addons\webman\controller\SliderController\index-delete', + 'pid' => 'addons\webman\controller\SliderController\index', + 'action' => 'index', + 'method' => 'delete', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-SliderController/index', + 'title' => '删除轮播图', + ], + [ + 'id' => 'addons\webman\controller\SliderController\form-post', + 'pid' => 'addons\webman\controller\SliderController\index', + 'action' => 'form', + 'method' => 'post', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-SliderController/form', + 'title' => '添加轮播图', + ], + [ + 'id' => 'addons\webman\controller\SliderController\form-put', + 'pid' => 'addons\webman\controller\SliderController\index', + 'action' => 'form', + 'method' => 'put', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-SliderController/form', + 'title' => '编辑轮播图', + ], + //系统管理 + [ + 'id' => 'addons\webman\controller\ConfigController-', + 'pid' => 0, + 'url' => '', + 'group' => 'department', + 'title' => '系统管理', + 'children' => [] + ], + [ + 'id' => 'addons\webman\controller\ConfigController\form-get', + 'pid' => 'addons\webman\controller\ConfigController-', + 'action' => 'form', + 'method' => 'get', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-ConfigController/form', + 'title' => '查看系统配置', + ], + [ + 'id' => 'addons\webman\controller\ConfigController\form-post', + 'pid' => 'addons\webman\controller\ConfigController-', + 'action' => 'form', + 'method' => 'post', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-ConfigController/form', + 'title' => '编辑系统配置', + ], + [ + 'id' => 'addons\webman\controller\AttachmentController\index', + 'pid' => 'addons\webman\controller\ConfigController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-AttachmentController/index', + 'title' => '附件列表', + ], + [ + 'id' => 'addons\webman\controller\AttachmentController\index-delete', + 'pid' => 'addons\webman\controller\AttachmentController\index', + 'action' => 'index', + 'method' => 'delete', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-AttachmentController/index', + 'title' => '删除附件', + ], + [ + 'id' => 'addons\webman\controller\AttachmentController\cate', + 'pid' => 'addons\webman\controller\AttachmentController\index', + 'action' => 'cate', + 'method' => '', + 'group' => 'department', + 'url' => 'ex-admin/addons-webman-controller-AttachmentController/index', + 'title' => '附件分类', + ], +]; diff --git a/config/app.php b/config/app.php new file mode 100644 index 0000000..4078e5f --- /dev/null +++ b/config/app.php @@ -0,0 +1,29 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use support\Request; + +return [ + 'debug' => env('APP_DEBUG', true), + 'error_reporting' => E_ALL, + 'default_timezone' => 'Asia/Shanghai', + 'request_class' => Request::class, + 'public_path' => base_path() . DIRECTORY_SEPARATOR . 'public', + 'runtime_path' => base_path(false) . DIRECTORY_SEPARATOR . 'runtime', + 'controller_suffix' => 'Controller', + 'controller_reuse' => false, + 'currency' => env('currency', 'TWD'), + 'env' => env('APP_ENV', 'pro'), + 'profit' => 'task', // 分润结算模式(task任务模式每天结算前天, event事件模式实时结算) +]; \ No newline at end of file diff --git a/config/autoload.php b/config/autoload.php new file mode 100644 index 0000000..69a8135 --- /dev/null +++ b/config/autoload.php @@ -0,0 +1,21 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + 'files' => [ + base_path() . '/app/functions.php', + base_path() . '/support/Request.php', + base_path() . '/support/Response.php', + ] +]; diff --git a/config/bootstrap.php b/config/bootstrap.php new file mode 100644 index 0000000..6bcb734 --- /dev/null +++ b/config/bootstrap.php @@ -0,0 +1,20 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + support\bootstrap\Session::class, + support\bootstrap\LaravelDb::class, + Webman\ThinkOrm\ThinkOrm::class, + Webman\ThinkCache\ThinkCache::class, +]; diff --git a/config/channel_node.php b/config/channel_node.php new file mode 100644 index 0000000..0486693 --- /dev/null +++ b/config/channel_node.php @@ -0,0 +1,502 @@ + 'addons\webman\controller\ChannelIndexController\index', + 'pid' => 0, + 'action' => 'index', + 'method' => '', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelIndexController/index', + 'title' => '数据中心', + ], + + //用户管理 + [ + 'id' => 'addons\webman\controller\ChannelAdminController-', + 'pid' => 0, + 'url' => '', + 'group' => 'channel', + 'title' => '权限管理', + 'children' => [] + ], + [ + 'id' => 'addons\webman\controller\ChannelAdminController\index', + 'pid' => 'addons\webman\controller\ChannelAdminController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelAdminController/index', + 'title' => '系统用户列表', + ], + [ + 'id' => 'addons\webman\controller\ChannelAdminController\index-delete', + 'pid' => 'addons\webman\controller\ChannelAdminController\index', + 'action' => 'index', + 'method' => 'delete', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelAdminController/index', + 'title' => '删除系统用户', + ], + [ + 'id' => 'addons\webman\controller\ChannelAdminController\resetPassword', + 'pid' => 'addons\webman\controller\ChannelAdminController\index', + 'action' => 'resetPassword', + 'method' => 'post', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelAdminController/resetPassword', + 'title' => '重置密码', + ], + [ + 'id' => 'addons\webman\controller\ChannelAdminController\form-post', + 'pid' => 'addons\webman\controller\ChannelAdminController\index', + 'action' => 'form', + 'method' => 'post', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelAdminController/form', + 'title' => '添加系统用户', + ], + [ + 'id' => 'addons\webman\controller\ChannelAdminController\form-put', + 'pid' => 'addons\webman\controller\ChannelAdminController\index', + 'action' => 'form', + 'method' => 'put', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelAdminController/form', + 'title' => '编辑系统用户', + ], + [ + 'id' => 'addons\webman\controller\ChannelPostController\index', + 'pid' => 'addons\webman\controller\ChannelAdminController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelPostController/index', + 'title' => '岗位列表', + ], + [ + 'id' => 'addons\webman\controller\ChannelPostController\index-delete', + 'pid' => 'addons\webman\controller\ChannelPostController\index', + 'action' => 'index', + 'method' => 'delete', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelPostController/index', + 'title' => '删除岗位', + ], + [ + 'id' => 'addons\webman\controller\ChannelPostController\form-post', + 'pid' => 'addons\webman\controller\ChannelPostController\index', + 'action' => 'form', + 'method' => 'post', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelPostController/form', + 'title' => '添加岗位', + ], + [ + 'id' => 'addons\webman\controller\ChannelPostController\form-put', + 'pid' => 'addons\webman\controller\ChannelPostController\index', + 'action' => 'form', + 'method' => 'put', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelPostController/form', + 'title' => '编辑岗位', + ], + // 渠道玩家质料修改日志 + [ + 'id' => 'addons\webman\controller\ChannelPlayerEditLogController-', + 'pid' => 0, + 'url' => '', + 'group' => 'channel', + 'title' => '日志中心', + 'children' => [] + ], + [ + 'id' => 'addons\webman\controller\ChannelPlayerEditLogController\index', + 'pid' => 'addons\webman\controller\ChannelPlayerEditLogController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelPlayerEditLogController/index', + 'title' => '玩家质料修改日志', + ], + [ + 'id' => 'addons\webman\controller\ChannelPlayerMoneyEditLogController\index', + 'pid' => 'addons\webman\controller\ChannelPlayerEditLogController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelPlayerMoneyEditLogController/index', + 'title' => '玩家钱包操作日志', + ], + //玩家管理 + [ + 'id' => 'addons\webman\controller\ChannelPlayerController-', + 'pid' => 0, + 'url' => '', + 'group' => 'channel', + 'title' => '玩家管理', + 'children' => [] + ], + [ + 'id' => 'addons\webman\controller\ChannelPlayerController\index', + 'pid' => 'addons\webman\controller\ChannelPlayerController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelPlayerController/index', + 'title' => '玩家列表', + ], + [ + 'id' => 'addons\webman\controller\ChannelPlayerController\form-post', + 'pid' => 'addons\webman\controller\ChannelPlayerController\index', + 'action' => 'form', + 'method' => 'post', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelPlayerController/form', + 'title' => '添加玩家', + ], + [ + 'id' => 'addons\webman\controller\ChannelPlayerController\form-put', + 'pid' => 'addons\webman\controller\ChannelPlayerController\index', + 'action' => 'form', + 'method' => 'put', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelPlayerController/form', + 'title' => '编辑玩家', + ], + [ + 'id' => 'addons\webman\controller\ChannelPlayerController\index-delete', + 'pid' => 'addons\webman\controller\ChannelPlayerController\index', + 'action' => 'index', + 'method' => 'delete', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelPlayerController/index', + 'title' => '删除玩家', + ], + [ + 'id' => 'addons\webman\controller\ChannelPlayerController\playerRecord', + 'pid' => 'addons\webman\controller\ChannelPlayerController\index', + 'action' => 'playerRecord', + 'method' => '', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelPlayerController/playerRecord', + 'title' => '钱包余额-查看记录', + ], + [ + 'id' => 'addons\webman\controller\ChannelPlayerController\playerWallet', + 'pid' => 'addons\webman\controller\ChannelPlayerController\index', + 'action' => 'playerWallet', + 'method' => '', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelPlayerController/playerWallet', + 'title' => '玩家钱包', + ], + [ + 'id' => 'addons\webman\controller\ChannelPlayerController\artificialWithdrawal', + 'pid' => 'addons\webman\controller\ChannelPlayerController\index', + 'action' => 'artificialWithdrawal', + 'method' => '', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelPlayerController/artificialWithdrawal', + 'title' => '人工提现', + ], + [ + 'id' => 'addons\webman\controller\ChannelPlayerController\artificialRecharge', + 'pid' => 'addons\webman\controller\ChannelPlayerController\index', + 'action' => 'artificialRecharge', + 'method' => '', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelPlayerController/artificialRecharge', + 'title' => '人工充值', + ], + [ + 'id' => 'addons\webman\controller\ChannelPlayerDeliveryRecordController\index', + 'pid' => 'addons\webman\controller\ChannelPlayerController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelPlayerDeliveryRecordController/index', + 'title' => '账变记录', + ], + //轮播图管理 + [ + 'id' => 'addons\webman\controller\ChannelSliderController-', + 'pid' => 0, + 'url' => '', + 'group' => 'channel', + 'title' => '客户端管理', + 'children' => [] + ], + [ + 'id' => 'addons\webman\controller\ChannelSliderController\index', + 'pid' => 'addons\webman\controller\ChannelSliderController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelSliderController/index', + 'title' => '轮播图列表', + ], + [ + 'id' => 'addons\webman\controller\ChannelSliderController\index-delete', + 'pid' => 'addons\webman\controller\ChannelSliderController\index', + 'action' => 'index', + 'method' => 'delete', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelSliderController/index', + 'title' => '删除轮播图', + ], + [ + 'id' => 'addons\webman\controller\ChannelSliderController\form-post', + 'pid' => 'addons\webman\controller\ChannelSliderController\index', + 'action' => 'form', + 'method' => 'post', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelSliderController/form', + 'title' => '添加轮播图', + ], + [ + 'id' => 'addons\webman\controller\ChannelSliderController\form-put', + 'pid' => 'addons\webman\controller\ChannelSliderController\index', + 'action' => 'form', + 'method' => 'put', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelSliderController/form', + 'title' => '编辑轮播图', + ], + [ + 'id' => 'addons\webman\controller\ChannelMarqueeController\index', + 'pid' => 'addons\webman\controller\ChannelSliderController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelMarqueeController/index', + 'title' => '跑马灯列表', + ], + [ + 'id' => 'addons\webman\controller\ChannelAnnouncementController\index', + 'pid' => 'addons\webman\controller\ChannelSliderController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelAnnouncementController/index', + 'title' => '公告列表', + ], + [ + 'id' => 'addons\webman\controller\ChannelAnnouncementController\index-delete', + 'pid' => 'addons\webman\controller\ChannelAnnouncementController\index', + 'action' => 'index', + 'method' => 'delete', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelAnnouncementController/index', + 'title' => '删除公告', + ], + [ + 'id' => 'addons\webman\controller\ChannelAnnouncementController\form-post', + 'pid' => 'addons\webman\controller\ChannelAnnouncementController\index', + 'action' => 'form', + 'method' => 'post', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelAnnouncementController/form', + 'title' => '添加公告', + ], + [ + 'id' => 'addons\webman\controller\ChannelAnnouncementController\form-put', + 'pid' => 'addons\webman\controller\ChannelAnnouncementController\index', + 'action' => 'form', + 'method' => 'put', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelAnnouncementController/form', + 'title' => '编辑公告', + ], + //财务管理 + [ + 'id' => 'addons\webman\controller\ChannelRechargeRecordController-', + 'pid' => 0, + 'url' => '', + 'group' => 'channel', + 'title' => '财务管理', + 'children' => [] + ], + [ + 'id' => 'addons\webman\controller\ChannelWithdrawRecordController\index', + 'pid' => 'addons\webman\controller\ChannelRechargeRecordController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelWithdrawRecordController/index', + 'title' => '提现记录', + ], + [ + 'id' => 'addons\webman\controller\ChannelRechargeController\index', + 'pid' => 'addons\webman\controller\ChannelRechargeRecordController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelRechargeController/index', + 'title' => '充值渠道配置', + ], + [ + 'id' => 'addons\webman\controller\ChannelRechargeController\methodForm-post', + 'pid' => 'addons\webman\controller\ChannelRechargeController\index', + 'action' => 'methodForm', + 'method' => 'post', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelRechargeController/methodForm', + 'title' => '添加充值方式', + ], + [ + 'id' => 'addons\webman\controller\ChannelRechargeController\methodForm', + 'pid' => 'addons\webman\controller\ChannelRechargeController\index', + 'action' => 'methodForm', + 'method' => '', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelRechargeController/methodForm', + 'title' => '编辑充值方式', + ], + [ + 'id' => 'addons\webman\controller\ChannelRechargeController\form', + 'pid' => 'addons\webman\controller\ChannelRechargeController\index', + 'action' => 'form', + 'method' => '', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelRechargeController/form', + 'title' => '添加充值账户', + ], + [ + 'id' => 'addons\webman\controller\ChannelRechargeController\speedPayList', + 'pid' => 'addons\webman\controller\ChannelRechargeRecordController-', + 'action' => 'speedPayList', + 'method' => 'get', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelRechargeController/speedPayList', + 'title' => '在线充值', + ], + [ + 'id' => 'addons\webman\controller\ChannelRechargeController\addSpeedPay', + 'pid' => 'addons\webman\controller\ChannelRechargeRecordController-', + 'action' => 'addSpeedPay', + 'method' => '', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelRechargeController/addSpeedPay', + 'title' => '在线充值配置', + ], + [ + 'id' => 'addons\webman\controller\ChannelRechargeRecordController\index', + 'pid' => 'addons\webman\controller\ChannelRechargeRecordController-', + 'action' => 'index', + 'method' => 'get', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelRechargeRecordController/index', + 'title' => '充值记录', + ], + [ + 'id' => 'addons\webman\controller\ChannelRechargeRecordController\examineList', + 'pid' => 'addons\webman\controller\ChannelRechargeRecordController-', + 'action' => 'examineList', + 'method' => 'get', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelRechargeRecordController/examineList', + 'title' => '充值审核', + ], + [ + 'id' => 'addons\webman\controller\ChannelRechargeRecordController\reject', + 'pid' => 'addons\webman\controller\ChannelRechargeRecordController\examineList', + 'action' => 'reject', + 'method' => '', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelRechargeRecordController/reject', + 'title' => '审核拒绝', + ], + [ + 'id' => 'addons\webman\controller\ChannelRechargeRecordController\pass', + 'pid' => 'addons\webman\controller\ChannelRechargeRecordController\examineList', + 'action' => 'pass', + 'method' => '', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelRechargeRecordController/pass', + 'title' => '审核通过', + ], + [ + 'id' => 'addons\webman\controller\ChannelRechargeRecordController\rechargeCertificate', + 'pid' => 'addons\webman\controller\ChannelRechargeRecordController\examineList', + 'action' => 'rechargeCertificate', + 'method' => '', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelRechargeRecordController/rechargeCertificate', + 'title' => '查看付款凭证', + ], + [ + 'id' => 'addons\webman\controller\ChannelRechargeRecordController\rechargeSetting', + 'pid' => 'addons\webman\controller\ChannelRechargeRecordController\examineList', + 'action' => 'rechargeSetting', + 'method' => '', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelRechargeRecordController/rechargeSetting', + 'title' => '查看充值账号配置', + ], + [ + 'id' => 'addons\webman\controller\ChannelWithdrawRecordController\examineList', + 'pid' => 'addons\webman\controller\ChannelRechargeRecordController-', + 'action' => 'examineList', + 'method' => 'get', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelWithdrawRecordController/examineList', + 'title' => '提现审核', + ], + [ + 'id' => 'addons\webman\controller\ChannelWithdrawRecordController\viewRechargeList', + 'pid' => 'addons\webman\controller\ChannelWithdrawRecordController\examineList', + 'action' => 'viewRechargeList', + 'method' => 'get', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelWithdrawRecordController/viewRechargeList', + 'title' => '查看充值记录', + ], + [ + 'id' => 'addons\webman\controller\ChannelWithdrawRecordController\viewGameList', + 'pid' => 'addons\webman\controller\ChannelWithdrawRecordController\examineList', + 'action' => 'viewGameList', + 'method' => 'get', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelWithdrawRecordController/viewGameList', + 'title' => '查看游戏记录', + ], + [ + 'id' => 'addons\webman\controller\ChannelWithdrawRecordController\reject', + 'pid' => 'addons\webman\controller\ChannelWithdrawRecordController\examineList', + 'action' => 'reject', + 'method' => '', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelWithdrawRecordController/reject', + 'title' => '审核拒绝', + ], + [ + 'id' => 'addons\webman\controller\ChannelWithdrawRecordController\pass', + 'pid' => 'addons\webman\controller\ChannelWithdrawRecordController\examineList', + 'action' => 'pass', + 'method' => '', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelWithdrawRecordController/pass', + 'title' => '审核通过', + ], + [ + 'id' => 'addons\webman\controller\ChannelWithdrawRecordController\paymentList', + 'pid' => 'addons\webman\controller\ChannelRechargeRecordController-', + 'action' => 'paymentList', + 'method' => 'get', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelWithdrawRecordController/paymentList', + 'title' => '提现打款', + ], + [ + 'id' => 'addons\webman\controller\ChannelWithdrawRecordController\payment', + 'pid' => 'addons\webman\controller\ChannelWithdrawRecordController\paymentList', + 'action' => 'payment', + 'method' => '', + 'group' => 'channel', + 'url' => 'ex-admin/addons-webman-controller-ChannelWithdrawRecordController/payment', + 'title' => '提交打款凭证', + ] +]; diff --git a/config/container.php b/config/container.php new file mode 100644 index 0000000..13edbac --- /dev/null +++ b/config/container.php @@ -0,0 +1,19 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +$builder = new \DI\ContainerBuilder(); +$builder->addDefinitions(config('dependence', [])); +$builder->useAutowiring(true); +$builder->useAnnotations(true); +return $builder->build(); \ No newline at end of file diff --git a/config/database.php b/config/database.php new file mode 100644 index 0000000..bb9d168 --- /dev/null +++ b/config/database.php @@ -0,0 +1,37 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + 'default' => env('DB_CONNECTION', 'mysql'), + 'connections' => [ + 'mysql' => [ + 'driver' => 'mysql', + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => [ + \PDO::ATTR_TIMEOUT => 3 + ], + ] + ] +]; \ No newline at end of file diff --git a/config/def_avatar.php b/config/def_avatar.php new file mode 100644 index 0000000..7851b62 --- /dev/null +++ b/config/def_avatar.php @@ -0,0 +1,14 @@ + env('APP_URL', 'http://127.0.0.1:8787') . '/def_avatar/nan1.png', + 2 => env('APP_URL', 'http://127.0.0.1:8787') . '/def_avatar/nan2.png', + 3 => env('APP_URL', 'http://127.0.0.1:8787') . '/def_avatar/nan3.png', + 5 => env('APP_URL', 'http://127.0.0.1:8787') . '/def_avatar/nan4.png', + 6 => env('APP_URL', 'http://127.0.0.1:8787') . '/def_avatar/nan5.png', + 7 => env('APP_URL', 'http://127.0.0.1:8787') . '/def_avatar/nv1.png', + 8 => env('APP_URL', 'http://127.0.0.1:8787') . '/def_avatar/nv2.png', + 9 => env('APP_URL', 'http://127.0.0.1:8787') . '/def_avatar/nv3.png', + 10 => env('APP_URL', 'http://127.0.0.1:8787') . '/def_avatar/nv4.png', + 11 => env('APP_URL', 'http://127.0.0.1:8787') . '/def_avatar/nv5.png', +]; diff --git a/config/dependence.php b/config/dependence.php new file mode 100644 index 0000000..8e964ed --- /dev/null +++ b/config/dependence.php @@ -0,0 +1,15 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return []; \ No newline at end of file diff --git a/config/event.php b/config/event.php new file mode 100644 index 0000000..0b67a5f --- /dev/null +++ b/config/event.php @@ -0,0 +1,3 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + '' => support\exception\Handler::class, + 'api' => \app\exception\ApiHandler::class, +]; \ No newline at end of file diff --git a/config/game_platform.php b/config/game_platform.php new file mode 100644 index 0000000..0b32846 --- /dev/null +++ b/config/game_platform.php @@ -0,0 +1,251 @@ + [ + 'api_domain' => 'https://api365.sungaming.games', + 'domain' => 'https://game.lucky365.cc', + 'app_id' => 'BB428C0141FE47578AD3DFAB1F075F72', + 'app_secret' => '8C060E85E1F947A39F9E03AC7AF26846', + 'admin_url' => 'https://www.lkagent.cc/', + 'admin_user' => 'L365API3051MYS', + ], + 'MEGA888' => [ + 'api_domain' => 'https://mgapi-ali.yidaiyiluclub.com/mega-cloud/api/', + 'domain' => 'https://www.weimen99f.net', + 'app_id' => 'Mega1-4961', + 'app_secret' => 'Wp1yT/dlinuMXbq0g+6OlrFQhgA=', + 'sn' => 'ld00', + 'admin_url' => 'https://k3.mega166.com', + 'admin_user' => 'Mega14961s1', + ], + 'JILI' => [ + 'api_domain' => 'https://wb-api-2.jiscc77s.com/api1/', + 'domain' => 'https://play.mking11.com/', + 'app_id' => 'ON9_samsung88_MYR', + 'app_secret' => 'df4a08fcd94b48c7a8f5c5e6c5abda0e560a5a66', + 'admin_url' => 'https://wb-api4.jlfafafa3.com/', + 'admin_user' => 'ON9_samsung88_MYR', + ], + 'BIGGAMING' => [ + 'api_domain' => 'http://n1api.trarot.com/open-cloud/api/', + 'domain' => 'https://www.weimen99f.net', + 'app_id' => '181837', + 'app_secret' => '54E260D5AB1B4B1A9EF84DC392B998F9', + 'sn' => 'ty15', + 'admin_url' => 'http://ty158266.bgvip66.com', + 'admin_user' => 'Samsung88', + 'admin_pass' => 'Abcd1234', + ], + 'KISS918' => [ + 'api_domain' => 'http://api.918kiss.com:9991/', + 'record_api' => 'http://api.918kiss.com:9919/', + 'domain' => '', + 'app_id' => 'a06kiss', + 'auth' => 'feXZAjPKxYsBBExSaabu', + 'app_secret' => '7a958AFsf6W296WF3Ugf', + 'admin_url' => 'aiu.918kiss.com', + 'admin_user' => 'a06kiss', + ], + 'PRAGMATIC' => [ + 'api_domain' => 'https://api-2133.ppgames.net', + 'domain' => '', + 'name' => 'Samsung88', + 'secure_login' => 'pvd_samsung88', + 'provider_id' => 'PragmaticPlay', + 'app_secret' => '0cAcD962C0544f12', + 'admin_url' => 'https://backoffice-2133.ppgames.net/', + 'admin_user' => 'samsung88_admin', + ], + 'JDB' => [ + 'api_domain' => 'http://api.jdb1688.net', + 'domain' => '', + 'dc' => 'COLR', + 'iv' => 'bb6c659d4b3177c5', + 'key' => 'e2a648e621621dd1', + 'admin_url' => 'https://agent.jdb1688.net', + 'admin_user' => 'samsung88', + 'admin_psw' => 'Abcd1234', + 'platform_game_type' => [ + 'CB', + 'FH', + 'LK', + 'OT', + 'SL', + ] + ], + 'MARIOCLUB' => [ + 'api_domain' => 'https://api.marioclub88.online', + 'domain' => 'https://play.mking11.com/', + 'app_id' => 'ALMYR', + 'app_secret' => 'da725f16bb1274b8abd11d8f5d3b919b80809e0986eb024dacecdc5d8c310483', + 'admin_url' => 'https://ag.marioclub88.info/', + 'admin_user' => 'ALMYR', + ], + 'JOKER' => [ + 'api_domain' => 'https://w.apiext88.net', + 'domain' => 'https://www.weimen99f.net', + 'app_id' => 'FP17', + 'provider_code' => 'JOKER', + 'app_secret' => '1di6o3at6apks', + 'admin_url' => 'https://www.partnerbo888a.net', + 'admin_user' => 'FP17M', + 'platform_game_type' => [ + 'FH', + 'LK', + 'OT', + 'SL', + ] + ], + 'ASIAGAMING' => [ + 'api_domain' => 'gsmd.336699bet.com', + 'domain' => '', + 'app_id' => 'd08u', + 'provider_code' => 'AG', + 'app_secret' => 'ec88090da0e6fab55d3c778116128330', + 'admin_url' => 'http://mdbo.1199119.com/', + 'admin_user' => 'awin16868usd', + 'platform_game_type' => [ + 'FH', + 'LC', + 'SL' + ] + ], + 'TFGAMING' => [ + 'api_domain' => 'gsmd.336699bet.com', + 'domain' => '', + 'app_id' => 'd08u', + 'provider_code' => 'TF', + 'app_secret' => 'ec88090da0e6fab55d3c778116128330', + 'admin_url' => 'tfas.r4espt.com', + 'admin_user' => 'win168ausdusdo01', + 'platform_game_type' => [ + 'ES', + 'SB', + ] + ], + 'IBC' => [ + 'api_domain' => 'gsmd.336699bet.com', + 'domain' => '', + 'app_id' => 'd08u', + 'provider_code' => 'IB', + 'app_secret' => 'ec88090da0e6fab55d3c778116128330', + 'admin_url' => 'https://ibsbo.gsoft688.com/Account/Login.aspx', + 'admin_user' => 'M77', + 'platform_game_type' => [ + 'ES', + 'SB', + ] + ], + 'PLAYSTAR' => [ + 'api_domain' => 'gsmd.336699bet.com', + 'domain' => '', + 'app_id' => 'd08u', + 'provider_code' => 'ps', + 'app_secret' => 'ec88090da0e6fab55d3c778116128330', + 'admin_url' => 'https://pssgadmin.always988.com/', + 'admin_user' => 'pvwin168ausdcs01', + 'platform_game_type' => [ + 'FH', + 'SL', + ] + ], + 'AWC68' => [ + 'api_domain' => 'gsmd.336699bet.com', + 'domain' => '', + 'app_id' => 'd08u', + 'provider_code' => 'S6', + 'app_secret' => 'ec88090da0e6fab55d3c778116128330', + 'admin_url' => 'https://gciag.usplaynet.com', + 'admin_user' => 'testwin186usd', + 'platform_game_type' => [ + 'FH', + 'LC', + 'OT', + 'SL' + ] + ], + 'GAMEPLAY' => [ + 'api_domain' => 'gsmd.336699bet.com', + 'domain' => '', + 'app_id' => 'd08u', + 'provider_code' => 'G8', + 'app_secret' => 'ec88090da0e6fab55d3c778116128330', + 'admin_url' => 'https://gpbo.gsoft688.com/Account/Login.aspx', + 'admin_user' => 'W88_A1', + 'platform_game_type' => [ + 'SL', + 'LK', + 'LC', + 'APP' + ] + ], + 'NEXTSPIN' => [ + 'api_domain' => 'gsmd.336699bet.com', + 'domain' => '', + 'app_id' => 'd08u', + 'provider_code' => 'NS', + 'app_secret' => 'ec88090da0e6fab55d3c778116128330', + 'admin_url' => 'http://bo.88golddragon.com/', + 'admin_user' => 'W88_A1', + 'platform_game_type' => [ + 'FH', + 'SL', + ] + ], + 'WMCASINO' => [ + 'api_domain' => 'gsmd.336699bet.com', + 'domain' => '', + 'app_id' => 'd08u', + 'provider_code' => 'WC', + 'app_secret' => 'ec88090da0e6fab55d3c778116128330', + 'admin_url' => 'https://hp8.pokp02.net/', + 'admin_user' => 'd08usdapi', + 'platform_game_type' => [ + 'LC', + ] + ], + 'SPADEGAMING' => [ + 'api_domain' => 'gsmd.336699bet.com', + 'domain' => '', + 'app_id' => 'd08u', + 'provider_code' => 'SG', + 'app_secret' => 'ec88090da0e6fab55d3c778116128330', + 'admin_url' => 'http://backoffice.hugedolphin.com/login.jsp', + 'admin_user' => 'd08usdapi', + 'platform_game_type' => [ + 'FH', + 'SL', + ] + ], + 'FUNKYGAME' => [ + 'api_domain' => 'gsmd.336699bet.com', + 'domain' => '', + 'app_id' => 'd08u', + 'provider_code' => 'FK', + 'app_secret' => 'ec88090da0e6fab55d3c778116128330', + 'admin_url' => 'http://bo.funkygames.io/', + 'admin_user' => 'WIN168AUSD', + 'platform_game_type' => [ + 'FH', + 'LK', + 'OT', + 'SL', + ] + ], + 'R5' => [ + 'api_domain' => 'gsmd.336699bet.com', + 'domain' => '', + 'app_id' => 'd08u', + 'provider_code' => 'R5', + 'app_secret' => 'ec88090da0e6fab55d3c778116128330', + 'admin_url' => 'http://bo.klonostek.com', + 'admin_user' => 'cp_opwin168ausd', + 'platform_game_type' => [ + 'FH', + 'LK', + 'OT', + 'SL', + ] + ], + 'bankruptcy_money' => 5 +]; diff --git a/config/jp-sms.php b/config/jp-sms.php new file mode 100644 index 0000000..fc0e817 --- /dev/null +++ b/config/jp-sms.php @@ -0,0 +1,10 @@ + 'Ybz2h8', + 'appcode' => '1000', + 'appsecret' => 'iny93x', + 'domain' => 'http://47.242.85.7:9090', + 'batchSend' => '/sms/batch/v2', + 'balance' => '/sms/balance/v1', +]; diff --git a/config/log.php b/config/log.php new file mode 100644 index 0000000..307c435 --- /dev/null +++ b/config/log.php @@ -0,0 +1,64 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + 'default' => [ + 'handlers' => [ + [ + 'class' => Monolog\Handler\RotatingFileHandler::class, + 'constructor' => [ + runtime_path() . '/logs/webman.log', + 7, //$maxFiles + Monolog\Logger::DEBUG, + ], + 'formatter' => [ + 'class' => Monolog\Formatter\LineFormatter::class, + 'constructor' => [null, 'Y-m-d H:i:s', true], + ], + ] + ], + ], + 'game_log' => [ + 'handlers' => [ + [ + 'class' => Monolog\Handler\RotatingFileHandler::class, + 'constructor' => [ + runtime_path() . '/logs/game_log.log', + 7, //$maxFiles + Monolog\Logger::DEBUG, + ], + 'formatter' => [ + 'class' => Monolog\Formatter\LineFormatter::class, + 'constructor' => [null, 'Y-m-d H:i:s', true], + ], + ] + ], + ], + 'pay_log' => [ + 'handlers' => [ + [ + 'class' => Monolog\Handler\RotatingFileHandler::class, + 'constructor' => [ + runtime_path() . '/logs/pay_log.log', + 7, //$maxFiles + Monolog\Logger::DEBUG, + ], + 'formatter' => [ + 'class' => Monolog\Formatter\LineFormatter::class, + 'constructor' => [null, 'Y-m-d H:i:s', true], + ], + ] + ], + ], +]; diff --git a/config/middleware.php b/config/middleware.php new file mode 100644 index 0000000..5362b8e --- /dev/null +++ b/config/middleware.php @@ -0,0 +1,28 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use app\middleware\AppVersionMiddleware; +use app\middleware\Lang; +use app\middleware\SiteAuthMiddleware; + +return [ + // api应用中间件 + 'api' => [ +// ApiSignMiddleware::class +// AccessControl::class, + SiteAuthMiddleware::class, + Lang::class, + AppVersionMiddleware::class + ], +]; \ No newline at end of file diff --git a/config/one_pay.php b/config/one_pay.php new file mode 100644 index 0000000..481b041 --- /dev/null +++ b/config/one_pay.php @@ -0,0 +1,11 @@ + 'AliWin', + 'key' => 'KFfWS8j5Lu1gfef4akclTxSb0', + 'api_key' => 'HHIgy4B7uL8QU5XcSwFVALERY', + 'domain' => 'https://api.one1pay.asia/', + 'notifyUrl' => 'https://api.sumsung888.top/external/one-recharge-notify', + 'payoutNotifyUrl' => 'https://api.sumsung888.top/external/one-withdrawal-notify', + 'returnUrl' => 'https://api.sumsung888.top/external/onepay-query' +]; diff --git a/config/plugin/gitfei1231/webman-api-sign/app.php b/config/plugin/gitfei1231/webman-api-sign/app.php new file mode 100644 index 0000000..3df5a50 --- /dev/null +++ b/config/plugin/gitfei1231/webman-api-sign/app.php @@ -0,0 +1,68 @@ + true, + + /** + * 配置 driver + * 数组配置驱动 \Wengg\WebmanApiSign\Driver\ArrayDriver::class + * 数据库配置驱动 \Wengg\WebmanApiSign\Driver\DatabaseDriver::class (使用的是 ThinkORM) + * 如需要自定义驱动,继承 \Wengg\WebmanApiSign\Driver\BaseDriver::class + */ + 'driver' => \Wengg\WebmanApiSign\Driver\ArrayDriver::class, + 'encrypt' => 'sha256', //加密sign方式, + 'timeout' => 0, //timestamp超时时间秒,0不限制 + 'table' => 'app_sign', //表名 + + /** + * 防重放请求是否开启 true只能请求一次,时间是上面 timeout内 + * replay 主要借助与 timeout + noncestr随机值进行验证, 一定的时间内noncestr如果重复,那就判定重放请求 + * noncestr 建议生成随机唯一UUID 或者你使用 13位时间戳+18位随机数。1678159075243(13位)+随机数(18位) + */ + 'replay' => false, + + /** + * 如果使用 DatabaseDriver 需要缓存查询后的数据 + * 设置缓存时间即可缓存对应的app_id数据 + * db_cache_time => null 关闭缓存 + */ + 'db_cache_time' => 604800, // null 关闭缓存 + + //字段对照,可从(header,get,post)获取的值 + 'fields' => [ + 'app_id' => 'appId', //app_id + 'app_key' => 'appKey', //app_key rsa加密才需要传,appKey为前端随机生成的app_secret秘钥,用于加密sign和报文数据 + 'timestamp' => 'timestamp', //时间戳 + 'noncestr' => 'nonceStr', //随机字符串 + 'signature' => 'signature', //签名字符串 + ], + + //driver为ArrayDriver时生效,对应table + 'app_sign' => [ + [ + 'app_id' => '1661408635', //应用id + 'app_name' => '默认', //应用名称 + 'status' => 1, //状态:0=禁用,1=启用 + 'expired_at' => null, //过期时间,例如:2023-01-01 00:00:00,null不限制 + 'app_secret' => 'D81668E7B3F24F4DAB32E5B88EAE27AC', //应用秘钥 不启用RSA使用 + 'encrypt_body' => 0, //状态:0=禁用,1=启用 算法:aes-128-cbc 是否加密body传入加密后的报文字符串,启用RSA需要使用自动生成的app_secret进行对称加密,否则使用固定的app_secret进行对称加密 + 'rsa_status' => 0, //状态:0=禁用,1=启用 启用RSA,主要用rsa加密随机生成的app_secret,而不使用固定app_secret + /** + * sign私钥 RS256加密 + */ + 'private_key' => << << true, +]; \ No newline at end of file diff --git a/config/plugin/rockys/ex-admin-webman/bootstrap.php b/config/plugin/rockys/ex-admin-webman/bootstrap.php new file mode 100644 index 0000000..2736c41 --- /dev/null +++ b/config/plugin/rockys/ex-admin-webman/bootstrap.php @@ -0,0 +1,17 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + \ExAdmin\webman\ServiceProvider::class +]; diff --git a/config/plugin/rockys/ex-admin-webman/command.php b/config/plugin/rockys/ex-admin-webman/command.php new file mode 100644 index 0000000..5674a6e --- /dev/null +++ b/config/plugin/rockys/ex-admin-webman/command.php @@ -0,0 +1,6 @@ + env('FILESYSTEM_DRIVER', 'local'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Here you may configure as many filesystem "disks" as you wish, and you + | may even configure multiple disks of the same driver. Defaults have + | been setup for each driver as an example of the required options. + | + | Supported Drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + 'local' => [ + 'driver' => \addons\webman\filesystem\driver\Local::class, + 'root' => public_path('storage'), + 'url' => env('APP_URL','http://127.0.0.1:8787').'/storage', + 'visibility' => 'public', + ], + ], +]; diff --git a/config/plugin/rockys/ex-admin-webman/middleware.php b/config/plugin/rockys/ex-admin-webman/middleware.php new file mode 100644 index 0000000..afe4437 --- /dev/null +++ b/config/plugin/rockys/ex-admin-webman/middleware.php @@ -0,0 +1,20 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + '' => [ + \ExAdmin\webman\middleware\RequestMiddleware::class + ] + +]; \ No newline at end of file diff --git a/config/plugin/rockys/ex-admin-webman/process.php b/config/plugin/rockys/ex-admin-webman/process.php new file mode 100644 index 0000000..84aa769 --- /dev/null +++ b/config/plugin/rockys/ex-admin-webman/process.php @@ -0,0 +1,11 @@ + [ + 'handler' => Webman\RedisQueue\Process\Consumer::class, + 'count' => 8, // 可以设置多进程同时消费 + 'constructor' => [ + // 消费者类目录 + 'consumer_dir' => base_path() . '/addons/webman/grid/Jobs' + ] + ] +]; \ No newline at end of file diff --git a/config/plugin/rockys/ex-admin-webman/route.php b/config/plugin/rockys/ex-admin-webman/route.php new file mode 100644 index 0000000..612e9ab --- /dev/null +++ b/config/plugin/rockys/ex-admin-webman/route.php @@ -0,0 +1,11 @@ +webman){ + plugin()->webman->route(); +} + + + + + + + diff --git a/config/plugin/tinywan/jwt/app.php b/config/plugin/tinywan/jwt/app.php new file mode 100644 index 0000000..f2e7811 --- /dev/null +++ b/config/plugin/tinywan/jwt/app.php @@ -0,0 +1,72 @@ + true, + 'jwt' => [ + // 算法类型 HS256、HS384、HS512、RS256、RS384、RS512、ES256、ES384、Ed25519 + 'algorithms' => 'HS256', + // access令牌秘钥 + 'access_secret_key' => '2022d3d3LmJq', + // access令牌过期时间,单位:秒。默认 15天 + 'access_exp' => 1296000, + // refresh令牌秘钥 + 'refresh_secret_key' => '2022KTxigxc9o50c', + // refresh令牌过期时间,单位:秒。默认 30 天 + 'refresh_exp' => 2592000, + // refresh 令牌是否禁用,默认不禁用 false + 'refresh_disable' => false, + // 令牌签发者 + 'iss' => 'webman.tinywan.cn', + // 某个时间点后才能访问,单位秒。(如:30 表示当前时间30秒后才能使用) + 'nbf' => 0, + // 时钟偏差冗余时间,单位秒。建议这个余地应该不大于几分钟。 + 'leeway' => 60, + // 单设备登录 + 'is_single_device' => true, + // 缓存令牌时间,单位:秒。默认 15 天 + 'cache_token_ttl' => 1296000, + // 缓存令牌前缀 + 'cache_token_pre' => 'JWT:TOKEN:', + 'cache_refresh_token_pre' => 'JWT:REFRESH_TOKEN:', + // 用户信息模型 + 'user_model' => function($uid){ + return []; + }, + + /** + * access令牌私钥 + */ + 'access_private_key' => << << << << true, + /** + * 日志相关 + */ + 'log' => [ + /** + * 日志是否启用,建议启用 + */ + 'enable' => false, + /** + * 日志的 channel + */ + 'channel' => 'default', + /** + * 日志的级别 + */ + 'level' => 'info', + /** + * 日志格式 + * 启用 custom 时无实际作用 + * @link \GuzzleHttp\MessageFormatter::format() + */ + 'format' => \GuzzleHttp\MessageFormatter::CLF, + /** + * 自定义日志 + * + * 返回 WebmanTech\LaravelHttpClient\Guzzle\Log\CustomLogInterface 时使用 @see WebmanTech\LaravelHttpClient\Guzzle\Log\Middleware::__invoke() + * 返回 null 时使用 guzzle 的 @see GuzzleHttp\Middleware::log() + * 返回 callable 时使用自定义 middleware @link https://docs.guzzlephp.org/en/stable/handlers-and-middleware.html#middleware + * + * 建议使用 CustomLogInterface 形式,支持慢请求、请求时长、更多配置 + */ + 'custom' => function (array $config) { + /** + * @see \WebmanTech\LaravelHttpClient\Guzzle\Log\CustomLog::$config + */ + $config = [ + 'log_channel' => $config['channel'], + ]; + return new \WebmanTech\LaravelHttpClient\Guzzle\Log\CustomLog($config); + } + ], + /** + * guzzle 全局的 options + * @link https://laravel.com/docs/8.x/http-client#guzzle-options + */ + 'guzzle' => [ + 'debug' => false, + 'timeout' => 10, + ], + /** + * 扩展 Http 功能,一般可用于快速定义 api 信息 + * @link https://laravel.com/docs/8.x/http-client#macros + */ + 'macros' => [ + /*'httpbin' => function() { + return Http::baseUrl('https://httpbin.org') + ->asJson(); + }*/ + ], +]; diff --git a/config/plugin/webman/console/app.php b/config/plugin/webman/console/app.php new file mode 100644 index 0000000..aec978f --- /dev/null +++ b/config/plugin/webman/console/app.php @@ -0,0 +1,20 @@ + true, + + 'build_dir' => BASE_PATH . DIRECTORY_SEPARATOR . 'build', + + 'phar_filename' => 'webman.phar', + + 'bin_filename' => 'webman.bin', + + 'signature_algorithm'=> Phar::SHA256, //set the signature algorithm for a phar and apply it. The signature algorithm must be one of Phar::MD5, Phar::SHA1, Phar::SHA256, Phar::SHA512, or Phar::OPENSSL. + + 'private_key_file' => '', // The file path for certificate or OpenSSL private key file. + + 'exclude_pattern' => '#^(?!.*(composer.json|/.github/|/.idea/|/.git/|/.setting/|/runtime/|/vendor-bin/|/build/|/vendor/webman/admin/))(.*)$#', + + 'exclude_files' => [ + '.env', 'LICENSE', 'composer.json', 'composer.lock', 'start.php', 'webman.phar', 'webman.bin' + ] +]; diff --git a/config/plugin/webman/event/app.php b/config/plugin/webman/event/app.php new file mode 100644 index 0000000..8f9c426 --- /dev/null +++ b/config/plugin/webman/event/app.php @@ -0,0 +1,4 @@ + true, +]; \ No newline at end of file diff --git a/config/plugin/webman/event/bootstrap.php b/config/plugin/webman/event/bootstrap.php new file mode 100644 index 0000000..e5b09ba --- /dev/null +++ b/config/plugin/webman/event/bootstrap.php @@ -0,0 +1,17 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + Webman\Event\BootStrap::class, +]; diff --git a/config/plugin/webman/event/command.php b/config/plugin/webman/event/command.php new file mode 100644 index 0000000..e860cf7 --- /dev/null +++ b/config/plugin/webman/event/command.php @@ -0,0 +1,7 @@ + true, + 'exception' => [ + // 是否记录异常到日志 + 'enable' => true, + // 不会记录到日志的异常类 + 'dontReport' => [ + support\exception\BusinessException::class + ] + ] +]; diff --git a/config/plugin/webman/log/middleware.php b/config/plugin/webman/log/middleware.php new file mode 100644 index 0000000..acf9763 --- /dev/null +++ b/config/plugin/webman/log/middleware.php @@ -0,0 +1,21 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Log\Middleware; + +return [ + '' => [ + Middleware::class + ] +]; \ No newline at end of file diff --git a/config/plugin/webman/push/app.php b/config/plugin/webman/push/app.php new file mode 100644 index 0000000..4ae960d --- /dev/null +++ b/config/plugin/webman/push/app.php @@ -0,0 +1,10 @@ + true, + 'websocket' => 'websocket://0.0.0.0:3132', + 'api' => 'http://127.0.0.1:3233', + 'app_key' => '20f94408fc4c52845f162e92a253c7a3', + 'app_secret' => '3151f8648a6ccd9d4515386f34127e28', + 'channel_hook' => 'http://127.0.0.1:8787/plugin/webman/push/hook', + 'auth' => '/plugin/webman/push/auth' +]; \ No newline at end of file diff --git a/config/plugin/webman/push/process.php b/config/plugin/webman/push/process.php new file mode 100644 index 0000000..01c545d --- /dev/null +++ b/config/plugin/webman/push/process.php @@ -0,0 +1,21 @@ + [ + 'handler' => Server::class, + 'listen' => config('plugin.webman.push.app.websocket'), + 'count' => 1, // 必须是1 + 'reloadable' => false, // 执行reload不重启 + 'constructor' => [ + 'api_listen' => config('plugin.webman.push.app.api'), + 'app_info' => [ + config('plugin.webman.push.app.app_key') => [ + 'channel_hook' => config('plugin.webman.push.app.channel_hook'), + 'app_secret' => config('plugin.webman.push.app.app_secret'), + ], + ] + ] + ] +]; \ No newline at end of file diff --git a/config/plugin/webman/push/route.php b/config/plugin/webman/push/route.php new file mode 100644 index 0000000..ea54c37 --- /dev/null +++ b/config/plugin/webman/push/route.php @@ -0,0 +1,87 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use support\Request; +use Webman\Route; +use Webman\Push\Api; + +/** + * 推送js客户端文件 + */ +Route::get('/plugin/webman/push/push.js', function (Request $request) { + return response()->file(base_path().'/vendor/webman/push/src/push.js'); +}); + +/** + * 私有频道鉴权,这里应该使用session辨别当前用户身份,然后确定该用户是否有权限监听channel_name + */ +Route::post(config('plugin.webman.push.app.auth'), function (Request $request) { + $pusher = new Api(str_replace('0.0.0.0', '127.0.0.1', config('plugin.webman.push.app.api')), config('plugin.webman.push.app.app_key'), config('plugin.webman.push.app.app_secret')); + $channel_name = $request->post('channel_name'); + $session = $request->session(); + // 这里应该通过session和channel_name判断当前用户是否有权限监听channel_name + $has_authority = true; + if ($has_authority) { + return response($pusher->socketAuth($channel_name, $request->post('socket_id'))); + } else { + return response('Forbidden', 403); + } +}); + +/** + * 当频道上线以及下线时触发的回调 + * 频道上线:是指某个频道从没有连接在线到有连接在线的事件 + * 频道下线:是指某个频道的所有连接都断开触发的事件 + */ +Route::post(parse_url(config('plugin.webman.push.app.channel_hook'), PHP_URL_PATH), function (Request $request) { + + // 没有x-pusher-signature头视为伪造请求 + if (!$webhook_signature = $request->header('x-pusher-signature')) { + return response('401 Not authenticated', 401); + } + + $body = $request->rawBody(); + + // 计算签名,$app_secret 是双方使用的密钥,是保密的,外部无从得知 + $expected_signature = hash_hmac('sha256', $body, config('plugin.webman.push.app.app_secret'), false); + + // 安全校验,如果签名不一致可能是伪造的请求,返回401状态码 + if ($webhook_signature !== $expected_signature) { + return response('401 Not authenticated', 401); + } + + // 这里存储这上线 下线的channel数据 + $payload = json_decode($body, true); + + $channels_online = $channels_offline = []; + + foreach ($payload['events'] as $event) { + if ($event['name'] === 'channel_added') { + $channels_online[] = $event['channel']; + } else if ($event['name'] === 'channel_removed') { + $channels_offline[] = $event['channel']; + } + } + + // 业务根据需要处理上下线的channel,例如将在线状态写入数据库,通知其它channel等 + // 上线的所有channel + echo 'online channels: ' . implode(',', $channels_online) . "\n"; + // 下线的所有channel + echo 'offline channels: ' . implode(',', $channels_offline) . "\n"; + + return 'OK'; +}); + + + diff --git a/config/plugin/webman/redis-queue/app.php b/config/plugin/webman/redis-queue/app.php new file mode 100644 index 0000000..8f9c426 --- /dev/null +++ b/config/plugin/webman/redis-queue/app.php @@ -0,0 +1,4 @@ + true, +]; \ No newline at end of file diff --git a/config/plugin/webman/redis-queue/command.php b/config/plugin/webman/redis-queue/command.php new file mode 100644 index 0000000..8bfe2a1 --- /dev/null +++ b/config/plugin/webman/redis-queue/command.php @@ -0,0 +1,7 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + 'default' => [ + 'handlers' => [ + [ + 'class' => Monolog\Handler\RotatingFileHandler::class, + 'constructor' => [ + runtime_path() . '/logs/redis-queue/queue.log', + 7, //$maxFiles + Monolog\Logger::DEBUG, + ], + 'formatter' => [ + 'class' => Monolog\Formatter\LineFormatter::class, + 'constructor' => [null, 'Y-m-d H:i:s', true], + ], + ] + ], + ] +]; diff --git a/config/plugin/webman/redis-queue/process.php b/config/plugin/webman/redis-queue/process.php new file mode 100644 index 0000000..c8d4da1 --- /dev/null +++ b/config/plugin/webman/redis-queue/process.php @@ -0,0 +1,11 @@ + [ + 'handler' => Webman\RedisQueue\Process\Consumer::class, + 'count' => 8, // 可以设置多进程同时消费 + 'constructor' => [ + // 消费者类目录 + 'consumer_dir' => app_path() . '/queue/redis' + ] + ] +]; \ No newline at end of file diff --git a/config/plugin/webman/redis-queue/redis.php b/config/plugin/webman/redis-queue/redis.php new file mode 100644 index 0000000..e106f7e --- /dev/null +++ b/config/plugin/webman/redis-queue/redis.php @@ -0,0 +1,13 @@ + [ + 'host' => 'redis://127.0.0.1:6379', + 'options' => [ + 'auth' => null, // 密码,字符串类型,可选参数 + 'db' => 1, // 数据库 + 'prefix' => '', // key 前缀 + 'max_attempts' => 5, // 消费失败后,重试次数 + 'retry_seconds' => 5, // 重试间隔,单位秒 + ] + ], +]; diff --git a/config/plugin/workbunny/webman-ip-attribution/app.php b/config/plugin/workbunny/webman-ip-attribution/app.php new file mode 100644 index 0000000..575fd95 --- /dev/null +++ b/config/plugin/workbunny/webman-ip-attribution/app.php @@ -0,0 +1,11 @@ + true, + + 'default' => '--', + 'language' => ['zh-CN'], + + 'db-country' => null, + 'db-city' => null, + 'db-asn' => null, +]; \ No newline at end of file diff --git a/config/plugin/yzh52521/jwt_key/private.key b/config/plugin/yzh52521/jwt_key/private.key new file mode 100644 index 0000000..7242374 --- /dev/null +++ b/config/plugin/yzh52521/jwt_key/private.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDmA8qKaS3+AIkj +t2IsdFQw8kKHVARk2aPBxkV3qIhpaFpvs/uDA5NkGVR/uFFFsSAOGx6JCsdZRQv7 +byR0NUjyM8iKeHKnSwQwfjuUZkhDd/mVem0RX7GaJJjTqCPYdsZUo1XqCjgHHNUr +drx7FoUMUz6Jr9fsYhVL5huDflsQbAFx5JoHY2xQ1ZEahYbV5dZp2Np0s3JsF7rf +/WtvUYxg/Mk+8coroMi8OPE/+2PUxxFVyyheNjMIYAvMMQxb3+NowNL8lpz8ZmQa +mlWgxDp4d9h+DQWyL+vyJKpqH9azKjlBLsDhPpD/gS7wzyfsuLfePC2rkhrt8zbF +cDPX0B81AgMBAAECggEBALuDLbPmiQMABsziLBuXfick6E2QlcBtmM1YyLsC3qon +00orDQhCev7ok3VHmqHZAwvc2ejYq6k/28PPWIWQBvbEdmFEThvJ0RGDZyjUtWaj +QQm184JtY8kIuroZ4ZcPRSIswdZ5HDHYNIQpWQBzXGWu21W9z6Y6U6g7YASzlqNs +DZ3fLXxSRi+r2/TN/gQTFhygvseeTOI76ULiSsB7gocQxpp5tLtBznXqEu74OWoR +wH+cwvrxaNnx+zGIJsIGYpaJSZmOvkgAJQ6GTGT65l71O/DX2syOsMFI1k5y7Gjb +9jOIivtjbzfP4qFBRKpH2jI56o7/SFenzNe/Iv9DVUECgYEA9Bt0LxUuEEdpjwea ++WM1DcLIRuls85S+sSwe72t4mw22b2H7Ta0iP3YXQ2DN+duzXWxsfr2N0XGUDuw3 +n+WhHqLTA21WFBTdorr0FvgeHPRRnlHS7kjD4AMZS4/wlMhc571fZc2KrJfL/gIr +htWbLudaI7b4ZNm8oZtjKsh2jXECgYEA8TiS/MGm05xuq1Gucp/YkUNkEVhpjZeI +0m7DHxaOrE322v2HnhyvlZDR+gioStS/EjLbaJ8eJlbjMVmRlrGvIhbzUM77unhF +hQLFvEYNEMuUUbVqb3qqJOD+HnO3KDdXTSguhhTuoRxkpbPSrZ9Y5BEAWMDlLBsG +sq6+j173HAUCgYBFtFk24Jtotpuj5g4QzI1nwokiBqG/5GeXe/vRbiTgUcgYgiga +hCfVa0k1Sj1G7b+IG9/XSRVoC0C2CinQFOgvMVuEDQKZdWPchfoRXQRsTC/KP581 +v71/CCN++jk+owA0hFTrYwgIRMhRXhlDxVcsy49nx2WilrJQi2iD3P5NYQKBgQDA +rh0TEqhsbY8k/5jl7HK0De2XwVSHClz7IghwA7exQJGHeW5jyKwkP0rKezHanDeH +lOIXnsoZe9v8ZnxZr9Kh20095ifDWiDFz2IdMqNrIAJ4hf3f0E6qKKIztuC9mf79 +HbST25KFVMW8anhFwXviqQXq3yHv6iKeheCnawbd9QKBgQCuD0vgx+8/6sKpowx3 +n11zi1pPv3gEUmAW9ivL/xHHKZbymTZkjPHiRVv6ddlQiLigRnArvyQnhKCSwiVi +T/G8hR2axKuEJw0Z6feKRj590ZN2OrbDgEXz45OOvMMktFY+wjJsa9Qouj4Od5br +6mIaRJhf1EUlYdMKMJo2f2Te8w== +-----END PRIVATE KEY----- diff --git a/config/plugin/yzh52521/jwt_key/public.key b/config/plugin/yzh52521/jwt_key/public.key new file mode 100644 index 0000000..b94f96b --- /dev/null +++ b/config/plugin/yzh52521/jwt_key/public.key @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5gPKimkt/gCJI7diLHRU +MPJCh1QEZNmjwcZFd6iIaWhab7P7gwOTZBlUf7hRRbEgDhseiQrHWUUL+28kdDVI +8jPIinhyp0sEMH47lGZIQ3f5lXptEV+xmiSY06gj2HbGVKNV6go4BxzVK3a8exaF +DFM+ia/X7GIVS+Ybg35bEGwBceSaB2NsUNWRGoWG1eXWadjadLNybBe63/1rb1GM +YPzJPvHKK6DIvDjxP/tj1McRVcsoXjYzCGALzDEMW9/jaMDS/Jac/GZkGppVoMQ6 +eHfYfg0Fsi/r8iSqah/Wsyo5QS7A4T6Q/4Eu8M8n7Li33jwtq5Ia7fM2xXAz19Af +NQIDAQAB +-----END PUBLIC KEY----- diff --git a/config/plugin/yzh52521/lock/app.php b/config/plugin/yzh52521/lock/app.php new file mode 100644 index 0000000..fa331be --- /dev/null +++ b/config/plugin/yzh52521/lock/app.php @@ -0,0 +1,30 @@ + true, + 'storage' => 'redis', // file/redis, 建议使用 redis,file 不支持 ttl + 'storage_configs' => [ + 'file' => [ + 'class' => FlockStore::class, + 'construct' => [ + 'lockPath' => runtime_path() . '/lock', + ], + ], + 'redis' => [ + 'class' => RedisStore::class, + 'construct' => function () { + return [ + 'redis' => \support\Redis::connection('default')->client(), + ]; + }, + ], + ], + 'default_config' => [ + 'ttl' => 300, // 默认锁超时时间 + 'auto_release' => true, // 是否自动释放,建议设置为 true + 'prefix' => 'lock_', // 锁前缀 + ], +]; \ No newline at end of file diff --git a/config/process.php b/config/process.php new file mode 100644 index 0000000..3315a27 --- /dev/null +++ b/config/process.php @@ -0,0 +1,48 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use process\CommissionSettlement; +use process\MegaPlayGameRecord; +use process\SyncPlayGameRecord; +use process\SendBroadcast; +use Workerman\Worker; + +return [ + // File update detection and automatic reload + 'monitor' => [ + 'handler' => process\Monitor::class, + 'reloadable' => false, + 'constructor' => [ + // Monitor these directories + 'monitorDir' => array_merge([ + app_path(), + config_path(), + base_path() . '/addons', + base_path() . '/process', + base_path() . '/support', + base_path() . '/plugin', + base_path() . '/resource', + base_path() . '/.env', + ], glob(base_path() . '/plugin/*/app'), glob(base_path() . '/plugin/*/config'), glob(base_path() . '/plugin/*/api')), + // Files with these suffixes will be monitored + 'monitorExtensions' => [ + 'php', 'html', 'htm', 'env' + ], + 'options' => [ + 'enable_file_monitor' => !Worker::$daemonize && DIRECTORY_SEPARATOR === '/', + 'enable_memory_monitor' => DIRECTORY_SEPARATOR === '/', + ] + ] + ], +]; diff --git a/config/redis.php b/config/redis.php new file mode 100644 index 0000000..af852bf --- /dev/null +++ b/config/redis.php @@ -0,0 +1,22 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + 'default' => [ + 'host' => '127.0.0.1', + 'password' => null, + 'port' => 6379, + 'database' => 1, + ], +]; diff --git a/config/route.php b/config/route.php new file mode 100644 index 0000000..9ebd6c9 --- /dev/null +++ b/config/route.php @@ -0,0 +1,115 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use app\api\controller\v1\AnnouncementController; +use app\api\controller\v1\GameController; +use app\api\controller\v1\IndexController; +use app\api\controller\v1\PlayerController; +use app\api\controller\v1\VersionController; +use app\api\controller\v1\PromoterController; +use Webman\Route; +use app\api\controller\v1\QrcodeController; +use app\external\ExternalApiController; + +Route::options('[{path:.+}]', function () { + return response(''); +}); + +Route::group('/api', function () { + Route::group('/v1', function () { + // 获取版本更新信息 + Route::post('/get-app-update', [VersionController::class, 'getAppUpdate']); + // 渠道信息 + Route::post('/channel-info', [IndexController::class, 'channelInfo']); + //手机号注册 + Route::post('/phone-register', [PlayerController::class, 'phoneRegister']); + //发送验证码 + Route::post('/send-msg', [PlayerController::class, 'sendMsg']); + //忘记密码 + Route::post('/forget-password', [PlayerController::class, 'forgetPassword']); + // 玩家登录 + Route::post('/login', [PlayerController::class, 'login']); + // 获取用户信息 + Route::post('/player-info', [PlayerController::class, 'playerInfo']); + // 编辑昵称 + Route::post('/edit-player-name', [PlayerController::class, 'editPlayerName']); + // 用户银行卡列表 + Route::post('/bank-card-list', [IndexController::class, 'bankCardList']); + // 添加银行卡 + Route::post('/add-bank-card', [IndexController::class, 'addBankCard']); + // 修改银行卡 + Route::post('/edit-bank-card', [IndexController::class, 'editBankCard']); + // 银行卡列表 + Route::post('/bank-list', [IndexController::class, 'bankList']); + // 删除银行卡 + Route::post('/delete-bank-card', [IndexController::class, 'deleteBankCard']); + // 充值列表 + Route::post('/recharge-list', [PlayerController::class, 'rechargeList']); + // 充值项列表 + Route::post('/recharge-setting-list', [PlayerController::class, 'rechargeSettingList']); + // 充值配置详情 + Route::post('/recharge-info', [PlayerController::class, 'rechargeInfo']); + // 登出 + Route::post('/logout', [IndexController::class, 'logout']); + // 玩家充值 + Route::post('/player-recharge', [IndexController::class, 'playerRecharge']); + // 數據中心 + Route::post('/gift-center', [PlayerController::class, 'giftCenter']); + // cash out列表 + Route::post('/cash-out-list', [IndexController::class, 'cashOutList']); + // cash in列表 + Route::post('/cash-in-list', [IndexController::class, 'cashInList']); + // 玩家提现 + Route::post('/withdrawal', [IndexController::class, 'playerWithdrawal']); + // 登录游戏返回游戏地址 + Route::post('/login-game', [GameController::class, 'loginGame']); + // 上传充值凭证 + Route::post('/upload-certificate', [IndexController::class, 'uploadCertificate']); + //se支付 + Route::post('/se-recharge-list', [PlayerController::class, 'seRechargeList']); + Route::post('/se-recharge', [PlayerController::class, 'seRecharge']); + //完成充值 + Route::post('/complete-recharge', [PlayerController::class, 'completeRecharge']); + Route::post('/se-withdrawal', [PlayerController::class, 'seWithdrawal']); + Route::post('/gametest', [GameController::class, 'gametest']); + // 游戏记录 + Route::post('/game-record', [PlayerController::class, 'gameRecord']); + //获取奖品列表 + Route::post('/prize-list', [GameController::class, 'getPrizeList']); + //抽奖 + Route::post('/lottery', [GameController::class, 'lottery']); + //抽奖记录 + Route::post('/draw-records', [GameController::class, 'getDrawRecords']); + //充提记录 + Route::post('/deposit-withdrawal-records', [PlayerController::class, 'depositWithdrawalRecord']); + }); +}); + +// 外部API +Route::group('/external', function () { + Route::get('/login', [ExternalApiController::class, 'login']); + Route::get('/download', [ExternalApiController::class, 'download']); + //skl支付回调 + Route::post('/skl-recharge-notify', [ExternalApiController::class, 'sklRechargeNotify']); + //skl提现回调 + Route::post('/skl-withdrawal-notify', [ExternalApiController::class, 'sklWithdrawalNotify']); + //skl支付跳转 + Route::get('/skl-query/', [ExternalApiController::class, 'sklQuery']); +}); + +Route::disableDefaultRoute(); + + + + diff --git a/config/se-pay.php b/config/se-pay.php new file mode 100644 index 0000000..bfa168d --- /dev/null +++ b/config/se-pay.php @@ -0,0 +1,10 @@ + 'SPMSAM88', + 'MD5' => '52HDSG5Y62T56268D526VSDT5C252Y6R', + 'domain' => 'https://public.wangspay.com/', + 'notifyUrl' => 'https://ss-api.liulao.top/external/se-recharge-notify', + 'payoutNotifyUrl' => 'https://ss-api.liulao.top/external/se-withdrawal-notify', + 'returnUrl' => 'https://ss-api.liulao.top/external/sepay-query' +]; diff --git a/config/server.php b/config/server.php new file mode 100644 index 0000000..10aa38d --- /dev/null +++ b/config/server.php @@ -0,0 +1,31 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +return [ + 'listen' => env('APP_LISTEN','http://0.0.0.0:8786'), + 'transport' => 'tcp', + 'context' => [], + 'name' => 'ggl', + 'count' => cpu_count() * 4, + 'user' => '', + 'group' => '', + 'reusePort' => false, + 'event_loop' => '', + 'stop_timeout' => 2, + 'pid_file' => runtime_path() . '/webman.pid', + 'status_file' => runtime_path() . '/webman.status', + 'stdout_file' => runtime_path() . '/logs/stdout.log', + 'log_file' => runtime_path() . '/logs/workerman.log', + 'max_package_size' => 10 * 1024 * 1024 +]; diff --git a/config/session.php b/config/session.php new file mode 100644 index 0000000..043f8c4 --- /dev/null +++ b/config/session.php @@ -0,0 +1,65 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use Webman\Session\FileSessionHandler; +use Webman\Session\RedisSessionHandler; +use Webman\Session\RedisClusterSessionHandler; + +return [ + + 'type' => 'file', // or redis or redis_cluster + + 'handler' => FileSessionHandler::class, + + 'config' => [ + 'file' => [ + 'save_path' => runtime_path() . '/sessions', + ], + 'redis' => [ + 'host' => '127.0.0.1', + 'port' => 6379, + 'auth' => '', + 'timeout' => 2, + 'database' => '', + 'prefix' => 'redis_session_', + ], + 'redis_cluster' => [ + 'host' => ['127.0.0.1:7000', '127.0.0.1:7001', '127.0.0.1:7001'], + 'timeout' => 2, + 'auth' => '', + 'prefix' => 'redis_session_', + ] + ], + + 'session_name' => 'PHPSID', + + 'auto_update_timestamp' => false, + + 'lifetime' => 7*24*60*60, + + 'cookie_lifetime' => 365*24*60*60, + + 'cookie_path' => '/', + + 'domain' => '', + + 'http_only' => true, + + 'secure' => false, + + 'same_site' => '', + + 'gc_probability' => [1, 1000], + +]; diff --git a/config/skl_pay.php b/config/skl_pay.php new file mode 100644 index 0000000..0861ef2 --- /dev/null +++ b/config/skl_pay.php @@ -0,0 +1,10 @@ + 'ggl-ds', + 'api_key' => 'v2.local.FTKkFQnfL0lB4x2KQ_P9ptA7TS-NWUWD4xlkGdVQC4tWZaqOoX-CvK9Wzbqy2AAH0pYyjnzJaL85wWuFA_tRrxAMFQGzPFlwNEocjwdzDDeU5UxyJYLOeuF_I_tccJbWoopXm902wHdSrzDfvwgOVrp23J5TwxO4D9vuHXoNPbDsjumVy71eJ_0bOGW80rK1ucHZa8o4sXut4WgTg6sThivARBgdoc5c6f9nlxErixjNWFj4TaAa77SJfc3hGPmUDD5vPa0IygoLY2lCjcVVUtvpIzqIW_twvawWVB5wcpDJaMRP9IlxF53lxNR27pR2-_5y-VfCrsFYhlBqcs-8iUbct6L6Y0XrqgCxaarip9W7xBNkssdRUp4KRSsxAoe6tveASXqtPCQ.bnVsbA', + 'domain' => 'https://apiv1.skl99.net', + 'notifyUrl' => 'https://gglapi.golucky88.com/external/skl-recharge-notify', + 'payoutNotifyUrl' => 'https://gglapi.golucky88.com/external/skl-withdrawal-notify', + 'returnUrl' => 'https://gglapi.golucky88.com/external/skl-query' +]; diff --git a/config/sms.php b/config/sms.php new file mode 100644 index 0000000..e53d774 --- /dev/null +++ b/config/sms.php @@ -0,0 +1,10 @@ + [886], + 'default_code' => 8888, + "userId" => "dengshikeji2", + "account" => "dengshikeji2", + "password" => "dengshikeji2", + 'aliwy_url' => 'http://smsapi.weiqucloud.com/sms/httpSmsInterface2', +]; diff --git a/config/static.php b/config/static.php new file mode 100644 index 0000000..6313679 --- /dev/null +++ b/config/static.php @@ -0,0 +1,23 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +/** + * Static file settings + */ +return [ + 'enable' => true, + 'middleware' => [ // Static file Middleware + //app\middleware\StaticFile::class, + ], +]; \ No newline at end of file diff --git a/config/thinkcache.php b/config/thinkcache.php new file mode 100644 index 0000000..487f18f --- /dev/null +++ b/config/thinkcache.php @@ -0,0 +1,22 @@ + 'file', + 'stores' => [ + 'file' => [ + 'type' => 'File', + // 缓存保存目录 + 'path' => runtime_path() . '/cache/', + // 缓存前缀 + 'prefix' => '', + // 缓存有效期 0表示永久缓存 + 'expire' => 0, + ], + 'redis' => [ + 'type' => 'redis', + 'host' => '127.0.0.1', + 'port' => 6379, + 'prefix' => '', + 'expire' => 0, + ], + ], +]; \ No newline at end of file diff --git a/config/thinkorm.php b/config/thinkorm.php new file mode 100644 index 0000000..02966f9 --- /dev/null +++ b/config/thinkorm.php @@ -0,0 +1,36 @@ + 'mysql', + 'connections' => [ + 'mysql' => [ + // 数据库类型 + 'type' => 'mysql', + // 服务器地址 + 'hostname' => '127.0.0.1', + // 数据库名 + 'database' => 'test', + // 数据库用户名 + 'username' => 'root', + // 数据库密码 + 'password' => '123456', + // 数据库连接端口 + 'hostport' => '3306', + // 数据库连接参数 + 'params' => [ + // 连接超时3秒 + \PDO::ATTR_TIMEOUT => 3, + ], + // 数据库编码默认采用utf8 + 'charset' => 'utf8', + // 数据库表前缀 + 'prefix' => '', + // 断线重连 + 'break_reconnect' => true, + // 关闭SQL监听日志 + 'trigger_sql' => true, + // 自定义分页类 + 'bootstrap' => '' + ], + ], +]; diff --git a/config/translation.php b/config/translation.php new file mode 100644 index 0000000..dbe3d19 --- /dev/null +++ b/config/translation.php @@ -0,0 +1,25 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +/** + * Multilingual configuration + */ +return [ + // Default language + 'locale' => 'zh_CN', + // Fallback language + 'fallback_locale' => ['zh_CN', 'en', 'Ma_my'], + // Folder where language files are stored + 'path' => base_path() . '/resource/translations', +]; \ No newline at end of file diff --git a/config/tw-sms.php b/config/tw-sms.php new file mode 100644 index 0000000..898180f --- /dev/null +++ b/config/tw-sms.php @@ -0,0 +1,9 @@ + 'https://smsapi.mitake.com.tw', + 'username' => '42913099', + 'password' => '701001', + 'sm_send_api' => '/api/mtk/SmSend', + 'sm_query_api' => '/api/mtk/SmQuery', +]; diff --git a/config/view.php b/config/view.php new file mode 100644 index 0000000..e3a7b85 --- /dev/null +++ b/config/view.php @@ -0,0 +1,22 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +use support\view\Raw; +use support\view\Twig; +use support\view\Blade; +use support\view\ThinkPHP; + +return [ + 'handler' => Raw::class +]; diff --git a/db/migrations/20231019063557_create_channel.php b/db/migrations/20231019063557_create_channel.php new file mode 100644 index 0000000..8c70c97 --- /dev/null +++ b/db/migrations/20231019063557_create_channel.php @@ -0,0 +1,49 @@ +hasTable('channel'); + if (!$exists) { + $table = $this->table('channel', ['comment' => '渠道']); + $table->addColumn('name', 'string', ['limit' => 120, 'null' => false, 'default' => '', 'comment' => '渠道名称']) + ->addColumn('domain', 'string', ['limit' => 80, 'null' => false, 'default' => '', 'comment' => '渠道域名']) + ->addColumn('lang', 'string', ['limit' => 20, 'null' => false, 'default' => '', 'comment' => '语言']) + ->addColumn('currency', 'string', ['limit' => 10, 'null' => false, 'default' => '', 'comment' => '币别代码']) + ->addColumn('department_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => true, 'null' => false, 'default' => 0, 'comment' => '部门id']) + ->addColumn('site_id', 'string', ['limit' => 100, 'signed' => true, 'null' => false, 'default' => 0, 'comment' => '渠道编号']) + ->addColumn('user_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '管理员id']) + ->addColumn('status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '状态(0:禁用,1:启用)']) + ->addColumn('recharge_status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '平台充值(0:禁用,1:启用)']) + ->addColumn('withdraw_status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '平台提现状态(0:禁用,1:启用)']) + ->addColumn('web_login_status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => 'web登录状态(0:禁用,1:启用)']) + ->addColumn('recharge_amount', 'decimal', ['precision' => 10, 'scale' => 2, 'signed' => true, 'null' => false, 'default' => 0, 'comment' => '官方总充值金额']) + ->addColumn('withdraw_amount', 'decimal', ['precision' => 10, 'scale' => 2, 'signed' => true, 'null' => false, 'default' => 0, 'comment' => '官方总提现金额']) + ->addColumn('wallet_action_status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '玩家钱包操作功能']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->addColumn('deleted_at', 'timestamp', ['comment' => '删除时间']) + ->addIndex(['name'], ['unique' => true, 'name' => 'uni_name']) + ->addIndex(['department_id'], ['name' => 'idx_department_id']) + ->addIndex(['user_id'], ['name' => 'idx_user_id']) + ->create(); + } + } +} diff --git a/db/migrations/20231019082149_create_admin_configs.php b/db/migrations/20231019082149_create_admin_configs.php new file mode 100644 index 0000000..8fc042d --- /dev/null +++ b/db/migrations/20231019082149_create_admin_configs.php @@ -0,0 +1,33 @@ +hasTable('admin_configs'); + if (!$exists) { + $table = $this->table('admin_configs', ['comment' => '系统配置表']); + $table->addColumn('name', 'string', ['limit' => 100, 'null' => false, 'default' => '', 'comment' => '配置字段']) + ->addColumn('value', 'text', ['limit' => MysqlAdapter::TEXT_MEDIUM, 'comment' => '工控返回']) + ->addColumn('created_at', 'datetime', ['comment' => '创建时间']) + ->addColumn('updated_at', 'datetime', ['comment' => '更新时间']) + ->create(); + } + } +} diff --git a/db/migrations/20231019082538_create_admin_department.php b/db/migrations/20231019082538_create_admin_department.php new file mode 100644 index 0000000..69131db --- /dev/null +++ b/db/migrations/20231019082538_create_admin_department.php @@ -0,0 +1,40 @@ +hasTable('admin_department'); + if (!$exists) { + $table = $this->table('admin_department', ['comment' => '部门表']); + $table->addColumn('pid', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => false, 'null' => false, 'default' => 0, 'comment' => '上级部门']) + ->addColumn('name', 'string', ['limit' => 100, 'null' => false, 'default' => '', 'comment' => '部门名称']) + ->addColumn('leader', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '负责人']) + ->addColumn('phone', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '手机号']) + ->addColumn('status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '状态:1=正常,0=禁用']) + ->addColumn('type', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '1 部门 2渠道']) + ->addColumn('sort', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '排序']) + ->addColumn('path', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '手机号']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->addColumn('deleted_at', 'timestamp', ['comment' => '删除时间']) + ->create(); + } + } +} diff --git a/db/migrations/20231019083200_create_admin_file_attachment_cates.php b/db/migrations/20231019083200_create_admin_file_attachment_cates.php new file mode 100644 index 0000000..46fd7d0 --- /dev/null +++ b/db/migrations/20231019083200_create_admin_file_attachment_cates.php @@ -0,0 +1,34 @@ +hasTable('admin_file_attachment_cates'); + if (!$exists) { + $table = $this->table('admin_file_attachment_cates', ['comment' => '系统附件分类']); + $table->addColumn('name', 'string', ['limit' => 100, 'null' => false, 'default' => '', 'comment' => '分类名称']) + ->addColumn('pid', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => false, 'null' => false, 'default' => 0, 'comment' => '上级id']) + ->addColumn('permission_type', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 0, 'comment' => '0所有人,1仅自己']) + ->addColumn('sort', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '排序']) + ->addColumn('admin_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => false, 'null' => false, 'default' => 0, 'comment' => '后台用户id']) + ->create(); + } + } +} diff --git a/db/migrations/20231019083930_create_admin_file_attachments.php b/db/migrations/20231019083930_create_admin_file_attachments.php new file mode 100644 index 0000000..768f7d4 --- /dev/null +++ b/db/migrations/20231019083930_create_admin_file_attachments.php @@ -0,0 +1,43 @@ +hasTable('admin_file_attachments'); + if (!$exists) { + $table = $this->table('admin_file_attachments', ['comment' => '系统附件分类']); + $table->addColumn('cate_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => false, 'null' => false, 'default' => 0, 'comment' => '分类id']) + ->addColumn('uploader_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => false, 'null' => false, 'default' => 0, 'comment' => '上传人id']) + ->addColumn('type', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => 'image图片 file文件']) + ->addColumn('file_type', 'string', ['limit' => 100, 'null' => false, 'default' => '', 'comment' => '文件类型']) + ->addColumn('name', 'string', ['limit' => 100, 'null' => false, 'default' => '', 'comment' => '附件名称']) + ->addColumn('real_name', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '原始文件名']) + ->addColumn('path', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '路径']) + ->addColumn('url', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '访问url']) + ->addColumn('ext', 'string', ['limit' => 10, 'null' => false, 'default' => '', 'comment' => '文件后缀']) + ->addColumn('disk', 'string', ['limit' => 20, 'null' => false, 'default' => '', 'comment' => 'disk']) + ->addColumn('size', 'integer', ['limit' => MysqlAdapter::INT_BIG, 'null' => false, 'default' => 0, 'comment' => '文件大小']) + ->addColumn('created_at', 'datetime', ['comment' => '创建时间']) + ->addColumn('updated_at', 'datetime', ['comment' => '更新时间']) + ->addColumn('deleted_at', 'datetime', ['comment' => '删除时间']) + ->create(); + } + } +} diff --git a/db/migrations/20231019084623_create_admin_menus.php b/db/migrations/20231019084623_create_admin_menus.php new file mode 100644 index 0000000..1414568 --- /dev/null +++ b/db/migrations/20231019084623_create_admin_menus.php @@ -0,0 +1,40 @@ +hasTable('admin_menus'); + if (!$exists) { + $table = $this->table('admin_menus', ['comment' => '系统菜单表']); + $table->addColumn('name', 'string', ['limit' => 100, 'null' => false, 'default' => '', 'comment' => '名称']) + ->addColumn('icon', 'string', ['limit' => 100, 'null' => false, 'default' => '', 'comment' => '图标']) + ->addColumn('url', 'string', ['limit' => 100, 'null' => false, 'default' => '', 'comment' => '链接']) + ->addColumn('plugin', 'string', ['limit' => 100, 'null' => false, 'default' => '', 'comment' => '插件名称']) + ->addColumn('pid', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => false, 'null' => false, 'default' => 0, 'comment' => '父级id']) + ->addColumn('sort', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '排序']) + ->addColumn('type', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '类型 1 总站 2渠道']) + ->addColumn('status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '状态(0:禁用,1:启用)']) + ->addColumn('open', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '菜单展开(0:收起,1:展开)']) + ->addColumn('created_at', 'datetime', ['comment' => '创建时间']) + ->addColumn('updated_at', 'datetime', ['comment' => '更新时间']) + ->create(); + } + } +} diff --git a/db/migrations/20231019085033_create_admin_post.php b/db/migrations/20231019085033_create_admin_post.php new file mode 100644 index 0000000..344c283 --- /dev/null +++ b/db/migrations/20231019085033_create_admin_post.php @@ -0,0 +1,37 @@ +hasTable('admin_post'); + if (!$exists) { + $table = $this->table('admin_post', ['comment' => '岗位']); + $table->addColumn('name', 'string', ['limit' => 100, 'null' => false, 'default' => '', 'comment' => '岗位名称']) + ->addColumn('status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '状态(0:禁用,1:启用)']) + ->addColumn('sort', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '排序']) + ->addColumn('department_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '部门id']) + ->addColumn('type', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '类型 1 总站 2渠道']) + ->addColumn('deleted_at', 'datetime', ['comment' => '更新时间']) + ->addColumn('created_at', 'datetime', ['comment' => '创建时间']) + ->addColumn('updated_at', 'datetime', ['comment' => '更新时间']) + ->create(); + } + } +} diff --git a/db/migrations/20231019085352_create_admin_role_department.php b/db/migrations/20231019085352_create_admin_role_department.php new file mode 100644 index 0000000..ab5cec4 --- /dev/null +++ b/db/migrations/20231019085352_create_admin_role_department.php @@ -0,0 +1,33 @@ +hasTable('admin_role_department'); + if (!$exists) { + $table = $this->table('admin_role_department', ['comment' => '角色数据权限部门关联表']); + $table->addColumn('role_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '角色id']) + ->addColumn('department_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '渠道/部门id']) + ->addColumn('created_at', 'datetime', ['comment' => '创建时间']) + ->addColumn('updated_at', 'datetime', ['comment' => '更新时间']) + ->create(); + } + } +} diff --git a/db/migrations/20231019085602_create_admin_role_menus.php b/db/migrations/20231019085602_create_admin_role_menus.php new file mode 100644 index 0000000..37828b2 --- /dev/null +++ b/db/migrations/20231019085602_create_admin_role_menus.php @@ -0,0 +1,32 @@ +hasTable('admin_role_menus'); + if (!$exists) { + $table = $this->table('admin_role_menus', ['comment' => '系统角色菜单表']); + $table->addColumn('role_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '角色id']) + ->addColumn('menu_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '菜单id']) + ->addIndex(['role_id', 'menu_id'], ['name' => 'idx_role_id_menu_id']) + ->create(); + } + } +} diff --git a/db/migrations/20231019085901_create_admin_role_permissions.php b/db/migrations/20231019085901_create_admin_role_permissions.php new file mode 100644 index 0000000..1f922a1 --- /dev/null +++ b/db/migrations/20231019085901_create_admin_role_permissions.php @@ -0,0 +1,32 @@ +hasTable('admin_role_permissions'); + if (!$exists) { + $table = $this->table('admin_role_permissions', ['comment' => '系统角色权限表']); + $table->addColumn('role_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '角色id']) + ->addColumn('node_id', 'string', ['limit' => 255, 'null' => false, 'default' => '0', 'comment' => '节点id']) + ->addIndex(['role_id', 'node_id'], ['name' => 'idx_role_id_node_id']) + ->create(); + } + } +} diff --git a/db/migrations/20231019090118_create_admin_role_users.php b/db/migrations/20231019090118_create_admin_role_users.php new file mode 100644 index 0000000..2bc0f73 --- /dev/null +++ b/db/migrations/20231019090118_create_admin_role_users.php @@ -0,0 +1,32 @@ +hasTable('admin_role_users'); + if (!$exists) { + $table = $this->table('admin_role_users', ['comment' => '系统角色用户表']); + $table->addColumn('role_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '角色id']) + ->addColumn('user_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '用户id']) + ->addIndex(['role_id', 'user_id'], ['name' => 'idx_role_id_user_id']) + ->create(); + } + } +} diff --git a/db/migrations/20231019090238_create_admin_roles.php b/db/migrations/20231019090238_create_admin_roles.php new file mode 100644 index 0000000..3771826 --- /dev/null +++ b/db/migrations/20231019090238_create_admin_roles.php @@ -0,0 +1,36 @@ +hasTable('admin_roles'); + if (!$exists) { + $table = $this->table('admin_roles', ['comment' => '系统角色表']); + $table->addColumn('name', 'string', ['limit' => 20, 'null' => false, 'default' => '', 'comment' => '权限角色名称']) + ->addColumn('desc', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '备注说明']) + ->addColumn('sort', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '排序']) + ->addColumn('created_at', 'datetime', ['comment' => '创建时间']) + ->addColumn('updated_at', 'datetime', ['comment' => '更新时间']) + ->addColumn('check_strictly', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 0, 'comment' => '数据权限类型:0=全部数据权限,1=自定义数据权限,2=本部门及以下数据权限,3=本部门数据权限,4=本人数据权限']) + ->addColumn('type', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '1 总后台 2渠道后台']) + ->create(); + } + } +} diff --git a/db/migrations/20231019090918_create_admin_users.php b/db/migrations/20231019090918_create_admin_users.php new file mode 100644 index 0000000..13e46cc --- /dev/null +++ b/db/migrations/20231019090918_create_admin_users.php @@ -0,0 +1,45 @@ +hasTable('admin_users'); + if (!$exists) { + $table = $this->table('admin_users', ['comment' => '系统用户表']); + $table->addColumn('username', 'string', ['limit' => 120, 'null' => false, 'default' => '', 'comment' => '用户账号']) + ->addColumn('password', 'string', ['limit' => 80, 'null' => false, 'default' => '', 'comment' => '密码']) + ->addColumn('nickname', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '姓名']) + ->addColumn('avatar', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '头像']) + ->addColumn('email', 'string', ['limit' => 50, 'null' => false, 'default' => '', 'comment' => '邮箱']) + ->addColumn('phone', 'string', ['limit' => 20, 'null' => false, 'default' => '', 'comment' => '手机号']) + ->addColumn('type', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '1 部门 2渠道']) + ->addColumn('is_super', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 0, 'comment' => '是否超管']) + ->addColumn('status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '状态(0:禁用,1:启用)']) + ->addColumn('remember_token', 'string', ['limit' => 100, 'null' => false, 'default' => '', 'comment' => '备注说明']) + ->addColumn('department_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '部门id']) + ->addColumn('post', 'text', ['limit' => MysqlAdapter::TEXT_LONG, 'comment' => '岗位']) + ->addColumn('created_at', 'datetime', ['comment' => '创建时间']) + ->addColumn('updated_at', 'datetime', ['comment' => '更新时间']) + ->addColumn('deleted_at', 'datetime', ['comment' => '删除时间']) + ->addIndex(['username'], ['name' => 'uni_username', 'unique' => true]) + ->create(); + } + } +} diff --git a/db/migrations/20231019091927_create_announcement.php b/db/migrations/20231019091927_create_announcement.php new file mode 100644 index 0000000..c1a74df --- /dev/null +++ b/db/migrations/20231019091927_create_announcement.php @@ -0,0 +1,43 @@ +hasTable('announcement'); + if (!$exists) { + $table = $this->table('announcement', ['comment' => '公告']); + $table->addColumn('department_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '部门/渠道id']) + ->addColumn('title', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '内容']) + ->addColumn('content', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '姓名']) + ->addColumn('valid_time', 'datetime', ['null' => true, 'comment' => '有效时间']) + ->addColumn('push_time', 'datetime', ['null' => true, 'comment' => '发布时间']) + ->addColumn('status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '狀態,0=停用, 1=啟用']) + ->addColumn('priority', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => true, 'comment' => '优先级']) + ->addColumn('admin_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => false, 'null' => false, 'default' => 0, 'comment' => '管理员id']) + ->addColumn('admin_name', 'string', ['limit' => 20, 'null' => false, 'default' => '', 'comment' => '管理员名称']) + ->addColumn('created_at', 'datetime', ['comment' => '创建时间']) + ->addColumn('updated_at', 'datetime', ['comment' => '更新时间']) + ->addColumn('deleted_at', 'datetime', ['comment' => '删除时间']) + ->addIndex(['department_id'], ['name' => 'idx_department_id']) + ->addIndex(['admin_id'], ['name' => 'idx_admin_id']) + ->create(); + } + } +} diff --git a/db/migrations/20231019092731_create_api_error_log.php b/db/migrations/20231019092731_create_api_error_log.php new file mode 100644 index 0000000..3d43493 --- /dev/null +++ b/db/migrations/20231019092731_create_api_error_log.php @@ -0,0 +1,38 @@ +hasTable('api_error_log'); + if (!$exists) { + $table = $this->table('api_error_log', ['comment' => 'api请求错误日志']); + $table->addColumn('player_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '玩家id']) + ->addColumn('target', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '资源表']) + ->addColumn('target_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => false, 'null' => false, 'default' => 0, 'comment' => '资源id']) + ->addColumn('url', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '请求地址']) + ->addColumn('params', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '参数']) + ->addColumn('content', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '错误内容']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->addIndex(['player_id'], ['name' => 'idx_player_id']) + ->create(); + } + } +} diff --git a/db/migrations/20231019100353_create_channel_financial_record.php b/db/migrations/20231019100353_create_channel_financial_record.php new file mode 100644 index 0000000..f565263 --- /dev/null +++ b/db/migrations/20231019100353_create_channel_financial_record.php @@ -0,0 +1,41 @@ +hasTable('channel_financial_record'); + if (!$exists) { + $table = $this->table('channel_financial_record', ['comment' => '渠道财务记录']); + $table->addColumn('department_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => true, 'null' => false, 'default' => 0, 'comment' => '部门/渠道id']) + ->addColumn('player_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => true, 'null' => false, 'default' => 0, 'comment' => '玩家id']) + ->addColumn('target', 'string', ['limit' => 50, 'null' => false, 'default' => '', 'comment' => '資料表']) + ->addColumn('target_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => true, 'null' => false, 'default' => 0, 'comment' => '資料id']) + ->addColumn('action', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 0, 'comment' => '操作']) + ->addColumn('tradeno', 'string', ['limit' => 100, 'null' => false, 'default' => '', 'comment' => '單號']) + ->addColumn('user_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '管理员id']) + ->addColumn('user_name', 'string', ['limit' => 120, 'null' => false, 'default' => '', 'comment' => '管理员名称']) + ->addColumn('created_at', 'datetime', ['comment' => '创建时间']) + ->addColumn('updated_at', 'datetime', ['comment' => '更新时间']) + ->addIndex(['department_id'], ['name' => 'idx_department_id']) + ->addIndex(['user_id'], ['name' => 'idx_user_id']) + ->create(); + } + } +} diff --git a/db/migrations/20231020013447_create_currency.php b/db/migrations/20231020013447_create_currency.php new file mode 100644 index 0000000..b177abc --- /dev/null +++ b/db/migrations/20231020013447_create_currency.php @@ -0,0 +1,38 @@ +hasTable('currency'); + if (!$exists) { + $table = $this->table('currency', ['comment' => '货币配置']); + $table->addColumn('name', 'string', ['limit' => 120, 'null' => false, 'default' => '', 'comment' => '货币名称']) + ->addColumn('identifying', 'string', ['limit' => 80, 'null' => false, 'default' => '', 'comment' => '货币标识']) + ->addColumn('ratio', 'decimal', ['precision' => 14, 'scale' => 4, 'signed' => true, 'null' => false, 'default' => 0, 'comment' => '1货币 = 点数']) + ->addColumn('status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '狀態,0=停用, 1=啟用']) + ->addColumn('admin_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '管理员id']) + ->addColumn('created_at', 'datetime', ['comment' => '创建时间']) + ->addColumn('updated_at', 'datetime', ['comment' => '更新时间']) + ->addColumn('deleted_at', 'datetime', ['comment' => '删除时间']) + ->addIndex(['identifying'], ['name' => 'uni_identifying', 'unique' => true]) + ->create(); + } + } +} diff --git a/db/migrations/20231020014010_create_external_app.php b/db/migrations/20231020014010_create_external_app.php new file mode 100644 index 0000000..5112008 --- /dev/null +++ b/db/migrations/20231020014010_create_external_app.php @@ -0,0 +1,41 @@ +hasTable('external_app'); + if (!$exists) { + $table = $this->table('external_app', ['comment' => '外部应用']); + $table->addColumn('name', 'string', ['limit' => 120, 'null' => false, 'default' => '', 'comment' => '应用名称']) + ->addColumn('white_ip', 'text', ['limit' => MysqlAdapter::TEXT_REGULAR, 'comment' => '白化IP']) + ->addColumn('app_id', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => 'app_id']) + ->addColumn('app_secret', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => 'app_secret']) + ->addColumn('user_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '管理员id']) + ->addColumn('user_name', 'string', ['limit' => 20, 'null' => false, 'default' => '', 'comment' => '管理员名称']) + ->addColumn('status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '狀態,0=停用, 1=啟用']) + ->addColumn('created_at', 'datetime', ['comment' => '创建时间']) + ->addColumn('updated_at', 'datetime', ['comment' => '更新时间']) + ->addColumn('deleted_at', 'datetime', ['comment' => '删除时间']) + ->addIndex(['name'], ['name' => 'uni_name', 'unique' => true]) + ->addIndex(['user_id'], ['name' => 'idx_user_id']) + ->create(); + } + } +} diff --git a/db/migrations/20231020023005_create_phone_sms_log.php b/db/migrations/20231020023005_create_phone_sms_log.php new file mode 100644 index 0000000..b8bf2e6 --- /dev/null +++ b/db/migrations/20231020023005_create_phone_sms_log.php @@ -0,0 +1,42 @@ +hasTable('phone_sms_log'); + if (!$exists) { + $table = $this->table('phone_sms_log', ['comment' => '手机短信日志']); + $table->addColumn('player_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => false, 'null' => false, 'default' => 0, 'comment' => '玩家id']) + ->addColumn('phone', 'string', ['limit' => 20, 'null' => false, 'default' => '', 'comment' => '手机号']) + ->addColumn('code', 'string', ['limit' => 10, 'null' => false, 'default' => '', 'comment' => '驗證碼']) + ->addColumn('type', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'comment' => '类型 1 登录 2注册 3修改密码']) + ->addColumn('expire_time', 'datetime', ['default' => null, 'comment' => '過期時間']) + ->addColumn('status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 0, 'comment' => '狀態,0=失敗, 1=成功']) + ->addColumn('send_times', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 1, 'comment' => '發送次數']) + ->addColumn('response', 'text', ['limit' => MysqlAdapter::TEXT_REGULAR, 'comment' => '簡訊商回傳內容']) + ->addColumn('uid', 'string', ['limit' => 40, 'null' => false, 'default' => '', 'comment' => '短信发送编号']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->addIndex(['player_id'], ['name' => 'idx_player_id']) + ->addIndex(['phone'], ['name' => 'idx_phone']) + ->create(); + } + } +} diff --git a/db/migrations/20231020023858_create_player.php b/db/migrations/20231020023858_create_player.php new file mode 100644 index 0000000..98706f6 --- /dev/null +++ b/db/migrations/20231020023858_create_player.php @@ -0,0 +1,58 @@ +hasTable('player'); + if (!$exists) { + $table = $this->table('player', ['comment' => '玩家']); + $table->addColumn('talk_user_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'default' => null, 'comment' => '来聊聊账号id']) + ->addColumn('uuid', 'string', ['limit' => 20, 'null' => false, 'default' => '', 'comment' => 'uuid']) + ->addColumn('department_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '部门id']) + ->addColumn('recommend_id', 'integer', ['limit' => MysqlAdapter::INT_BIG, 'default' => null, 'comment' => '推广id']) + ->addColumn('type', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'signed' => false, 'null' => false, 'default' => 1, 'comment' => '1 玩家']) + ->addColumn('status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '帐号状态 1啟用 0停用']) + ->addColumn('status_withdraw', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'signed' => false, 'null' => false, 'default' => 1, 'comment' => '取款状态 1啟用 0停用']) + ->addColumn('status_transfer', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '轉點功能']) + ->addColumn('name', 'string', ['limit' => 50, 'null' => false, 'default' => '', 'comment' => '姓名']) + ->addColumn('phone', 'string', ['limit' => 25, 'null' => false, 'default' => '', 'comment' => '手机号']) + ->addColumn('country_code', 'string', ['limit' => 20, 'null' => false, 'default' => '', 'comment' => '手機國際碼']) + ->addColumn('recommend_code', 'string', ['limit' => 10, 'null' => false, 'default' => '', 'comment' => '玩家推广码']) + ->addColumn('recommended_code', 'string', ['limit' => 10, 'null' => false, 'default' => '', 'comment' => '输入推广码']) + ->addColumn('play_password', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => '玩家支付密码']) + ->addColumn('password', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => '玩家密碼']) + ->addColumn('currency', 'string', ['limit' => 5, 'null' => false, 'default' => '', 'comment' => '币别代码']) + ->addColumn('flag', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => '玩家標籤']) + ->addColumn('avatar', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '头像']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->addColumn('deleted_at', 'timestamp', ['comment' => '删除时间']) + ->addColumn('player_tag', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '玩家標籤']) + ->addIndex(['status'], ['name' => 'idx_status']) + ->addIndex(['currency'], ['name' => 'idx_currency']) + ->addIndex(['talk_user_id'], ['name' => 'idx_talk_user_id']) + ->addIndex(['recommend_id'], ['name' => 'idx_recommend_id']) + ->addIndex(['department_id'], ['name' => 'idx_department_id']) + ->addIndex(['uuid'], ['name' => 'idx_uuid']) + ->addIndex(['phone'], ['name' => 'idx_phone']) + ->create(); + } + } +} diff --git a/db/migrations/20231020033110_create_player_bank.php b/db/migrations/20231020033110_create_player_bank.php new file mode 100644 index 0000000..63fbad2 --- /dev/null +++ b/db/migrations/20231020033110_create_player_bank.php @@ -0,0 +1,38 @@ +hasTable('player_bank'); + if (!$exists) { + $table = $this->table('player_bank', ['comment' => '玩家银行账户']); + $table->addColumn('player_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '玩家id']) + ->addColumn('bank_name', 'string', ['limit' => 100, 'null' => false, 'default' => '', 'comment' => '银行名称']) + ->addColumn('account', 'string', ['limit' => 100, 'null' => false, 'default' => '', 'comment' => '银行账号']) + ->addColumn('account_name', 'string', ['limit' => 100, 'null' => false, 'default' => '', 'comment' => '账户所属人']) + ->addColumn('status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '状态(0:禁用,1:启用)']) + ->addColumn('created_at', 'datetime', ['comment' => '创建时间']) + ->addColumn('updated_at', 'datetime', ['comment' => '更新时间']) + ->addColumn('deleted_at', 'datetime', ['comment' => '删除时间']) + ->addIndex(['player_id'], ['name' => 'idx_player_id']) + ->create(); + } + } +} diff --git a/db/migrations/20231020033609_create_player_delivery_record.php b/db/migrations/20231020033609_create_player_delivery_record.php new file mode 100644 index 0000000..a9ce2ab --- /dev/null +++ b/db/migrations/20231020033609_create_player_delivery_record.php @@ -0,0 +1,51 @@ +hasTable('player_delivery_record'); + if (!$exists) { + $table = $this->table('player_delivery_record', ['comment' => '玩家变账记录']); + $table->addColumn('player_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => false, 'null' => false, 'comment' => '玩家id']) + ->addColumn('department_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => false, 'null' => false, 'comment' => '渠道/部门id']) + ->addColumn('code', 'string', ['limit' => 50, 'null' => false, 'default' => '', 'comment' => '機台編號']) + ->addColumn('target', 'string', ['limit' => 50, 'null' => false, 'default' => '', 'comment' => '交易資料表']) + ->addColumn('target_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => false, 'null' => false, 'default' => 0, 'comment' => '資料id']) + ->addColumn('type', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'signed' => false, 'null' => false, 'comment' => '类型']) + ->addColumn('source', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '来源']) + ->addColumn('amount', 'decimal', ['precision' => 32, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '金额']) + ->addColumn('user_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => true, 'null' => false, 'default' => 0, 'comment' => '操作管理员id']) + ->addColumn('user_name', 'string', ['limit' => 50, 'null' => false, 'default' => '', 'comment' => '操作管理员名称']) + ->addColumn('amount_before', 'decimal', ['precision' => 32, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '異動前金額']) + ->addColumn('amount_after', 'decimal', ['precision' => 32, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '金额']) + ->addColumn('tradeno', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '單號']) + ->addColumn('remark', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '备注']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->addIndex(['player_id'], ['name' => 'idx_player_id']) + ->addIndex(['type'], ['name' => 'idx_type']) + ->addIndex(['source'], ['name' => 'idx_source']) + ->addIndex(['amount'], ['name' => 'idx_amount']) + ->addIndex(['tradeno'], ['name' => 'idx_tradeno']) + ->addIndex(['department_id'], ['name' => 'idx_department_id']) + ->create(); + } + } +} diff --git a/db/migrations/20231020034940_create_player_extend.php b/db/migrations/20231020034940_create_player_extend.php new file mode 100644 index 0000000..3e6468f --- /dev/null +++ b/db/migrations/20231020034940_create_player_extend.php @@ -0,0 +1,53 @@ +hasTable('player_extend'); + if (!$exists) { + $table = $this->table('player_extend', ['comment' => '玩家扩展数据']); + $table->addColumn('player_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '玩家id']) + ->addColumn('sex', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'signed' => false, 'default' => null, 'comment' => '性別 1男 2女 3三性']) + ->addColumn('email', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => '信箱']) + ->addColumn('ip', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => '注册IP']) + ->addColumn('qq', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => 'qq号']) + ->addColumn('telegram', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => 'telegram']) + ->addColumn('birthday', 'date', ['default' => null, 'comment' => '生日']) + ->addColumn('id_number', 'string', ['limit' => 20, 'null' => false, 'default' => '', 'comment' => '身分證']) + ->addColumn('address', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '地址']) + ->addColumn('wechat', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => '微信号']) + ->addColumn('facebook', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => 'facebook']) + ->addColumn('line', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => 'line']) + ->addColumn('remark', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '备注']) + ->addColumn('recharge_amount', 'decimal', ['precision' => 10, 'scale' => 2, 'signed' => true, 'null' => false, 'default' => 0, 'comment' => '总充值金额']) + ->addColumn('withdraw_amount', 'decimal', ['precision' => 10, 'scale' => 2, 'signed' => true, 'null' => false, 'default' => 0, 'comment' => '总提现金额']) + ->addColumn('present_in_amount', 'decimal', ['precision' => 10, 'scale' => 2, 'signed' => true, 'null' => false, 'default' => 0, 'comment' => '总提转入金额']) + ->addColumn('present_out_amount', 'decimal', ['precision' => 10, 'scale' => 2, 'signed' => true, 'null' => false, 'default' => 0, 'comment' => '总提转出金额']) + ->addColumn('third_recharge_amount', 'decimal', ['precision' => 10, 'scale' => 2, 'signed' => true, 'null' => false, 'default' => 0, 'comment' => '第三方总充值金额']) + ->addColumn('third_withdraw_amount', 'decimal', ['precision' => 10, 'scale' => 2, 'signed' => true, 'null' => false, 'default' => 0, 'comment' => '第三方总提现金额']) + ->addColumn('coin_recharge_amount', 'decimal', ['precision' => 10, 'scale' => 2, 'signed' => true, 'null' => false, 'default' => 0, 'comment' => '币商充值总金额']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->addColumn('deleted_at', 'timestamp', ['comment' => '删除时间']) + ->addIndex(['player_id'], ['name' => 'uni_player_id', 'unique' => true]) + ->create(); + } + } +} diff --git a/db/migrations/20231020055313_create_player_login_record.php b/db/migrations/20231020055313_create_player_login_record.php new file mode 100644 index 0000000..7c29a3b --- /dev/null +++ b/db/migrations/20231020055313_create_player_login_record.php @@ -0,0 +1,40 @@ +hasTable('player_login_record'); + if (!$exists) { + $table = $this->table('player_login_record', ['comment' => '玩家登录记录']); + $table->addColumn('player_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '玩家id']) + ->addColumn('department_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '渠道/部门id']) + ->addColumn('login_domain', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => '登錄域名']) + ->addColumn('ip', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => 'ip']) + ->addColumn('country_name', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => '國家名稱']) + ->addColumn('city_name', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => '地區名稱']) + ->addColumn('remark', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => '備註']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->addIndex(['player_id'], ['name' => 'idx_player_id']) + ->addIndex(['department_id'], ['name' => 'idx_department_id']) + ->create(); + } + } +} diff --git a/db/migrations/20231020055715_create_player_money_edit_log.php b/db/migrations/20231020055715_create_player_money_edit_log.php new file mode 100644 index 0000000..9438e69 --- /dev/null +++ b/db/migrations/20231020055715_create_player_money_edit_log.php @@ -0,0 +1,50 @@ +hasTable('player_money_edit_log'); + if (!$exists) { + $table = $this->table('player_money_edit_log', ['comment' => '玩家钱包管理员调整日志']); + $table->addColumn('player_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '玩家id']) + ->addColumn('type', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 0, 'comment' => '類型 1=存 0=出']) + ->addColumn('action', 'string', ['limit' => 20, 'null' => false, 'default' => '', 'comment' => '手動輸入類型']) + ->addColumn('tradeno', 'string', ['limit' => 20, 'null' => false, 'default' => '', 'comment' => '單號']) + ->addColumn('currency', 'string', ['limit' => 10, 'null' => false, 'default' => '', 'comment' => '幣種']) + ->addColumn('money', 'decimal', ['precision' => 14, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '金額']) + ->addColumn('origin_money', 'decimal', ['precision' => 14, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '原始金額']) + ->addColumn('after_money', 'decimal', ['precision' => 14, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '異動後金額']) + ->addColumn('inmoney', 'decimal', ['precision' => 14, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '實際金額']) + ->addColumn('subsidy_money', 'decimal', ['precision' => 14, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '補助金額']) + ->addColumn('bet_multiple', 'decimal', ['precision' => 8, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '流水倍數']) + ->addColumn('bet_num', 'decimal', ['precision' => 14, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '流水']) + ->addColumn('remark', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '資金調整備註']) + ->addColumn('user_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '管理员id']) + ->addColumn('user_name', 'string', ['limit' => 20, 'null' => false, 'default' => '', 'comment' => '管理员名称']) + ->addColumn('deleted_at', 'timestamp', ['comment' => '更新时间']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->addIndex(['tradeno'], ['name' => 'idx_tradeno', 'unique' => true]) + ->addIndex(['user_id'], ['name' => 'idx_user_id']) + ->addIndex(['player_id'], ['name' => 'idx_player_id']) + ->create(); + } + } +} diff --git a/db/migrations/20231020060556_create_player_platform_cash.php b/db/migrations/20231020060556_create_player_platform_cash.php new file mode 100644 index 0000000..e0a216c --- /dev/null +++ b/db/migrations/20231020060556_create_player_platform_cash.php @@ -0,0 +1,38 @@ +hasTable('player_platform_cash'); + if (!$exists) { + $table = $this->table('player_platform_cash', ['comment' => '玩家钱包']); + $table->addColumn('player_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '玩家id']) + ->addColumn('platform_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '平台id']) + ->addColumn('platform_name', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '平台名稱']) + ->addColumn('money', 'decimal', ['precision' => 16, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '點數']) + ->addColumn('status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '钱包状态']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->addIndex(['player_id'], ['name' => 'idx_player_id']) + ->addIndex(['platform_id'], ['name' => 'idx_platform_id']) + ->create(); + } + } +} diff --git a/db/migrations/20231020061742_create_player_recharge_record.php b/db/migrations/20231020061742_create_player_recharge_record.php new file mode 100644 index 0000000..f0fb0b4 --- /dev/null +++ b/db/migrations/20231020061742_create_player_recharge_record.php @@ -0,0 +1,60 @@ +hasTable('player_recharge_record'); + if (!$exists) { + $table = $this->table('player_recharge_record', ['comment' => '玩家充值记录']); + $table->addColumn('player_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '玩家id']) + ->addColumn('department_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '部门/渠道id']) + ->addColumn('talk_user_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'default' => null, 'comment' => '来聊聊账号id']) + ->addColumn('setting_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'default' => null, 'comment' => '充值账号配置id']) + ->addColumn('tradeno', 'string', ['limit' => 100, 'null' => false, 'default' => '', 'comment' => '單號']) + ->addColumn('status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 0, 'comment' => '狀態, 0=充值中 1=待审核, 2=成功, 3=失败, 4=取消(用户取消) 5=拒绝 6=已关闭(后端取消任务)']) + ->addColumn('type', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '1来聊聊充值(第三方充值) 2渠道充值(官方充值) 3币商转入']) + ->addColumn('player_name', 'string', ['limit' => 20, 'null' => false, 'default' => null, 'comment' => '玩家姓名']) + ->addColumn('player_phone', 'string', ['limit' => 20, 'null' => false, 'default' => null, 'comment' => '玩家手機號碼']) + ->addColumn('point', 'decimal', ['precision' => 14, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '充值点数']) + ->addColumn('money', 'decimal', ['precision' => 14, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '充值金額']) + ->addColumn('inmoney', 'decimal', ['precision' => 14, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '實際充值金額']) + ->addColumn('currency', 'string', ['limit' => 10, 'null' => false, 'default' => null, 'comment' => '幣種']) + ->addColumn('user_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => true, 'null' => false, 'default' => 0, 'comment' => '管理员id']) + ->addColumn('user_name', 'string', ['limit' => 50, 'null' => false, 'default' => '', 'comment' => '管理员']) + ->addColumn('player_tag', 'string', ['limit' => 100, 'null' => false, 'default' => '', 'comment' => '玩家標籤']) + ->addColumn('remark', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '備註']) + ->addColumn('reject_reason', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '拒绝原因']) + ->addColumn('notify_result', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '異步通知回傳結果']) + ->addColumn('certificate', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '付款凭证']) + ->addColumn('finish_time', 'datetime', ['comment' => '入款成功时间']) + ->addColumn('cancel_time', 'datetime', ['comment' => '取消時間']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->addIndex(['tradeno'], ['name' => 'uni_tradeno', 'unique' => true]) + ->addIndex(['status'], ['name' => 'idx_status']) + ->addIndex(['type'], ['name' => 'idx_type']) + ->addIndex(['player_name'], ['name' => 'idx_player_name']) + ->addIndex(['player_id'], ['name' => 'idx_player_id']) + ->addIndex(['talk_user_id'], ['name' => 'idx_talk_user_id']) + ->addIndex(['department_id'], ['name' => 'idx_department_id']) + ->create(); + } + } +} diff --git a/db/migrations/20231020062947_create_player_register_record.php b/db/migrations/20231020062947_create_player_register_record.php new file mode 100644 index 0000000..f2f1abf --- /dev/null +++ b/db/migrations/20231020062947_create_player_register_record.php @@ -0,0 +1,42 @@ +hasTable('player_register_record'); + if (!$exists) { + $table = $this->table('player_register_record', ['comment' => '玩家注册记录']); + $table->addColumn('player_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '玩家id']) + ->addColumn('department_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '部门/渠道id']) + ->addColumn('register_domain', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => '登錄域名']) + ->addColumn('ip', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => 'ip']) + ->addColumn('country_name', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => '國家名稱']) + ->addColumn('city_name', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => '地區名稱']) + ->addColumn('type', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'signed' => true, 'null' => false, 'default' => 0, 'comment' => '類型 0未讀 1已讀']) + ->addColumn('remark', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => '備註']) + ->addColumn('device', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => '使用設備']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->addIndex(['player_id'], ['name' => 'idx_player_id']) + ->addIndex(['department_id'], ['name' => 'idx_department_id']) + ->create(); + } + } +} diff --git a/db/migrations/20231020070150_create_player_tag.php b/db/migrations/20231020070150_create_player_tag.php new file mode 100644 index 0000000..f56d5e1 --- /dev/null +++ b/db/migrations/20231020070150_create_player_tag.php @@ -0,0 +1,31 @@ +hasTable('player_tag'); + if (!$exists) { + $table = $this->table('player_tag', ['comment' => '玩家标签']); + $table->addColumn('name', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => '标签名称']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->create(); + } + } +} diff --git a/db/migrations/20231020070340_create_player_withdraw_record.php b/db/migrations/20231020070340_create_player_withdraw_record.php new file mode 100644 index 0000000..48f7891 --- /dev/null +++ b/db/migrations/20231020070340_create_player_withdraw_record.php @@ -0,0 +1,61 @@ +hasTable('player_withdraw_record'); + if (!$exists) { + $table = $this->table('player_withdraw_record', ['comment' => '玩家提现记录']); + $table->addColumn('player_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '玩家id']) + ->addColumn('department_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '部门/渠道id']) + ->addColumn('talk_user_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'default' => null, 'comment' => '来聊聊账号id']) + ->addColumn('player_tag', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '玩家標籤']) + ->addColumn('tradeno', 'string', ['limit' => 100, 'null' => false, 'default' => '', 'comment' => '單號']) + ->addColumn('status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '狀態, 1=提现中(待审核), 2=成功, 3=失败 , 4=待打款, 5=不通过, 6=玩家取消, 7=系统取消']) + ->addColumn('type', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '1=来聊聊 , 2=银行卡']) + ->addColumn('player_name', 'string', ['limit' => 20, 'null' => false, 'default' => null, 'comment' => '玩家姓名']) + ->addColumn('player_phone', 'string', ['limit' => 20, 'null' => false, 'default' => null, 'comment' => '玩家手機號碼']) + ->addColumn('point', 'decimal', ['precision' => 14, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '游戏点数']) + ->addColumn('money', 'decimal', ['precision' => 14, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '出款金額']) + ->addColumn('inmoney', 'decimal', ['precision' => 14, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '實際出款金額']) + ->addColumn('fee', 'decimal', ['precision' => 14, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '手續費']) + ->addColumn('bank_name', 'string', ['limit' => 100, 'null' => false, 'default' => null, 'comment' => '银行名称']) + ->addColumn('account', 'string', ['limit' => 100, 'null' => false, 'default' => null, 'comment' => '银行账号']) + ->addColumn('account_name', 'string', ['limit' => 100, 'null' => false, 'default' => null, 'comment' => '账户所属人']) + ->addColumn('currency', 'string', ['limit' => 100, 'null' => false, 'default' => null, 'comment' => '幣種']) + ->addColumn('remark', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '備註']) + ->addColumn('reject_reason', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '拒绝原因']) + ->addColumn('finish_time', 'datetime', ['comment' => '出款成功時間']) + ->addColumn('cancel_time', 'datetime', ['comment' => '取消時間']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->addColumn('user_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => true, 'null' => false, 'default' => 0, 'comment' => '管理员id']) + ->addColumn('user_name', 'string', ['limit' => 50, 'null' => false, 'default' => '', 'comment' => '管理员']) + ->addColumn('certificate', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '打款凭证']) + ->addIndex(['tradeno'], ['name' => 'uni_tradeno', 'unique' => true]) + ->addIndex(['status'], ['name' => 'idx_status']) + ->addIndex(['player_name'], ['name' => 'idx_player_name']) + ->addIndex(['player_id'], ['name' => 'idx_player_id']) + ->addIndex(['talk_user_id'], ['name' => 'idx_talk_user_id']) + ->addIndex(['department_id'], ['name' => 'idx_department_id']) + ->create(); + } + } +} diff --git a/db/migrations/20231020071333_create_slider.php b/db/migrations/20231020071333_create_slider.php new file mode 100644 index 0000000..91b7619 --- /dev/null +++ b/db/migrations/20231020071333_create_slider.php @@ -0,0 +1,38 @@ +hasTable('slider'); + if (!$exists) { + $table = $this->table('slider', ['comment' => '轮播图']); + $table->addColumn('department_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '部门/渠道id']) + ->addColumn('url', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '超連結']) + ->addColumn('content', 'text', ['limit' => MysqlAdapter::TEXT_REGULAR, 'comment' => '內文']) + ->addColumn('picture_url', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '圖片位置']) + ->addColumn('status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '狀態,0=停用, 1=啟用']) + ->addColumn('sort', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '排序']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->addColumn('deleted_at', 'timestamp', ['comment' => '删除时间']) + ->create(); + } + } +} diff --git a/db/migrations/20231020073448_create_system_setting.php b/db/migrations/20231020073448_create_system_setting.php new file mode 100644 index 0000000..dc27afc --- /dev/null +++ b/db/migrations/20231020073448_create_system_setting.php @@ -0,0 +1,38 @@ +hasTable('system_setting'); + if (!$exists) { + $table = $this->table('system_setting', ['comment' => '系统设计']); + $table->addColumn('department_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '部门/渠道id']) + ->addColumn('feature', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '功能名稱']) + ->addColumn('num', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'default' => null, 'comment' => '數量']) + ->addColumn('content', 'text', ['limit' => MysqlAdapter::TEXT_REGULAR, 'comment' => '內容']) + ->addColumn('date_start', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '开始时间']) + ->addColumn('date_end', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '结束时间']) + ->addColumn('status', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 1, 'comment' => '1啟用 0停用']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->create(); + } + } +} diff --git a/db/migrations/20231024093335_create_player_edit_log.php b/db/migrations/20231024093335_create_player_edit_log.php new file mode 100644 index 0000000..5b6d519 --- /dev/null +++ b/db/migrations/20231024093335_create_player_edit_log.php @@ -0,0 +1,40 @@ +hasTable('player_edit_log'); + if (!$exists) { + $table = $this->table('player_edit_log', ['comment' => '玩家信息修改记录']); + $table->addColumn('player_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '玩家id']) + ->addColumn('department_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '渠道/部门id']) + ->addColumn('origin_data', 'text', ['limit' => MysqlAdapter::TEXT_REGULAR, 'comment' => '原数据']) + ->addColumn('new_data', 'text', ['limit' => MysqlAdapter::TEXT_REGULAR, 'comment' => '新数据']) + ->addColumn('user_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => false, 'null' => false, 'default' => 0, 'comment' => '管理员id']) + ->addColumn('user_name', 'string', ['limit' => 50, 'null' => false, 'default' => '', 'comment' => '管理员姓名']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->addIndex(['player_id'], ['name' => 'idx_player_id']) + ->addIndex(['department_id'], ['name' => 'idx_department_id']) + ->addIndex(['user_id'], ['name' => 'idx_user_id']) + ->create(); + } + } +} diff --git a/db/migrations/20231115082108_create_notice.php b/db/migrations/20231115082108_create_notice.php new file mode 100644 index 0000000..53fe739 --- /dev/null +++ b/db/migrations/20231115082108_create_notice.php @@ -0,0 +1,45 @@ +hasTable('notice'); + if (!$exists) { + $table = $this->table('notice', ['comment' => '消息']); + $table->addColumn('department_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '部门/渠道id']) + ->addColumn('player_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '玩家id']) + ->addColumn('source_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '来源id']) + ->addColumn('type', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '1 系统, 2派彩']) + ->addColumn('title', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '标题']) + ->addColumn('content', 'string', ['limit' => 500, 'null' => false, 'default' => '', 'comment' => '内容']) + ->addColumn('status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 0, 'comment' => '狀態,0=未读, 1=已读']) + ->addColumn('receiver', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '接受方,1=玩家, 2=总后台, 2=子站']) + ->addColumn('is_private', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '是否私人消息,0=否, 1=是']) + ->addColumn('admin_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => false, 'null' => false, 'default' => 0, 'comment' => '管理员id']) + ->addColumn('admin_name', 'string', ['limit' => 20, 'null' => false, 'default' => '', 'comment' => '管理员名称']) + ->addColumn('created_at', 'datetime', ['comment' => '创建时间']) + ->addColumn('updated_at', 'datetime', ['comment' => '更新时间']) + ->addColumn('deleted_at', 'datetime', ['comment' => '删除时间']) + ->addIndex(['department_id'], ['name' => 'idx_department_id']) + ->addIndex(['admin_id'], ['name' => 'idx_admin_id']) + ->create(); + } + } +} diff --git a/db/migrations/20240511015233_create_sign_ins.php b/db/migrations/20240511015233_create_sign_ins.php new file mode 100644 index 0000000..59fc57d --- /dev/null +++ b/db/migrations/20240511015233_create_sign_ins.php @@ -0,0 +1,38 @@ +hasTable('sign_ins'); + if (!$exists) { + $table = $this->table('sign_ins', ['comment' => '玩家签到表']); + $table->addColumn('player_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '玩家id']) + ->addColumn('department_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '渠道/部门id']) + ->addColumn('sign_date', 'date', ['default' => null, 'comment' => '签到日期']) + ->addColumn('reward_amount', 'decimal', ['precision' => 10, 'scale' => 2, 'signed' => true, 'null' => false, 'default' => 0, 'comment' => '签到奖励']) + ->addColumn('chip_amount', 'decimal', ['precision' => 10, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '打码量']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->addIndex(['player_id'], ['name' => 'idx_player_id']) + ->addIndex(['department_id'], ['name' => 'idx_department_id']) + ->create(); + } + } +} diff --git a/db/migrations/20240511032731_create_chip_changes.php b/db/migrations/20240511032731_create_chip_changes.php new file mode 100644 index 0000000..9219108 --- /dev/null +++ b/db/migrations/20240511032731_create_chip_changes.php @@ -0,0 +1,41 @@ +hasTable('chip_changes'); + if (!$exists) { + $table = $this->table('chip_changes', ['comment' => '打码量变化']); + $table->addColumn('player_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '玩家id']) + ->addColumn('department_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '渠道/部门id']) + ->addColumn('type', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'null' => false, 'default' => 1, 'comment' => '1 增加 2减少']) + ->addColumn('source_type', 'string', ['limit' => 125, 'null' => false, 'default' => '', 'comment' => '来源']) + ->addColumn('source_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '0 充值 1活动 2游戏']) + ->addColumn('chip_amount', 'decimal', ['precision' => 10, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '打码量']) + ->addColumn('before_chip_amount', 'decimal', ['precision' => 10, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '变化前打码量']) + ->addColumn('after_chip_amount', 'decimal', ['precision' => 10, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '变化后打码量']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->addIndex(['player_id'], ['name' => 'idx_player_id']) + ->addIndex(['department_id'], ['name' => 'idx_department_id']) + ->create(); + } + } +} diff --git a/db/migrations/20240511053700_modify_player_chip_amount.php b/db/migrations/20240511053700_modify_player_chip_amount.php new file mode 100644 index 0000000..92c3f78 --- /dev/null +++ b/db/migrations/20240511053700_modify_player_chip_amount.php @@ -0,0 +1,27 @@ +table('player'); + $table->addColumn('chip_amount', 'decimal', ['precision' => 10, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '当前打码量']) + ->addColumn('must_chip_amount', 'decimal', ['precision' => 10, 'scale' => 2, 'null' => false, 'default' => 0, 'comment' => '达成打码量']) + ->update(); + } +} diff --git a/db/migrations/20240511060113_create_activity.php b/db/migrations/20240511060113_create_activity.php new file mode 100644 index 0000000..b9989c0 --- /dev/null +++ b/db/migrations/20240511060113_create_activity.php @@ -0,0 +1,37 @@ +table('activity', ['comment' => '活动']); + $table->addColumn('department_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '渠道/部门id']) + ->addColumn('status', 'integer', ['limit' => MysqlAdapter::INT_TINY, 'signed' => false, 'null' => false, 'default' => 0, 'comment' => '狀態,0=停用, 1=啟用']) + ->addColumn('sort', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'signed' => false, 'null' => false, 'default' => 0, 'comment' => '排序']) + ->addColumn('link', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '连接地址']) + ->addColumn('recharge_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '充值配置id']) + ->addColumn('start_time', 'datetime', ['default' => null, 'comment' => '开始时间']) + ->addColumn('end_time', 'datetime', ['default' => null, 'comment' => '结束时间']) + ->addColumn('deleted_at', 'timestamp', ['comment' => '删除时间']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->addIndex(['department_id'], ['name' => 'idx_department_id']) + ->create(); + } +} diff --git a/db/migrations/20240511065003_create_activity_content.php b/db/migrations/20240511065003_create_activity_content.php new file mode 100644 index 0000000..b39ca8d --- /dev/null +++ b/db/migrations/20240511065003_create_activity_content.php @@ -0,0 +1,34 @@ +table('activity_content', ['comment' => '活动内容']); + $table->addColumn('name', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '活动名称']) + ->addColumn('activity_id', 'integer', ['limit' => MysqlAdapter::INT_REGULAR, 'null' => false, 'default' => 0, 'comment' => '活动ID']) + ->addColumn('lang', 'string', ['limit' => 20, 'null' => false, 'default' => '', 'comment' => '语言标识']) + ->addColumn('link', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '连接地址']) + ->addColumn('picture', 'string', ['limit' => 255, 'null' => false, 'default' => '', 'comment' => '主图']) + ->addColumn('created_at', 'timestamp', ['comment' => '创建时间']) + ->addColumn('updated_at', 'timestamp', ['comment' => '更新时间']) + ->addIndex(['activity_id'], ['name' => 'idx_activity_id']) + ->create(); + } +} diff --git a/process/Monitor.php b/process/Monitor.php new file mode 100644 index 0000000..2a52eb8 --- /dev/null +++ b/process/Monitor.php @@ -0,0 +1,244 @@ + + * @copyright walkor + * @link http://www.workerman.net/ + * @license http://www.opensource.org/licenses/mit-license.php MIT License + */ + +namespace process; + +use FilesystemIterator; +use RecursiveDirectoryIterator; +use RecursiveIteratorIterator; +use SplFileInfo; +use Workerman\Timer; +use Workerman\Worker; + +/** + * Class FileMonitor + * @package process + */ +class Monitor +{ + /** + * @var array + */ + protected $paths = []; + + /** + * @var array + */ + protected $extensions = []; + + /** + * @var string + */ + public static $lockFile = __DIR__ . '/../runtime/monitor.lock'; + + /** + * Pause monitor + * @return void + */ + public static function pause() + { + file_put_contents(static::$lockFile, time()); + } + + /** + * Resume monitor + * @return void + */ + public static function resume(): void + { + clearstatcache(); + if (is_file(static::$lockFile)) { + unlink(static::$lockFile); + } + } + + /** + * Whether monitor is paused + * @return bool + */ + public static function isPaused(): bool + { + clearstatcache(); + return file_exists(static::$lockFile); + } + + /** + * FileMonitor constructor. + * @param $monitorDir + * @param $monitorExtensions + * @param array $options + */ + public function __construct($monitorDir, $monitorExtensions, array $options = []) + { + static::resume(); + $this->paths = (array)$monitorDir; + $this->extensions = $monitorExtensions; + if (!Worker::getAllWorkers()) { + return; + } + $disableFunctions = explode(',', ini_get('disable_functions')); + if (in_array('exec', $disableFunctions, true)) { + echo "\nMonitor file change turned off because exec() has been disabled by disable_functions setting in " . PHP_CONFIG_FILE_PATH . "/php.ini\n"; + } else { + if ($options['enable_file_monitor'] ?? true) { + Timer::add(1, function () { + $this->checkAllFilesChange(); + }); + } + } + + $memoryLimit = $this->getMemoryLimit($options['memory_limit'] ?? null); + if ($memoryLimit && ($options['enable_memory_monitor'] ?? true)) { + Timer::add(60, [$this, 'checkMemory'], [$memoryLimit]); + } + } + + /** + * @param $monitorDir + * @return bool + */ + public function checkFilesChange($monitorDir): bool + { + static $lastMtime, $tooManyFilesCheck; + if (!$lastMtime) { + $lastMtime = time(); + } + clearstatcache(); + if (!is_dir($monitorDir)) { + if (!is_file($monitorDir)) { + return false; + } + $iterator = [new SplFileInfo($monitorDir)]; + } else { + // recursive traversal directory + $dirIterator = new RecursiveDirectoryIterator($monitorDir, FilesystemIterator::SKIP_DOTS | FilesystemIterator::FOLLOW_SYMLINKS); + $iterator = new RecursiveIteratorIterator($dirIterator); + } + $count = 0; + foreach ($iterator as $file) { + $count ++; + /** var SplFileInfo $file */ + if (is_dir($file->getRealPath())) { + continue; + } + // check mtime + if ($lastMtime < $file->getMTime() && in_array($file->getExtension(), $this->extensions, true)) { + $var = 0; + exec('"'.PHP_BINARY . '" -l ' . $file, $out, $var); + if ($var) { + $lastMtime = $file->getMTime(); + continue; + } + $lastMtime = $file->getMTime(); + echo $file . " update and reload\n"; + // send SIGUSR1 signal to master process for reload + if (DIRECTORY_SEPARATOR === '/') { + posix_kill(posix_getppid(), SIGUSR1); + } else { + return true; + } + break; + } + } + if (!$tooManyFilesCheck && $count > 1000) { + echo "Monitor: There are too many files ($count files) in $monitorDir which makes file monitoring very slow\n"; + $tooManyFilesCheck = 1; + } + return false; + } + + /** + * @return bool + */ + public function checkAllFilesChange(): bool + { + if (static::isPaused()) { + return false; + } + foreach ($this->paths as $path) { + if ($this->checkFilesChange($path)) { + return true; + } + } + return false; + } + + /** + * @param $memoryLimit + * @return void + */ + public function checkMemory($memoryLimit) + { + if (static::isPaused() || $memoryLimit <= 0) { + return; + } + $ppid = posix_getppid(); + $childrenFile = "/proc/$ppid/task/$ppid/children"; + if (!is_file($childrenFile) || !($children = file_get_contents($childrenFile))) { + return; + } + foreach (explode(' ', $children) as $pid) { + $pid = (int)$pid; + $statusFile = "/proc/$pid/status"; + if (!is_file($statusFile) || !($status = file_get_contents($statusFile))) { + continue; + } + $mem = 0; + if (preg_match('/VmRSS\s*?:\s*?(\d+?)\s*?kB/', $status, $match)) { + $mem = $match[1]; + } + $mem = (int)($mem / 1024); + if ($mem >= $memoryLimit) { + posix_kill($pid, SIGINT); + } + } + } + + /** + * Get memory limit + * @return float + */ + protected function getMemoryLimit($memoryLimit) + { + if ($memoryLimit === 0) { + return 0; + } + $usePhpIni = false; + if (!$memoryLimit) { + $memoryLimit = ini_get('memory_limit'); + $usePhpIni = true; + } + + if ($memoryLimit == -1) { + return 0; + } + $unit = strtolower($memoryLimit[strlen($memoryLimit) - 1]); + if ($unit === 'g') { + $memoryLimit = 1024 * (int)$memoryLimit; + } else if ($unit === 'm') { + $memoryLimit = (int)$memoryLimit; + } else if ($unit === 'k') { + $memoryLimit = ((int)$memoryLimit / 1024); + } else { + $memoryLimit = ((int)$memoryLimit / (1024 * 1024)); + } + if ($memoryLimit < 30) { + $memoryLimit = 30; + } + if ($usePhpIni) { + $memoryLimit = (int)(0.8 * $memoryLimit); + } + return $memoryLimit; + } +} diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..2bde119 --- /dev/null +++ b/public/404.html @@ -0,0 +1,12 @@ + + + 404 Not Found - webman + + +
+

404 Not Found

+
+
+
webman
+ + diff --git a/public/audio/activity_examine.mp3 b/public/audio/activity_examine.mp3 new file mode 100644 index 0000000..d41dd5a Binary files /dev/null and b/public/audio/activity_examine.mp3 differ diff --git a/public/audio/lottery_examine.mp3 b/public/audio/lottery_examine.mp3 new file mode 100644 index 0000000..667b7e5 Binary files /dev/null and b/public/audio/lottery_examine.mp3 differ diff --git a/public/audio/recharge_examine.mp3 b/public/audio/recharge_examine.mp3 new file mode 100644 index 0000000..550b9d2 Binary files /dev/null and b/public/audio/recharge_examine.mp3 differ diff --git a/public/audio/withdraw_examine.mp3 b/public/audio/withdraw_examine.mp3 new file mode 100644 index 0000000..57a7abf Binary files /dev/null and b/public/audio/withdraw_examine.mp3 differ diff --git a/public/def_avatar/nan1.png b/public/def_avatar/nan1.png new file mode 100644 index 0000000..b73e69d Binary files /dev/null and b/public/def_avatar/nan1.png differ diff --git a/public/def_avatar/nan2.png b/public/def_avatar/nan2.png new file mode 100644 index 0000000..1dc2d6f Binary files /dev/null and b/public/def_avatar/nan2.png differ diff --git a/public/def_avatar/nan3.png b/public/def_avatar/nan3.png new file mode 100644 index 0000000..fb35adf Binary files /dev/null and b/public/def_avatar/nan3.png differ diff --git a/public/def_avatar/nan4.png b/public/def_avatar/nan4.png new file mode 100644 index 0000000..10fd061 Binary files /dev/null and b/public/def_avatar/nan4.png differ diff --git a/public/def_avatar/nan5.png b/public/def_avatar/nan5.png new file mode 100644 index 0000000..f4c0443 Binary files /dev/null and b/public/def_avatar/nan5.png differ diff --git a/public/def_avatar/nv1.png b/public/def_avatar/nv1.png new file mode 100644 index 0000000..fa7d4f7 Binary files /dev/null and b/public/def_avatar/nv1.png differ diff --git a/public/def_avatar/nv2.png b/public/def_avatar/nv2.png new file mode 100644 index 0000000..4018021 Binary files /dev/null and b/public/def_avatar/nv2.png differ diff --git a/public/def_avatar/nv3.png b/public/def_avatar/nv3.png new file mode 100644 index 0000000..7f4f821 Binary files /dev/null and b/public/def_avatar/nv3.png differ diff --git a/public/def_avatar/nv4.png b/public/def_avatar/nv4.png new file mode 100644 index 0000000..27af907 Binary files /dev/null and b/public/def_avatar/nv4.png differ diff --git a/public/def_avatar/nv5.png b/public/def_avatar/nv5.png new file mode 100644 index 0000000..d1f3bc8 Binary files /dev/null and b/public/def_avatar/nv5.png differ diff --git a/public/exadmin/assets/@ant-design.bcfb08ae.js b/public/exadmin/assets/@ant-design.bcfb08ae.js new file mode 100644 index 0000000..fd66e75 --- /dev/null +++ b/public/exadmin/assets/@ant-design.bcfb08ae.js @@ -0,0 +1,57 @@ +import"./vue.db505ee4.js";import{i as w,r as Mb,a as Fb}from"./@ctrl.fa7cbd46.js";import{n as Hb,h as wi,c as l}from"./@vue.cb43a243.js";var Cb={icon:{tag:"svg",attrs:{viewBox:"0 0 1024 1024",focusable:"false"},children:[{tag:"path",attrs:{d:"M988 548c-19.9 0-36-16.1-36-36 0-59.4-11.6-117-34.6-171.3a440.45 440.45 0 00-94.3-139.9 437.71 437.71 0 00-139.9-94.3C629 83.6 571.4 72 512 72c-19.9 0-36-16.1-36-36s16.1-36 36-36c69.1 0 136.2 13.5 199.3 40.3C772.3 66 827 103 874 150c47 47 83.9 101.8 109.7 162.7 26.7 63.1 40.2 130.2 40.2 199.3.1 19.9-16 36-35.9 36z"}}]},name:"loading",theme:"outlined"},Vb=Cb,T=2,zi=.16,_b=.05,Ab=.05,Lb=.15,hb=5,bb=4,Bb=[{index:7,opacity:.15},{index:6,opacity:.25},{index:5,opacity:.3},{index:5,opacity:.45},{index:5,opacity:.65},{index:5,opacity:.85},{index:4,opacity:.9},{index:3,opacity:.95},{index:2,opacity:.97},{index:1,opacity:.98}];function ji(r){var e=r.r,t=r.g,n=r.b,a=Fb(e,t,n);return{h:a.h*360,s:a.s,v:a.v}}function M(r){var e=r.r,t=r.g,n=r.b;return"#".concat(Mb(e,t,n,!1))}function Db(r,e,t){var n=t/100,a={r:(e.r-r.r)*n+r.r,g:(e.g-r.g)*n+r.g,b:(e.b-r.b)*n+r.b};return a}function $i(r,e,t){var n;return Math.round(r.h)>=60&&Math.round(r.h)<=240?n=t?Math.round(r.h)-T*e:Math.round(r.h)+T*e:n=t?Math.round(r.h)+T*e:Math.round(r.h)-T*e,n<0?n+=360:n>=360&&(n-=360),n}function Ti(r,e,t){if(r.h===0&&r.s===0)return r.s;var n;return t?n=r.s-zi*e:e===bb?n=r.s+zi:n=r.s+_b*e,n>1&&(n=1),t&&e===hb&&n>.1&&(n=.1),n<.06&&(n=.06),Number(n.toFixed(2))}function Mi(r,e,t){var n;return t?n=r.v+Ab*e:n=r.v-Lb*e,n>1&&(n=1),Number(n.toFixed(2))}function x(r){for(var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=[],n=w(r),a=hb;a>0;a-=1){var i=ji(n),f=M(w({h:$i(i,a,!0),s:Ti(i,a,!0),v:Mi(i,a,!0)}));t.push(f)}t.push(M(n));for(var u=1;u<=bb;u+=1){var o=ji(n),v=M(w({h:$i(o,u),s:Ti(o,u),v:Mi(o,u)}));t.push(v)}return e.theme==="dark"?Bb.map(function(p){var m=p.index,g=p.opacity,O=M(Db(w(e.backgroundColor||"#141414"),w(t[m]),g*100));return O}):t}var B={red:"#F5222D",volcano:"#FA541C",orange:"#FA8C16",gold:"#FAAD14",yellow:"#FADB14",lime:"#A0D911",green:"#52C41A",cyan:"#13C2C2",blue:"#1890FF",geekblue:"#2F54EB",purple:"#722ED1",magenta:"#EB2F96",grey:"#666666"},s={},D={};Object.keys(B).forEach(function(r){s[r]=x(B[r]),s[r].primary=s[r][5],D[r]=x(B[r],{theme:"dark",backgroundColor:"#141414"}),D[r].primary=D[r][5]});s.red;s.volcano;s.gold;s.orange;s.yellow;s.lime;s.green;s.cyan;s.blue;s.geekblue;s.purple;s.magenta;s.grey;var Fi=[],z=[],xb="insert-css: You need to provide a CSS string. Usage: insertCss(cssString[, options]).";function Eb(){var r=document.createElement("style");return r.setAttribute("type","text/css"),r}function Nb(r,e){if(e=e||{},r===void 0)throw new Error(xb);var t=e.prepend===!0?"prepend":"append",n=e.container!==void 0?e.container:document.querySelector("head"),a=Fi.indexOf(n);a===-1&&(a=Fi.push(n)-1,z[a]={});var i;return z[a]!==void 0&&z[a][t]!==void 0?i=z[a][t]:(i=z[a][t]=Eb(),t==="prepend"?n.insertBefore(i,n.childNodes[0]):n.appendChild(i)),r.charCodeAt(0)===65279&&(r=r.substr(1,r.length)),i.styleSheet?i.styleSheet.cssText+=r:i.textContent+=r,i}function Hi(r){for(var e=1;e * { + line-height: 1; +} + +.anticon svg { + display: inline-block; +} + +.anticon::before { + display: none; +} + +.anticon .anticon-icon { + display: block; +} + +.anticon[tabindex] { + cursor: pointer; +} + +.anticon-spin::before, +.anticon-spin { + display: inline-block; + -webkit-animation: loadingCircle 1s infinite linear; + animation: loadingCircle 1s infinite linear; +} + +@-webkit-keyframes loadingCircle { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@keyframes loadingCircle { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +`,Vi=!1,Sb=function(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:Ib;Hb(function(){Vi||(typeof window!="undefined"&&window.document&&window.document.documentElement&&Nb(e,{prepend:!0}),Vi=!0)})},Ub=["icon","primaryColor","secondaryColor"];function Wb(r,e){if(r==null)return{};var t=Gb(r,e),n,a;if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(r);for(a=0;a=0)&&(!Object.prototype.propertyIsEnumerable.call(r,n)||(t[n]=r[n]))}return t}function Gb(r,e){if(r==null)return{};var t={},n=Object.keys(r),a,i;for(i=0;i=0)&&(t[a]=r[a]);return t}function H(r){for(var e=1;er.length)&&(e=r.length);for(var t=0,n=new Array(e);tr.length)&&(e=r.length);for(var t=0,n=new Array(e);t=0)&&(!Object.prototype.propertyIsEnumerable.call(r,n)||(t[n]=r[n]))}return t}function uy(r,e){if(r==null)return{};var t={},n=Object.keys(r),a,i;for(i=0;i=0)&&(t[a]=r[a]);return t}R("#1890ff");var P=function(e,t){var n,a=Li({},e,t.attrs),i=a.class,f=a.icon,u=a.spin,o=a.rotate,v=a.tabindex,p=a.twoToneColor,m=a.onClick,g=iy(a,ty),O=(n={anticon:!0},N(n,"anticon-".concat(f.name),Boolean(f.name)),N(n,i,i),n),d=u===""||!!u||f.name==="loading"?"anticon-spin":"",h=v;h===void 0&&m&&(h=-1,g.tabindex=h);var S=o?{msTransform:"rotate(".concat(o,"deg)"),transform:"rotate(".concat(o,"deg)")}:void 0,_=Pb(p),$=ry(_,2),A=$[0],b=$[1];return l("span",Li({role:"img","aria-label":f.name},g,{onClick:m,class:O}),[l(q,{class:d,icon:f,primaryColor:A,secondaryColor:b,style:S},null)])};P.props={spin:Boolean,rotate:Number,icon:Object,twoToneColor:String};P.displayName="AntdIcon";P.inheritAttrs=!1;P.getTwoToneColor=wb;P.setTwoToneColor=R;var c=P;function Bi(r){for(var e=1;e=0)&&(!Object.prototype.propertyIsEnumerable.call(r,n)||(t[n]=r[n]))}return t}function _pe(r,e){if(r==null)return{};var t={},n=Object.keys(r),a,i;for(i=0;i=0)&&(t[a]=r[a]);return t}var V=function(e,t){var n=t.attrs,a=t.slots,i=F({},e,n),f=i.class,u=i.component,o=i.viewBox,v=i.spin,p=i.rotate,m=i.tabindex,g=i.onClick,O=Vpe(i,Cpe),d=a.default&&a.default(),h=d&&d.length,S=a.component;Sb();var _=zb({anticon:!0},f,f),$={"anticon-spin":v===""||!!v},A=p?{msTransform:"rotate(".concat(p,"deg)"),transform:"rotate(".concat(p,"deg)")}:void 0,b=F({},Rb,{viewBox:o,class:$,style:A});o||delete b.viewBox;var Tb=function(){return u?l(u,b,{default:function(){return[d]}}):S?S(b):h?(Boolean(o)||d.length===1&&d[0]&&d[0].type,l("svg",F({},b,{viewBox:o}),[d])):null},L=m;return L===void 0&&g&&(L=-1,O.tabindex=L),l("span",F({role:"img"},O,{onClick:g,class:_}),[Tb()])};V.props={spin:Boolean,rotate:Number,viewBox:String,ariaLabel:String};V.inheritAttrs=!1;V.displayName="Icon";var jb=V,Ape=["type"];function gb(r){for(var e=1;e=0)&&(!Object.prototype.propertyIsEnumerable.call(r,n)||(t[n]=r[n]))}return t}function Dpe(r,e){if(r==null)return{};var t={},n=Object.keys(r),a,i;for(i=0;i=0)&&(t[a]=r[a]);return t}var $b=new Set;function xpe(r){return typeof r=="string"&&r.length&&!$b.has(r)}function C(r){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,t=r[e];if(xpe(t)){var n=document.createElement("script");n.setAttribute("src",t),n.setAttribute("data-namespace",t),r.length>e+1&&(n.onload=function(){C(r,e+1)},n.onerror=function(){C(r,e+1)}),$b.add(t),document.body.appendChild(n)}}function Epe(){var r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=r.scriptUrl,t=r.extraCommonProps,n=t===void 0?{}:t;typeof document!="undefined"&&typeof window!="undefined"&&typeof document.createElement=="function"&&(Array.isArray(e)?C(e.reverse()):C([e]));var a=function(f,u){var o=u.attrs,v=u.slots,p=gb({},f,o),m=p.type,g=Bpe(p,Ape),O=v.default&&v.default(),d=null;m&&(d=l("use",{"xlink:href":"#".concat(m)},null)),O&&O.length&&(d=O);var h=gb({},n,g);return l(jb,h,{default:function(){return[d]}})};return a.props={spin:Boolean,rotate:Number,type:String},a.inheritAttrs=!1,a.displayName="Iconfont",a}var Wpe=Object.freeze({__proto__:null,[Symbol.toStringTag]:"Module",createFromIconfontCN:Epe,default:jb,AccountBookFilled:yP,AccountBookOutlined:zP,AccountBookTwoTone:MP,AimOutlined:VP,AlertFilled:BP,AlertOutlined:NP,AlertTwoTone:UP,AlibabaOutlined:ZP,AlignCenterOutlined:kP,AlignLeftOutlined:rS,AlignRightOutlined:cS,AlipayCircleFilled:fS,AlipayCircleOutlined:pS,AlipayOutlined:hS,AlipaySquareFilled:SS,AliwangwangFilled:$S,AliwangwangOutlined:HS,AliyunOutlined:AS,AmazonCircleFilled:xS,AmazonOutlined:RS,AmazonSquareFilled:GS,AndroidFilled:JS,AndroidOutlined:ew,AntCloudOutlined:aw,AntDesignOutlined:uw,ApartmentOutlined:sw,ApiFilled:mw,ApiOutlined:yw,ApiTwoTone:zw,AppleFilled:Mw,AppleOutlined:Vw,AppstoreAddOutlined:Bw,AppstoreFilled:Nw,AppstoreOutlined:Uw,AppstoreTwoTone:Zw,AreaChartOutlined:kw,ArrowDownOutlined:rz,ArrowLeftOutlined:cz,ArrowRightOutlined:fz,ArrowUpOutlined:pz,ArrowsAltOutlined:hz,AudioFilled:Sz,AudioMutedOutlined:$z,AudioOutlined:Hz,AudioTwoTone:Az,AuditOutlined:xz,BackwardFilled:Rz,BackwardOutlined:Gz,BankFilled:Jz,BankOutlined:ej,BankTwoTone:aj,BarChartOutlined:uj,BarcodeOutlined:sj,BarsOutlined:mj,BehanceCircleFilled:yj,BehanceOutlined:zj,BehanceSquareFilled:Mj,BehanceSquareOutlined:Vj,BellFilled:Bj,BellOutlined:Nj,BellTwoTone:Uj,BgColorsOutlined:Zj,BlockOutlined:kj,BoldOutlined:r$,BookFilled:c$,BookOutlined:f$,BookTwoTone:p$,BorderBottomOutlined:h$,BorderHorizontalOutlined:S$,BorderInnerOutlined:$$,BorderLeftOutlined:H$,BorderOuterOutlined:A$,BorderOutlined:x$,BorderRightOutlined:R$,BorderTopOutlined:G$,BorderVerticleOutlined:J$,BorderlessTableOutlined:eT,BoxPlotFilled:aT,BoxPlotOutlined:uT,BoxPlotTwoTone:sT,BranchesOutlined:mT,BugFilled:yT,BugOutlined:zT,BugTwoTone:MT,BuildFilled:VT,BuildOutlined:BT,BuildTwoTone:NT,BulbFilled:UT,BulbOutlined:ZT,BulbTwoTone:kT,CalculatorFilled:rM,CalculatorOutlined:cM,CalculatorTwoTone:fM,CalendarFilled:pM,CalendarOutlined:hM,CalendarTwoTone:SM,CameraFilled:$M,CameraOutlined:HM,CameraTwoTone:AM,CarFilled:xM,CarOutlined:RM,CarTwoTone:GM,CaretDownFilled:JM,CaretDownOutlined:eF,CaretLeftFilled:aF,CaretLeftOutlined:uF,CaretRightFilled:sF,CaretRightOutlined:mF,CaretUpFilled:yF,CaretUpOutlined:zF,CarryOutFilled:MF,CarryOutOutlined:VF,CarryOutTwoTone:BF,CheckCircleFilled:Sy,CheckCircleOutlined:Hy,CheckCircleTwoTone:NF,CheckOutlined:eP,CheckSquareFilled:UF,CheckSquareOutlined:ZF,CheckSquareTwoTone:kF,ChromeFilled:rH,ChromeOutlined:cH,CiCircleFilled:fH,CiCircleOutlined:pH,CiCircleTwoTone:hH,CiOutlined:SH,CiTwoTone:$H,ClearOutlined:HH,ClockCircleFilled:AH,ClockCircleOutlined:xH,ClockCircleTwoTone:RH,CloseCircleFilled:hy,CloseCircleOutlined:xy,CloseCircleTwoTone:GH,CloseOutlined:Gy,CloseSquareFilled:JH,CloseSquareOutlined:eC,CloseSquareTwoTone:aC,CloudDownloadOutlined:uC,CloudFilled:sC,CloudOutlined:mC,CloudServerOutlined:yC,CloudSyncOutlined:zC,CloudTwoTone:MC,CloudUploadOutlined:VC,ClusterOutlined:BC,CodeFilled:NC,CodeOutlined:UC,CodeSandboxCircleFilled:ZC,CodeSandboxOutlined:kC,CodeSandboxSquareFilled:rV,CodeTwoTone:cV,CodepenCircleFilled:fV,CodepenCircleOutlined:pV,CodepenOutlined:hV,CodepenSquareFilled:SV,CoffeeOutlined:$V,ColumnHeightOutlined:HV,ColumnWidthOutlined:AV,CommentOutlined:xV,CompassFilled:RV,CompassOutlined:GV,CompassTwoTone:JV,CompressOutlined:e_,ConsoleSqlOutlined:a_,ContactsFilled:u_,ContactsOutlined:s_,ContactsTwoTone:m_,ContainerFilled:y_,ContainerOutlined:z_,ContainerTwoTone:M_,ControlFilled:V_,ControlOutlined:B_,ControlTwoTone:N_,CopyFilled:U_,CopyOutlined:Z_,CopyTwoTone:k_,CopyrightCircleFilled:rA,CopyrightCircleOutlined:cA,CopyrightCircleTwoTone:fA,CopyrightOutlined:pA,CopyrightTwoTone:hA,CreditCardFilled:SA,CreditCardOutlined:$A,CreditCardTwoTone:HA,CrownFilled:AA,CrownOutlined:xA,CrownTwoTone:RA,CustomerServiceFilled:GA,CustomerServiceOutlined:JA,CustomerServiceTwoTone:eL,DashOutlined:aL,DashboardFilled:uL,DashboardOutlined:sL,DashboardTwoTone:mL,DatabaseFilled:yL,DatabaseOutlined:zL,DatabaseTwoTone:ML,DeleteColumnOutlined:VL,DeleteFilled:BL,DeleteOutlined:NL,DeleteRowOutlined:UL,DeleteTwoTone:ZL,DeliveredProcedureOutlined:kL,DeploymentUnitOutlined:rB,DesktopOutlined:cB,DiffFilled:fB,DiffOutlined:pB,DiffTwoTone:hB,DingdingOutlined:SB,DingtalkCircleFilled:$B,DingtalkOutlined:HB,DingtalkSquareFilled:AB,DisconnectOutlined:xB,DislikeFilled:RB,DislikeOutlined:GB,DislikeTwoTone:JB,DollarCircleFilled:eD,DollarCircleOutlined:aD,DollarCircleTwoTone:uD,DollarOutlined:sD,DollarTwoTone:mD,DotChartOutlined:yD,DoubleLeftOutlined:zD,DoubleRightOutlined:MD,DownCircleFilled:VD,DownCircleOutlined:BD,DownCircleTwoTone:ND,DownOutlined:Jy,DownSquareFilled:UD,DownSquareOutlined:ZD,DownSquareTwoTone:kD,DownloadOutlined:rx,DragOutlined:cx,DribbbleCircleFilled:fx,DribbbleOutlined:px,DribbbleSquareFilled:hx,DribbbleSquareOutlined:Sx,DropboxCircleFilled:$x,DropboxOutlined:Hx,DropboxSquareFilled:Ax,EditFilled:xx,EditOutlined:Rx,EditTwoTone:Gx,EllipsisOutlined:sP,EnterOutlined:Jx,EnvironmentFilled:eE,EnvironmentOutlined:aE,EnvironmentTwoTone:uE,EuroCircleFilled:sE,EuroCircleOutlined:mE,EuroCircleTwoTone:yE,EuroOutlined:zE,EuroTwoTone:ME,ExceptionOutlined:VE,ExclamationCircleFilled:py,ExclamationCircleOutlined:Ry,ExclamationCircleTwoTone:BE,ExclamationOutlined:NE,ExpandAltOutlined:UE,ExpandOutlined:ZE,ExperimentFilled:kE,ExperimentOutlined:rN,ExperimentTwoTone:cN,ExportOutlined:fN,EyeFilled:pN,EyeInvisibleFilled:hN,EyeInvisibleOutlined:SN,EyeInvisibleTwoTone:$N,EyeOutlined:HN,EyeTwoTone:AN,FacebookFilled:xN,FacebookOutlined:RN,FallOutlined:GN,FastBackwardFilled:JN,FastBackwardOutlined:eq,FastForwardFilled:aq,FastForwardOutlined:uq,FieldBinaryOutlined:sq,FieldNumberOutlined:mq,FieldStringOutlined:yq,FieldTimeOutlined:zq,FileAddFilled:Mq,FileAddOutlined:Vq,FileAddTwoTone:Bq,FileDoneOutlined:Nq,FileExcelFilled:Uq,FileExcelOutlined:Zq,FileExcelTwoTone:kq,FileExclamationFilled:rR,FileExclamationOutlined:cR,FileExclamationTwoTone:fR,FileFilled:pR,FileGifOutlined:hR,FileImageFilled:SR,FileImageOutlined:$R,FileImageTwoTone:HR,FileJpgOutlined:AR,FileMarkdownFilled:xR,FileMarkdownOutlined:RR,FileMarkdownTwoTone:GR,FileOutlined:JR,FilePdfFilled:eI,FilePdfOutlined:aI,FilePdfTwoTone:uI,FilePptFilled:sI,FilePptOutlined:mI,FilePptTwoTone:yI,FileProtectOutlined:zI,FileSearchOutlined:MI,FileSyncOutlined:VI,FileTextFilled:BI,FileTextOutlined:NI,FileTextTwoTone:UI,FileTwoTone:ZI,FileUnknownFilled:kI,FileUnknownOutlined:rU,FileUnknownTwoTone:cU,FileWordFilled:fU,FileWordOutlined:pU,FileWordTwoTone:hU,FileZipFilled:SU,FileZipOutlined:$U,FileZipTwoTone:HU,FilterFilled:AU,FilterOutlined:xU,FilterTwoTone:RU,FireFilled:GU,FireOutlined:JU,FireTwoTone:eW,FlagFilled:aW,FlagOutlined:uW,FlagTwoTone:sW,FolderAddFilled:mW,FolderAddOutlined:yW,FolderAddTwoTone:zW,FolderFilled:MW,FolderOpenFilled:VW,FolderOpenOutlined:BW,FolderOpenTwoTone:NW,FolderOutlined:UW,FolderTwoTone:ZW,FolderViewOutlined:kW,FontColorsOutlined:rG,FontSizeOutlined:cG,ForkOutlined:fG,FormOutlined:pG,FormatPainterFilled:hG,FormatPainterOutlined:SG,ForwardFilled:$G,ForwardOutlined:HG,FrownFilled:AG,FrownOutlined:xG,FrownTwoTone:RG,FullscreenExitOutlined:GG,FullscreenOutlined:JG,FunctionOutlined:eQ,FundFilled:aQ,FundOutlined:uQ,FundProjectionScreenOutlined:sQ,FundTwoTone:mQ,FundViewOutlined:yQ,FunnelPlotFilled:zQ,FunnelPlotOutlined:MQ,FunnelPlotTwoTone:VQ,GatewayOutlined:BQ,GifOutlined:NQ,GiftFilled:UQ,GiftOutlined:ZQ,GiftTwoTone:kQ,GithubFilled:rZ,GithubOutlined:cZ,GitlabFilled:fZ,GitlabOutlined:pZ,GlobalOutlined:hZ,GoldFilled:SZ,GoldOutlined:$Z,GoldTwoTone:HZ,GoldenFilled:AZ,GoogleCircleFilled:xZ,GoogleOutlined:RZ,GooglePlusCircleFilled:GZ,GooglePlusOutlined:JZ,GooglePlusSquareFilled:eY,GoogleSquareFilled:aY,GroupOutlined:uY,HddFilled:sY,HddOutlined:mY,HddTwoTone:yY,HeartFilled:zY,HeartOutlined:MY,HeartTwoTone:VY,HeatMapOutlined:BY,HighlightFilled:NY,HighlightOutlined:UY,HighlightTwoTone:ZY,HistoryOutlined:kY,HolderOutlined:rJ,HomeFilled:cJ,HomeOutlined:fJ,HomeTwoTone:pJ,HourglassFilled:hJ,HourglassOutlined:SJ,HourglassTwoTone:$J,Html5Filled:HJ,Html5Outlined:AJ,Html5TwoTone:xJ,IdcardFilled:RJ,IdcardOutlined:GJ,IdcardTwoTone:JJ,IeCircleFilled:eX,IeOutlined:aX,IeSquareFilled:uX,ImportOutlined:sX,InboxOutlined:mX,InfoCircleFilled:$y,InfoCircleOutlined:Ay,InfoCircleTwoTone:yX,InfoOutlined:zX,InsertRowAboveOutlined:MX,InsertRowBelowOutlined:VX,InsertRowLeftOutlined:BX,InsertRowRightOutlined:NX,InstagramFilled:UX,InstagramOutlined:ZX,InsuranceFilled:kX,InsuranceOutlined:rk,InsuranceTwoTone:ck,InteractionFilled:fk,InteractionOutlined:pk,InteractionTwoTone:hk,IssuesCloseOutlined:Sk,ItalicOutlined:$k,KeyOutlined:Hk,LaptopOutlined:Ak,LayoutFilled:xk,LayoutOutlined:Rk,LayoutTwoTone:Gk,LeftCircleFilled:Jk,LeftCircleOutlined:eK,LeftCircleTwoTone:aK,LeftOutlined:uK,LeftSquareFilled:sK,LeftSquareOutlined:mK,LeftSquareTwoTone:yK,LikeFilled:zK,LikeOutlined:MK,LikeTwoTone:VK,LineChartOutlined:BK,LineHeightOutlined:NK,LineOutlined:UK,LinkOutlined:ZK,LinkedinFilled:kK,LinkedinOutlined:ree,Loading3QuartersOutlined:cee,LoadingOutlined:fy,LockFilled:fee,LockOutlined:pee,LockTwoTone:hee,LoginOutlined:See,LogoutOutlined:$ee,MacCommandFilled:Hee,MacCommandOutlined:Aee,MailFilled:xee,MailOutlined:Ree,MailTwoTone:Gee,ManOutlined:Jee,MedicineBoxFilled:ete,MedicineBoxOutlined:ate,MedicineBoxTwoTone:ute,MediumCircleFilled:ste,MediumOutlined:mte,MediumSquareFilled:yte,MediumWorkmarkOutlined:zte,MehFilled:Mte,MehOutlined:Vte,MehTwoTone:Bte,MenuFoldOutlined:Nte,MenuOutlined:Ute,MenuUnfoldOutlined:Zte,MergeCellsOutlined:kte,MessageFilled:r1e,MessageOutlined:c1e,MessageTwoTone:f1e,MinusCircleFilled:p1e,MinusCircleOutlined:h1e,MinusCircleTwoTone:S1e,MinusOutlined:$1e,MinusSquareFilled:H1e,MinusSquareOutlined:A1e,MinusSquareTwoTone:x1e,MobileFilled:R1e,MobileOutlined:G1e,MobileTwoTone:J1e,MoneyCollectFilled:ere,MoneyCollectOutlined:are,MoneyCollectTwoTone:ure,MonitorOutlined:sre,MoreOutlined:mre,NodeCollapseOutlined:yre,NodeExpandOutlined:zre,NodeIndexOutlined:Mre,NotificationFilled:Vre,NotificationOutlined:Bre,NotificationTwoTone:Nre,NumberOutlined:Ure,OneToOneOutlined:Zre,OrderedListOutlined:kre,PaperClipOutlined:r4e,PartitionOutlined:c4e,PauseCircleFilled:f4e,PauseCircleOutlined:p4e,PauseCircleTwoTone:h4e,PauseOutlined:S4e,PayCircleFilled:$4e,PayCircleOutlined:H4e,PercentageOutlined:A4e,PhoneFilled:x4e,PhoneOutlined:R4e,PhoneTwoTone:G4e,PicCenterOutlined:J4e,PicLeftOutlined:ene,PicRightOutlined:ane,PictureFilled:une,PictureOutlined:sne,PictureTwoTone:mne,PieChartFilled:yne,PieChartOutlined:zne,PieChartTwoTone:Mne,PlayCircleFilled:Vne,PlayCircleOutlined:Bne,PlayCircleTwoTone:Nne,PlaySquareFilled:Une,PlaySquareOutlined:Zne,PlaySquareTwoTone:kne,PlusCircleFilled:r2e,PlusCircleOutlined:c2e,PlusCircleTwoTone:f2e,PlusOutlined:p2e,PlusSquareFilled:h2e,PlusSquareOutlined:S2e,PlusSquareTwoTone:$2e,PoundCircleFilled:H2e,PoundCircleOutlined:A2e,PoundCircleTwoTone:x2e,PoundOutlined:R2e,PoweroffOutlined:G2e,PrinterFilled:J2e,PrinterOutlined:e3e,PrinterTwoTone:a3e,ProfileFilled:u3e,ProfileOutlined:s3e,ProfileTwoTone:m3e,ProjectFilled:y3e,ProjectOutlined:z3e,ProjectTwoTone:M3e,PropertySafetyFilled:V3e,PropertySafetyOutlined:B3e,PropertySafetyTwoTone:N3e,PullRequestOutlined:U3e,PushpinFilled:Z3e,PushpinOutlined:k3e,PushpinTwoTone:r8e,QqCircleFilled:c8e,QqOutlined:f8e,QqSquareFilled:p8e,QrcodeOutlined:h8e,QuestionCircleFilled:S8e,QuestionCircleOutlined:$8e,QuestionCircleTwoTone:H8e,QuestionOutlined:A8e,RadarChartOutlined:x8e,RadiusBottomleftOutlined:R8e,RadiusBottomrightOutlined:G8e,RadiusSettingOutlined:J8e,RadiusUpleftOutlined:e6e,RadiusUprightOutlined:a6e,ReadFilled:u6e,ReadOutlined:s6e,ReconciliationFilled:m6e,ReconciliationOutlined:y6e,ReconciliationTwoTone:z6e,RedEnvelopeFilled:M6e,RedEnvelopeOutlined:V6e,RedEnvelopeTwoTone:B6e,RedditCircleFilled:N6e,RedditOutlined:U6e,RedditSquareFilled:Z6e,RedoOutlined:k6e,ReloadOutlined:rae,RestFilled:cae,RestOutlined:fae,RestTwoTone:pae,RetweetOutlined:hae,RightCircleFilled:Sae,RightCircleOutlined:$ae,RightCircleTwoTone:Hae,RightOutlined:mP,RightSquareFilled:Aae,RightSquareOutlined:xae,RightSquareTwoTone:Rae,RiseOutlined:Gae,RobotFilled:Jae,RobotOutlined:ele,RocketFilled:ale,RocketOutlined:ule,RocketTwoTone:sle,RollbackOutlined:mle,RotateLeftOutlined:yle,RotateRightOutlined:zle,SafetyCertificateFilled:Mle,SafetyCertificateOutlined:Vle,SafetyCertificateTwoTone:Ble,SafetyOutlined:Nle,SaveFilled:Ule,SaveOutlined:Zle,SaveTwoTone:kle,ScanOutlined:r0e,ScheduleFilled:c0e,ScheduleOutlined:f0e,ScheduleTwoTone:p0e,ScissorOutlined:h0e,SearchOutlined:aP,SecurityScanFilled:S0e,SecurityScanOutlined:$0e,SecurityScanTwoTone:H0e,SelectOutlined:A0e,SendOutlined:x0e,SettingFilled:R0e,SettingOutlined:G0e,SettingTwoTone:J0e,ShakeOutlined:ece,ShareAltOutlined:ace,ShopFilled:uce,ShopOutlined:sce,ShopTwoTone:mce,ShoppingCartOutlined:yce,ShoppingFilled:zce,ShoppingOutlined:Mce,ShoppingTwoTone:Vce,ShrinkOutlined:Bce,SignalFilled:Nce,SisternodeOutlined:Uce,SketchCircleFilled:Zce,SketchOutlined:kce,SketchSquareFilled:rie,SkinFilled:cie,SkinOutlined:fie,SkinTwoTone:pie,SkypeFilled:hie,SkypeOutlined:Sie,SlackCircleFilled:$ie,SlackOutlined:Hie,SlackSquareFilled:Aie,SlackSquareOutlined:xie,SlidersFilled:Rie,SlidersOutlined:Gie,SlidersTwoTone:Jie,SmallDashOutlined:e5e,SmileFilled:a5e,SmileOutlined:u5e,SmileTwoTone:s5e,SnippetsFilled:m5e,SnippetsOutlined:y5e,SnippetsTwoTone:z5e,SolutionOutlined:M5e,SortAscendingOutlined:V5e,SortDescendingOutlined:B5e,SoundFilled:N5e,SoundOutlined:U5e,SoundTwoTone:Z5e,SplitCellsOutlined:k5e,StarFilled:r7e,StarOutlined:c7e,StarTwoTone:f7e,StepBackwardFilled:p7e,StepBackwardOutlined:h7e,StepForwardFilled:S7e,StepForwardOutlined:$7e,StockOutlined:H7e,StopFilled:A7e,StopOutlined:x7e,StopTwoTone:R7e,StrikethroughOutlined:G7e,SubnodeOutlined:J7e,SwapLeftOutlined:eue,SwapOutlined:aue,SwapRightOutlined:uue,SwitcherFilled:sue,SwitcherOutlined:mue,SwitcherTwoTone:yue,SyncOutlined:zue,TableOutlined:Mue,TabletFilled:Vue,TabletOutlined:Bue,TabletTwoTone:Nue,TagFilled:Uue,TagOutlined:Zue,TagTwoTone:kue,TagsFilled:roe,TagsOutlined:coe,TagsTwoTone:foe,TaobaoCircleFilled:poe,TaobaoCircleOutlined:hoe,TaobaoOutlined:Soe,TaobaoSquareFilled:$oe,TeamOutlined:Hoe,ThunderboltFilled:Aoe,ThunderboltOutlined:xoe,ThunderboltTwoTone:Roe,ToTopOutlined:Goe,ToolFilled:Joe,ToolOutlined:e9e,ToolTwoTone:a9e,TrademarkCircleFilled:u9e,TrademarkCircleOutlined:s9e,TrademarkCircleTwoTone:m9e,TrademarkOutlined:y9e,TransactionOutlined:z9e,TranslationOutlined:M9e,TrophyFilled:V9e,TrophyOutlined:B9e,TrophyTwoTone:N9e,TwitterCircleFilled:U9e,TwitterOutlined:Z9e,TwitterSquareFilled:k9e,UnderlineOutlined:rfe,UndoOutlined:cfe,UngroupOutlined:ffe,UnlockFilled:pfe,UnlockOutlined:hfe,UnlockTwoTone:Sfe,UnorderedListOutlined:$fe,UpCircleFilled:Hfe,UpCircleOutlined:Afe,UpCircleTwoTone:xfe,UpOutlined:Rfe,UpSquareFilled:Gfe,UpSquareOutlined:Jfe,UpSquareTwoTone:eve,UploadOutlined:ave,UsbFilled:uve,UsbOutlined:sve,UsbTwoTone:mve,UserAddOutlined:yve,UserDeleteOutlined:zve,UserOutlined:Mve,UserSwitchOutlined:Vve,UsergroupAddOutlined:Bve,UsergroupDeleteOutlined:Nve,VerifiedOutlined:Uve,VerticalAlignBottomOutlined:Zve,VerticalAlignMiddleOutlined:kve,VerticalAlignTopOutlined:uP,VerticalLeftOutlined:rse,VerticalRightOutlined:cse,VideoCameraAddOutlined:fse,VideoCameraFilled:pse,VideoCameraOutlined:hse,VideoCameraTwoTone:Sse,WalletFilled:$se,WalletOutlined:Hse,WalletTwoTone:Ase,WarningFilled:xse,WarningOutlined:Rse,WarningTwoTone:Gse,WechatFilled:Jse,WechatOutlined:ede,WeiboCircleFilled:ade,WeiboCircleOutlined:ude,WeiboOutlined:sde,WeiboSquareFilled:mde,WeiboSquareOutlined:yde,WhatsAppOutlined:zde,WifiOutlined:Mde,WindowsFilled:Vde,WindowsOutlined:Bde,WomanOutlined:Nde,YahooFilled:Ude,YahooOutlined:Zde,YoutubeFilled:kde,YoutubeOutlined:rpe,YuqueFilled:cpe,YuqueOutlined:fpe,ZhihuCircleFilled:ppe,ZhihuOutlined:hpe,ZhihuSquareFilled:Spe,ZoomInOutlined:$pe,ZoomOutOutlined:Hpe,setTwoToneColor:R,getTwoToneColor:wb});export{r4e as $,fz as A,mj as B,Sy as C,Jy as D,py as E,JR as F,S2e as G,BW as H,$y as I,UW as J,AU as K,fy as L,A1e as M,NL as N,Jx as O,p2e as P,Rx as Q,mP as R,aP as S,Z_ as T,Rfe as U,uP as V,xse as W,rx as X,mne as Y,$pe as Z,ZI as _,hy as a,Wpe as a0,Gy as b,Hy as c,Ay as d,xy as e,Ry as f,x as g,eP as h,sP as i,uK as j,xH as k,hM as l,uue as m,HN as n,SN as o,yle as p,zle as q,Hpe as r,zD as s,MD as t,cz as u,B as v,r7e as w,zF as x,eF as y,JM as z}; diff --git a/public/exadmin/assets/@babel.6cd0804c.js b/public/exadmin/assets/@babel.6cd0804c.js new file mode 100644 index 0000000..fe69364 --- /dev/null +++ b/public/exadmin/assets/@babel.6cd0804c.js @@ -0,0 +1,4 @@ +import{r as v}from"./regenerator-runtime.8e24db72.js";var A=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:typeof global!="undefined"?global:typeof self!="undefined"?self:{};function P(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function T(e){if(e.__esModule)return e;var t=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(e).forEach(function(r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}),t}function E(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}function w(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable})),r.push.apply(r,n)}return r}function I(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(u){throw u},f:o}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var i=!0,f=!1,l;return{s:function(){r=r.call(e)},n:function(){var u=r.next();return i=u.done,u},e:function(u){f=!0,l=u},f:function(){try{!i&&r.return!=null&&r.return()}finally{if(f)throw l}}}}function F(e){if(e==null)throw new TypeError("Cannot destructure undefined")}export{b as _,E as a,p as b,A as c,C as d,I as e,w as f,P as g,D as h,M as i,R as j,H as k,x as l,F as m,T as n,q as r}; diff --git a/public/exadmin/assets/@ctrl.fa7cbd46.js b/public/exadmin/assets/@ctrl.fa7cbd46.js new file mode 100644 index 0000000..6c8c760 --- /dev/null +++ b/public/exadmin/assets/@ctrl.fa7cbd46.js @@ -0,0 +1 @@ +function s(e,t){F(e)&&(e="100%");var r=I(e);return e=t===360?e:Math.min(t,Math.max(0,parseFloat(e))),r&&(e=parseInt(String(e*t),10)/100),Math.abs(e-t)<1e-6?1:(t===360?e=(e<0?e%t+t:e%t)/parseFloat(String(t)):e=e%t/parseFloat(String(t)),e)}function p(e){return Math.min(1,Math.max(0,e))}function F(e){return typeof e=="string"&&e.indexOf(".")!==-1&&parseFloat(e)===1}function I(e){return typeof e=="string"&&e.indexOf("%")!==-1}function A(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function l(e){return e<=1?Number(e)*100+"%":e}function v(e){return e.length===1?"0"+e:String(e)}function E(e,t,r){return{r:s(e,255)*255,g:s(t,255)*255,b:s(r,255)*255}}function M(e,t,r){e=s(e,255),t=s(t,255),r=s(r,255);var a=Math.max(e,t,r),i=Math.min(e,t,r),n=0,f=0,h=(a+i)/2;if(a===i)f=0,n=0;else{var u=a-i;switch(f=h>.5?u/(2-a-i):u/(a+i),a){case e:n=(t-r)/u+(t1&&(r-=1),r<1/6?e+(t-e)*(6*r):r<1/2?t:r<2/3?e+(t-e)*(2/3-r)*6:e}function B(e,t,r){var a,i,n;if(e=s(e,360),t=s(t,100),r=s(r,100),t===0)i=r,n=r,a=r;else{var f=r<.5?r*(1+t):r+t-r*t,h=2*r-f;a=c(h,f,e+1/3),i=c(h,f,e),n=c(h,f,e-1/3)}return{r:a*255,g:i*255,b:n*255}}function S(e,t,r){e=s(e,255),t=s(t,255),r=s(r,255);var a=Math.max(e,t,r),i=Math.min(e,t,r),n=0,f=a,h=a-i,u=a===0?0:h/a;if(a===i)n=0;else{switch(a){case e:n=(t-r)/h+(t>16,g:(e&65280)>>8,b:e&255}}var x={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",goldenrod:"#daa520",gold:"#ffd700",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavenderblush:"#fff0f5",lavender:"#e6e6fa",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};function W(e){var t={r:0,g:0,b:0},r=1,a=null,i=null,n=null,f=!1,h=!1;return typeof e=="string"&&(e=U(e)),typeof e=="object"&&(d(e.r)&&d(e.g)&&d(e.b)?(t=E(e.r,e.g,e.b),f=!0,h=String(e.r).substr(-1)==="%"?"prgb":"rgb"):d(e.h)&&d(e.s)&&d(e.v)?(a=l(e.s),i=l(e.v),t=N(e.h,a,i),f=!0,h="hsv"):d(e.h)&&d(e.s)&&d(e.l)&&(a=l(e.s),n=l(e.l),t=B(e.h,a,n),f=!0,h="hsl"),Object.prototype.hasOwnProperty.call(e,"a")&&(r=e.a)),r=A(r),{ok:f,format:e.format||h,r:Math.min(255,Math.max(t.r,0)),g:Math.min(255,Math.max(t.g,0)),b:Math.min(255,Math.max(t.b,0)),a:r}}var G="[-\\+]?\\d+%?",q="[-\\+]?\\d*\\.\\d+%?",b="(?:"+q+")|(?:"+G+")",y="[\\s|\\(]+("+b+")[,|\\s]+("+b+")[,|\\s]+("+b+")\\s*\\)?",m="[\\s|\\(]+("+b+")[,|\\s]+("+b+")[,|\\s]+("+b+")[,|\\s]+("+b+")\\s*\\)?",g={CSS_UNIT:new RegExp(b),rgb:new RegExp("rgb"+y),rgba:new RegExp("rgba"+m),hsl:new RegExp("hsl"+y),hsla:new RegExp("hsla"+m),hsv:new RegExp("hsv"+y),hsva:new RegExp("hsva"+m),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/};function U(e){if(e=e.trim().toLowerCase(),e.length===0)return!1;var t=!1;if(x[e])e=x[e],t=!0;else if(e==="transparent")return{r:0,g:0,b:0,a:0,format:"name"};var r=g.rgb.exec(e);return r?{r:r[1],g:r[2],b:r[3]}:(r=g.rgba.exec(e),r?{r:r[1],g:r[2],b:r[3],a:r[4]}:(r=g.hsl.exec(e),r?{h:r[1],s:r[2],l:r[3]}:(r=g.hsla.exec(e),r?{h:r[1],s:r[2],l:r[3],a:r[4]}:(r=g.hsv.exec(e),r?{h:r[1],s:r[2],v:r[3]}:(r=g.hsva.exec(e),r?{h:r[1],s:r[2],v:r[3],a:r[4]}:(r=g.hex8.exec(e),r?{r:o(r[1]),g:o(r[2]),b:o(r[3]),a:k(r[4]),format:t?"name":"hex8"}:(r=g.hex6.exec(e),r?{r:o(r[1]),g:o(r[2]),b:o(r[3]),format:t?"name":"hex"}:(r=g.hex4.exec(e),r?{r:o(r[1]+r[1]),g:o(r[2]+r[2]),b:o(r[3]+r[3]),a:k(r[4]+r[4]),format:t?"name":"hex8"}:(r=g.hex3.exec(e),r?{r:o(r[1]+r[1]),g:o(r[2]+r[2]),b:o(r[3]+r[3]),format:t?"name":"hex"}:!1)))))))))}function d(e){return Boolean(g.CSS_UNIT.exec(String(e)))}var D=function(){function e(t,r){t===void 0&&(t=""),r===void 0&&(r={});var a;if(t instanceof e)return t;typeof t=="number"&&(t=O(t)),this.originalInput=t;var i=W(t);this.originalInput=t,this.r=i.r,this.g=i.g,this.b=i.b,this.a=i.a,this.roundA=Math.round(100*this.a)/100,this.format=(a=r.format)!==null&&a!==void 0?a:i.format,this.gradientType=r.gradientType,this.r<1&&(this.r=Math.round(this.r)),this.g<1&&(this.g=Math.round(this.g)),this.b<1&&(this.b=Math.round(this.b)),this.isValid=i.ok}return e.prototype.isDark=function(){return this.getBrightness()<128},e.prototype.isLight=function(){return!this.isDark()},e.prototype.getBrightness=function(){var t=this.toRgb();return(t.r*299+t.g*587+t.b*114)/1e3},e.prototype.getLuminance=function(){var t=this.toRgb(),r,a,i,n=t.r/255,f=t.g/255,h=t.b/255;return n<=.03928?r=n/12.92:r=Math.pow((n+.055)/1.055,2.4),f<=.03928?a=f/12.92:a=Math.pow((f+.055)/1.055,2.4),h<=.03928?i=h/12.92:i=Math.pow((h+.055)/1.055,2.4),.2126*r+.7152*a+.0722*i},e.prototype.getAlpha=function(){return this.a},e.prototype.setAlpha=function(t){return this.a=A(t),this.roundA=Math.round(100*this.a)/100,this},e.prototype.toHsv=function(){var t=S(this.r,this.g,this.b);return{h:t.h*360,s:t.s,v:t.v,a:this.a}},e.prototype.toHsvString=function(){var t=S(this.r,this.g,this.b),r=Math.round(t.h*360),a=Math.round(t.s*100),i=Math.round(t.v*100);return this.a===1?"hsv("+r+", "+a+"%, "+i+"%)":"hsva("+r+", "+a+"%, "+i+"%, "+this.roundA+")"},e.prototype.toHsl=function(){var t=M(this.r,this.g,this.b);return{h:t.h*360,s:t.s,l:t.l,a:this.a}},e.prototype.toHslString=function(){var t=M(this.r,this.g,this.b),r=Math.round(t.h*360),a=Math.round(t.s*100),i=Math.round(t.l*100);return this.a===1?"hsl("+r+", "+a+"%, "+i+"%)":"hsla("+r+", "+a+"%, "+i+"%, "+this.roundA+")"},e.prototype.toHex=function(t){return t===void 0&&(t=!1),w(this.r,this.g,this.b,t)},e.prototype.toHexString=function(t){return t===void 0&&(t=!1),"#"+this.toHex(t)},e.prototype.toHex8=function(t){return t===void 0&&(t=!1),P(this.r,this.g,this.b,this.a,t)},e.prototype.toHex8String=function(t){return t===void 0&&(t=!1),"#"+this.toHex8(t)},e.prototype.toRgb=function(){return{r:Math.round(this.r),g:Math.round(this.g),b:Math.round(this.b),a:this.a}},e.prototype.toRgbString=function(){var t=Math.round(this.r),r=Math.round(this.g),a=Math.round(this.b);return this.a===1?"rgb("+t+", "+r+", "+a+")":"rgba("+t+", "+r+", "+a+", "+this.roundA+")"},e.prototype.toPercentageRgb=function(){var t=function(r){return Math.round(s(r,255)*100)+"%"};return{r:t(this.r),g:t(this.g),b:t(this.b),a:this.a}},e.prototype.toPercentageRgbString=function(){var t=function(r){return Math.round(s(r,255)*100)};return this.a===1?"rgb("+t(this.r)+"%, "+t(this.g)+"%, "+t(this.b)+"%)":"rgba("+t(this.r)+"%, "+t(this.g)+"%, "+t(this.b)+"%, "+this.roundA+")"},e.prototype.toName=function(){if(this.a===0)return"transparent";if(this.a<1)return!1;for(var t="#"+w(this.r,this.g,this.b,!1),r=0,a=Object.entries(x);r=0,n=!r&&i&&(t.startsWith("hex")||t==="name");return n?t==="name"&&this.a===0?this.toName():this.toRgbString():(t==="rgb"&&(a=this.toRgbString()),t==="prgb"&&(a=this.toPercentageRgbString()),(t==="hex"||t==="hex6")&&(a=this.toHexString()),t==="hex3"&&(a=this.toHexString(!0)),t==="hex4"&&(a=this.toHex8String(!0)),t==="hex8"&&(a=this.toHex8String()),t==="name"&&(a=this.toName()),t==="hsl"&&(a=this.toHslString()),t==="hsv"&&(a=this.toHsvString()),a||this.toHexString())},e.prototype.toNumber=function(){return(Math.round(this.r)<<16)+(Math.round(this.g)<<8)+Math.round(this.b)},e.prototype.clone=function(){return new e(this.toString())},e.prototype.lighten=function(t){t===void 0&&(t=10);var r=this.toHsl();return r.l+=t/100,r.l=p(r.l),new e(r)},e.prototype.brighten=function(t){t===void 0&&(t=10);var r=this.toRgb();return r.r=Math.max(0,Math.min(255,r.r-Math.round(255*-(t/100)))),r.g=Math.max(0,Math.min(255,r.g-Math.round(255*-(t/100)))),r.b=Math.max(0,Math.min(255,r.b-Math.round(255*-(t/100)))),new e(r)},e.prototype.darken=function(t){t===void 0&&(t=10);var r=this.toHsl();return r.l-=t/100,r.l=p(r.l),new e(r)},e.prototype.tint=function(t){return t===void 0&&(t=10),this.mix("white",t)},e.prototype.shade=function(t){return t===void 0&&(t=10),this.mix("black",t)},e.prototype.desaturate=function(t){t===void 0&&(t=10);var r=this.toHsl();return r.s-=t/100,r.s=p(r.s),new e(r)},e.prototype.saturate=function(t){t===void 0&&(t=10);var r=this.toHsl();return r.s+=t/100,r.s=p(r.s),new e(r)},e.prototype.greyscale=function(){return this.desaturate(100)},e.prototype.spin=function(t){var r=this.toHsl(),a=(r.h+t)%360;return r.h=a<0?360+a:a,new e(r)},e.prototype.mix=function(t,r){r===void 0&&(r=50);var a=this.toRgb(),i=new e(t).toRgb(),n=r/100,f={r:(i.r-a.r)*n+a.r,g:(i.g-a.g)*n+a.g,b:(i.b-a.b)*n+a.b,a:(i.a-a.a)*n+a.a};return new e(f)},e.prototype.analogous=function(t,r){t===void 0&&(t=6),r===void 0&&(r=30);var a=this.toHsl(),i=360/r,n=[this];for(a.h=(a.h-(i*t>>1)+720)%360;--t;)a.h=(a.h+i)%360,n.push(new e(a));return n},e.prototype.complement=function(){var t=this.toHsl();return t.h=(t.h+180)%360,new e(t)},e.prototype.monochromatic=function(t){t===void 0&&(t=6);for(var r=this.toHsv(),a=r.h,i=r.s,n=r.v,f=[],h=1/t;t--;)f.push(new e({h:a,s:i,v:n})),n=(n+h)%1;return f},e.prototype.splitcomplement=function(){var t=this.toHsl(),r=t.h;return[this,new e({h:(r+72)%360,s:t.s,l:t.l}),new e({h:(r+216)%360,s:t.s,l:t.l})]},e.prototype.onBackground=function(t){var r=this.toRgb(),a=new e(t).toRgb();return new e({r:a.r+(r.r-a.r)*r.a,g:a.g+(r.g-a.g)*r.a,b:a.b+(r.b-a.b)*r.a})},e.prototype.triad=function(){return this.polyad(3)},e.prototype.tetrad=function(){return this.polyad(4)},e.prototype.polyad=function(t){for(var r=this.toHsl(),a=r.h,i=[this],n=360/t,f=1;fli{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em) * -1);position:absolute;text-align:center;width:var(--fa-li-width, 2em);line-height:inherit}.fa-border{border-color:var(--fa-border-color, #eee);border-radius:var(--fa-border-radius, .1em);border-style:var(--fa-border-style, solid);border-width:var(--fa-border-width, .08em);padding:var(--fa-border-padding, .2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin, .3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin, .3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay, 0);animation-delay:var(--fa-animation-delay, 0);-webkit-animation-direction:var(--fa-animation-direction, normal);animation-direction:var(--fa-animation-direction, normal);-webkit-animation-duration:var(--fa-animation-duration, 1s);animation-duration:var(--fa-animation-duration, 1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-iteration-count:var(--fa-animation-iteration-count, infinite);-webkit-animation-timing-function:var(--fa-animation-timing, ease-in-out);animation-timing-function:var(--fa-animation-timing, ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay, 0);animation-delay:var(--fa-animation-delay, 0);-webkit-animation-direction:var(--fa-animation-direction, normal);animation-direction:var(--fa-animation-direction, normal);-webkit-animation-duration:var(--fa-animation-duration, 1s);animation-duration:var(--fa-animation-duration, 1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-iteration-count:var(--fa-animation-iteration-count, infinite);-webkit-animation-timing-function:var(--fa-animation-timing, cubic-bezier(.28, .84, .42, 1));animation-timing-function:var(--fa-animation-timing, cubic-bezier(.28, .84, .42, 1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-delay:var(--fa-animation-delay, 0);animation-delay:var(--fa-animation-delay, 0);-webkit-animation-direction:var(--fa-animation-direction, normal);animation-direction:var(--fa-animation-direction, normal);-webkit-animation-duration:var(--fa-animation-duration, 1s);animation-duration:var(--fa-animation-duration, 1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-iteration-count:var(--fa-animation-iteration-count, infinite);-webkit-animation-timing-function:var(--fa-animation-timing, cubic-bezier(.4, 0, .6, 1));animation-timing-function:var(--fa-animation-timing, cubic-bezier(.4, 0, .6, 1))}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-delay:var(--fa-animation-delay, 0);animation-delay:var(--fa-animation-delay, 0);-webkit-animation-direction:var(--fa-animation-direction, normal);animation-direction:var(--fa-animation-direction, normal);-webkit-animation-duration:var(--fa-animation-duration, 1s);animation-duration:var(--fa-animation-duration, 1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-iteration-count:var(--fa-animation-iteration-count, infinite);-webkit-animation-timing-function:var(--fa-animation-timing, cubic-bezier(.4, 0, .6, 1));animation-timing-function:var(--fa-animation-timing, cubic-bezier(.4, 0, .6, 1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay, 0);animation-delay:var(--fa-animation-delay, 0);-webkit-animation-direction:var(--fa-animation-direction, normal);animation-direction:var(--fa-animation-direction, normal);-webkit-animation-duration:var(--fa-animation-duration, 1s);animation-duration:var(--fa-animation-duration, 1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-iteration-count:var(--fa-animation-iteration-count, infinite);-webkit-animation-timing-function:var(--fa-animation-timing, ease-in-out);animation-timing-function:var(--fa-animation-timing, ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-delay:var(--fa-animation-delay, 0);animation-delay:var(--fa-animation-delay, 0);-webkit-animation-direction:var(--fa-animation-direction, normal);animation-direction:var(--fa-animation-direction, normal);-webkit-animation-duration:var(--fa-animation-duration, 1s);animation-duration:var(--fa-animation-duration, 1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-iteration-count:var(--fa-animation-iteration-count, infinite);-webkit-animation-timing-function:var(--fa-animation-timing, linear);animation-timing-function:var(--fa-animation-timing, linear)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-delay:var(--fa-animation-delay, 0);animation-delay:var(--fa-animation-delay, 0);-webkit-animation-direction:var(--fa-animation-direction, normal);animation-direction:var(--fa-animation-direction, normal);-webkit-animation-duration:var(--fa-animation-duration, 2s);animation-duration:var(--fa-animation-duration, 2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-iteration-count:var(--fa-animation-iteration-count, infinite);-webkit-animation-timing-function:var(--fa-animation-timing, linear);animation-timing-function:var(--fa-animation-timing, linear)}.fa-spin-reverse{--fa-animation-direction: reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction, normal);animation-direction:var(--fa-animation-direction, normal);-webkit-animation-duration:var(--fa-animation-duration, 1s);animation-duration:var(--fa-animation-duration, 1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-iteration-count:var(--fa-animation-iteration-count, infinite);-webkit-animation-timing-function:var(--fa-animation-timing, steps(8));animation-timing-function:var(--fa-animation-timing, steps(8))}@media (prefers-reduced-motion: reduce){.fa-beat,.fa-bounce,.fa-fade,.fa-beat-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale, 1.25));transform:scale(var(--fa-beat-scale, 1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale, 1.25));transform:scale(var(--fa-beat-scale, 1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1,1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x, 1.1),var(--fa-bounce-start-scale-y, .9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x, 1.1),var(--fa-bounce-start-scale-y, .9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x, .9),var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -.5em));transform:scale(var(--fa-bounce-jump-scale-x, .9),var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x, 1.05),var(--fa-bounce-land-scale-y, .95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x, 1.05),var(--fa-bounce-land-scale-y, .95)) translateY(0)}57%{-webkit-transform:scale(1,1) translateY(var(--fa-bounce-rebound, -.125em));transform:scale(1) translateY(var(--fa-bounce-rebound, -.125em))}64%{-webkit-transform:scale(1,1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1,1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1,1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x, 1.1),var(--fa-bounce-start-scale-y, .9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x, 1.1),var(--fa-bounce-start-scale-y, .9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x, .9),var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -.5em));transform:scale(var(--fa-bounce-jump-scale-x, .9),var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x, 1.05),var(--fa-bounce-land-scale-y, .95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x, 1.05),var(--fa-bounce-land-scale-y, .95)) translateY(0)}57%{-webkit-transform:scale(1,1) translateY(var(--fa-bounce-rebound, -.125em));transform:scale(1) translateY(var(--fa-bounce-rebound, -.125em))}64%{-webkit-transform:scale(1,1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1,1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity, .4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity, .4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity, .4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale, 1.125));transform:scale(var(--fa-beat-fade-scale, 1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity, .4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale, 1.125));transform:scale(var(--fa-beat-fade-scale, 1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x, 0),var(--fa-flip-y, 1),var(--fa-flip-z, 0),var(--fa-flip-angle, -180deg));transform:rotate3d(var(--fa-flip-x, 0),var(--fa-flip-y, 1),var(--fa-flip-z, 0),var(--fa-flip-angle, -180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x, 0),var(--fa-flip-y, 1),var(--fa-flip-z, 0),var(--fa-flip-angle, -180deg));transform:rotate3d(var(--fa-flip-x, 0),var(--fa-flip-y, 1),var(--fa-flip-z, 0),var(--fa-flip-angle, -180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scale(-1,1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1,-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle, none));transform:rotate(var(--fa-rotate-angle, none))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index, auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse, #fff)}.fa-0:before{content:"0"}.fa-1:before{content:"1"}.fa-2:before{content:"2"}.fa-3:before{content:"3"}.fa-4:before{content:"4"}.fa-5:before{content:"5"}.fa-6:before{content:"6"}.fa-7:before{content:"7"}.fa-8:before{content:"8"}.fa-9:before{content:"9"}.fa-a:before{content:"A"}.fa-address-book:before{content:"\f2b9"}.fa-contact-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-contact-card:before{content:"\f2bb"}.fa-vcard:before{content:"\f2bb"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-anchor:before{content:"\f13d"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-anchor-lock:before{content:"\e4ad"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angles-down:before{content:"\f103"}.fa-angle-double-down:before{content:"\f103"}.fa-angles-left:before{content:"\f100"}.fa-angle-double-left:before{content:"\f100"}.fa-angles-right:before{content:"\f101"}.fa-angle-double-right:before{content:"\f101"}.fa-angles-up:before{content:"\f102"}.fa-angle-double-up:before{content:"\f102"}.fa-ankh:before{content:"\f644"}.fa-apple-whole:before{content:"\f5d1"}.fa-apple-alt:before{content:"\f5d1"}.fa-archway:before{content:"\f557"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-down-1-9:before{content:"\f162"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-down:before{content:"\f162"}.fa-arrow-down-9-1:before{content:"\f886"}.fa-sort-numeric-desc:before{content:"\f886"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-arrow-down-a-z:before{content:"\f15d"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-arrow-down-long:before{content:"\f175"}.fa-long-arrow-down:before{content:"\f175"}.fa-arrow-down-short-wide:before{content:"\f884"}.fa-sort-amount-desc:before{content:"\f884"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-arrow-down-wide-short:before{content:"\f160"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-down:before{content:"\f160"}.fa-arrow-down-z-a:before{content:"\f881"}.fa-sort-alpha-desc:before{content:"\f881"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-left-long:before{content:"\f177"}.fa-long-arrow-left:before{content:"\f177"}.fa-arrow-pointer:before{content:"\f245"}.fa-mouse-pointer:before{content:"\f245"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-right-arrow-left:before{content:"\f0ec"}.fa-exchange:before{content:"\f0ec"}.fa-arrow-right-from-bracket:before{content:"\f08b"}.fa-sign-out:before{content:"\f08b"}.fa-arrow-right-long:before{content:"\f178"}.fa-long-arrow-right:before{content:"\f178"}.fa-arrow-right-to-bracket:before{content:"\f090"}.fa-sign-in:before{content:"\f090"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-arrow-rotate-left:before{content:"\f0e2"}.fa-arrow-left-rotate:before{content:"\f0e2"}.fa-arrow-rotate-back:before{content:"\f0e2"}.fa-arrow-rotate-backward:before{content:"\f0e2"}.fa-undo:before{content:"\f0e2"}.fa-arrow-rotate-right:before{content:"\f01e"}.fa-arrow-right-rotate:before{content:"\f01e"}.fa-arrow-rotate-forward:before{content:"\f01e"}.fa-redo:before{content:"\f01e"}.fa-arrow-trend-down:before{content:"\e097"}.fa-arrow-trend-up:before{content:"\e098"}.fa-arrow-turn-down:before{content:"\f149"}.fa-level-down:before{content:"\f149"}.fa-arrow-turn-up:before{content:"\f148"}.fa-level-up:before{content:"\f148"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-up-1-9:before{content:"\f163"}.fa-sort-numeric-up:before{content:"\f163"}.fa-arrow-up-9-1:before{content:"\f887"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-arrow-up-a-z:before{content:"\f15e"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-arrow-up-long:before{content:"\f176"}.fa-long-arrow-up:before{content:"\f176"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-arrow-up-right-from-square:before{content:"\f08e"}.fa-external-link:before{content:"\f08e"}.fa-arrow-up-short-wide:before{content:"\f885"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-arrow-up-wide-short:before{content:"\f161"}.fa-sort-amount-up:before{content:"\f161"}.fa-arrow-up-z-a:before{content:"\f882"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-arrows-left-right:before{content:"\f07e"}.fa-arrows-h:before{content:"\f07e"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-arrows-rotate:before{content:"\f021"}.fa-refresh:before{content:"\f021"}.fa-sync:before{content:"\f021"}.fa-arrows-spin:before{content:"\e4bb"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-arrows-up-down:before{content:"\f07d"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-up-down-left-right:before{content:"\f047"}.fa-arrows:before{content:"\f047"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-asterisk:before{content:"*"}.fa-at:before{content:"@"}.fa-atom:before{content:"\f5d2"}.fa-audio-description:before{content:"\f29e"}.fa-austral-sign:before{content:"\e0a9"}.fa-award:before{content:"\f559"}.fa-b:before{content:"B"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-carriage-baby:before{content:"\f77d"}.fa-backward:before{content:"\f04a"}.fa-backward-fast:before{content:"\f049"}.fa-fast-backward:before{content:"\f049"}.fa-backward-step:before{content:"\f048"}.fa-step-backward:before{content:"\f048"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bag-shopping:before{content:"\f290"}.fa-shopping-bag:before{content:"\f290"}.fa-bahai:before{content:"\f666"}.fa-baht-sign:before{content:"\e0ac"}.fa-ban:before{content:"\f05e"}.fa-cancel:before{content:"\f05e"}.fa-ban-smoking:before{content:"\f54d"}.fa-smoking-ban:before{content:"\f54d"}.fa-bandage:before{content:"\f462"}.fa-band-aid:before{content:"\f462"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-navicon:before{content:"\f0c9"}.fa-bars-progress:before{content:"\f828"}.fa-tasks-alt:before{content:"\f828"}.fa-bars-staggered:before{content:"\f550"}.fa-reorder:before{content:"\f550"}.fa-stream:before{content:"\f550"}.fa-baseball:before{content:"\f433"}.fa-baseball-ball:before{content:"\f433"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-basket-shopping:before{content:"\f291"}.fa-shopping-basket:before{content:"\f291"}.fa-basketball:before{content:"\f434"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-bathtub:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-0:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery:before{content:"\f240"}.fa-battery-5:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-3:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-2:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-4:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-bed-pulse:before{content:"\f487"}.fa-procedures:before{content:"\f487"}.fa-beer-mug-empty:before{content:"\f0fc"}.fa-beer:before{content:"\f0fc"}.fa-bell:before{content:"\f0f3"}.fa-bell-concierge:before{content:"\f562"}.fa-concierge-bell:before{content:"\f562"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bicycle:before{content:"\f206"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blog:before{content:"\f781"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-zap:before{content:"\f0e7"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-atlas:before{content:"\f558"}.fa-atlas:before{content:"\f558"}.fa-book-bible:before{content:"\f647"}.fa-bible:before{content:"\f647"}.fa-book-bookmark:before{content:"\e0bb"}.fa-book-journal-whills:before{content:"\f66a"}.fa-journal-whills:before{content:"\f66a"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-open-reader:before{content:"\f5da"}.fa-book-reader:before{content:"\f5da"}.fa-book-quran:before{content:"\f687"}.fa-quran:before{content:"\f687"}.fa-book-skull:before{content:"\f6b7"}.fa-book-dead:before{content:"\f6b7"}.fa-bookmark:before{content:"\f02e"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-top-left:before{content:"\f853"}.fa-border-style:before{content:"\f853"}.fa-bore-hole:before{content:"\e4c3"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-bottle-water:before{content:"\e4c5"}.fa-bowl-food:before{content:"\e4c6"}.fa-bowl-rice:before{content:"\e2eb"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-archive:before{content:"\f187"}.fa-archive:before{content:"\f187"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes-packing:before{content:"\e4c7"}.fa-boxes-stacked:before{content:"\f468"}.fa-boxes:before{content:"\f468"}.fa-boxes-alt:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-bread-slice:before{content:"\f7ec"}.fa-bridge:before{content:"\e4c8"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-bridge-water:before{content:"\e4ce"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broom:before{content:"\f51a"}.fa-broom-ball:before{content:"\f458"}.fa-quidditch:before{content:"\f458"}.fa-quidditch-broom-ball:before{content:"\f458"}.fa-brush:before{content:"\f55d"}.fa-bucket:before{content:"\e4cf"}.fa-bug:before{content:"\f188"}.fa-bug-slash:before{content:"\e490"}.fa-bugs:before{content:"\e4d0"}.fa-building:before{content:"\f1ad"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-building-circle-check:before{content:"\e4d2"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-building-columns:before{content:"\f19c"}.fa-bank:before{content:"\f19c"}.fa-institution:before{content:"\f19c"}.fa-museum:before{content:"\f19c"}.fa-university:before{content:"\f19c"}.fa-building-flag:before{content:"\e4d5"}.fa-building-lock:before{content:"\e4d6"}.fa-building-ngo:before{content:"\e4d7"}.fa-building-shield:before{content:"\e4d8"}.fa-building-un:before{content:"\e4d9"}.fa-building-user:before{content:"\e4da"}.fa-building-wheat:before{content:"\e4db"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burger:before{content:"\f805"}.fa-hamburger:before{content:"\f805"}.fa-burst:before{content:"\e4dc"}.fa-bus:before{content:"\f207"}.fa-bus-simple:before{content:"\f55e"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-briefcase-clock:before{content:"\f64a"}.fa-c:before{content:"C"}.fa-cake-candles:before{content:"\f1fd"}.fa-birthday-cake:before{content:"\f1fd"}.fa-cake:before{content:"\f1fd"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-days:before{content:"\f073"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-week:before{content:"\f784"}.fa-calendar-xmark:before{content:"\f273"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-alt:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-camera-rotate:before{content:"\e0d8"}.fa-campground:before{content:"\f6bb"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-automobile:before{content:"\f1b9"}.fa-car-battery:before{content:"\f5df"}.fa-battery-car:before{content:"\f5df"}.fa-car-burst:before{content:"\f5e1"}.fa-car-crash:before{content:"\f5e1"}.fa-car-on:before{content:"\e4dd"}.fa-car-rear:before{content:"\f5de"}.fa-car-alt:before{content:"\f5de"}.fa-car-side:before{content:"\f5e4"}.fa-car-tunnel:before{content:"\e4de"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-flatbed:before{content:"\f474"}.fa-dolly-flatbed:before{content:"\f474"}.fa-cart-flatbed-suitcase:before{content:"\f59d"}.fa-luggage-cart:before{content:"\f59d"}.fa-cart-plus:before{content:"\f217"}.fa-cart-shopping:before{content:"\f07a"}.fa-shopping-cart:before{content:"\f07a"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cedi-sign:before{content:"\e0df"}.fa-cent-sign:before{content:"\e3f5"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-blackboard:before{content:"\f51b"}.fa-chalkboard-user:before{content:"\f51c"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-champagne-glasses:before{content:"\f79f"}.fa-glass-cheers:before{content:"\f79f"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-area-chart:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-bar-chart:before{content:"\f080"}.fa-chart-column:before{content:"\e0e3"}.fa-chart-gantt:before{content:"\e0e4"}.fa-chart-line:before{content:"\f201"}.fa-line-chart:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-pie-chart:before{content:"\f200"}.fa-chart-simple:before{content:"\e473"}.fa-check:before{content:"\f00c"}.fa-check-double:before{content:"\f560"}.fa-check-to-slot:before{content:"\f772"}.fa-vote-yea:before{content:"\f772"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-child-dress:before{content:"\e59c"}.fa-child-reaching:before{content:"\e59d"}.fa-child-rifle:before{content:"\e4e0"}.fa-children:before{content:"\e4e1"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-circle-arrow-left:before{content:"\f0a8"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-circle-arrow-right:before{content:"\f0a9"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-circle-arrow-up:before{content:"\f0aa"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-circle-check:before{content:"\f058"}.fa-check-circle:before{content:"\f058"}.fa-circle-chevron-down:before{content:"\f13a"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-circle-chevron-left:before{content:"\f137"}.fa-chevron-circle-left:before{content:"\f137"}.fa-circle-chevron-right:before{content:"\f138"}.fa-chevron-circle-right:before{content:"\f138"}.fa-circle-chevron-up:before{content:"\f139"}.fa-chevron-circle-up:before{content:"\f139"}.fa-circle-dollar-to-slot:before{content:"\f4b9"}.fa-donate:before{content:"\f4b9"}.fa-circle-dot:before{content:"\f192"}.fa-dot-circle:before{content:"\f192"}.fa-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-circle-exclamation:before{content:"\f06a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-circle-h:before{content:"\f47e"}.fa-hospital-symbol:before{content:"\f47e"}.fa-circle-half-stroke:before{content:"\f042"}.fa-adjust:before{content:"\f042"}.fa-circle-info:before{content:"\f05a"}.fa-info-circle:before{content:"\f05a"}.fa-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-circle-minus:before{content:"\f056"}.fa-minus-circle:before{content:"\f056"}.fa-circle-nodes:before{content:"\e4e2"}.fa-circle-notch:before{content:"\f1ce"}.fa-circle-pause:before{content:"\f28b"}.fa-pause-circle:before{content:"\f28b"}.fa-circle-play:before{content:"\f144"}.fa-play-circle:before{content:"\f144"}.fa-circle-plus:before{content:"\f055"}.fa-plus-circle:before{content:"\f055"}.fa-circle-question:before{content:"\f059"}.fa-question-circle:before{content:"\f059"}.fa-circle-radiation:before{content:"\f7ba"}.fa-radiation-alt:before{content:"\f7ba"}.fa-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-circle-stop:before{content:"\f28d"}.fa-stop-circle:before{content:"\f28d"}.fa-circle-up:before{content:"\f35b"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-circle-user:before{content:"\f2bd"}.fa-user-circle:before{content:"\f2bd"}.fa-circle-xmark:before{content:"\f057"}.fa-times-circle:before{content:"\f057"}.fa-xmark-circle:before{content:"\f057"}.fa-city:before{content:"\f64f"}.fa-clapperboard:before{content:"\e131"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clipboard-question:before{content:"\e4e3"}.fa-clipboard-user:before{content:"\f7f3"}.fa-clock:before{content:"\f017"}.fa-clock-four:before{content:"\f017"}.fa-clock-rotate-left:before{content:"\f1da"}.fa-history:before{content:"\f1da"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-arrow-down:before{content:"\f0ed"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-download-alt:before{content:"\f0ed"}.fa-cloud-arrow-up:before{content:"\f0ee"}.fa-cloud-upload:before{content:"\f0ee"}.fa-cloud-upload-alt:before{content:"\f0ee"}.fa-cloud-bolt:before{content:"\f76c"}.fa-thunderstorm:before{content:"\f76c"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-clover:before{content:"\e139"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-code-commit:before{content:"\f386"}.fa-code-compare:before{content:"\e13a"}.fa-code-fork:before{content:"\e13b"}.fa-code-merge:before{content:"\f387"}.fa-code-pull-request:before{content:"\e13c"}.fa-coins:before{content:"\f51e"}.fa-colon-sign:before{content:"\e140"}.fa-comment:before{content:"\f075"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-commenting:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comment-sms:before{content:"\f7cd"}.fa-sms:before{content:"\f7cd"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compass-drafting:before{content:"\f568"}.fa-drafting-compass:before{content:"\f568"}.fa-compress:before{content:"\f066"}.fa-computer:before{content:"\e4e5"}.fa-computer-mouse:before{content:"\f8cc"}.fa-mouse:before{content:"\f8cc"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cow:before{content:"\f6c8"}.fa-credit-card:before{content:"\f09d"}.fa-credit-card-alt:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crop-simple:before{content:"\f565"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-d:before{content:"D"}.fa-database:before{content:"\f1c0"}.fa-delete-left:before{content:"\f55a"}.fa-backspace:before{content:"\f55a"}.fa-democrat:before{content:"\f747"}.fa-desktop:before{content:"\f390"}.fa-desktop-alt:before{content:"\f390"}.fa-dharmachakra:before{content:"\f655"}.fa-diagram-next:before{content:"\e476"}.fa-diagram-predecessor:before{content:"\e477"}.fa-diagram-project:before{content:"\f542"}.fa-project-diagram:before{content:"\f542"}.fa-diagram-successor:before{content:"\e47a"}.fa-diamond:before{content:"\f219"}.fa-diamond-turn-right:before{content:"\f5eb"}.fa-directions:before{content:"\f5eb"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-disease:before{content:"\f7fa"}.fa-display:before{content:"\e163"}.fa-divide:before{content:"\f529"}.fa-dna:before{content:"\f471"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"$"}.fa-dollar:before{content:"$"}.fa-usd:before{content:"$"}.fa-dolly:before{content:"\f472"}.fa-dolly-box:before{content:"\f472"}.fa-dong-sign:before{content:"\e169"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dove:before{content:"\f4ba"}.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-compress-alt:before{content:"\f422"}.fa-down-long:before{content:"\f309"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-download:before{content:"\f019"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-droplet:before{content:"\f043"}.fa-tint:before{content:"\f043"}.fa-droplet-slash:before{content:"\f5c7"}.fa-tint-slash:before{content:"\f5c7"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-e:before{content:"E"}.fa-ear-deaf:before{content:"\f2a4"}.fa-deaf:before{content:"\f2a4"}.fa-deafness:before{content:"\f2a4"}.fa-hard-of-hearing:before{content:"\f2a4"}.fa-ear-listen:before{content:"\f2a2"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-earth-africa:before{content:"\f57c"}.fa-globe-africa:before{content:"\f57c"}.fa-earth-americas:before{content:"\f57d"}.fa-earth:before{content:"\f57d"}.fa-earth-america:before{content:"\f57d"}.fa-globe-americas:before{content:"\f57d"}.fa-earth-asia:before{content:"\f57e"}.fa-globe-asia:before{content:"\f57e"}.fa-earth-europe:before{content:"\f7a2"}.fa-globe-europe:before{content:"\f7a2"}.fa-earth-oceania:before{content:"\e47b"}.fa-globe-oceania:before{content:"\e47b"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elevator:before{content:"\e16d"}.fa-ellipsis:before{content:"\f141"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-vertical:before{content:"\f142"}.fa-ellipsis-v:before{content:"\f142"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelopes-bulk:before{content:"\f674"}.fa-mail-bulk:before{content:"\f674"}.fa-equals:before{content:"="}.fa-eraser:before{content:"\f12d"}.fa-ethernet:before{content:"\f796"}.fa-euro-sign:before{content:"\f153"}.fa-eur:before{content:"\f153"}.fa-euro:before{content:"\f153"}.fa-exclamation:before{content:"!"}.fa-expand:before{content:"\f065"}.fa-explosion:before{content:"\e4e9"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-dropper-empty:before{content:"\f1fb"}.fa-eyedropper:before{content:"\f1fb"}.fa-eye-low-vision:before{content:"\f2a8"}.fa-low-vision:before{content:"\f2a8"}.fa-eye-slash:before{content:"\f070"}.fa-f:before{content:"F"}.fa-face-angry:before{content:"\f556"}.fa-angry:before{content:"\f556"}.fa-face-dizzy:before{content:"\f567"}.fa-dizzy:before{content:"\f567"}.fa-face-flushed:before{content:"\f579"}.fa-flushed:before{content:"\f579"}.fa-face-frown:before{content:"\f119"}.fa-frown:before{content:"\f119"}.fa-face-frown-open:before{content:"\f57a"}.fa-frown-open:before{content:"\f57a"}.fa-face-grimace:before{content:"\f57f"}.fa-grimace:before{content:"\f57f"}.fa-face-grin:before{content:"\f580"}.fa-grin:before{content:"\f580"}.fa-face-grin-beam:before{content:"\f582"}.fa-grin-beam:before{content:"\f582"}.fa-face-grin-beam-sweat:before{content:"\f583"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-face-grin-hearts:before{content:"\f584"}.fa-grin-hearts:before{content:"\f584"}.fa-face-grin-squint:before{content:"\f585"}.fa-grin-squint:before{content:"\f585"}.fa-face-grin-squint-tears:before{content:"\f586"}.fa-grin-squint-tears:before{content:"\f586"}.fa-face-grin-stars:before{content:"\f587"}.fa-grin-stars:before{content:"\f587"}.fa-face-grin-tears:before{content:"\f588"}.fa-grin-tears:before{content:"\f588"}.fa-face-grin-tongue:before{content:"\f589"}.fa-grin-tongue:before{content:"\f589"}.fa-face-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-face-grin-tongue-wink:before{content:"\f58b"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-face-grin-wide:before{content:"\f581"}.fa-grin-alt:before{content:"\f581"}.fa-face-grin-wink:before{content:"\f58c"}.fa-grin-wink:before{content:"\f58c"}.fa-face-kiss:before{content:"\f596"}.fa-kiss:before{content:"\f596"}.fa-face-kiss-beam:before{content:"\f597"}.fa-kiss-beam:before{content:"\f597"}.fa-face-kiss-wink-heart:before{content:"\f598"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-face-laugh:before{content:"\f599"}.fa-laugh:before{content:"\f599"}.fa-face-laugh-beam:before{content:"\f59a"}.fa-laugh-beam:before{content:"\f59a"}.fa-face-laugh-squint:before{content:"\f59b"}.fa-laugh-squint:before{content:"\f59b"}.fa-face-laugh-wink:before{content:"\f59c"}.fa-laugh-wink:before{content:"\f59c"}.fa-face-meh:before{content:"\f11a"}.fa-meh:before{content:"\f11a"}.fa-face-meh-blank:before{content:"\f5a4"}.fa-meh-blank:before{content:"\f5a4"}.fa-face-rolling-eyes:before{content:"\f5a5"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-face-sad-cry:before{content:"\f5b3"}.fa-sad-cry:before{content:"\f5b3"}.fa-face-sad-tear:before{content:"\f5b4"}.fa-sad-tear:before{content:"\f5b4"}.fa-face-smile:before{content:"\f118"}.fa-smile:before{content:"\f118"}.fa-face-smile-beam:before{content:"\f5b8"}.fa-smile-beam:before{content:"\f5b8"}.fa-face-smile-wink:before{content:"\f4da"}.fa-smile-wink:before{content:"\f4da"}.fa-face-surprise:before{content:"\f5c2"}.fa-surprise:before{content:"\f5c2"}.fa-face-tired:before{content:"\f5c8"}.fa-tired:before{content:"\f5c8"}.fa-fan:before{content:"\f863"}.fa-faucet:before{content:"\e005"}.fa-faucet-drip:before{content:"\e006"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-pointed:before{content:"\f56b"}.fa-feather-alt:before{content:"\f56b"}.fa-ferry:before{content:"\e4ea"}.fa-file:before{content:"\f15b"}.fa-file-arrow-down:before{content:"\f56d"}.fa-file-download:before{content:"\f56d"}.fa-file-arrow-up:before{content:"\f574"}.fa-file-upload:before{content:"\f574"}.fa-file-audio:before{content:"\f1c7"}.fa-file-circle-check:before{content:"\e493"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-file-circle-plus:before{content:"\e4ee"}.fa-file-circle-question:before{content:"\e4ef"}.fa-file-circle-xmark:before{content:"\e494"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-arrow-right-from-file:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-arrow-right-to-file:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-lines:before{content:"\f15c"}.fa-file-alt:before{content:"\f15c"}.fa-file-text:before{content:"\f15c"}.fa-file-medical:before{content:"\f477"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-pen:before{content:"\f31c"}.fa-file-edit:before{content:"\f31c"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-shield:before{content:"\e4f0"}.fa-file-signature:before{content:"\f573"}.fa-file-video:before{content:"\f1c8"}.fa-file-waveform:before{content:"\f478"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-word:before{content:"\f1c2"}.fa-file-zipper:before{content:"\f1c6"}.fa-file-archive:before{content:"\f1c6"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-filter-circle-dollar:before{content:"\f662"}.fa-funnel-dollar:before{content:"\f662"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-burner:before{content:"\e4f1"}.fa-fire-extinguisher:before{content:"\f134"}.fa-fire-flame-curved:before{content:"\f7e4"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-flame-simple:before{content:"\f46a"}.fa-burn:before{content:"\f46a"}.fa-fish:before{content:"\f578"}.fa-fish-fins:before{content:"\e4f2"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flask-vial:before{content:"\e4f3"}.fa-floppy-disk:before{content:"\f0c7"}.fa-save:before{content:"\f0c7"}.fa-florin-sign:before{content:"\e184"}.fa-folder:before{content:"\f07b"}.fa-folder-blank:before{content:"\f07b"}.fa-folder-closed:before{content:"\e185"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-folder-tree:before{content:"\f802"}.fa-font:before{content:"\f031"}.fa-football:before{content:"\f44e"}.fa-football-ball:before{content:"\f44e"}.fa-forward:before{content:"\f04e"}.fa-forward-fast:before{content:"\f050"}.fa-fast-forward:before{content:"\f050"}.fa-forward-step:before{content:"\f051"}.fa-step-forward:before{content:"\f051"}.fa-franc-sign:before{content:"\e18f"}.fa-frog:before{content:"\f52e"}.fa-futbol:before{content:"\f1e3"}.fa-futbol-ball:before{content:"\f1e3"}.fa-soccer-ball:before{content:"\f1e3"}.fa-g:before{content:"G"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gauge:before{content:"\f624"}.fa-dashboard:before{content:"\f624"}.fa-gauge-med:before{content:"\f624"}.fa-tachometer-alt-average:before{content:"\f624"}.fa-gauge-high:before{content:"\f625"}.fa-tachometer-alt:before{content:"\f625"}.fa-tachometer-alt-fast:before{content:"\f625"}.fa-gauge-simple:before{content:"\f629"}.fa-gauge-simple-med:before{content:"\f629"}.fa-tachometer-average:before{content:"\f629"}.fa-gauge-simple-high:before{content:"\f62a"}.fa-tachometer:before{content:"\f62a"}.fa-tachometer-fast:before{content:"\f62a"}.fa-gavel:before{content:"\f0e3"}.fa-legal:before{content:"\f0e3"}.fa-gear:before{content:"\f013"}.fa-cog:before{content:"\f013"}.fa-gears:before{content:"\f085"}.fa-cogs:before{content:"\f085"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-glass-water:before{content:"\e4f4"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-glasses:before{content:"\f530"}.fa-globe:before{content:"\f0ac"}.fa-golf-ball-tee:before{content:"\f450"}.fa-golf-ball:before{content:"\f450"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-mortar-board:before{content:"\f19d"}.fa-greater-than:before{content:">"}.fa-greater-than-equal:before{content:"\f532"}.fa-grip:before{content:"\f58d"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-guarani-sign:before{content:"\e19a"}.fa-guitar:before{content:"\f7a6"}.fa-gun:before{content:"\e19b"}.fa-h:before{content:"H"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand:before{content:"\f256"}.fa-hand-paper:before{content:"\f256"}.fa-hand-back-fist:before{content:"\f255"}.fa-hand-rock:before{content:"\f255"}.fa-hand-dots:before{content:"\f461"}.fa-allergies:before{content:"\f461"}.fa-hand-fist:before{content:"\f6de"}.fa-fist-raised:before{content:"\f6de"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-dollar:before{content:"\f4c0"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-droplet:before{content:"\f4c1"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-handcuffs:before{content:"\e4f8"}.fa-hands:before{content:"\f2a7"}.fa-sign-language:before{content:"\f2a7"}.fa-signing:before{content:"\f2a7"}.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-asl-interpreting:before{content:"\f2a3"}.fa-hands-american-sign-language-interpreting:before{content:"\f2a3"}.fa-hands-bound:before{content:"\e4f9"}.fa-hands-bubbles:before{content:"\e05e"}.fa-hands-wash:before{content:"\e05e"}.fa-hands-clapping:before{content:"\e1a8"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-hands-praying:before{content:"\f684"}.fa-praying-hands:before{content:"\f684"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-angle:before{content:"\f4c4"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake-simple:before{content:"\f4c6"}.fa-handshake-alt:before{content:"\f4c6"}.fa-handshake-simple-slash:before{content:"\e05f"}.fa-handshake-alt-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-drive:before{content:"\f0a0"}.fa-hdd:before{content:"\f0a0"}.fa-hashtag:before{content:"#"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-heading:before{content:"\f1dc"}.fa-header:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-simple:before{content:"\f58f"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-heart-circle-plus:before{content:"\e500"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-heart-crack:before{content:"\f7a9"}.fa-heart-broken:before{content:"\f7a9"}.fa-heart-pulse:before{content:"\f21e"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-helicopter-symbol:before{content:"\e502"}.fa-helmet-safety:before{content:"\f807"}.fa-hard-hat:before{content:"\f807"}.fa-hat-hard:before{content:"\f807"}.fa-helmet-un:before{content:"\e503"}.fa-highlighter:before{content:"\f591"}.fa-hill-avalanche:before{content:"\e507"}.fa-hill-rockslide:before{content:"\e508"}.fa-hippo:before{content:"\f6ed"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f0f8"}.fa-hospital-wide:before{content:"\f0f8"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub-person:before{content:"\f593"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-2:before{content:"\f254"}.fa-hourglass-half:before{content:"\f254"}.fa-hourglass-empty:before{content:"\f252"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-3:before{content:"\f253"}.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-1:before{content:"\f251"}.fa-house:before{content:"\f015"}.fa-home:before{content:"\f015"}.fa-home-alt:before{content:"\f015"}.fa-home-lg-alt:before{content:"\f015"}.fa-house-chimney:before{content:"\e3af"}.fa-home-lg:before{content:"\e3af"}.fa-house-chimney-crack:before{content:"\f6f1"}.fa-house-damage:before{content:"\f6f1"}.fa-house-chimney-medical:before{content:"\f7f2"}.fa-clinic-medical:before{content:"\f7f2"}.fa-house-chimney-user:before{content:"\e065"}.fa-house-chimney-window:before{content:"\e00d"}.fa-house-circle-check:before{content:"\e509"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-house-crack:before{content:"\e3b1"}.fa-house-fire:before{content:"\e50c"}.fa-house-flag:before{content:"\e50d"}.fa-house-flood-water:before{content:"\e50e"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-house-laptop:before{content:"\e066"}.fa-laptop-house:before{content:"\e066"}.fa-house-lock:before{content:"\e510"}.fa-house-medical:before{content:"\e3b2"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-house-medical-flag:before{content:"\e514"}.fa-house-signal:before{content:"\e012"}.fa-house-tsunami:before{content:"\e515"}.fa-house-user:before{content:"\e1b0"}.fa-home-user:before{content:"\e1b0"}.fa-hryvnia-sign:before{content:"\f6f2"}.fa-hryvnia:before{content:"\f6f2"}.fa-hurricane:before{content:"\f751"}.fa-i:before{content:"I"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-heart-music-camera-bolt:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-drivers-license:before{content:"\f2c2"}.fa-id-card-clip:before{content:"\f47f"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-image-portrait:before{content:"\f3e0"}.fa-portrait:before{content:"\f3e0"}.fa-images:before{content:"\f302"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-indian-rupee-sign:before{content:"\e1bc"}.fa-indian-rupee:before{content:"\e1bc"}.fa-inr:before{content:"\e1bc"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-italic:before{content:"\f033"}.fa-j:before{content:"J"}.fa-jar:before{content:"\e516"}.fa-jar-wheat:before{content:"\e517"}.fa-jedi:before{content:"\f669"}.fa-jet-fighter:before{content:"\f0fb"}.fa-fighter-jet:before{content:"\f0fb"}.fa-jet-fighter-up:before{content:"\e518"}.fa-joint:before{content:"\f595"}.fa-jug-detergent:before{content:"\e519"}.fa-k:before{content:"K"}.fa-kaaba:before{content:"\f66b"}.fa-key:before{content:"\f084"}.fa-keyboard:before{content:"\f11c"}.fa-khanda:before{content:"\f66d"}.fa-kip-sign:before{content:"\e1c4"}.fa-kit-medical:before{content:"\f479"}.fa-first-aid:before{content:"\f479"}.fa-kitchen-set:before{content:"\e51a"}.fa-kiwi-bird:before{content:"\f535"}.fa-l:before{content:"L"}.fa-land-mine-on:before{content:"\e51b"}.fa-landmark:before{content:"\f66f"}.fa-landmark-dome:before{content:"\f752"}.fa-landmark-alt:before{content:"\f752"}.fa-landmark-flag:before{content:"\e51c"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-file:before{content:"\e51d"}.fa-laptop-medical:before{content:"\f812"}.fa-lari-sign:before{content:"\e1c8"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-left-long:before{content:"\f30a"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-left-right:before{content:"\f337"}.fa-arrows-alt-h:before{content:"\f337"}.fa-lemon:before{content:"\f094"}.fa-less-than:before{content:"<"}.fa-less-than-equal:before{content:"\f537"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-lines-leaning:before{content:"\e51e"}.fa-link:before{content:"\f0c1"}.fa-chain:before{content:"\f0c1"}.fa-link-slash:before{content:"\f127"}.fa-chain-broken:before{content:"\f127"}.fa-chain-slash:before{content:"\f127"}.fa-unlink:before{content:"\f127"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-squares:before{content:"\f03a"}.fa-list-check:before{content:"\f0ae"}.fa-tasks:before{content:"\f0ae"}.fa-list-ol:before{content:"\f0cb"}.fa-list-1-2:before{content:"\f0cb"}.fa-list-numeric:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-list-dots:before{content:"\f0ca"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-location-arrow:before{content:"\f124"}.fa-location-crosshairs:before{content:"\f601"}.fa-location:before{content:"\f601"}.fa-location-dot:before{content:"\f3c5"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-location-pin:before{content:"\f041"}.fa-map-marker:before{content:"\f041"}.fa-location-pin-lock:before{content:"\e51f"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-locust:before{content:"\e520"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-m:before{content:"M"}.fa-magnet:before{content:"\f076"}.fa-magnifying-glass:before{content:"\f002"}.fa-search:before{content:"\f002"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-magnifying-glass-dollar:before{content:"\f688"}.fa-search-dollar:before{content:"\f688"}.fa-magnifying-glass-location:before{content:"\f689"}.fa-search-location:before{content:"\f689"}.fa-magnifying-glass-minus:before{content:"\f010"}.fa-search-minus:before{content:"\f010"}.fa-magnifying-glass-plus:before{content:"\f00e"}.fa-search-plus:before{content:"\f00e"}.fa-manat-sign:before{content:"\e1d5"}.fa-map:before{content:"\f279"}.fa-map-location:before{content:"\f59f"}.fa-map-marked:before{content:"\f59f"}.fa-map-location-dot:before{content:"\f5a0"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-pin:before{content:"\f276"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-and-venus:before{content:"\f224"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-right:before{content:"\f22b"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-up:before{content:"\f22a"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-martini-glass:before{content:"\f57b"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-martini-glass-citrus:before{content:"\f561"}.fa-cocktail:before{content:"\f561"}.fa-martini-glass-empty:before{content:"\f000"}.fa-glass-martini:before{content:"\f000"}.fa-mask:before{content:"\f6fa"}.fa-mask-face:before{content:"\e1d7"}.fa-mask-ventilator:before{content:"\e524"}.fa-masks-theater:before{content:"\f630"}.fa-theater-masks:before{content:"\f630"}.fa-mattress-pillow:before{content:"\e525"}.fa-maximize:before{content:"\f31e"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-medal:before{content:"\f5a2"}.fa-memory:before{content:"\f538"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-message:before{content:"\f27a"}.fa-comment-alt:before{content:"\f27a"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-lines:before{content:"\f3c9"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-lines-slash:before{content:"\f539"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-mill-sign:before{content:"\e1ed"}.fa-minimize:before{content:"\f78c"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-minus:before{content:"\f068"}.fa-subtract:before{content:"\f068"}.fa-mitten:before{content:"\f7b5"}.fa-mobile:before{content:"\f3ce"}.fa-mobile-android:before{content:"\f3ce"}.fa-mobile-phone:before{content:"\f3ce"}.fa-mobile-button:before{content:"\f10b"}.fa-mobile-retro:before{content:"\e527"}.fa-mobile-screen:before{content:"\f3cf"}.fa-mobile-android-alt:before{content:"\f3cf"}.fa-mobile-screen-button:before{content:"\f3cd"}.fa-mobile-alt:before{content:"\f3cd"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-1:before{content:"\f3d1"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-1-wave:before{content:"\f53b"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-money-bills:before{content:"\e1f3"}.fa-money-check:before{content:"\f53c"}.fa-money-check-dollar:before{content:"\f53d"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-mosquito-net:before{content:"\e52c"}.fa-motorcycle:before{content:"\f21c"}.fa-mound:before{content:"\e52d"}.fa-mountain:before{content:"\f6fc"}.fa-mountain-city:before{content:"\e52e"}.fa-mountain-sun:before{content:"\e52f"}.fa-mug-hot:before{content:"\f7b6"}.fa-mug-saucer:before{content:"\f0f4"}.fa-coffee:before{content:"\f0f4"}.fa-music:before{content:"\f001"}.fa-n:before{content:"N"}.fa-naira-sign:before{content:"\e1f6"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-not-equal:before{content:"\f53e"}.fa-note-sticky:before{content:"\f249"}.fa-sticky-note:before{content:"\f249"}.fa-notes-medical:before{content:"\f481"}.fa-o:before{content:"O"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-oil-can:before{content:"\f613"}.fa-oil-well:before{content:"\e532"}.fa-om:before{content:"\f679"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-dedent:before{content:"\f03b"}.fa-p:before{content:"P"}.fa-pager:before{content:"\f815"}.fa-paint-roller:before{content:"\f5aa"}.fa-paintbrush:before{content:"\f1fc"}.fa-paint-brush:before{content:"\f1fc"}.fa-palette:before{content:"\f53f"}.fa-pallet:before{content:"\f482"}.fa-panorama:before{content:"\e209"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-passport:before{content:"\f5ab"}.fa-paste:before{content:"\f0ea"}.fa-file-clipboard:before{content:"\f0ea"}.fa-pause:before{content:"\f04c"}.fa-paw:before{content:"\f1b0"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-clip:before{content:"\f305"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-ruler:before{content:"\f5ae"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-pen-to-square:before{content:"\f044"}.fa-edit:before{content:"\f044"}.fa-pencil:before{content:"\f303"}.fa-pencil-alt:before{content:"\f303"}.fa-people-arrows-left-right:before{content:"\e068"}.fa-people-arrows:before{content:"\e068"}.fa-people-carry-box:before{content:"\f4ce"}.fa-people-carry:before{content:"\f4ce"}.fa-people-group:before{content:"\e533"}.fa-people-line:before{content:"\e534"}.fa-people-pulling:before{content:"\e535"}.fa-people-robbery:before{content:"\e536"}.fa-people-roof:before{content:"\e537"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"%"}.fa-percentage:before{content:"%"}.fa-person:before{content:"\f183"}.fa-male:before{content:"\f183"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-person-biking:before{content:"\f84a"}.fa-biking:before{content:"\f84a"}.fa-person-booth:before{content:"\f756"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-person-burst:before{content:"\e53b"}.fa-person-cane:before{content:"\e53c"}.fa-person-chalkboard:before{content:"\e53d"}.fa-person-circle-check:before{content:"\e53e"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-person-circle-minus:before{content:"\e540"}.fa-person-circle-plus:before{content:"\e541"}.fa-person-circle-question:before{content:"\e542"}.fa-person-circle-xmark:before{content:"\e543"}.fa-person-digging:before{content:"\f85e"}.fa-digging:before{content:"\f85e"}.fa-person-dots-from-line:before{content:"\f470"}.fa-diagnoses:before{content:"\f470"}.fa-person-dress:before{content:"\f182"}.fa-female:before{content:"\f182"}.fa-person-dress-burst:before{content:"\e544"}.fa-person-drowning:before{content:"\e545"}.fa-person-falling:before{content:"\e546"}.fa-person-falling-burst:before{content:"\e547"}.fa-person-half-dress:before{content:"\e548"}.fa-person-harassing:before{content:"\e549"}.fa-person-hiking:before{content:"\f6ec"}.fa-hiking:before{content:"\f6ec"}.fa-person-military-pointing:before{content:"\e54a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-person-military-to-person:before{content:"\e54c"}.fa-person-praying:before{content:"\f683"}.fa-pray:before{content:"\f683"}.fa-person-pregnant:before{content:"\e31e"}.fa-person-rays:before{content:"\e54d"}.fa-person-rifle:before{content:"\e54e"}.fa-person-running:before{content:"\f70c"}.fa-running:before{content:"\f70c"}.fa-person-shelter:before{content:"\e54f"}.fa-person-skating:before{content:"\f7c5"}.fa-skating:before{content:"\f7c5"}.fa-person-skiing:before{content:"\f7c9"}.fa-skiing:before{content:"\f7c9"}.fa-person-skiing-nordic:before{content:"\f7ca"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-person-snowboarding:before{content:"\f7ce"}.fa-snowboarding:before{content:"\f7ce"}.fa-person-swimming:before{content:"\f5c4"}.fa-swimmer:before{content:"\f5c4"}.fa-person-through-window:before{content:"\e433"}.fa-person-walking:before{content:"\f554"}.fa-walking:before{content:"\f554"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-person-walking-luggage:before{content:"\e554"}.fa-person-walking-with-cane:before{content:"\f29d"}.fa-blind:before{content:"\f29d"}.fa-peseta-sign:before{content:"\e221"}.fa-peso-sign:before{content:"\e222"}.fa-phone:before{content:"\f095"}.fa-phone-flip:before{content:"\f879"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-volume:before{content:"\f2a0"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-photo-film:before{content:"\f87c"}.fa-photo-video:before{content:"\f87c"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-circle-check:before{content:"\e555"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-lock:before{content:"\e558"}.fa-plane-slash:before{content:"\e069"}.fa-plane-up:before{content:"\e22d"}.fa-plant-wilt:before{content:"\e43b"}.fa-plate-wheat:before{content:"\e55a"}.fa-play:before{content:"\f04b"}.fa-plug:before{content:"\f1e6"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-plug-circle-check:before{content:"\e55c"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-plus:before{content:"+"}.fa-add:before{content:"+"}.fa-plus-minus:before{content:"\e43c"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poo-bolt:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-power-off:before{content:"\f011"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-medical:before{content:"\f486"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-puzzle-piece:before{content:"\f12e"}.fa-q:before{content:"Q"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"?"}.fa-quote-left:before{content:"\f10d"}.fa-quote-left-alt:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quote-right-alt:before{content:"\f10e"}.fa-r:before{content:"R"}.fa-radiation:before{content:"\f7b9"}.fa-radio:before{content:"\f8d7"}.fa-rainbow:before{content:"\f75b"}.fa-ranking-star:before{content:"\e561"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-rectangle-ad:before{content:"\f641"}.fa-ad:before{content:"\f641"}.fa-rectangle-list:before{content:"\f022"}.fa-list-alt:before{content:"\f022"}.fa-rectangle-xmark:before{content:"\f410"}.fa-rectangle-times:before{content:"\f410"}.fa-times-rectangle:before{content:"\f410"}.fa-window-close:before{content:"\f410"}.fa-recycle:before{content:"\f1b8"}.fa-registered:before{content:"\f25d"}.fa-repeat:before{content:"\f363"}.fa-reply:before{content:"\f3e5"}.fa-mail-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-mail-reply-all:before{content:"\f122"}.fa-republican:before{content:"\f75e"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-ribbon:before{content:"\f4d6"}.fa-right-from-bracket:before{content:"\f2f5"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-right-left:before{content:"\f362"}.fa-exchange-alt:before{content:"\f362"}.fa-right-long:before{content:"\f30b"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-right-to-bracket:before{content:"\f2f6"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-road-barrier:before{content:"\e562"}.fa-road-bridge:before{content:"\e563"}.fa-road-circle-check:before{content:"\e564"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-road-circle-xmark:before{content:"\e566"}.fa-road-lock:before{content:"\e567"}.fa-road-spikes:before{content:"\e568"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rotate:before{content:"\f2f1"}.fa-sync-alt:before{content:"\f2f1"}.fa-rotate-left:before{content:"\f2ea"}.fa-rotate-back:before{content:"\f2ea"}.fa-rotate-backward:before{content:"\f2ea"}.fa-undo-alt:before{content:"\f2ea"}.fa-rotate-right:before{content:"\f2f9"}.fa-redo-alt:before{content:"\f2f9"}.fa-rotate-forward:before{content:"\f2f9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-feed:before{content:"\f09e"}.fa-ruble-sign:before{content:"\f158"}.fa-rouble:before{content:"\f158"}.fa-rub:before{content:"\f158"}.fa-ruble:before{content:"\f158"}.fa-rug:before{content:"\e569"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-rupee-sign:before{content:"\f156"}.fa-rupee:before{content:"\f156"}.fa-rupiah-sign:before{content:"\e23d"}.fa-s:before{content:"S"}.fa-sack-dollar:before{content:"\f81d"}.fa-sack-xmark:before{content:"\e56a"}.fa-sailboat:before{content:"\e445"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-scale-balanced:before{content:"\f24e"}.fa-balance-scale:before{content:"\f24e"}.fa-scale-unbalanced:before{content:"\f515"}.fa-balance-scale-left:before{content:"\f515"}.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-balance-scale-right:before{content:"\f516"}.fa-school:before{content:"\f549"}.fa-school-circle-check:before{content:"\e56b"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-school-flag:before{content:"\e56e"}.fa-school-lock:before{content:"\e56f"}.fa-scissors:before{content:"\f0c4"}.fa-cut:before{content:"\f0c4"}.fa-screwdriver:before{content:"\f54a"}.fa-screwdriver-wrench:before{content:"\f7d9"}.fa-tools:before{content:"\f7d9"}.fa-scroll:before{content:"\f70e"}.fa-scroll-torah:before{content:"\f6a0"}.fa-torah:before{content:"\f6a0"}.fa-sd-card:before{content:"\f7c2"}.fa-section:before{content:"\e447"}.fa-seedling:before{content:"\f4d8"}.fa-sprout:before{content:"\f4d8"}.fa-server:before{content:"\f233"}.fa-shapes:before{content:"\f61f"}.fa-triangle-circle-square:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-arrow-turn-right:before{content:"\f064"}.fa-mail-forward:before{content:"\f064"}.fa-share-from-square:before{content:"\f14d"}.fa-share-square:before{content:"\f14d"}.fa-share-nodes:before{content:"\f1e0"}.fa-share-alt:before{content:"\f1e0"}.fa-sheet-plastic:before{content:"\e571"}.fa-shekel-sign:before{content:"\f20b"}.fa-ils:before{content:"\f20b"}.fa-shekel:before{content:"\f20b"}.fa-sheqel:before{content:"\f20b"}.fa-sheqel-sign:before{content:"\f20b"}.fa-shield:before{content:"\f132"}.fa-shield-blank:before{content:"\f132"}.fa-shield-cat:before{content:"\e572"}.fa-shield-dog:before{content:"\e573"}.fa-shield-halved:before{content:"\f3ed"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-heart:before{content:"\e574"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shirt:before{content:"\f553"}.fa-t-shirt:before{content:"\f553"}.fa-tshirt:before{content:"\f553"}.fa-shoe-prints:before{content:"\f54b"}.fa-shop:before{content:"\f54f"}.fa-store-alt:before{content:"\f54f"}.fa-shop-lock:before{content:"\e4a5"}.fa-shop-slash:before{content:"\e070"}.fa-store-alt-slash:before{content:"\e070"}.fa-shower:before{content:"\f2cc"}.fa-shrimp:before{content:"\e448"}.fa-shuffle:before{content:"\f074"}.fa-random:before{content:"\f074"}.fa-shuttle-space:before{content:"\f197"}.fa-space-shuttle:before{content:"\f197"}.fa-sign-hanging:before{content:"\f4d9"}.fa-sign:before{content:"\f4d9"}.fa-signal:before{content:"\f012"}.fa-signal-5:before{content:"\f012"}.fa-signal-perfect:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-signs-post:before{content:"\f277"}.fa-map-signs:before{content:"\f277"}.fa-sim-card:before{content:"\f7c4"}.fa-sink:before{content:"\e06d"}.fa-sitemap:before{content:"\f0e8"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders:before{content:"\f1de"}.fa-sliders-h:before{content:"\f1de"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-unsorted:before{content:"\f0dc"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before{content:"\f0de"}.fa-sort-asc:before{content:"\f0de"}.fa-spa:before{content:"\f5bb"}.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-pastafarianism:before{content:"\f67b"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spoon:before{content:"\f2e5"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-spray-can:before{content:"\f5bd"}.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-air-freshener:before{content:"\f5d0"}.fa-square:before{content:"\f0c8"}.fa-square-arrow-up-right:before{content:"\f14c"}.fa-external-link-square:before{content:"\f14c"}.fa-square-caret-down:before{content:"\f150"}.fa-caret-square-down:before{content:"\f150"}.fa-square-caret-left:before{content:"\f191"}.fa-caret-square-left:before{content:"\f191"}.fa-square-caret-right:before{content:"\f152"}.fa-caret-square-right:before{content:"\f152"}.fa-square-caret-up:before{content:"\f151"}.fa-caret-square-up:before{content:"\f151"}.fa-square-check:before{content:"\f14a"}.fa-check-square:before{content:"\f14a"}.fa-square-envelope:before{content:"\f199"}.fa-envelope-square:before{content:"\f199"}.fa-square-full:before{content:"\f45c"}.fa-square-h:before{content:"\f0fd"}.fa-h-square:before{content:"\f0fd"}.fa-square-minus:before{content:"\f146"}.fa-minus-square:before{content:"\f146"}.fa-square-nfi:before{content:"\e576"}.fa-square-parking:before{content:"\f540"}.fa-parking:before{content:"\f540"}.fa-square-pen:before{content:"\f14b"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-square:before{content:"\f14b"}.fa-square-person-confined:before{content:"\e577"}.fa-square-phone:before{content:"\f098"}.fa-phone-square:before{content:"\f098"}.fa-square-phone-flip:before{content:"\f87b"}.fa-phone-square-alt:before{content:"\f87b"}.fa-square-plus:before{content:"\f0fe"}.fa-plus-square:before{content:"\f0fe"}.fa-square-poll-horizontal:before{content:"\f682"}.fa-poll-h:before{content:"\f682"}.fa-square-poll-vertical:before{content:"\f681"}.fa-poll:before{content:"\f681"}.fa-square-root-variable:before{content:"\f698"}.fa-square-root-alt:before{content:"\f698"}.fa-square-rss:before{content:"\f143"}.fa-rss-square:before{content:"\f143"}.fa-square-share-nodes:before{content:"\f1e1"}.fa-share-alt-square:before{content:"\f1e1"}.fa-square-up-right:before{content:"\f360"}.fa-external-link-square-alt:before{content:"\f360"}.fa-square-virus:before{content:"\e578"}.fa-square-xmark:before{content:"\f2d3"}.fa-times-square:before{content:"\f2d3"}.fa-xmark-square:before{content:"\f2d3"}.fa-staff-aesculapius:before{content:"\e579"}.fa-rod-asclepius:before{content:"\e579"}.fa-rod-snake:before{content:"\e579"}.fa-staff-snake:before{content:"\e579"}.fa-stairs:before{content:"\e289"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-stroke:before{content:"\f5c0"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-sterling-sign:before{content:"\f154"}.fa-gbp:before{content:"\f154"}.fa-pound-sign:before{content:"\f154"}.fa-stethoscope:before{content:"\f0f1"}.fa-stop:before{content:"\f04d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-slash:before{content:"\e071"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stroopwafel:before{content:"\f551"}.fa-subscript:before{content:"\f12c"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-medical:before{content:"\f0fa"}.fa-medkit:before{content:"\f0fa"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-superscript:before{content:"\f12b"}.fa-swatchbook:before{content:"\f5c3"}.fa-synagogue:before{content:"\f69b"}.fa-syringe:before{content:"\f48e"}.fa-t:before{content:"T"}.fa-table:before{content:"\f0ce"}.fa-table-cells:before{content:"\f00a"}.fa-th:before{content:"\f00a"}.fa-table-cells-large:before{content:"\f009"}.fa-th-large:before{content:"\f009"}.fa-table-columns:before{content:"\f0db"}.fa-columns:before{content:"\f0db"}.fa-table-list:before{content:"\f00b"}.fa-th-list:before{content:"\f00b"}.fa-table-tennis-paddle-ball:before{content:"\f45d"}.fa-ping-pong-paddle-ball:before{content:"\f45d"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f3fb"}.fa-tablet-android:before{content:"\f3fb"}.fa-tablet-button:before{content:"\f10a"}.fa-tablet-screen-button:before{content:"\f3fa"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachograph-digital:before{content:"\f566"}.fa-digital-tachograph:before{content:"\f566"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tarp:before{content:"\e57b"}.fa-tarp-droplet:before{content:"\e57c"}.fa-taxi:before{content:"\f1ba"}.fa-cab:before{content:"\f1ba"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-temperature-arrow-down:before{content:"\e03f"}.fa-temperature-down:before{content:"\e03f"}.fa-temperature-arrow-up:before{content:"\e040"}.fa-temperature-up:before{content:"\e040"}.fa-temperature-empty:before{content:"\f2cb"}.fa-temperature-0:before{content:"\f2cb"}.fa-thermometer-0:before{content:"\f2cb"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-temperature-full:before{content:"\f2c7"}.fa-temperature-4:before{content:"\f2c7"}.fa-thermometer-4:before{content:"\f2c7"}.fa-thermometer-full:before{content:"\f2c7"}.fa-temperature-half:before{content:"\f2c9"}.fa-temperature-2:before{content:"\f2c9"}.fa-thermometer-2:before{content:"\f2c9"}.fa-thermometer-half:before{content:"\f2c9"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-temperature-quarter:before{content:"\f2ca"}.fa-temperature-1:before{content:"\f2ca"}.fa-thermometer-1:before{content:"\f2ca"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-temperature-three-quarters:before{content:"\f2c8"}.fa-temperature-3:before{content:"\f2c8"}.fa-thermometer-3:before{content:"\f2c8"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-tenge-sign:before{content:"\f7d7"}.fa-tenge:before{content:"\f7d7"}.fa-tent:before{content:"\e57d"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tent-arrows-down:before{content:"\e581"}.fa-tents:before{content:"\e582"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-slash:before{content:"\f87d"}.fa-remove-format:before{content:"\f87d"}.fa-text-width:before{content:"\f035"}.fa-thermometer:before{content:"\f491"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-thumb-tack:before{content:"\f08d"}.fa-ticket:before{content:"\f145"}.fa-ticket-simple:before{content:"\f3ff"}.fa-ticket-alt:before{content:"\f3ff"}.fa-timeline:before{content:"\e29c"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toilet-portable:before{content:"\e583"}.fa-toilets-portable:before{content:"\e584"}.fa-toolbox:before{content:"\f552"}.fa-tooth:before{content:"\f5c9"}.fa-torii-gate:before{content:"\f6a1"}.fa-tornado:before{content:"\f76f"}.fa-tower-broadcast:before{content:"\f519"}.fa-broadcast-tower:before{content:"\f519"}.fa-tower-cell:before{content:"\e585"}.fa-tower-observation:before{content:"\e586"}.fa-tractor:before{content:"\f722"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-train-subway:before{content:"\f239"}.fa-subway:before{content:"\f239"}.fa-train-tram:before{content:"\f7da"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f225"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-arrow-up:before{content:"\f829"}.fa-trash-restore:before{content:"\f829"}.fa-trash-can:before{content:"\f2ed"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-can-arrow-up:before{content:"\f82a"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-tree-city:before{content:"\e587"}.fa-triangle-exclamation:before{content:"\f071"}.fa-exclamation-triangle:before{content:"\f071"}.fa-warning:before{content:"\f071"}.fa-trophy:before{content:"\f091"}.fa-trowel:before{content:"\e589"}.fa-trowel-bricks:before{content:"\e58a"}.fa-truck:before{content:"\f0d1"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-truck-droplet:before{content:"\e58c"}.fa-truck-fast:before{content:"\f48b"}.fa-shipping-fast:before{content:"\f48b"}.fa-truck-field:before{content:"\e58d"}.fa-truck-field-un:before{content:"\e58e"}.fa-truck-front:before{content:"\e2b7"}.fa-truck-medical:before{content:"\f0f9"}.fa-ambulance:before{content:"\f0f9"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-truck-plane:before{content:"\e58f"}.fa-truck-ramp-box:before{content:"\f4de"}.fa-truck-loading:before{content:"\f4de"}.fa-tty:before{content:"\f1e4"}.fa-teletype:before{content:"\f1e4"}.fa-turkish-lira-sign:before{content:"\e2bb"}.fa-try:before{content:"\e2bb"}.fa-turkish-lira:before{content:"\e2bb"}.fa-turn-down:before{content:"\f3be"}.fa-level-down-alt:before{content:"\f3be"}.fa-turn-up:before{content:"\f3bf"}.fa-level-up-alt:before{content:"\f3bf"}.fa-tv:before{content:"\f26c"}.fa-television:before{content:"\f26c"}.fa-tv-alt:before{content:"\f26c"}.fa-u:before{content:"U"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-universal-access:before{content:"\f29a"}.fa-unlock:before{content:"\f09c"}.fa-unlock-keyhole:before{content:"\f13e"}.fa-unlock-alt:before{content:"\f13e"}.fa-up-down:before{content:"\f338"}.fa-arrows-alt-v:before{content:"\f338"}.fa-up-down-left-right:before{content:"\f0b2"}.fa-arrows-alt:before{content:"\f0b2"}.fa-up-long:before{content:"\f30c"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-expand-alt:before{content:"\f424"}.fa-up-right-from-square:before{content:"\f35d"}.fa-external-link-alt:before{content:"\f35d"}.fa-upload:before{content:"\f093"}.fa-user:before{content:"\f007"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-clock:before{content:"\f4fd"}.fa-user-doctor:before{content:"\f0f0"}.fa-user-md:before{content:"\f0f0"}.fa-user-gear:before{content:"\f4fe"}.fa-user-cog:before{content:"\f4fe"}.fa-user-graduate:before{content:"\f501"}.fa-user-group:before{content:"\f500"}.fa-user-friends:before{content:"\f500"}.fa-user-injured:before{content:"\f728"}.fa-user-large:before{content:"\f406"}.fa-user-alt:before{content:"\f406"}.fa-user-large-slash:before{content:"\f4fa"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-lock:before{content:"\f502"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-pen:before{content:"\f4ff"}.fa-user-edit:before{content:"\f4ff"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-xmark:before{content:"\f235"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-between-lines:before{content:"\e591"}.fa-users-gear:before{content:"\f509"}.fa-users-cog:before{content:"\f509"}.fa-users-line:before{content:"\e592"}.fa-users-rays:before{content:"\e593"}.fa-users-rectangle:before{content:"\e594"}.fa-users-slash:before{content:"\e073"}.fa-users-viewfinder:before{content:"\e595"}.fa-utensils:before{content:"\f2e7"}.fa-cutlery:before{content:"\f2e7"}.fa-v:before{content:"V"}.fa-van-shuttle:before{content:"\f5b6"}.fa-shuttle-van:before{content:"\f5b6"}.fa-vault:before{content:"\e2c5"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-vest:before{content:"\e085"}.fa-vest-patches:before{content:"\e086"}.fa-vial:before{content:"\f492"}.fa-vial-circle-check:before{content:"\e596"}.fa-vial-virus:before{content:"\e597"}.fa-vials:before{content:"\f493"}.fa-video:before{content:"\f03d"}.fa-video-camera:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-virus:before{content:"\e074"}.fa-virus-covid:before{content:"\e4a8"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-voicemail:before{content:"\f897"}.fa-volcano:before{content:"\f770"}.fa-volleyball:before{content:"\f45f"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-high:before{content:"\f028"}.fa-volume-up:before{content:"\f028"}.fa-volume-low:before{content:"\f027"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-xmark:before{content:"\f6a9"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-times:before{content:"\f6a9"}.fa-vr-cardboard:before{content:"\f729"}.fa-w:before{content:"W"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-wallet:before{content:"\f555"}.fa-wand-magic:before{content:"\f0d0"}.fa-magic:before{content:"\f0d0"}.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-magic-wand-sparkles:before{content:"\e2ca"}.fa-wand-sparkles:before{content:"\f72b"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-water-ladder:before{content:"\f5c5"}.fa-ladder-water:before{content:"\f5c5"}.fa-swimming-pool:before{content:"\f5c5"}.fa-wave-square:before{content:"\f83e"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weight-scale:before{content:"\f496"}.fa-weight:before{content:"\f496"}.fa-wheat-awn:before{content:"\e2cd"}.fa-wheat-alt:before{content:"\e2cd"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-wheelchair:before{content:"\f193"}.fa-wheelchair-move:before{content:"\e2ce"}.fa-wheelchair-alt:before{content:"\e2ce"}.fa-whiskey-glass:before{content:"\f7a0"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-wifi:before{content:"\f1eb"}.fa-wifi-3:before{content:"\f1eb"}.fa-wifi-strong:before{content:"\f1eb"}.fa-wind:before{content:"\f72e"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-empty:before{content:"\f5ce"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-won-sign:before{content:"\f159"}.fa-krw:before{content:"\f159"}.fa-won:before{content:"\f159"}.fa-worm:before{content:"\e599"}.fa-wrench:before{content:"\f0ad"}.fa-x:before{content:"X"}.fa-x-ray:before{content:"\f497"}.fa-xmark:before{content:"\f00d"}.fa-close:before{content:"\f00d"}.fa-multiply:before{content:"\f00d"}.fa-remove:before{content:"\f00d"}.fa-times:before{content:"\f00d"}.fa-xmarks-lines:before{content:"\e59a"}.fa-y:before{content:"Y"}.fa-yen-sign:before{content:"\f157"}.fa-cny:before{content:"\f157"}.fa-jpy:before{content:"\f157"}.fa-rmb:before{content:"\f157"}.fa-yen:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-z:before{content:"Z"}.sr-only,.fa-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sr-only-focusable:not(:focus),.fa-sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:root,:host{--fa-font-brands: normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(/exadmin/assets/fa-brands-400.404c746c.woff2) format("woff2"),url(/exadmin/assets/fa-brands-400.e523f49c.ttf) format("truetype")}.fab,.fa-brands{font-family:"Font Awesome 6 Brands";font-weight:400}.fa-42-group:before{content:"\e080"}.fa-innosoft:before{content:"\e080"}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-alipay:before{content:"\f642"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-amilia:before{content:"\f36d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-artstation:before{content:"\f77a"}.fa-asymmetrik:before{content:"\f372"}.fa-atlassian:before{content:"\f77b"}.fa-audible:before{content:"\f373"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-aws:before{content:"\f375"}.fa-bandcamp:before{content:"\f2d5"}.fa-battle-net:before{content:"\f835"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bilibili:before{content:"\e3d9"}.fa-bimobject:before{content:"\f378"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bootstrap:before{content:"\f836"}.fa-bots:before{content:"\e340"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-buromobelexperte:before{content:"\f37f"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-cloudflare:before{content:"\e07d"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cmplid:before{content:"\e360"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cotton-bureau:before{content:"\f89e"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-critical-role:before{content:"\f6c9"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dhl:before{content:"\f790"}.fa-diaspora:before{content:"\f791"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-draft2digital:before{content:"\f396"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drupal:before{content:"\f1a9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-elementor:before{content:"\f430"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-evernote:before{content:"\f839"}.fa-expeditedssl:before{content:"\f23e"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-figma:before{content:"\f799"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-fly:before{content:"\f417"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-flag:before{content:"\f2b4"}.fa-font-awesome-logo-full:before{content:"\f2b4"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-fulcrum:before{content:"\f50b"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-gofore:before{content:"\f3a7"}.fa-golang:before{content:"\e40f"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guilded:before{content:"\e07e"}.fa-gulp:before{content:"\f3ae"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hashnode:before{content:"\e499"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-hive:before{content:"\e07f"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-hotjar:before{content:"\f3b1"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-ideal:before{content:"\e013"}.fa-imdb:before{content:"\f2d8"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\e055"}.fa-instalod:before{content:"\e081"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaggle:before{content:"\f5fa"}.fa-keybase:before{content:"\f4f5"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-korvue:before{content:"\f42f"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-leanpub:before{content:"\f212"}.fa-less:before{content:"\f41d"}.fa-line:before{content:"\f3c0"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-mailchimp:before{content:"\f59e"}.fa-mandalorian:before{content:"\f50f"}.fa-markdown:before{content:"\f60f"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f23a"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-mendeley:before{content:"\f7b3"}.fa-microblog:before{content:"\e01a"}.fa-microsoft:before{content:"\f3ca"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-nfc-directional:before{content:"\e530"}.fa-nfc-symbol:before{content:"\e531"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-octopus-deploy:before{content:"\e082"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-old-republic:before{content:"\f510"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-padlet:before{content:"\e4a0"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-palfed:before{content:"\f3d8"}.fa-patreon:before{content:"\f3d9"}.fa-paypal:before{content:"\f1ed"}.fa-perbyte:before{content:"\e083"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\e01e"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pix:before{content:"\e43a"}.fa-playstation:before{content:"\f3df"}.fa-product-hunt:before{content:"\f288"}.fa-pushed:before{content:"\f3e1"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-r-project:before{content:"\f4f7"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-renren:before{content:"\f18b"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-rev:before{content:"\f5b2"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rust:before{content:"\e07a"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-schlix:before{content:"\f3ea"}.fa-screenpal:before{content:"\e570"}.fa-scribd:before{content:"\f28a"}.fa-searchengin:before{content:"\f3eb"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-servicestack:before{content:"\f3ec"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shopify:before{content:"\e057"}.fa-shopware:before{content:"\f5b5"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sith:before{content:"\f512"}.fa-sitrox:before{content:"\e44a"}.fa-sketch:before{content:"\f7c6"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f198"}.fa-slideshare:before{content:"\f1e7"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ab"}.fa-snapchat-square:before{content:"\f2ad"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spotify:before{content:"\f1bc"}.fa-square-font-awesome:before{content:"\f425"}.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-sticker-mule:before{content:"\f3f7"}.fa-strava:before{content:"\f428"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-superpowers:before{content:"\f2dd"}.fa-supple:before{content:"\f3f9"}.fa-suse:before{content:"\f7d6"}.fa-swift:before{content:"\f8e1"}.fa-symfony:before{content:"\f83d"}.fa-teamspeak:before{content:"\f4f9"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f2c6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-the-red-yeti:before{content:"\f69d"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-think-peaks:before{content:"\f731"}.fa-tiktok:before{content:"\e07b"}.fa-trade-federation:before{content:"\f513"}.fa-trello:before{content:"\f181"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-uncharted:before{content:"\e084"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-vaadin:before{content:"\f408"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-viber:before{content:"\f409"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-vuejs:before{content:"\f41f"}.fa-watchman-monitoring:before{content:"\e087"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-whmcs:before{content:"\f40d"}.fa-wikipedia-w:before{content:"\f266"}.fa-windows:before{content:"\f17a"}.fa-wirsindhandwerk:before{content:"\e2d0"}.fa-wsh:before{content:"\e2d0"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wodu:before{content:"\e088"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}:root,:host{--fa-font-regular: normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(/exadmin/assets/fa-regular-400.6a274e76.woff2) format("woff2"),url(/exadmin/assets/fa-regular-400.4e96a7e0.ttf) format("truetype")}.far,.fa-regular{font-family:"Font Awesome 6 Free";font-weight:400}:root,:host{--fa-font-solid: normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(/exadmin/assets/fa-solid-900.d76fb4e8.woff2) format("woff2"),url(/exadmin/assets/fa-solid-900.03f2986c.ttf) format("truetype")}.fas,.fa-solid{font-family:"Font Awesome 6 Free";font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(/exadmin/assets/fa-brands-400.404c746c.woff2) format("woff2"),url(/exadmin/assets/fa-brands-400.e523f49c.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(/exadmin/assets/fa-solid-900.d76fb4e8.woff2) format("woff2"),url(/exadmin/assets/fa-solid-900.03f2986c.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(/exadmin/assets/fa-regular-400.6a274e76.woff2) format("woff2"),url(/exadmin/assets/fa-regular-400.4e96a7e0.ttf) format("truetype")}@font-face{font-family:FontAwesome;font-display:block;src:url(/exadmin/assets/fa-brands-400.404c746c.woff2) format("woff2"),url(/exadmin/assets/fa-brands-400.e523f49c.ttf) format("truetype")}@font-face{font-family:FontAwesome;font-display:block;src:url(/exadmin/assets/fa-regular-400.6a274e76.woff2) format("woff2"),url(/exadmin/assets/fa-regular-400.4e96a7e0.ttf) format("truetype");unicode-range:U+F003,U+F006,U+F014,U+F016-F017,U+F01A-F01B,U+F01D,U+F022,U+F03E,U+F044,U+F046,U+F05C-F05D,U+F06E,U+F070,U+F087-F088,U+F08A,U+F094,U+F096-F097,U+F09D,U+F0A0,U+F0A2,U+F0A4-F0A7,U+F0C5,U+F0C7,U+F0E5-F0E6,U+F0EB,U+F0F6-F0F8,U+F10C,U+F114-F115,U+F118-F11A,U+F11C-F11D,U+F133,U+F147,U+F14E,U+F150-F152,U+F185-F186,U+F18E,U+F190-F192,U+F196,U+F1C1-F1C9,U+F1D9,U+F1DB,U+F1E3,U+F1EA,U+F1F7,U+F1F9,U+F20A,U+F247-F248,U+F24A,U+F24D,U+F255-F25B,U+F25D,U+F271-F274,U+F278,U+F27B,U+F28C,U+F28E,U+F29C,U+F2B5,U+F2B7,U+F2BA,U+F2BC,U+F2BE,U+F2C0-F2C1,U+F2C3,U+F2D0,U+F2D2,U+F2D4,U+F2DC}@font-face{font-family:FontAwesome;font-display:block;src:url(/exadmin/assets/fa-v4compatibility.0db31bef.woff2) format("woff2"),url(/exadmin/assets/fa-v4compatibility.86a687cf.ttf) format("truetype");unicode-range:U+F041,U+F047,U+F065-F066,U+F07D-F07E,U+F080,U+F08B,U+F08E,U+F090,U+F09A,U+F0AC,U+F0AE,U+F0B2,U+F0D0,U+F0D6,U+F0E4,U+F0EC,U+F10A-F10B,U+F123,U+F13E,U+F148-F149,U+F14C,U+F156,U+F15E,U+F160-F161,U+F163,U+F175-F178,U+F195,U+F1F8,U+F219,U+F250,U+F252,U+F27A} diff --git a/public/exadmin/assets/@kangc.1dc16e06.css b/public/exadmin/assets/@kangc.1dc16e06.css new file mode 100644 index 0000000..89b14d1 --- /dev/null +++ b/public/exadmin/assets/@kangc.1dc16e06.css @@ -0,0 +1 @@ +.v-md-textarea-editor{position:relative}.v-md-textarea-editor pre{margin:0;white-space:pre-wrap;visibility:hidden}.v-md-textarea-editor pre,.v-md-textarea-editor textarea{box-sizing:border-box;padding:20px 20px 30px;overflow:hidden;color:#2c3e50;font-size:14px;font-family:menlo,Ubuntu Mono,consolas,Courier New,Microsoft Yahei,Hiragino Sans GB,WenQuanYi Micro Hei,sans-serif;line-height:1.5;word-break:break-all}.v-md-textarea-editor textarea{position:absolute;top:0;left:0;width:100%;height:100%;border:none;outline:none;resize:none}.v-md-textarea-editor textarea::-webkit-input-placeholder{color:#c0c4cc}.v-md-textarea-editor textarea::placeholder{color:#c0c4cc}.v-md-zoom-in-top-enter-active,.v-md-zoom-in-top-leave-active{-webkit-transform:scaleY(1);transform:scaleY(1);opacity:1;-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1)}.v-md-zoom-in-top-enter-from,.v-md-zoom-in-top-leave-active{-webkit-transform:scaleY(0);transform:scaleY(0);opacity:0}.v-md-fade-in-enter-active,.v-md-fade-in-leave-active{-webkit-transition:opacity .3s cubic-bezier(.55,0,.1,1);transition:opacity .3s cubic-bezier(.55,0,.1,1)}.v-md-fade-in-enter-from,.v-md-fade-in-leave-active{opacity:0}@font-face{font-family:v-md-iconfont;src:url(data:application/vnd.ms-fontobject;base64,lBkAAOAYAAABAAIAAAAAAAIABQMAAAAAAAABAJABAAAAAExQAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAaGPnLwAAAAAAAAAAAAAAAAAAAAAAABYAdgAtAG0AZAAtAGUAZABpAHQAbwByAAAADgBSAGUAZwB1AGwAYQByAAAAFgBWAGUAcgBzAGkAbwBuACAAMQAuADAAAAAWAHYALQBtAGQALQBlAGQAaQB0AG8AcgAAAAAAAAEAAAALAIAAAwAwR1NVQrD+s+0AAAE4AAAAQk9TLzI8fE0eAAABfAAAAFZjbWFwEzte5gAAAkwAAAOQZ2x5ZhKJB5wAAAYcAAAO+GhlYWQY8MqxAAAA4AAAADZoaGVhB94EEAAAALwAAAAkaG10eHhxAAAAAAHUAAAAeGxvY2E5dDYWAAAF3AAAAD5tYXhwATIAawAAARgAAAAgbmFtZYA2YG8AABUUAAACkXBvc3Sv0n/QAAAXqAAAATgAAQAAA4D/gABcBHEAAAAABAAAAQAAAAAAAAAAAAAAAAAAAB4AAQAAAAEAAC/nY2hfDzz1AAsEAAAAAADa6MNaAAAAANrow1oAAP+CBAADfgAAAAgAAgAAAAAAAAABAAAAHgBfAAoAAAAAAAIAAAAKAAoAAAD/AAAAAAAAAAEAAAAKAB4ALAABREZMVAAIAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAAAAQQEAZAABQAIAokCzAAAAI8CiQLMAAAB6wAyAQgAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA5gbrKAOA/4AAXAOAAIAAAAABAAAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABHEAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAABQAAAAMAAAAsAAAABAAAAiQAAQAAAAABHgADAAEAAAAsAAMACgAAAiQABADyAAAAKgAgAAQACuYG5gzmDuYR5hjmJOZB5nDme+az5uzm8eb+5wLnB+cR50Dnwejx6yj//wAA5gbmDOYO5hDmFOYj5kHmcOZ75rPm7Obw5v7nAucH5w/nQOfB6PHrKP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACoAKgAqACoALAA0ADYANgA2ADYANgA2ADgAOAA4ADgAPAA8ADwAPAAAAB0AHAAbABoAGQACAAMABAAFAAEAFwAMABgABwAIABQACgATABIADQAOAA8AFgAQABEACQAVAAsABgAAAQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAABbAAAAAAAAAAdAADmBgAA5gYAAAAdAADmDAAA5gwAAAAcAADmDgAA5g4AAAAbAADmEAAA5hAAAAAaAADmEQAA5hEAAAAZAADmFAAA5hQAAAACAADmFQAA5hUAAAADAADmFgAA5hYAAAAEAADmFwAA5hcAAAAFAADmGAAA5hgAAAABAADmIwAA5iMAAAAXAADmJAAA5iQAAAAMAADmQQAA5kEAAAAYAADmcAAA5nAAAAAHAADmewAA5nsAAAAIAADmswAA5rMAAAAUAADm7AAA5uwAAAAKAADm8AAA5vAAAAATAADm8QAA5vEAAAASAADm/gAA5v4AAAANAADnAgAA5wIAAAAOAADnBwAA5wcAAAAPAADnDwAA5w8AAAAWAADnEAAA5xAAAAAQAADnEQAA5xEAAAARAADnQAAA50AAAAAJAADnwQAA58EAAAAVAADo8QAA6PEAAAALAADrKAAA6ygAAAAGAAAAAABYAJoA3AE4AYIBwAH4Ak4CfgLIAvIDXAOUA8QD6AQUBFIEeASeBMoFCgWSBaAF+AYyBngGkgb2B3wAAAAEAAAAAAQAAtYACwAXACMALwAAARYAFwYAByYAJzYAFw4BBx4BFz4BNy4BBx4BFw4BBy4BJz4BFw4BBx4BFz4BNy4BAgDyAQwCAv708vL+9AICAQzyquIpKeKqquIpKeKqX38CAn9fX38CAn9fRFoCAlpERFoCAloC1Rb+zBYW/swWFgE0FhYBNCoLz0ZGzwsLz0ZGzzUCf19ffwICf19ffz4CWkREWgICWkREWgAAAAEAAP++A8IDUgAoAAABNTQ2MhYXFQ4BByMuATQ2OwEuAQcOARceARc+ATczDgEHLgEnPgIEAzEVHxYBARYPrhEVFRFtXPd0c2UfIsaDn9MFSwX+v7/+BQGP+gEDAsw6ERUVEa4PFQICFR8VYCk8QOWBf5kDBNSfv/4FBf6/iNxtKwAAAAEAAP++A8MDUgApAAATMzIWFAYHIy4BPQE0NjIWHQE2JBceARcOAQcuASczHgEXPgE3LgEnJgbrbREVFRGuERUVIRVlAQN9fZABBf6/v/4FSwTUn5/TBQGBbW7eAn0VHxYBARYPrhEVFRE6Wis0OdyIv/4FBf6/n9QEBNSfdrssKTIAAAMAAP++A8IDRgASAB4AOgAAJRcWFAYiLwEGJCcmEjc2JBcWEgU+ATcuAScOAQceARM1NDYyFh0BMzIWFAYrARUUBiImPQEjIiY0NjMDN4IJFBoKgor+r3x2BnyBAVCGgBT+RpzOBATOnJzNBATNexMdE2MPExMPYxMdE2QOExMOeIIKGhQJgnEUgIYBUIF8BnZ8/q/eBM6cnM0EBM2cnM4Bi2QOExMOZBMdE2MPExMPYxMdEwAAAAADAAD/vgPCA0YAEgAeACoAACUXFhQGIi8BBiQnJhI3NiQXFhIFPgE3LgEnDgEHHgETITIWFAYjISImNDYDN4IJFBoKgor+r3x2BnyBAVCGgBT+RpzOBATOnJzNBATNFwEKDxMTD/72DhMTeIIKGhQJgnEUgIYBUIF8BnZ8/q/eBM6cnM0EBM2cnM4BixMdExMdEwAABAAA/9cDqQMpAAMABwAXACQAABMRIRElITUhJyEyFhURFAYjISImNRE0NhMyFhcRDgEiJicRPgG2ApT9bAKU/WwvAvIUGxsU/Q4UGxvQFBsBARsoGgEBGwIN/ikB119eXhsU/Q4UGxsUAvIUG/62GxT+5RQaGhQBGxQbAAIAAP+CA20DfgAPAB8AAAE1Bxc1HgEXFAcXPgE1LgEDLgEnNjcnDgEVHgEXFTcnAgC2tnSaAyBCHB0Ezpp0mgMBH0IcHQTOmra2AvOLurmLA512RjxDLGM2ndL9ewOddkY8QyplNp3SBIu6uQAAAAAFAAD/mgPmA2YACwAXACAAKQAwAAAFJgAnNgA3FgAXBgADDgEHHgEXPgE3LgETIiY0NjIWFAYhIiY0NjIWFAYHHgEXPgE3AgDO/u4FBQESzs4BEgUF/u7OpNwEBNykpNwEBNweFhoaLBoa/mYWGhosGhoWAm5SUm4CZQUBEs7OARIFBf7uzs7+7gNkBNykpNwEBNykpNz+sRosGhosGhosGhosGmJSbgICblIAAwAA/8sDtQM1AA8AEwAZAAATITIWFREUBiMhLgEnETQ2FxEhEQEnNxcBF3wDCBQdHRT8+BUbAR1EAqj+fM5EigESRQM1HRT8+BQdARsVAwgUHWH9WAKo/erORIkBE0UABQAA/74DwwNlAAAADAAeACIAJwAANzMhMh0BFCMhIj0BNDcXFjMhMjcBNiYnASYGBwEGFgkBAwEHAQchJ08JA1AJCfywCQ+TDhEBZxgPARETBxn+oxo9Ff54EwgB0QFU0P6rMgFVAv60hhAJPwkJPwnScwoTAV0aPRUBEBQIGf4LGj8CGP72/vUBCkD+9QFpAAAAAAIAAP+4A8gDSAASABkAABMhMhYVERQGKwEHJyMiJjURNDYXETMXNzMRlALYJjU1Jra2trYmNTUm3JCQ3ANHNSb93iY1trY1JgIiJjVb/d6QkAIiAAQAAP/cA6QDJAATADEANQBFAAAlDgEHIS4BJxE+ATchMhYfAR4BFQMRNCYvAS4BIxUOAQchLgEnNSMRMzU+ATchHgEXFSM1IRUBNCYrASIGHQEUFjsBMjY1A6QBHRf9IRYdAQEdFgH8FzIRmRAVRgsFmgcYCQEdF/7FFh0BRkYBHRYBxxcdAUb+XAEYCghpBwoKB2kIChEXHQEBHRcC3xYdARUQmREyF/4WAeoJGQaaBgrjFx0BAR0X4/1E5BYdAQEdFuTS0gKrBwoKB68ICgoIAAAAAwAA/8ADwANAAAsAFwAbAAABBxc3JzcXBycHFzcBFwcnNxc3JwcBNycjARcBAm31ZUQibsttIkRm9f4fIm7LbSJEZvUBU/VlzAEPRP7xA0D1ZkQibctuIkRl9f7qIm3LbiJEZfX+rfVmAQ9E/vEAAAUAAAAAA8ADAAADAAcADQAOABcAABMRIREDIQEXNScBIxEhBSMeATI2NCYiBkADgGD+CAEf2dn+WUACwP3gMAEbKBsbKBsDAP0AAwD9YAEg2YjZ/lgCQKAUGxsoGxsAAAMAAAAAA94CtAAFAAsADwAAEwMTMwMTISMTAzMTATMTI9SysnaysgHidrKyd7H9m2qkagKz/s3+zQEzATP+zf7NATP+zQJmAAYAAAAAA8AC4AADAAcACwAPABMAFwAAASEVIREhFSERIRUhAzMVIxUzFSMVMxUjAQACwP1AAsD9QALA/UDAYGBgYGBgAbBgAZBg/gBgAsBg0GDQYAAAAAAGAAAAAAPAAvAAAwAHAAsAEQAeACgAAAEhFSERIRUhESEVIQMzNSMVMwMVMxUjFTMVIxUzNSMTNSMVMwcVMzUjAQACwP1AAsD9QALA/UCQIEAgMEAoKEBgICBgMzNgQAGwYAGQYP4AYAJQgCD9wCAPIBEggAEQICAzLSAAAQAAAAADgwMkABQAAAEhNRcHNSEOAQceARczFSMuASc+AQGIASzOzv7UWXcCAndZeHh/qgMDqgKseKWleAJ3WVl3AloDqn9/qgAAAAEAAAAAA6QDJAAUAAABITUHFzUhHgEXDgEHIxUzPgE3LgECeP7Uzs4BLFl3AgJ3WXh4f6oDA6oCrHilpXgCd1lZdwJaA6p/f6oAAAACAAAAAANxAtUACwAXAAABPgE3JwYHBh0BIREhPgE3JwYHBh0BIREBHAVJTj6BPC0BEgEyBEpOPoE8LQERAVR7gSFjOnFVvuoBKHuBIWM6cVW+6gEoAAAAAwAAAAADigL1AAkAFAAnAAABMjc2NCcmKwEVEzI3NjU0JyYrAREDITIXFhUUBwYHFhcWFRQHBiMhAms/Ijc6IUCx1VsnGEclP8RgATmANiAnFSY4HDEsQpD+zAG6ERySGQ/n/qc2IjBSHRD++QKUTi49Ri4YExYcMFZIOlgAAAADAAD//gPCAwIADwAyAF4AAAEyFh0BFAYjISImPQE0NjM3JicmNTQ2MzIXFhcWFxYVFA8BLwEmJyYjIgYVFBYXFhcWFwczFhUUBwYHBgcGBwYjIi8BJicmPQE0JyY/ATU3HwEWFx4CMzI+ATU0JyYDsgcJCQf8nAcJCQfjDgwYhoMZOiI3BQYHAwYqBxkbLD05REJrIzQdE3fPAxQMGBMkKCUoPjkpRh0HBAEBAQEzDwwDAxEtPCUgTC8pEQGACQcgBwkJByAHCSASFjItW4AKBhITKD4eCQ4BAwFLHC06LCVDIAoXDgyAFBs3MxwYEhcYCQsMFAgGBAcHNhgPExMWASQcCgQcJRUaPSIqJQ4AAAEAAAAAAtcB0wACAAABIRcC1/5S1wHT0QAAAAACAAAAAANkAuQAFwA7AAABIy4BNDY7ATIWHQEUBiImJzUBBiImNDcFPgEyFh0BDgEHIS4BJxE+ATczMhYUBgcjIgYVERQWMyEyNjUC9nUNExMNww0TExsSAf7yChoTCQE8ARIbEwE3Kf36KTcBATcpww4SEg7DDhISDgIGDhICowESGxMTDcMNExMNdf7xCRMaClYOEhIOwik3AQE3KQIGKTcBExsSARIO/foOEhIOAAIAAP/0A3IDDAADACQAADchFSERIRUPAREUFjMyNjURLwE1MxUPAREUBiMiJicuATURLwGPAtv9JQE7RQ9UX1dPEUX4Qw+ImVB4IxoWD0UxPQMYMQQO/qljVFpmAUoRBTExBRH+rIl6KiYfT0oBUw4EAAAAAQAA/9oC2AMmACsAAAE2JicmNTQ/AR4BMzI2NxYVFAcOAQcDBhYXFhUUByYnJiMiBgcmNTQ3PgE3AggFGikTAgMlSyAbTCIDEikhBX4FHCsRAycnIyQbSyIEESgkBQLHGhgFBBEEBAsEBAQEDQYTAQQaGv1yGhcGBA8IDQQBAwQEDQgPAwYYGgAAAAABAAAAAAOMAcIADAAAARQGIyEiJjQ2MyEyFgOMGhP9QhMaGhMCvhMaAZUTGRknGRkAAAAACgAA/+wDwgMBABAAFAAYABwAIAApAC4ANwA7AD8AAAEhMhYVERQGJyEiJjURNDYzEyMVMwU1IxUlMzUjJRUzNQUWNzI2NTYnIwUzNSMVJzUjBhcUFjMWNzM1IwU1IxUCAgGEIRsbIPzwHhsbHuHg4AEX3gEW4OD90t8BT21pAwgBAeH+6eDgOOEBAgoEZ6Pf3wH33wMBHCD9ZSEdARsfAqIdG/2/mAGYmAGYy5aWmAEBBwRHRZWVlsqYRkIECwEDlZaWlgAAAAAEAAD/8wONAw0AEwAnADsATwAAATc2Ji8BJgYfAR4BPwEXFj8BNicXFj8BFxY2PwE2Jg8BDgEfAQcGFwEuAQ8BJyYPAQYfAQcGFh8BFjYnASYPAScmBg8BBhY/AT4BLwE3NicBBjIEBAa0BAYBFQEJBTGXBgYwBQX2BgaXMQUJARUBBgS0BgQEMpcFBQETAQkFMZcGBjAFBZcyBAQGtAQGAf3iBgaXMQUJARUBBgS0BgQEMpcFBQK2MQUJARUBBgS0BgQEMpcFBTAGBjwFBZcyBAQGtAQGARUBCQUxlwYG/p8GBAQylwUFMAYGlzEFCQEVAQYEAR8FBZcyBAQGtAQGARUBCQUxlwYGAAAAAAASAN4AAQAAAAAAAAAVAAAAAQAAAAAAAQALABUAAQAAAAAAAgAHACAAAQAAAAAAAwALACcAAQAAAAAABAALADIAAQAAAAAABQALAD0AAQAAAAAABgALAEgAAQAAAAAACgArAFMAAQAAAAAACwATAH4AAwABBAkAAAAqAJEAAwABBAkAAQAWALsAAwABBAkAAgAOANEAAwABBAkAAwAWAN8AAwABBAkABAAWAPUAAwABBAkABQAWAQsAAwABBAkABgAWASEAAwABBAkACgBWATcAAwABBAkACwAmAY0KQ3JlYXRlZCBieSBpY29uZm9udAp2LW1kLWVkaXRvclJlZ3VsYXJ2LW1kLWVkaXRvcnYtbWQtZWRpdG9yVmVyc2lvbiAxLjB2LW1kLWVkaXRvckdlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAAoAQwByAGUAYQB0AGUAZAAgAGIAeQAgAGkAYwBvAG4AZgBvAG4AdAAKAHYALQBtAGQALQBlAGQAaQB0AG8AcgBSAGUAZwB1AGwAYQByAHYALQBtAGQALQBlAGQAaQB0AG8AcgB2AC0AbQBkAC0AZQBkAGkAdABvAHIAVgBlAHIAcwBpAG8AbgAgADEALgAwAHYALQBtAGQALQBlAGQAaQB0AG8AcgBHAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAHMAdgBnADIAdAB0AGYAIABmAHIAbwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfAAdwcmV2aWV3DXJlZnJlc2gtcmlnaHQMcmVmcmVzaC1sZWZ0B3pvb20taW4Iem9vbS1vdXQDdG9jBHN5bmMFZW1vamkIY2hlY2tib3gFY2xlYXIDdGlwBHNhdmUEbGluawNpbWcEY29kZQJ1bAJvbARyZWRvBHVuZG8FcXVvdGUEYm9sZA1zdHJpa2V0aHJvdWdoCmFycm93LWRvd24Lb3Blbi1pbi1uZXcKdW5kZXItbGluZQZpdGFsaWMKaG9yaXpvbnRhbAV0YWJsZQpmdWxsc2NyZWVuAAA=);src:url(data:application/vnd.ms-fontobject;base64,lBkAAOAYAAABAAIAAAAAAAIABQMAAAAAAAABAJABAAAAAExQAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAaGPnLwAAAAAAAAAAAAAAAAAAAAAAABYAdgAtAG0AZAAtAGUAZABpAHQAbwByAAAADgBSAGUAZwB1AGwAYQByAAAAFgBWAGUAcgBzAGkAbwBuACAAMQAuADAAAAAWAHYALQBtAGQALQBlAGQAaQB0AG8AcgAAAAAAAAEAAAALAIAAAwAwR1NVQrD+s+0AAAE4AAAAQk9TLzI8fE0eAAABfAAAAFZjbWFwEzte5gAAAkwAAAOQZ2x5ZhKJB5wAAAYcAAAO+GhlYWQY8MqxAAAA4AAAADZoaGVhB94EEAAAALwAAAAkaG10eHhxAAAAAAHUAAAAeGxvY2E5dDYWAAAF3AAAAD5tYXhwATIAawAAARgAAAAgbmFtZYA2YG8AABUUAAACkXBvc3Sv0n/QAAAXqAAAATgAAQAAA4D/gABcBHEAAAAABAAAAQAAAAAAAAAAAAAAAAAAAB4AAQAAAAEAAC/nY2hfDzz1AAsEAAAAAADa6MNaAAAAANrow1oAAP+CBAADfgAAAAgAAgAAAAAAAAABAAAAHgBfAAoAAAAAAAIAAAAKAAoAAAD/AAAAAAAAAAEAAAAKAB4ALAABREZMVAAIAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAAAAQQEAZAABQAIAokCzAAAAI8CiQLMAAAB6wAyAQgAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA5gbrKAOA/4AAXAOAAIAAAAABAAAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABHEAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAABQAAAAMAAAAsAAAABAAAAiQAAQAAAAABHgADAAEAAAAsAAMACgAAAiQABADyAAAAKgAgAAQACuYG5gzmDuYR5hjmJOZB5nDme+az5uzm8eb+5wLnB+cR50Dnwejx6yj//wAA5gbmDOYO5hDmFOYj5kHmcOZ75rPm7Obw5v7nAucH5w/nQOfB6PHrKP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACoAKgAqACoALAA0ADYANgA2ADYANgA2ADgAOAA4ADgAPAA8ADwAPAAAAB0AHAAbABoAGQACAAMABAAFAAEAFwAMABgABwAIABQACgATABIADQAOAA8AFgAQABEACQAVAAsABgAAAQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAABbAAAAAAAAAAdAADmBgAA5gYAAAAdAADmDAAA5gwAAAAcAADmDgAA5g4AAAAbAADmEAAA5hAAAAAaAADmEQAA5hEAAAAZAADmFAAA5hQAAAACAADmFQAA5hUAAAADAADmFgAA5hYAAAAEAADmFwAA5hcAAAAFAADmGAAA5hgAAAABAADmIwAA5iMAAAAXAADmJAAA5iQAAAAMAADmQQAA5kEAAAAYAADmcAAA5nAAAAAHAADmewAA5nsAAAAIAADmswAA5rMAAAAUAADm7AAA5uwAAAAKAADm8AAA5vAAAAATAADm8QAA5vEAAAASAADm/gAA5v4AAAANAADnAgAA5wIAAAAOAADnBwAA5wcAAAAPAADnDwAA5w8AAAAWAADnEAAA5xAAAAAQAADnEQAA5xEAAAARAADnQAAA50AAAAAJAADnwQAA58EAAAAVAADo8QAA6PEAAAALAADrKAAA6ygAAAAGAAAAAABYAJoA3AE4AYIBwAH4Ak4CfgLIAvIDXAOUA8QD6AQUBFIEeASeBMoFCgWSBaAF+AYyBngGkgb2B3wAAAAEAAAAAAQAAtYACwAXACMALwAAARYAFwYAByYAJzYAFw4BBx4BFz4BNy4BBx4BFw4BBy4BJz4BFw4BBx4BFz4BNy4BAgDyAQwCAv708vL+9AICAQzyquIpKeKqquIpKeKqX38CAn9fX38CAn9fRFoCAlpERFoCAloC1Rb+zBYW/swWFgE0FhYBNCoLz0ZGzwsLz0ZGzzUCf19ffwICf19ffz4CWkREWgICWkREWgAAAAEAAP++A8IDUgAoAAABNTQ2MhYXFQ4BByMuATQ2OwEuAQcOARceARc+ATczDgEHLgEnPgIEAzEVHxYBARYPrhEVFRFtXPd0c2UfIsaDn9MFSwX+v7/+BQGP+gEDAsw6ERUVEa4PFQICFR8VYCk8QOWBf5kDBNSfv/4FBf6/iNxtKwAAAAEAAP++A8MDUgApAAATMzIWFAYHIy4BPQE0NjIWHQE2JBceARcOAQcuASczHgEXPgE3LgEnJgbrbREVFRGuERUVIRVlAQN9fZABBf6/v/4FSwTUn5/TBQGBbW7eAn0VHxYBARYPrhEVFRE6Wis0OdyIv/4FBf6/n9QEBNSfdrssKTIAAAMAAP++A8IDRgASAB4AOgAAJRcWFAYiLwEGJCcmEjc2JBcWEgU+ATcuAScOAQceARM1NDYyFh0BMzIWFAYrARUUBiImPQEjIiY0NjMDN4IJFBoKgor+r3x2BnyBAVCGgBT+RpzOBATOnJzNBATNexMdE2MPExMPYxMdE2QOExMOeIIKGhQJgnEUgIYBUIF8BnZ8/q/eBM6cnM0EBM2cnM4Bi2QOExMOZBMdE2MPExMPYxMdEwAAAAADAAD/vgPCA0YAEgAeACoAACUXFhQGIi8BBiQnJhI3NiQXFhIFPgE3LgEnDgEHHgETITIWFAYjISImNDYDN4IJFBoKgor+r3x2BnyBAVCGgBT+RpzOBATOnJzNBATNFwEKDxMTD/72DhMTeIIKGhQJgnEUgIYBUIF8BnZ8/q/eBM6cnM0EBM2cnM4BixMdExMdEwAABAAA/9cDqQMpAAMABwAXACQAABMRIRElITUhJyEyFhURFAYjISImNRE0NhMyFhcRDgEiJicRPgG2ApT9bAKU/WwvAvIUGxsU/Q4UGxvQFBsBARsoGgEBGwIN/ikB119eXhsU/Q4UGxsUAvIUG/62GxT+5RQaGhQBGxQbAAIAAP+CA20DfgAPAB8AAAE1Bxc1HgEXFAcXPgE1LgEDLgEnNjcnDgEVHgEXFTcnAgC2tnSaAyBCHB0Ezpp0mgMBH0IcHQTOmra2AvOLurmLA512RjxDLGM2ndL9ewOddkY8QyplNp3SBIu6uQAAAAAFAAD/mgPmA2YACwAXACAAKQAwAAAFJgAnNgA3FgAXBgADDgEHHgEXPgE3LgETIiY0NjIWFAYhIiY0NjIWFAYHHgEXPgE3AgDO/u4FBQESzs4BEgUF/u7OpNwEBNykpNwEBNweFhoaLBoa/mYWGhosGhoWAm5SUm4CZQUBEs7OARIFBf7uzs7+7gNkBNykpNwEBNykpNz+sRosGhosGhosGhosGmJSbgICblIAAwAA/8sDtQM1AA8AEwAZAAATITIWFREUBiMhLgEnETQ2FxEhEQEnNxcBF3wDCBQdHRT8+BUbAR1EAqj+fM5EigESRQM1HRT8+BQdARsVAwgUHWH9WAKo/erORIkBE0UABQAA/74DwwNlAAAADAAeACIAJwAANzMhMh0BFCMhIj0BNDcXFjMhMjcBNiYnASYGBwEGFgkBAwEHAQchJ08JA1AJCfywCQ+TDhEBZxgPARETBxn+oxo9Ff54EwgB0QFU0P6rMgFVAv60hhAJPwkJPwnScwoTAV0aPRUBEBQIGf4LGj8CGP72/vUBCkD+9QFpAAAAAAIAAP+4A8gDSAASABkAABMhMhYVERQGKwEHJyMiJjURNDYXETMXNzMRlALYJjU1Jra2trYmNTUm3JCQ3ANHNSb93iY1trY1JgIiJjVb/d6QkAIiAAQAAP/cA6QDJAATADEANQBFAAAlDgEHIS4BJxE+ATchMhYfAR4BFQMRNCYvAS4BIxUOAQchLgEnNSMRMzU+ATchHgEXFSM1IRUBNCYrASIGHQEUFjsBMjY1A6QBHRf9IRYdAQEdFgH8FzIRmRAVRgsFmgcYCQEdF/7FFh0BRkYBHRYBxxcdAUb+XAEYCghpBwoKB2kIChEXHQEBHRcC3xYdARUQmREyF/4WAeoJGQaaBgrjFx0BAR0X4/1E5BYdAQEdFuTS0gKrBwoKB68ICgoIAAAAAwAA/8ADwANAAAsAFwAbAAABBxc3JzcXBycHFzcBFwcnNxc3JwcBNycjARcBAm31ZUQibsttIkRm9f4fIm7LbSJEZvUBU/VlzAEPRP7xA0D1ZkQibctuIkRl9f7qIm3LbiJEZfX+rfVmAQ9E/vEAAAUAAAAAA8ADAAADAAcADQAOABcAABMRIREDIQEXNScBIxEhBSMeATI2NCYiBkADgGD+CAEf2dn+WUACwP3gMAEbKBsbKBsDAP0AAwD9YAEg2YjZ/lgCQKAUGxsoGxsAAAMAAAAAA94CtAAFAAsADwAAEwMTMwMTISMTAzMTATMTI9SysnaysgHidrKyd7H9m2qkagKz/s3+zQEzATP+zf7NATP+zQJmAAYAAAAAA8AC4AADAAcACwAPABMAFwAAASEVIREhFSERIRUhAzMVIxUzFSMVMxUjAQACwP1AAsD9QALA/UDAYGBgYGBgAbBgAZBg/gBgAsBg0GDQYAAAAAAGAAAAAAPAAvAAAwAHAAsAEQAeACgAAAEhFSERIRUhESEVIQMzNSMVMwMVMxUjFTMVIxUzNSMTNSMVMwcVMzUjAQACwP1AAsD9QALA/UCQIEAgMEAoKEBgICBgMzNgQAGwYAGQYP4AYAJQgCD9wCAPIBEggAEQICAzLSAAAQAAAAADgwMkABQAAAEhNRcHNSEOAQceARczFSMuASc+AQGIASzOzv7UWXcCAndZeHh/qgMDqgKseKWleAJ3WVl3AloDqn9/qgAAAAEAAAAAA6QDJAAUAAABITUHFzUhHgEXDgEHIxUzPgE3LgECeP7Uzs4BLFl3AgJ3WXh4f6oDA6oCrHilpXgCd1lZdwJaA6p/f6oAAAACAAAAAANxAtUACwAXAAABPgE3JwYHBh0BIREhPgE3JwYHBh0BIREBHAVJTj6BPC0BEgEyBEpOPoE8LQERAVR7gSFjOnFVvuoBKHuBIWM6cVW+6gEoAAAAAwAAAAADigL1AAkAFAAnAAABMjc2NCcmKwEVEzI3NjU0JyYrAREDITIXFhUUBwYHFhcWFRQHBiMhAms/Ijc6IUCx1VsnGEclP8RgATmANiAnFSY4HDEsQpD+zAG6ERySGQ/n/qc2IjBSHRD++QKUTi49Ri4YExYcMFZIOlgAAAADAAD//gPCAwIADwAyAF4AAAEyFh0BFAYjISImPQE0NjM3JicmNTQ2MzIXFhcWFxYVFA8BLwEmJyYjIgYVFBYXFhcWFwczFhUUBwYHBgcGBwYjIi8BJicmPQE0JyY/ATU3HwEWFx4CMzI+ATU0JyYDsgcJCQf8nAcJCQfjDgwYhoMZOiI3BQYHAwYqBxkbLD05REJrIzQdE3fPAxQMGBMkKCUoPjkpRh0HBAEBAQEzDwwDAxEtPCUgTC8pEQGACQcgBwkJByAHCSASFjItW4AKBhITKD4eCQ4BAwFLHC06LCVDIAoXDgyAFBs3MxwYEhcYCQsMFAgGBAcHNhgPExMWASQcCgQcJRUaPSIqJQ4AAAEAAAAAAtcB0wACAAABIRcC1/5S1wHT0QAAAAACAAAAAANkAuQAFwA7AAABIy4BNDY7ATIWHQEUBiImJzUBBiImNDcFPgEyFh0BDgEHIS4BJxE+ATczMhYUBgcjIgYVERQWMyEyNjUC9nUNExMNww0TExsSAf7yChoTCQE8ARIbEwE3Kf36KTcBATcpww4SEg7DDhISDgIGDhICowESGxMTDcMNExMNdf7xCRMaClYOEhIOwik3AQE3KQIGKTcBExsSARIO/foOEhIOAAIAAP/0A3IDDAADACQAADchFSERIRUPAREUFjMyNjURLwE1MxUPAREUBiMiJicuATURLwGPAtv9JQE7RQ9UX1dPEUX4Qw+ImVB4IxoWD0UxPQMYMQQO/qljVFpmAUoRBTExBRH+rIl6KiYfT0oBUw4EAAAAAQAA/9oC2AMmACsAAAE2JicmNTQ/AR4BMzI2NxYVFAcOAQcDBhYXFhUUByYnJiMiBgcmNTQ3PgE3AggFGikTAgMlSyAbTCIDEikhBX4FHCsRAycnIyQbSyIEESgkBQLHGhgFBBEEBAsEBAQEDQYTAQQaGv1yGhcGBA8IDQQBAwQEDQgPAwYYGgAAAAABAAAAAAOMAcIADAAAARQGIyEiJjQ2MyEyFgOMGhP9QhMaGhMCvhMaAZUTGRknGRkAAAAACgAA/+wDwgMBABAAFAAYABwAIAApAC4ANwA7AD8AAAEhMhYVERQGJyEiJjURNDYzEyMVMwU1IxUlMzUjJRUzNQUWNzI2NTYnIwUzNSMVJzUjBhcUFjMWNzM1IwU1IxUCAgGEIRsbIPzwHhsbHuHg4AEX3gEW4OD90t8BT21pAwgBAeH+6eDgOOEBAgoEZ6Pf3wH33wMBHCD9ZSEdARsfAqIdG/2/mAGYmAGYy5aWmAEBBwRHRZWVlsqYRkIECwEDlZaWlgAAAAAEAAD/8wONAw0AEwAnADsATwAAATc2Ji8BJgYfAR4BPwEXFj8BNicXFj8BFxY2PwE2Jg8BDgEfAQcGFwEuAQ8BJyYPAQYfAQcGFh8BFjYnASYPAScmBg8BBhY/AT4BLwE3NicBBjIEBAa0BAYBFQEJBTGXBgYwBQX2BgaXMQUJARUBBgS0BgQEMpcFBQETAQkFMZcGBjAFBZcyBAQGtAQGAf3iBgaXMQUJARUBBgS0BgQEMpcFBQK2MQUJARUBBgS0BgQEMpcFBTAGBjwFBZcyBAQGtAQGARUBCQUxlwYG/p8GBAQylwUFMAYGlzEFCQEVAQYEAR8FBZcyBAQGtAQGARUBCQUxlwYGAAAAAAASAN4AAQAAAAAAAAAVAAAAAQAAAAAAAQALABUAAQAAAAAAAgAHACAAAQAAAAAAAwALACcAAQAAAAAABAALADIAAQAAAAAABQALAD0AAQAAAAAABgALAEgAAQAAAAAACgArAFMAAQAAAAAACwATAH4AAwABBAkAAAAqAJEAAwABBAkAAQAWALsAAwABBAkAAgAOANEAAwABBAkAAwAWAN8AAwABBAkABAAWAPUAAwABBAkABQAWAQsAAwABBAkABgAWASEAAwABBAkACgBWATcAAwABBAkACwAmAY0KQ3JlYXRlZCBieSBpY29uZm9udAp2LW1kLWVkaXRvclJlZ3VsYXJ2LW1kLWVkaXRvcnYtbWQtZWRpdG9yVmVyc2lvbiAxLjB2LW1kLWVkaXRvckdlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAAoAQwByAGUAYQB0AGUAZAAgAGIAeQAgAGkAYwBvAG4AZgBvAG4AdAAKAHYALQBtAGQALQBlAGQAaQB0AG8AcgBSAGUAZwB1AGwAYQByAHYALQBtAGQALQBlAGQAaQB0AG8AcgB2AC0AbQBkAC0AZQBkAGkAdABvAHIAVgBlAHIAcwBpAG8AbgAgADEALgAwAHYALQBtAGQALQBlAGQAaQB0AG8AcgBHAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAHMAdgBnADIAdAB0AGYAIABmAHIAbwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfAAdwcmV2aWV3DXJlZnJlc2gtcmlnaHQMcmVmcmVzaC1sZWZ0B3pvb20taW4Iem9vbS1vdXQDdG9jBHN5bmMFZW1vamkIY2hlY2tib3gFY2xlYXIDdGlwBHNhdmUEbGluawNpbWcEY29kZQJ1bAJvbARyZWRvBHVuZG8FcXVvdGUEYm9sZA1zdHJpa2V0aHJvdWdoCmFycm93LWRvd24Lb3Blbi1pbi1uZXcKdW5kZXItbGluZQZpdGFsaWMKaG9yaXpvbnRhbAV0YWJsZQpmdWxsc2NyZWVuAAA=#iefix) format("embedded-opentype"),url(data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAz0AAsAAAAAGOAAAAymAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCHEAqdeJhSATYCJAN4Cz4ABCAFhREHgjgbNBUzo7aSkzJK9n86bg6FCWj1E8kVT3lBwQMmwaDKE4FVS4ZsHYjIATUvymoyi92tazaqecZRrcjTMH1l45+wK37agyfa7/dndudef6KSMI9Ei5qaRZK0TEmEAg1P8vP/v7zqV/O9X8GiBzyNTwvwplRlBFSuyXW0cmMFpJPFaR0ABMDNrkkBR3kig8JAxq/pD4AvvNYQbfP4o+ppG7DQ2YE+GInZuMaMjWWTq0xYZZHm5+tt/n8+MAcWgX1fp6XVYfd6BVLGvD3Zr+1gf4PjIk4WaQyAbWJUjrksgIA/1z7tZm5SAD4osVAVrkKekUk+Jnm703ecIy4R+QoJKA8QZREkoEQpapwvRAynvac6RSN1SohMRBqGgFDTnFRN2/EprYRtNst5z98Ip4nhwnfcSIWxyj1+fnhrzsBd+fnlyUJABsOJ0CUezOqJvQvx8bT/hdJg4R7OANOKwII5UJgimiY5tpbzUoexJ6d+mGpT4cUVS8oQcZOgSa9t3l7+/ofklbm8I7f/ssoLncbjSn/LpI6FThBTE3puyQpdo1v/nQcNdTVVFYalHKIkVubx5YVyshKSUorSMgIFEReSwtYxQDZqTQOvROdaAR2kDjBBagAbpAqgIBWAB2IAPogFBCAKCEEcQAQigCuKFLiBxEACijxoAvGAXhAf2AaSB96ChMBHkBzwCSQL/GceEnhD5iGJN9J0UnibhyLe2IoSUBSAHCQAjjAPBbx/mocIXzLX6zwOmqGCLXACPcEt0fZ3ubkSwj6TpZlJ6+IMVcZyDRFtkkK02UwJaaazJ9Nc7GjbQFdNJ9jpmB4EXlqJEmeVkPN4TWXv51tZgeuqqpubCAuFmB5GuXRvbkV9lcwTqGwUOIGqLEPUuSX+N2X2j+b8Sz3wn9m2Fo8z19Udp+LrDD/noFgtRogRsyIpMBkO4emoEaM0L962WcqhzXd2f1ZQKyLCWQ00YT2A+4T16NChyuaOPcKmRNhM5PYv7vzQMyK+VcZdl2mXtHUNZRAhj5+HoXnBR9VOy/lKysulwqN621WicLUn6ZtLZZ7iN2JFtwQ9s8PtnOo9EGshGiNnu4oF7IJLHKd0tnIxP2vDnh8GnVc5/7j7X4//Zfaf4XtEFQ0uLseRKs9+HJl7SSQwbc7paGowR+ZT/Y1cZw1MpzwIAIFzTEIMnU1R2UpriB0vqI8+zasNH2upK6zfVReS+IhqfQIVHxE1jubnq5vyhflo2438I7PhLKXPWvoPxHJl61U223cJCr3G/kQ+fRrhAJFWEfRRclCeesBah0SCFmMa0ZwEEFOUWjNkRGP6Op1p68ocatdqXF+rc63O5YANrLYiMDdYKlW9Q3gt+tVW3BexYkbUDFcUFtHiEhmLCmlJJ63AEhUUL8Q3vZwCwiFihESXwiGLiB21q96yRSZMI9K9yROu50/YgPRIgPx84Vmue1k2hPtzW7MB2SuvSu+xVr+5SbuOCEXW5gvE4OPWeMpli50DsSa84tXkHdcbbJRGrCkAMXmXy+lJy2eovj/1MjFcam29tnNfxjEQodCyRGd6H00bruNsT91OZWt0H4gFs3nhFTeXXEVzGT+d2K09qdNpaWR7RspUQuTeK2q5T4ix7nSPxAZw+jURZ0XgeZqSSGonJ3FJVTNP4fwOflyiXP+c6T/yZfmzufYhNMPgExGqWjGiq6AEZdBCHhHvr83EW8AJBS3ZI2w0nXVRh3gT+cCB6LLTxEhKupauzfIpEFlXbyaXzkaWngIRur7s+vXec8k0MXJv3EkbeZLz62KpESPy035Qzpxa0TIEWkUQaijBdqCkKq4/G1JcjpVbGwEnaLNnCMb1M9EkpcXA84yGJ9aGOn6BXi/M8ynCeKNgklyUozeyiNHAy9fp+Dkb8usNBp6q0MmYLKPS6Zsao6DlkMk16NK88TijUZC7k8Bmf+LTgvmOlb56w7c11EfnZUrDwoVrqKsNQypxI0bgKoUJ9weoDWIxXEkJDj+mOD5VIgjmWKJQhUs+2MjMf7QRV7dcgWrKqr7LWqNb4tVPnbWSESdMo5GF8PIV/MJ0/MF//w6KHz9h5AomTL/zazjiDV73aVpbylmBkrURVUg+Lkpdgnj3BfdFzLgDJuRvmQ4XXrmyEA5UO9Cu3Tt8gEZ2LxAEN3WNGjXJPtjeVLSoScXtHdk+jpDdq9X2ZhPGtY/s5ar23JsHrVboh8+zWmKhxbLK3WLtmaxmSp2kTHUdSwaz6tx7jteQcYLJ1EEUdbwj2EG/obsxp1JnrutX8Zm3luf6XUjdCDrANTJz6OBaYPvctT07dk9pRczzkfakPwmJ+xxrw+B86yXz2N0YoHwzGbXHUa1h0x2ATW3Foyje+60Tjm+1A/2Jehm8cwfiX6Y4PrXaKUtg9jHO3GoHfg0uR6PJwcEC87sB0rFQMs/Cc0a+Fl/GYNWrdcPG8K1WDJs0EeUoFCCLRVFRKPGU0NvMS7NbbqGDRI/Z5V7Dx5az5pxKmfDVa8RFYR7lAjWf4pJPZWeMGwwoWPJND4WHVOHOHQI711a6l0rvzqCX7kpBlBwlWqofqCzEBwSL6q+QxzKZPiYIla9eU1Yrzeb6bsqTFIle+SRpf9LTdEmnqi2Ep0mXl18WriWZyUPcMNImsjWkpmTgcUX+9au6HsNQzfCzZ4drUAyrV+9c4mFhGpabm5FtYTIxTJUA4m0gQNWin84uN29OtPmtXCWXH3ZZFADXysw0cGXrliDV4fXjSamdm4PUQUOX1Q8Ftk1XH57pCIg5dKha2xc5xP4SZ2SLtXKx2D9eLGfJxDJ0lV2tFbuwQrI4WOrrd5CDCet8uqzLzSJdPsW4jg5cMRMmi3SVdo1A1qxB/CO4WtCZ/uUOefieFG2mOLZWGxnd5JN/8DVHFgR7UrcfHCoDQ/fEs4fNNjHlW15cLS6rbw7ITXLMjj9OqpoTqQ3N/BebpEnObd/HKkzZk1A0MwRES7SkiSSxs9Vlbo9dLu1o9i0bN3KM3RPpVU4s0jhTfFWzq0Vp6/bHRmKRPu4JiUNdvMKsAzpGXnB1CA/a1ykJ60zpiYucouSeqg8mkcJITAQRiJ/s83KlHd/uLk63eyv1HssA1y9vvH4RfFvad1jiIGUcY0hrHDj0dgbTZC+1nxRdwEAdJMyj5IFaonYgmSgbHGNyHNCLIQFlEuU9AtMD7sTeEUUHKuC7orq8vKqirJKBaUCBD/x5SMQ/zJ80odus6vRyX8jPSst7p4CAdDLVONYVxXO9sTQodkiHXB8ilz2Gkto/LXXnCsgi+9RVS90c0iA3hsxC2sNTQcQRPdfEPTjSnrQaiF1xYyXrxPMk6z+ynde6LHVa6/xQ/tD0UABM9018UPeu71nDA0OWcTgYDGAHHiQBxSOB7qH+oSH8jOkRUOIS8HPxA8FS5IH+wXd9s5YAwg52SIRqGy+gAPK2EcZgOIMhP9+mVH6LLn62wYDDxhB422BBwDaeKiKEbTAolZzqDIav45U4OTdeA0babH+/QueDXAfAdtBRmFvSY8sfhUmBN+Aa6BU4mgaOCJzrORy49hzcAUO7kPrA3U7DlMC7cDl0W3EYmpVyAACQABB/H9m+GYk8JOCjGpPLoctHNiPXNp6MfLP9vw4KkYnIDdwVo0aeEvhVC6Svvo3chB4Mn4o7St5KHGu/mAYZ/yYUBFxe0NhVrJhvC9qfDtfcfnmstEy1jY6M3a44fJeSjuCfgoi4+V7ynXp1RDM+/ofcWR7TrmsR3HQhNAa1mB3wz0FS1vN1tQvZIshowz2dbnja063IiChdIA7dJi7dnx6aOa48knPJkjgAph5G00XR43Qj6Wm6VfRClP6znMEBjbhUIr442eHUMLJVjz9ijEpgVP1UTlOy9qfK6lZEU8A4If5C04eKdw5cfugfODtK6lDuI+suSODhSsm35ihilWWK6txz4xACqY7pCi1lK9Kddjsba0WpKQ5WAGNUAqPUz7C005RsbrICHYVoRiLn7+KE+AtNHypOH0FE/mE4z8Tgt0c5KO3zyEWn3ENeR5lPVzZHYoxVTrKsjcr5WhsEJUl0F195hT6JK7UdVnYnO3MqK7q89XZ8OdmerIfRz1E+FIklUplcoVSpNVqd3mA0mS1Wm93hdLk9Xl8wb2LcHO5bhrX75rZg17Sy2cg/wMr8RRQLlxble0G9jIX0JD+TniLS1S10C+1rekx1QMVjcd0kVzdMgkt+7GIz0WQw6sOIwoRhaNInQ9P/ngSTmoLZZmHnIS1T37Srikcx98K4jdKaOqRLXVkk3FctDLgYrlTMnFTB6VVL7F6U1vxTV2YdsLJ9CFkzkAYDAA==) format("woff2"),url(data:font/woff;base64,d09GRgABAAAAAA/oAAsAAAAAGOAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFY8fE0eY21hcAAAAYAAAAE4AAADkBM7XuZnbHlmAAACuAAACjAAAA74EokHnGhlYWQAAAzoAAAALwAAADYY8MqxaGhlYQAADRgAAAAeAAAAJAfeBBBobXR4AAANOAAAABIAAAB4eHEAAGxvY2EAAA1MAAAAPgAAAD45dDYWbWF4cAAADYwAAAAdAAAAIAEyAGtuYW1lAAANrAAAAVcAAAKRgDZgb3Bvc3QAAA8EAAAA5AAAATiv0n/QeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2BkYWGcwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGByesb3WYG7438AQw9zA0AAUZgTJAQDiSwwaeJzdkktOAkEQhr8ZEBRHmFFePjAmsCCGpTEuXMB9XLDnWJyAy/xNAgvwAGA1NQuWrO3KN/2YSvpRH3AFVIyJUYV0RGIjkldbTU7rFRqn9Sq/Nn/nzUYN1ZSpqUJ9jTTTXAsttdVeh5CGeijCNKzW+834eIQyN1dbw7PcXZnbOs+9sCV2Do8JH3yexVcZ32XAgBeeeeKR1O5StRsn9MjoU+eatt3ugXvuaNKiS07BDR1uqdk2tYtP9H9bFj/JTzkbxHo6p3Hm2BujpmOvjXLH3h0VjlUAtR2rBeo40T91neigek50U30nuqihQ/w/cuLpNHOIuXPHaosWjlUZLR3i/lsneq2dYw6gvWM2oINjXhBSxwwh1B1zhVBi1hByh9gXDrGfOuYUYeWYXaz3jnnGZuxQ+wMrwIcfeJyFVw1sHMUVnjezt+s723fe29vd853Pvh/71k4c/9x5b4kT26dgG0oQiUKgEChxm9goUEfiL7FKwE6oohCosFry26BUJagQKD9parVUAgvaUjWJgRAa0lqJCdCqaYUg4EBRbumb3bMxCCl7t29m3ryZ992b9968IwLBRyD0b6SU6CRFmgkBjegikdLEyBHdD1I16J1gNTkdHDaB0Qlz+ZSchzJK7U/Pn7c/pRTKzh8829Bw9qBLVw9TOrzapd2rKF3V7VD6tmYf1ZwX2vg7r/T13t7XSx1qzq5YPdw5swIpQgVCvnyJvcJWkHocmG25jKarCCbVBG25RYAo/aC7yLJFsFRgrWqNBqAFnpVVVR68+bO77+qvSf75gf1veZZ67Jdftj3wyBfA6NF2Pv9sQKVUrVH7GhbnP9g8vIcJJ/ajCApumxycP4vhVcTQQIiSzWghkevvAI4mBrlafdZS2RkjGWnxP4PO7kgSaj+w++4bBVf5UlSAUGDz4PrT9L65UNtXzW9bOLnN1b7/hICCG/7Q2JAhhBXt0EuCpJq0E1KnI4xkM4i1RjpoIQYt6HE1O0elmC44B+18UFE23QGpZLotl2XWFm8o4tuy3X5u0wZx02ZYvnUkZPfumxCEiX37jgnCsXuVmLImoCiBNdhZ61cU/9AWXyTk3XJHaGQrLN+8SdywyX7u9Iz4vn0T8JAjtnbuQu5qX8c979K4ExxwKsGBXhqnDj6uzL6Aui+NECE5qDAGvjzJnmINiE7CKKjFU5UTcl3CTBioXpVdAKbcllPQ3WQ/JNOG3Alj9NHCD/nbTM+HotFQwY/0jVAUIFofQULL7QY4ufqWW4pTIS5mj0VD9gehSCQE0VCUUNS9hQ2y+0mA1HCPlnQTfSYkoduYTcDQDjkLTaEiU7UMSsbG7t7L4kuqYsLEXuxBjdsdG6OfPPTi7x9ij23oXXx545rcY8cL97qDef04EHCS29+D+vayf7IBJ97j6MEtyHRi3XLins2JbIVbnds/MdMpTlEyYX/o8UBwYgKC6JsfThyYFITJAw6t1iKRxkjEHnBbja5fsWI97Z8rjavZ2hl5pPYLXHLm+wMUx0WOrxxhv2Um2kYhlXgqs6eBZsHT0PGUwLB00DexklAsFrr4uRqFWDd90t400b0dgj3M5MxQDKIql/h+4Qb6ZOHcRPeDoPQ4tuBx3I92KUNvTBKDECubyMQghAeO8WzpGg4tyKUNSIsSiJoXGEggJYxlXrbc6734vDfwM78Mt4YDICtSpf14pEO1h5QSeBNWvmE/nYHrqH14a4W3y4vf43f5FPgeSkBFqKTSLo100bB9wZ4GXx7JOn4+3B9+x/7CrsT4mPOL54NkpFwX1OWsbmXlR+k7adNMj+HD28nR0Ul2hZkunE6bY2NmmqLwTYXTo6M06fj3JDvAatGKrcQkPRh1eMqOEfEwUUUNVIPK5LZ0M2bQlFqcNFNy1uQC3PdSZkKFtvR8SIpoHm0RZHImOwAxvZDAtAIxDS7qGXlPhdpb6tkrhb04Y/8JZ3p7+dxrOvbsmyHsK1kn+XzSuhKfrPNlOj2DQmrFHjmj2xqc81aKe0Xfe+7ce4Xu993N3z9+nD7NFz5X4vOVFPPIOBtnecePoxg5km6hK0gGtoCNhUMJLCMFOtDB6f7u5Pojg8nugWm7ZqYH1073H4VAt/0xy08PdCcHj6xPdvdP2+dme7+eHnDmnbhBpeOMODminPhRq5MlWAJ004CUnPCkqtEobemkmGcjfXYJ1Jw6Zd+Yp+OFqRbMCFH8MlLA9YU+iJ/adsq+geZ/EeLsqPN7kJymh1FTKfo7UZiSZUoipbCsAlkldeLQoQ2HDsFZJBtfKPz8tgO30d/Yx+xjkIWs29rH6AARXZx0ysFZ6kQOIoWEmpCLL8uqKbX4AkF4+Zl3vM954Pk+GO2zSR8d73sDP3zLmX0/Ku4rY7zUf3NfE/dk6uz2ZkrhHIn3vq5oNJ6Pt+Tr6/N98XhfNtuX/0rl8pF4YTweiMvxEaiIx7ML4vy+Rd0PoP+GuEZTl8yEm6VQjVOOwDZoxKRy4saNlG68cWho+CBjB+kzQ088MYRj5K5iB4eHD7p3N+51YHYvTLcJ97ZGpG45M2SfwETVeOm9qLPXHfRtxwcJ4HJDlDA80Bxz+lDl+c41nZsXL4AgZISr3K4MK+/dnFjTfsd1L52D+jldMuML2+k08SJKzEmQsXJtBsaeqmDPdLroeBldU0OSKGlum0rQ27uSVnsi/8LbNxnhK+q6/tgHC0dycUNNX1bV2rhk1D4KL8pVP60M/Mv+VS7ZsiJWYf+PPnpNU0dvU1jRqlquv7L9hmJs2XhHU/SeDLmF68codC9BXuRkrbSRxnoiiwB0R3kAmgF5qaSohhyWLmVdbM4nlXSmca2R7gLTqgFNr6bZDF5xyGGHJK9XuriP0/f8ZeGtD1S2Jy2PKDFxnlQZbexY2L3k9lRbTNn4OguVhZXa+rr6zoUNvTFJAHyygTLG5AWL6+JXNzfIMOKV4nwnJPGglllw04hPDCr1ndVeP6bupVUL2hvrLo/7dH/ZSChqZavCQT3sLS0LlYiCJOXCWD5oUFvlE6rq1EhHcl6dv+gz9CS8xU8cEjo9aa/A0Ztk1gfW0vfRAxbhbLEOdQ2GZYIJSNssLGk4a07WLZaNaDE5xC+ZnEkv3FOuKOWvIokGwT7viyheWAzBqAJWQ+GLBguwfdUfDPodQkV/kD7Op9015ffYH3uViO96PvmKK01FbPluQX/hC8537pdP2Z2sDE8Z6xzLjV28vBAEYpCbwcw6Qzy0tNEEnPMI/UehDhb1BFau/u4yuefzywPb9iwfSkW0QE9rBwu3Cn77qTUrVw3AVbKntdUj2888+KN56ZplV8G1fqFYL/+dvsPSBKtnfpei83ThjYMKLe4laBUmuk7sOpGEAhYvM0o8kQaFsrql8ejVSRZsSHju91TNl5lhpGqjS5OCXF/roa9Fwh5BFoRSAZ9yUQEhEincGdFFIVBSLgBDZkmAieEImY3/h+EVvPEJzFSWaH+NPRxRCkuUSEShLykR2KFUVhqVlVzch/j/i/EApALjMUyqnLqpiVh44l3cI9w72ijWiJis1awHM18d5r06TH4ezULT5oyUh2dIvFZFHa2tWTjiYviX6ceJaDR+8aPqaLT63akp0E+DNjVVOH4Glg2uYyUA79r/npq67F2gPuHWx8+cgc/OMKiKF/oTWNjU0F/GooWXd8Nu/B7ZuXM3gCRc0bNjx86/7u5dIpQC27Fz5073bx758hP2E1aOd4KB2JchdiuHd35a5AVAF+haF+QMTnUth910AD22BiRRx7IggP9hAiDyIdYLWg4rIs4SkYcLOjEDWMgTM4IgHhZEUMHrad0lii0ezwVR3NXq8SJLFA6LgpDZhaWj8tX8rpk1hbPfIknHvslpEcXFc1bNaLL3fzU/uwvUfIskIf8HMrY5C3icY2BkYGAAYv3n3ALx/DZfGbhZGEDg1ovDUQj6fxMLA3MdkMvBwAQSBQAlDQqwAHicY2BkYGBu+N/AEMNSyAAELAwMjAyoQA4AUi0C+AAAeJxjYWBgYKE2LiSsBgAs+wDqAAAAAAAAAFgAmgDcATgBggHAAfgCTgJ+AsgC8gNcA5QDxAPoBBQEUgR4BJ4EygUKBZIFoAX4BjIGeAaSBvYHfAAAeJxjYGRgYJBjiGfgYgABJiDmArP/g/kMABWhAZ4AAAB4nHWRzUrDQBSFT/qjmIALxa7HjYKS9GcjFFwVWtcVum+TSZqSZMJkWujGN3Dh8/gUvoA+hXuP6Qil2Ay5fOfMmZvLBMAFPuFg91zx3bEDj2rHDZxCWG7Sv7XcIg8st8mPlk/IT5Zd3OPZsodLvLCD0zqjusObZQcdvFtu4Bwflpv0vyy3yN+W2+g4nuUT8rVlFzPnwbKHG+fVHWk5NzISi61IQ1XEqjDuxs8jX0apUXoqk3U213vOHs6krlJViH7Q23MnspD6r2e1SQbGxCLWKhdjNpdZpkSp1UqGJlgaUw673dj6QahyjjiChsQchjXitS6wZU0RQqFAXFfD3AY+cib8OpfSUzw5pUqwRsYO+kjmf3dGpVFR/35BoI8AvSPZCVVR5w/nrHgi4U83XDF1zIxiB4GxnVxytowsUNZ7Kzoh/QDL+lSJIbpc8UE+qG8g/wEBCnU7AHicbY1JdoMwEEQpEIZgk3ke7BNwKBANKAg1aYRJfPrwkpdd/qbeX1RVEAa/ZMH/7BEigkKMDRKkOEOGLXbIcY4LXOIK17jBLe5wjwc84gnPeMEr3rDHIUhGoaOhJRdqhKauENN2fvdnlhqfnJiHwrj0J3n2kWetpi+nYxr43aS6I91X/BlrS6VE3oxqKo+krHF9ZIZWaa4pnG3IVgnVrGZXc/wxsydVsa3zyYvpyXfCc9tlpQgvRc2L2/JIbn0uHC3ZWiIp1k3aGF9ao7OOxZzYrRL7srKUNbO1kxYiFwTfFupPmA==) format("woff"),url(data:font/ttf;base64,AAEAAAALAIAAAwAwR1NVQrD+s+0AAAE4AAAAQk9TLzI8fE0eAAABfAAAAFZjbWFwEzte5gAAAkwAAAOQZ2x5ZhKJB5wAAAYcAAAO+GhlYWQY8MqxAAAA4AAAADZoaGVhB94EEAAAALwAAAAkaG10eHhxAAAAAAHUAAAAeGxvY2E5dDYWAAAF3AAAAD5tYXhwATIAawAAARgAAAAgbmFtZYA2YG8AABUUAAACkXBvc3Sv0n/QAAAXqAAAATgAAQAAA4D/gABcBHEAAAAABAAAAQAAAAAAAAAAAAAAAAAAAB4AAQAAAAEAAC/nCxBfDzz1AAsEAAAAAADa6MNaAAAAANrow1oAAP+CBAADfgAAAAgAAgAAAAAAAAABAAAAHgBfAAoAAAAAAAIAAAAKAAoAAAD/AAAAAAAAAAEAAAAKAB4ALAABREZMVAAIAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAAAAQQEAZAABQAIAokCzAAAAI8CiQLMAAAB6wAyAQgAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA5gbrKAOA/4AAXAOAAIAAAAABAAAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABHEAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAABQAAAAMAAAAsAAAABAAAAiQAAQAAAAABHgADAAEAAAAsAAMACgAAAiQABADyAAAAKgAgAAQACuYG5gzmDuYR5hjmJOZB5nDme+az5uzm8eb+5wLnB+cR50Dnwejx6yj//wAA5gbmDOYO5hDmFOYj5kHmcOZ75rPm7Obw5v7nAucH5w/nQOfB6PHrKP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABACoAKgAqACoALAA0ADYANgA2ADYANgA2ADgAOAA4ADgAPAA8ADwAPAAAAB0AHAAbABoAGQACAAMABAAFAAEAFwAMABgABwAIABQACgATABIADQAOAA8AFgAQABEACQAVAAsABgAAAQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAABbAAAAAAAAAAdAADmBgAA5gYAAAAdAADmDAAA5gwAAAAcAADmDgAA5g4AAAAbAADmEAAA5hAAAAAaAADmEQAA5hEAAAAZAADmFAAA5hQAAAACAADmFQAA5hUAAAADAADmFgAA5hYAAAAEAADmFwAA5hcAAAAFAADmGAAA5hgAAAABAADmIwAA5iMAAAAXAADmJAAA5iQAAAAMAADmQQAA5kEAAAAYAADmcAAA5nAAAAAHAADmewAA5nsAAAAIAADmswAA5rMAAAAUAADm7AAA5uwAAAAKAADm8AAA5vAAAAATAADm8QAA5vEAAAASAADm/gAA5v4AAAANAADnAgAA5wIAAAAOAADnBwAA5wcAAAAPAADnDwAA5w8AAAAWAADnEAAA5xAAAAAQAADnEQAA5xEAAAARAADnQAAA50AAAAAJAADnwQAA58EAAAAVAADo8QAA6PEAAAALAADrKAAA6ygAAAAGAAAAAABYAJoA3AE4AYIBwAH4Ak4CfgLIAvIDXAOUA8QD6AQUBFIEeASeBMoFCgWSBaAF+AYyBngGkgb2B3wAAAAEAAAAAAQAAtYACwAXACMALwAAARYAFwYAByYAJzYAFw4BBx4BFz4BNy4BBx4BFw4BBy4BJz4BFw4BBx4BFz4BNy4BAgDyAQwCAv708vL+9AICAQzyquIpKeKqquIpKeKqX38CAn9fX38CAn9fRFoCAlpERFoCAloC1Rb+zBYW/swWFgE0FhYBNCoLz0ZGzwsLz0ZGzzUCf19ffwICf19ffz4CWkREWgICWkREWgAAAAEAAP++A8IDUgAoAAABNTQ2MhYXFQ4BByMuATQ2OwEuAQcOARceARc+ATczDgEHLgEnPgIEAzEVHxYBARYPrhEVFRFtXPd0c2UfIsaDn9MFSwX+v7/+BQGP+gEDAsw6ERUVEa4PFQICFR8VYCk8QOWBf5kDBNSfv/4FBf6/iNxtKwAAAAEAAP++A8MDUgApAAATMzIWFAYHIy4BPQE0NjIWHQE2JBceARcOAQcuASczHgEXPgE3LgEnJgbrbREVFRGuERUVIRVlAQN9fZABBf6/v/4FSwTUn5/TBQGBbW7eAn0VHxYBARYPrhEVFRE6Wis0OdyIv/4FBf6/n9QEBNSfdrssKTIAAAMAAP++A8IDRgASAB4AOgAAJRcWFAYiLwEGJCcmEjc2JBcWEgU+ATcuAScOAQceARM1NDYyFh0BMzIWFAYrARUUBiImPQEjIiY0NjMDN4IJFBoKgor+r3x2BnyBAVCGgBT+RpzOBATOnJzNBATNexMdE2MPExMPYxMdE2QOExMOeIIKGhQJgnEUgIYBUIF8BnZ8/q/eBM6cnM0EBM2cnM4Bi2QOExMOZBMdE2MPExMPYxMdEwAAAAADAAD/vgPCA0YAEgAeACoAACUXFhQGIi8BBiQnJhI3NiQXFhIFPgE3LgEnDgEHHgETITIWFAYjISImNDYDN4IJFBoKgor+r3x2BnyBAVCGgBT+RpzOBATOnJzNBATNFwEKDxMTD/72DhMTeIIKGhQJgnEUgIYBUIF8BnZ8/q/eBM6cnM0EBM2cnM4BixMdExMdEwAABAAA/9cDqQMpAAMABwAXACQAABMRIRElITUhJyEyFhURFAYjISImNRE0NhMyFhcRDgEiJicRPgG2ApT9bAKU/WwvAvIUGxsU/Q4UGxvQFBsBARsoGgEBGwIN/ikB119eXhsU/Q4UGxsUAvIUG/62GxT+5RQaGhQBGxQbAAIAAP+CA20DfgAPAB8AAAE1Bxc1HgEXFAcXPgE1LgEDLgEnNjcnDgEVHgEXFTcnAgC2tnSaAyBCHB0Ezpp0mgMBH0IcHQTOmra2AvOLurmLA512RjxDLGM2ndL9ewOddkY8QyplNp3SBIu6uQAAAAAFAAD/mgPmA2YACwAXACAAKQAwAAAFJgAnNgA3FgAXBgADDgEHHgEXPgE3LgETIiY0NjIWFAYhIiY0NjIWFAYHHgEXPgE3AgDO/u4FBQESzs4BEgUF/u7OpNwEBNykpNwEBNweFhoaLBoa/mYWGhosGhoWAm5SUm4CZQUBEs7OARIFBf7uzs7+7gNkBNykpNwEBNykpNz+sRosGhosGhosGhosGmJSbgICblIAAwAA/8sDtQM1AA8AEwAZAAATITIWFREUBiMhLgEnETQ2FxEhEQEnNxcBF3wDCBQdHRT8+BUbAR1EAqj+fM5EigESRQM1HRT8+BQdARsVAwgUHWH9WAKo/erORIkBE0UABQAA/74DwwNlAAAADAAeACIAJwAANzMhMh0BFCMhIj0BNDcXFjMhMjcBNiYnASYGBwEGFgkBAwEHAQchJ08JA1AJCfywCQ+TDhEBZxgPARETBxn+oxo9Ff54EwgB0QFU0P6rMgFVAv60hhAJPwkJPwnScwoTAV0aPRUBEBQIGf4LGj8CGP72/vUBCkD+9QFpAAAAAAIAAP+4A8gDSAASABkAABMhMhYVERQGKwEHJyMiJjURNDYXETMXNzMRlALYJjU1Jra2trYmNTUm3JCQ3ANHNSb93iY1trY1JgIiJjVb/d6QkAIiAAQAAP/cA6QDJAATADEANQBFAAAlDgEHIS4BJxE+ATchMhYfAR4BFQMRNCYvAS4BIxUOAQchLgEnNSMRMzU+ATchHgEXFSM1IRUBNCYrASIGHQEUFjsBMjY1A6QBHRf9IRYdAQEdFgH8FzIRmRAVRgsFmgcYCQEdF/7FFh0BRkYBHRYBxxcdAUb+XAEYCghpBwoKB2kIChEXHQEBHRcC3xYdARUQmREyF/4WAeoJGQaaBgrjFx0BAR0X4/1E5BYdAQEdFuTS0gKrBwoKB68ICgoIAAAAAwAA/8ADwANAAAsAFwAbAAABBxc3JzcXBycHFzcBFwcnNxc3JwcBNycjARcBAm31ZUQibsttIkRm9f4fIm7LbSJEZvUBU/VlzAEPRP7xA0D1ZkQibctuIkRl9f7qIm3LbiJEZfX+rfVmAQ9E/vEAAAUAAAAAA8ADAAADAAcADQAOABcAABMRIREDIQEXNScBIxEhBSMeATI2NCYiBkADgGD+CAEf2dn+WUACwP3gMAEbKBsbKBsDAP0AAwD9YAEg2YjZ/lgCQKAUGxsoGxsAAAMAAAAAA94CtAAFAAsADwAAEwMTMwMTISMTAzMTATMTI9SysnaysgHidrKyd7H9m2qkagKz/s3+zQEzATP+zf7NATP+zQJmAAYAAAAAA8AC4AADAAcACwAPABMAFwAAASEVIREhFSERIRUhAzMVIxUzFSMVMxUjAQACwP1AAsD9QALA/UDAYGBgYGBgAbBgAZBg/gBgAsBg0GDQYAAAAAAGAAAAAAPAAvAAAwAHAAsAEQAeACgAAAEhFSERIRUhESEVIQMzNSMVMwMVMxUjFTMVIxUzNSMTNSMVMwcVMzUjAQACwP1AAsD9QALA/UCQIEAgMEAoKEBgICBgMzNgQAGwYAGQYP4AYAJQgCD9wCAPIBEggAEQICAzLSAAAQAAAAADgwMkABQAAAEhNRcHNSEOAQceARczFSMuASc+AQGIASzOzv7UWXcCAndZeHh/qgMDqgKseKWleAJ3WVl3AloDqn9/qgAAAAEAAAAAA6QDJAAUAAABITUHFzUhHgEXDgEHIxUzPgE3LgECeP7Uzs4BLFl3AgJ3WXh4f6oDA6oCrHilpXgCd1lZdwJaA6p/f6oAAAACAAAAAANxAtUACwAXAAABPgE3JwYHBh0BIREhPgE3JwYHBh0BIREBHAVJTj6BPC0BEgEyBEpOPoE8LQERAVR7gSFjOnFVvuoBKHuBIWM6cVW+6gEoAAAAAwAAAAADigL1AAkAFAAnAAABMjc2NCcmKwEVEzI3NjU0JyYrAREDITIXFhUUBwYHFhcWFRQHBiMhAms/Ijc6IUCx1VsnGEclP8RgATmANiAnFSY4HDEsQpD+zAG6ERySGQ/n/qc2IjBSHRD++QKUTi49Ri4YExYcMFZIOlgAAAADAAD//gPCAwIADwAyAF4AAAEyFh0BFAYjISImPQE0NjM3JicmNTQ2MzIXFhcWFxYVFA8BLwEmJyYjIgYVFBYXFhcWFwczFhUUBwYHBgcGBwYjIi8BJicmPQE0JyY/ATU3HwEWFx4CMzI+ATU0JyYDsgcJCQf8nAcJCQfjDgwYhoMZOiI3BQYHAwYqBxkbLD05REJrIzQdE3fPAxQMGBMkKCUoPjkpRh0HBAEBAQEzDwwDAxEtPCUgTC8pEQGACQcgBwkJByAHCSASFjItW4AKBhITKD4eCQ4BAwFLHC06LCVDIAoXDgyAFBs3MxwYEhcYCQsMFAgGBAcHNhgPExMWASQcCgQcJRUaPSIqJQ4AAAEAAAAAAtcB0wACAAABIRcC1/5S1wHT0QAAAAACAAAAAANkAuQAFwA7AAABIy4BNDY7ATIWHQEUBiImJzUBBiImNDcFPgEyFh0BDgEHIS4BJxE+ATczMhYUBgcjIgYVERQWMyEyNjUC9nUNExMNww0TExsSAf7yChoTCQE8ARIbEwE3Kf36KTcBATcpww4SEg7DDhISDgIGDhICowESGxMTDcMNExMNdf7xCRMaClYOEhIOwik3AQE3KQIGKTcBExsSARIO/foOEhIOAAIAAP/0A3IDDAADACQAADchFSERIRUPAREUFjMyNjURLwE1MxUPAREUBiMiJicuATURLwGPAtv9JQE7RQ9UX1dPEUX4Qw+ImVB4IxoWD0UxPQMYMQQO/qljVFpmAUoRBTExBRH+rIl6KiYfT0oBUw4EAAAAAQAA/9oC2AMmACsAAAE2JicmNTQ/AR4BMzI2NxYVFAcOAQcDBhYXFhUUByYnJiMiBgcmNTQ3PgE3AggFGikTAgMlSyAbTCIDEikhBX4FHCsRAycnIyQbSyIEESgkBQLHGhgFBBEEBAsEBAQEDQYTAQQaGv1yGhcGBA8IDQQBAwQEDQgPAwYYGgAAAAABAAAAAAOMAcIADAAAARQGIyEiJjQ2MyEyFgOMGhP9QhMaGhMCvhMaAZUTGRknGRkAAAAACgAA/+wDwgMBABAAFAAYABwAIAApAC4ANwA7AD8AAAEhMhYVERQGJyEiJjURNDYzEyMVMwU1IxUlMzUjJRUzNQUWNzI2NTYnIwUzNSMVJzUjBhcUFjMWNzM1IwU1IxUCAgGEIRsbIPzwHhsbHuHg4AEX3gEW4OD90t8BT21pAwgBAeH+6eDgOOEBAgoEZ6Pf3wH33wMBHCD9ZSEdARsfAqIdG/2/mAGYmAGYy5aWmAEBBwRHRZWVlsqYRkIECwEDlZaWlgAAAAAEAAD/8wONAw0AEwAnADsATwAAATc2Ji8BJgYfAR4BPwEXFj8BNicXFj8BFxY2PwE2Jg8BDgEfAQcGFwEuAQ8BJyYPAQYfAQcGFh8BFjYnASYPAScmBg8BBhY/AT4BLwE3NicBBjIEBAa0BAYBFQEJBTGXBgYwBQX2BgaXMQUJARUBBgS0BgQEMpcFBQETAQkFMZcGBjAFBZcyBAQGtAQGAf3iBgaXMQUJARUBBgS0BgQEMpcFBQK2MQUJARUBBgS0BgQEMpcFBTAGBjwFBZcyBAQGtAQGARUBCQUxlwYG/p8GBAQylwUFMAYGlzEFCQEVAQYEAR8FBZcyBAQGtAQGARUBCQUxlwYGAAAAAAASAN4AAQAAAAAAAAAVAAAAAQAAAAAAAQALABUAAQAAAAAAAgAHACAAAQAAAAAAAwALACcAAQAAAAAABAALADIAAQAAAAAABQALAD0AAQAAAAAABgALAEgAAQAAAAAACgArAFMAAQAAAAAACwATAH4AAwABBAkAAAAqAJEAAwABBAkAAQAWALsAAwABBAkAAgAOANEAAwABBAkAAwAWAN8AAwABBAkABAAWAPUAAwABBAkABQAWAQsAAwABBAkABgAWASEAAwABBAkACgBWATcAAwABBAkACwAmAY0KQ3JlYXRlZCBieSBpY29uZm9udAp2LW1kLWVkaXRvclJlZ3VsYXJ2LW1kLWVkaXRvcnYtbWQtZWRpdG9yVmVyc2lvbiAxLjB2LW1kLWVkaXRvckdlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAAoAQwByAGUAYQB0AGUAZAAgAGIAeQAgAGkAYwBvAG4AZgBvAG4AdAAKAHYALQBtAGQALQBlAGQAaQB0AG8AcgBSAGUAZwB1AGwAYQByAHYALQBtAGQALQBlAGQAaQB0AG8AcgB2AC0AbQBkAC0AZQBkAGkAdABvAHIAVgBlAHIAcwBpAG8AbgAgADEALgAwAHYALQBtAGQALQBlAGQAaQB0AG8AcgBHAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAHMAdgBnADIAdAB0AGYAIABmAHIAbwBtACAARgBvAG4AdABlAGwAbABvACAAcAByAG8AagBlAGMAdAAuAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAAAAAgAAAAAAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfAAdwcmV2aWV3DXJlZnJlc2gtcmlnaHQMcmVmcmVzaC1sZWZ0B3pvb20taW4Iem9vbS1vdXQDdG9jBHN5bmMFZW1vamkIY2hlY2tib3gFY2xlYXIDdGlwBHNhdmUEbGluawNpbWcEY29kZQJ1bAJvbARyZWRvBHVuZG8FcXVvdGUEYm9sZA1zdHJpa2V0aHJvdWdoCmFycm93LWRvd24Lb3Blbi1pbi1uZXcKdW5kZXItbGluZQZpdGFsaWMKaG9yaXpvbnRhbAV0YWJsZQpmdWxsc2NyZWVuAAA=) format("truetype")}[class*=v-md-icon-]{font-size:16px;font-family:v-md-iconfont!important;font-style:normal!important;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.v-md-icon-preview:before{content:"\e618"}.v-md-icon-refresh-right:before{content:"\e614"}.v-md-icon-refresh-left:before{content:"\e615"}.v-md-icon-zoom-in:before{content:"\e616"}.v-md-icon-zoom-out:before{content:"\e617"}.v-md-icon-toc:before{content:"\eb28"}.v-md-icon-sync:before{content:"\e670"}.v-md-icon-emoji:before{content:"\e67b"}.v-md-icon-checkbox:before{content:"\e740"}.v-md-icon-clear:before{content:"\e6ec"}.v-md-icon-tip:before{content:"\e8f1"}.v-md-icon-save:before{content:"\e624"}.v-md-icon-link:before{content:"\e6fe"}.v-md-icon-img:before{content:"\e702"}.v-md-icon-code:before{content:"\e707"}.v-md-icon-ul:before{content:"\e710"}.v-md-icon-ol:before{content:"\e711"}.v-md-icon-redo:before{content:"\e6f1"}.v-md-icon-undo:before{content:"\e6f0"}.v-md-icon-quote:before{content:"\e6b3"}.v-md-icon-bold:before{content:"\e7c1"}.v-md-icon-strikethrough:before{content:"\e70f"}.v-md-icon-arrow-down:before{content:"\e623"}.v-md-icon-open-in-new:before{content:"\e641"}.v-md-icon-under-line:before{content:"\e611"}.v-md-icon-italic:before{content:"\e610"}.v-md-icon-horizontal:before{content:"\e60e"}.v-md-icon-table:before{content:"\e60c"}.v-md-icon-fullscreen:before{content:"\e606"}.v-md-editor__tooltip{z-index:101;padding:4px 6px;color:#fff;font-size:12px;line-height:1;white-space:nowrap;background-color:#878787;border-radius:2px}.v-md-editor__menu,.v-md-editor__tooltip{position:absolute;box-shadow:0 2px 12px #0000001a}.v-md-editor__menu{top:38px;z-index:99;list-style:none;background-color:#fff;border-radius:3px;-webkit-transform-origin:center top;transform-origin:center top}.v-md-editor__menu::-webkit-scrollbar{width:6px}.v-md-editor__menu::-webkit-scrollbar-thumb{background-color:#9093994d;border-radius:4px}.v-md-editor__menu::-webkit-scrollbar-thumb:hover{background-color:#90939980}.v-md-editor__menu-item{color:#595959;font-weight:400;font-size:14px;white-space:nowrap;list-style:none}.v-md-editor__menu-item:hover{background-color:#f5f5f5}.v-md-editor__menu--list{padding:5px 0}.v-md-editor__menu--list .v-md-editor__menu-item{padding:0 24px;line-height:34px;text-align:left}.v-md-editor__menu--panel{max-height:200px;padding:12px 10px;overflow-y:auto}.v-md-editor__menu--panel .v-md-editor__menu-row{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.v-md-editor__menu--panel .v-md-editor__menu-row:not(:last-child){margin-bottom:6px}.v-md-editor__menu--panel .v-md-editor__menu-item{display:inline-block;padding:8px 0;line-height:1;text-align:center;border-radius:2px}.v-md-editor__menu--panel .v-md-editor__menu-item:not(:last-child){margin-right:4px}.v-md-editor__menu-ctrl{position:absolute;top:0;right:0;display:none}.v-md-editor__toolbar-item{position:relative;height:28px;padding:0 6px;color:#595959;font-size:16px;line-height:28px;text-align:center;border-radius:4px;cursor:pointer;-webkit-transition:all .2s linear 0s;transition:all .2s linear 0s}.v-md-editor__toolbar-item:not(:first-child){margin-left:4px}.v-md-editor__toolbar-item:hover{background:#f5f5f5}.v-md-editor__toolbar-item--menu{padding-right:16px}.v-md-editor__toolbar-item--menu .v-md-editor__menu-ctrl{display:inline-block}.v-md-editor__toolbar-item--active,.v-md-editor__toolbar-item--active:hover{background:#e8e8e8}.v-md-editor__toolbar{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;box-sizing:border-box;width:100%;padding:6px;border-bottom:1px solid #ddd}.v-md-editor__toolbar-left,.v-md-editor__toolbar-right{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;margin:0;padding:0;list-style:none}.v-md-editor__toolbar-left+.v-md-editor__toolbar-right{margin-left:60px}.v-md-editor__toolbar-divider{position:relative;height:28px;margin:0 10px}.v-md-editor__toolbar-divider+li.v-md-editor__toolbar-item{margin-left:0}.v-md-editor__toolbar-divider:before{position:absolute;top:4px;bottom:4px;border-left:1px solid #ddd;content:""}.v-md-editor{display:-webkit-box;display:-webkit-flex;display:flex;width:100%;background-color:#fff;border-radius:4px;box-shadow:0 2px 12px #0000001a}.v-md-editor__left-area,.v-md-editor__right-area{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;width:200px}.v-md-editor__left-area{height:100%;overflow:hidden;border-right:1px solid #ddd;-webkit-transition:.3s;transition:.3s}.v-md-editor__left-area-title{position:relative;height:41px;padding:0 14px;color:#2c3e50;font-weight:600;font-size:16px;line-height:41px;white-space:nowrap}.v-md-editor__left-area-title:after{position:absolute;right:0;bottom:0;left:0;border-bottom:1px solid #ddd;content:""}.v-md-editor__left-area-body{-webkit-box-flex:1;-webkit-flex:1;flex:1;padding:8px 14px;overflow:hidden}.v-md-editor--left-area-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;flex-direction:row-reverse}.v-md-editor--left-area-reverse .v-md-editor__left-area{border-right:none;border-left:1px solid #ddd}.v-md-editor__right-area{-webkit-box-flex:1;-webkit-flex:1;flex:1}.v-md-editor--preview{box-shadow:none}.v-md-editor--fullscreen{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1001}.v-md-editor__main{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-flex:1;-webkit-flex:1;flex:1;width:100%;overflow:hidden}.v-md-editor__editor-wrapper,.v-md-editor__preview-wrapper{position:relative;-webkit-box-flex:1;-webkit-flex:1;flex:1;height:100%;overflow:hidden}.v-md-editor__editor-wrapper{cursor:text;-webkit-user-select:none;user-select:none}.v-md-editor--editable .v-md-editor__editor-wrapper{border-right:1px solid #ddd}.scrollbar{height:100%;overflow:hidden}.scrollbar:active .scrollbar__bar,.scrollbar:focus .scrollbar__bar,.scrollbar:hover .scrollbar__bar{opacity:1}.scrollbar__wrap{height:100%;overflow-x:hidden}.scrollbar__wrap--hidden-default{scrollbar-width:none}.scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.scrollbar__thumb{position:relative;display:block;width:0;height:0;background-color:#9093994d;border-radius:inherit;cursor:pointer;-webkit-transition:background-color .3s;transition:background-color .3s}.scrollbar__thumb:hover{background-color:#90939980}.scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px;cursor:pointer;opacity:0;-webkit-transition:opacity .34s ease-out;transition:opacity .34s ease-out}.scrollbar__bar.is-vertical{top:2px;width:6px}.scrollbar__bar.is-vertical>div{width:100%}.scrollbar__bar.is-horizontal{left:2px;height:6px}.scrollbar__bar.is-horizontal>div{height:100%}.v-md-editor__toc-nav{margin:0;padding:0;list-style:none}.v-md-editor__toc-nav-item{position:relative;height:38px;overflow:hidden;color:#2c3e50;line-height:38px;white-space:nowrap;text-overflow:ellipsis;cursor:pointer}.v-md-editor__toc-nav-item:hover .v-md-editor__toc-nav-title{font-size:17px;-webkit-transform-origin:center center;transform-origin:center center}.v-md-editor__toc-nav-title{position:relative;font-size:16px;-webkit-transition:.3s;transition:.3s}[data-v-md-anchor]{cursor:pointer}.vuepress-markdown-body code[class*=v-md-prism-],.vuepress-markdown-body pre[class*=v-md-prism-]{color:#ccc;font-size:1em;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;line-height:1.5;white-space:pre;text-align:left;word-wrap:normal;word-break:normal;word-spacing:normal;-webkit-hyphens:none;hyphens:none;background:none}.vuepress-markdown-body>:first-child,.vuepress-markdown-body>div[data-v-md-line]:first-child>:first-child{margin-top:0!important}.vuepress-markdown-body>:last-child,.vuepress-markdown-body>div[data-v-md-line]:last-child>:last-child{margin-bottom:0!important}.vuepress-markdown-body pre[class*=v-md-prism-]{margin:.5em 0;padding:1em;overflow:auto}.vuepress-markdown-body :not(pre)>code[class*=v-md-prism-],.vuepress-markdown-body pre[class*=v-md-prism-]{background:#2d2d2d}.vuepress-markdown-body :not(pre)>code[class*=v-md-prism-]{padding:.1em;white-space:normal;border-radius:.3em}.vuepress-markdown-body .token.block-comment,.vuepress-markdown-body .token.cdata,.vuepress-markdown-body .token.comment,.vuepress-markdown-body .token.doctype,.vuepress-markdown-body .token.prolog{color:#999}.vuepress-markdown-body .token.punctuation{color:#ccc}.vuepress-markdown-body .token.attr-name,.vuepress-markdown-body .token.deleted,.vuepress-markdown-body .token.namespace,.vuepress-markdown-body .token.tag{color:#e2777a}.vuepress-markdown-body .token.function-name{color:#6196cc}.vuepress-markdown-body .token.boolean,.vuepress-markdown-body .token.function,.vuepress-markdown-body .token.number{color:#f08d49}.vuepress-markdown-body .token.class-name,.vuepress-markdown-body .token.constant,.vuepress-markdown-body .token.property,.vuepress-markdown-body .token.symbol{color:#f8c555}.vuepress-markdown-body .token.atrule,.vuepress-markdown-body .token.builtin,.vuepress-markdown-body .token.important,.vuepress-markdown-body .token.keyword,.vuepress-markdown-body .token.selector{color:#cc99cd}.vuepress-markdown-body .token.attr-value,.vuepress-markdown-body .token.char,.vuepress-markdown-body .token.regex,.vuepress-markdown-body .token.string,.vuepress-markdown-body .token.variable{color:#7ec699}.vuepress-markdown-body .token.entity,.vuepress-markdown-body .token.operator,.vuepress-markdown-body .token.url{color:#67cdcc}.vuepress-markdown-body .token.bold,.vuepress-markdown-body .token.important{font-weight:700}.vuepress-markdown-body .token.italic{font-style:italic}.vuepress-markdown-body .token.entity{cursor:help}.vuepress-markdown-body .token.inserted{color:green}.vuepress-markdown-body code{margin:0;padding:.25rem .5rem;color:#476582;font-size:.85em;background-color:#1b1f230d;border-radius:3px}.vuepress-markdown-body code .token.deleted{color:#ec5975}.vuepress-markdown-body code .token.inserted{color:#3eaf7c}.vuepress-markdown-body pre,.vuepress-markdown-body pre[class*=v-md-prism-]{margin:.85rem 0;padding:1.25rem 1.5rem;overflow:auto;line-height:1.4;background-color:#282c34;border-radius:6px}.vuepress-markdown-body pre[class*=v-md-prism-] code,.vuepress-markdown-body pre code{padding:0;color:#fff;background-color:initial;border-radius:0}.vuepress-markdown-body div[class*=v-md-pre-wrapper-]{position:relative;background-color:#282c34;border-radius:6px}.vuepress-markdown-body div[class*=v-md-pre-wrapper-] pre,.vuepress-markdown-body div[class*=v-md-pre-wrapper-] pre[class*=v-md-prism-]{position:relative;z-index:1;background:transparent}.vuepress-markdown-body div[class*=v-md-pre-wrapper-]:before{position:absolute;top:.8em;right:1em;z-index:3;color:#fff6;font-size:.75rem}.vuepress-markdown-body div[class*=v-md-pre-wrapper-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}.vuepress-markdown-body div[class*=v-md-pre-wrapper-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}.vuepress-markdown-body div[class*=v-md-pre-wrapper-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;padding:1.25rem 0;color:#ffffff4d;line-height:1.4;text-align:center}.vuepress-markdown-body div[class*=v-md-pre-wrapper-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;user-select:none}.vuepress-markdown-body div[class*=v-md-pre-wrapper-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;font-size:.85em;-webkit-user-select:none;user-select:none}.vuepress-markdown-body div[class*=v-md-pre-wrapper-].line-numbers-mode:after{position:absolute;top:0;left:0;z-index:2;width:3.5rem;height:100%;background-color:#282c34;border-right:1px solid rgba(0,0,0,.66);border-radius:6px 0 0 6px;content:""}.vuepress-markdown-body div[class~=v-md-pre-wrapper-js]:before{content:"js"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-ts]:before{content:"ts"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-html]:before{content:"html"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-md]:before{content:"md"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-vue]:before{content:"vue"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-css]:before{content:"css"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-sass]:before{content:"sass"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-scss]:before{content:"scss"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-less]:before{content:"less"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-stylus]:before{content:"stylus"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-go]:before{content:"go"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-java]:before{content:"java"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-c]:before{content:"c"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-sh]:before{content:"sh"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-yaml]:before{content:"yaml"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-py]:before{content:"py"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-docker]:before{content:"docker"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-dockerfile]:before{content:"dockerfile"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-makefile]:before{content:"makefile"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-javascript]:before{content:"js"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-typescript]:before{content:"ts"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-markup]:before{content:"html"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-markdown]:before{content:"md"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-json]:before{content:"json"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-ruby]:before{content:"rb"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-python]:before{content:"py"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-bash]:before{content:"sh"}.vuepress-markdown-body div[class~=v-md-pre-wrapper-php]:before{content:"php"}.vuepress-markdown-body .arrow{display:inline-block;width:0;height:0}.vuepress-markdown-body .arrow.up{border-bottom:6px solid #ccc}.vuepress-markdown-body .arrow.down,.vuepress-markdown-body .arrow.up{border-right:4px solid transparent;border-left:4px solid transparent}.vuepress-markdown-body .arrow.down{border-top:6px solid #ccc}.vuepress-markdown-body .arrow.right{border-left:6px solid #ccc}.vuepress-markdown-body .arrow.left,.vuepress-markdown-body .arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.vuepress-markdown-body .arrow.left{border-right:6px solid #ccc}.vuepress-markdown-body:not(.custom){padding:2rem 2.5rem}@media (max-width:959px){.vuepress-markdown-body:not(.custom){padding:2rem}}@media (max-width:419px){.vuepress-markdown-body:not(.custom){padding:1.5rem}}.vuepress-markdown-body .table-of-contents .badge{vertical-align:middle}.vuepress-markdown-body{color:#2c3e50;font-size:16px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:#fff}.vuepress-markdown-body:not(.custom) a:hover{text-decoration:underline}.vuepress-markdown-body:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.vuepress-markdown-body:not(.custom) img{max-width:100%}.vuepress-markdown-body.custom{margin:0;padding:0}.vuepress-markdown-body.custom img{max-width:100%}.vuepress-markdown-body a{font-weight:500;text-decoration:none}.vuepress-markdown-body a,.vuepress-markdown-body p a code{color:#3eaf7c}.vuepress-markdown-body p a code{font-weight:400}.vuepress-markdown-body kbd{padding:0 .15em;background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem}.vuepress-markdown-body blockquote{margin:1rem 0;padding:.25rem 0 .25rem 1rem;color:#999;font-size:1rem;border-left:.2rem solid #dfe2e5}.vuepress-markdown-body blockquote>p{margin:0}.vuepress-markdown-body ol,.vuepress-markdown-body ul{margin:1em 0;padding-left:1.2em}.vuepress-markdown-body strong{font-weight:600}.vuepress-markdown-body h1,.vuepress-markdown-body h2,.vuepress-markdown-body h3,.vuepress-markdown-body h4,.vuepress-markdown-body h5,.vuepress-markdown-body h6{font-weight:600;line-height:1.25}.vuepress-markdown-body h1{margin:.67em 0;font-size:2.2rem}.vuepress-markdown-body h2{margin:.83em 0;padding-bottom:.3rem;font-size:1.65rem;border-bottom:1px solid #eaecef}.vuepress-markdown-body h3{margin:1em 0;font-size:1.35rem}.vuepress-markdown-body h4{margin:1.33em 0}.vuepress-markdown-body h5{margin:1.67em 0}.vuepress-markdown-body h6{margin:2.33em 0}.vuepress-markdown-body em,.vuepress-markdown-body i{font-style:italic}.vuepress-markdown-body ul{list-style-type:disc}.vuepress-markdown-body ol ul,.vuepress-markdown-body ul ul{list-style-type:circle}.vuepress-markdown-body ol ol ul,.vuepress-markdown-body ol ul ul,.vuepress-markdown-body ul ol ul,.vuepress-markdown-body ul ul ul{list-style-type:square}.vuepress-markdown-body ol{list-style-type:decimal}.vuepress-markdown-body .line-number,.vuepress-markdown-body code,.vuepress-markdown-body kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}.vuepress-markdown-body ol,.vuepress-markdown-body p,.vuepress-markdown-body ul{line-height:1.7}.vuepress-markdown-body hr{border:0;border-top:1px solid #eaecef}.vuepress-markdown-body table{display:block;margin:1rem 0;overflow-x:auto;border-collapse:collapse}.vuepress-markdown-body tr{border-top:1px solid #dfe2e5}.vuepress-markdown-body tr:nth-child(2n){background-color:#f6f8fa}.vuepress-markdown-body td,.vuepress-markdown-body th{padding:.6em 1em;border:1px solid #dfe2e5}.vuepress-markdown-body .v-md-svg-outbound{position:relative;top:-1px;display:inline-block;color:#aaa;vertical-align:middle}@media (max-width:419px){.vuepress-markdown-body h1{font-size:1.9rem}.vuepress-markdown-body div[class*=v-md-pre-wrapper-]{margin:.85rem -1.5rem;border-radius:0}}.v-md-plugin-tip p{margin-top:1em;margin-bottom:1em}.v-md-plugin-tip .v-md-plugin-tip-title{margin-bottom:-.4rem;font-weight:600}.v-md-plugin-tip.danger,.v-md-plugin-tip.tip,.v-md-plugin-tip.warning{margin:1rem 0;padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid}.v-md-plugin-tip.tip{background-color:#f3f5f7;border-color:#42b983}.v-md-plugin-tip.warning{color:#6b5900;background-color:#ffe5644d;border-color:#e7c000}.v-md-plugin-tip.warning .v-md-plugin-tip-title{color:#b29400}.v-md-plugin-tip.warning a{color:#2c3e50}.v-md-plugin-tip.danger{color:#4d0000;background-color:#ffe6e6;border-color:#c00}.v-md-plugin-tip.danger .v-md-plugin-tip-title{color:#900}.v-md-plugin-tip.danger a{color:#2c3e50}.v-md-plugin-tip.details{position:relative;display:block;margin:1.6em 0;padding:1.6em;background-color:#eee;border-radius:2px}.v-md-plugin-tip.details h4{margin-top:0}.v-md-plugin-tip.details figure:last-child,.v-md-plugin-tip.details p:last-child{margin-bottom:0;padding-bottom:0}.v-md-plugin-tip.details summary{outline:none;cursor:pointer} diff --git a/public/exadmin/assets/@kangc.86f7507c.js b/public/exadmin/assets/@kangc.86f7507c.js new file mode 100644 index 0000000..95966a7 --- /dev/null +++ b/public/exadmin/assets/@kangc.86f7507c.js @@ -0,0 +1,39 @@ +import{c as Rt,g as Bt}from"./@babel.6cd0804c.js";import{r as Ae}from"./vue.db505ee4.js";var zt={exports:{}};(function(vt,Nt){(function(v,l){vt.exports=l(Ae)})(typeof self!="undefined"?self:Rt,function(L){return function(v){var l={};function n(r){if(l[r])return l[r].exports;var i=l[r]={i:r,l:!1,exports:{}};return v[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=v,n.c=l,n.d=function(r,i,t){n.o(r,i)||Object.defineProperty(r,i,{enumerable:!0,get:t})},n.r=function(r){typeof Symbol!="undefined"&&Symbol.toStringTag&&Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(r,"__esModule",{value:!0})},n.t=function(r,i){if(i&1&&(r=n(r)),i&8||i&4&&typeof r=="object"&&r&&r.__esModule)return r;var t=Object.create(null);if(n.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:r}),i&2&&typeof r!="string")for(var o in r)n.d(t,o,function(e){return r[e]}.bind(null,o));return t},n.n=function(r){var i=r&&r.__esModule?function(){return r.default}:function(){return r};return n.d(i,"a",i),i},n.o=function(r,i){return Object.prototype.hasOwnProperty.call(r,i)},n.p="",n(n.s=108)}([function(v,l){v.exports=L},function(v,l,n){n.d(l,"a",function(){return r}),n.d(l,"b",function(){return i}),n.d(l,"c",function(){return t}),n.d(l,"d",function(){return o}),n.d(l,"e",function(){return e}),n.d(l,"f",function(){return a}),n.d(l,"g",function(){return s}),n.d(l,"h",function(){return c}),n.d(l,"i",function(){return f}),n.d(l,"j",function(){return d}),n.d(l,"k",function(){return u}),n.d(l,"l",function(){return h}),n.d(l,"m",function(){return p}),n.d(l,"n",function(){return m}),n.d(l,"o",function(){return C}),n.d(l,"p",function(){return E}),n.d(l,"q",function(){return b}),n.d(l,"r",function(){return y}),n.d(l,"s",function(){return _}),n.d(l,"t",function(){return P}),n.d(l,"u",function(){return S}),n.d(l,"v",function(){return M});var r="bold",i="clear",t="code",o="fullscreen",e="h1",a="h2",s="h3",c="h4",f="h5",d="h6",u="hr",h="image",p="italic",m="link",C="ol",E="quote",b="redo",y="strikethrough",_="sync-scroll",P="table",S="ul",M="undo"},function(v,l,n){n.d(l,"f",function(){return i}),n.d(l,"a",function(){return o}),n.d(l,"c",function(){return e}),n.d(l,"d",function(){return a}),n.d(l,"e",function(){return s}),n.d(l,"b",function(){return c});var r=Object.prototype.toString,i=function(d){return r.call(d)==="[object Object]"};function t(f,d){return Object.keys(d).forEach(function(u){f[u]=d[u]}),f}function o(f){for(var d={},u=0;ue?"down":"up",h=(a-e)*(f/100),p,m=function C(){e+=h,u==="down"&&e>=a||u==="up"&&e<=a?(s(a),window.cancelAnimationFrame(p),d&&window.requestAnimationFrame(d)):(s(e),window.requestAnimationFrame(C))};window.requestAnimationFrame(m)}function t(o){var e=o.scrollTarget,a=o.scrollToTop,s=o.percent,c=s===void 0?10:s,f=o.onScrollEnd,d=Object(r.a)(e);i({currentScrollTop:d,scrollToTop:a,scrollFn:function(h){return Object(r.b)(e,h)},percent:c,onScrollEnd:f})}},function(v,l,n){n.r(l);var r=n(0);function i(p,m,C,E,b,y){return Object(r.openBlock)(),Object(r.createBlock)("div",{class:"v-md-editor-preview",style:{tabSize:p.tabSize,"-moz-tab-size":p.tabSize,"-o-tab-size":p.tabSize},onClick:m[1]||(m[1]=function(){return p.handlePreviewClick.apply(p,arguments)})},[Object(r.createVNode)("div",{class:[p.previewClass],innerHTML:p.html},null,10,["innerHTML"])],4)}var t=n(7),o=n(13),e=function(){function p(){this.lang=new o.a}var m=p.prototype;return m.defaultMarkdownLoader=function(E){return E},m.use=function(E,b){return typeof E=="function"?E(this,b):E.install(this,b),this},m.theme=function(E){this.themeConfig=E},m.extendMarkdown=function(E){if(!this.themeConfig)return console.error("Please use theme before using plugins");var b=this.themeConfig.markdownParser;E(b)},m.parse=function(E){var b,y=this.themeConfig.markdownParser,_=(y==null||(b=y.render)==null?void 0:b.bind(y))||this.defaultMarkdownLoader;return(typeof _!="function"||_===this.defaultMarkdownLoader)&&console.error("Please configure your markdown parser"),_(E)},p}(),a=n(16),s={name:"v-md-preview",mixins:[a.a],props:{text:{type:String,default:""},theme:Object,beforeChange:Function},emits:["change"],data:function(){return{html:""}},watch:{text:function(){this.handleTextChange()},langConfig:function(){this.handleTextChange()}},computed:{vMdParser:function(){return this.$options.vMdParser},previewClass:function(){return this.vMdParser.themeConfig.previewClass},langConfig:function(){return this.vMdParser.lang.langConfig}},created:function(){this.handleTextChange()},methods:{handleTextChange:function(){var m=this,C=function(b){m.html=t.a.process(m.$options.vMdParser.parse(b)),m.$emit("change",b,m.html)};this.beforeChange?this.beforeChange(this.text,C):C(this.text)}}},c=new e;c.lang.config=Object(r.reactive)(c.lang.config),s.vMdParser=new e;var f=s;f.render=i;var d=f;n(18);var u="2.3.15",h=function(m){m.component(d.name,d)};d.version=u,d.install=h,d.xss=t.a,d.use=function(p,m){return typeof p=="function"?p(d,m):p.install(d,m),d},l.default=d},function(v,l,n){v.exports=n(37)},function(v,l,n){var r=n(19),i=n(22),t=n(26);function o(s,c){var f=new t(c);return f.process(s)}l=v.exports=o,l.filterXSS=o,l.FilterXSS=t;for(var e in r)l[e]=r[e];for(var e in i)l[e]=i[e];typeof window!="undefined"&&(window.filterXSS=v.exports);function a(){return typeof self!="undefined"&&typeof DedicatedWorkerGlobalScope!="undefined"&&self instanceof DedicatedWorkerGlobalScope}a()&&(self.filterXSS=v.exports)},function(v,l,n){n.d(l,"a",function(){return r}),n.d(l,"b",function(){return i});function r(t,o){var e=o.accept,a=Object.keys(t).filter(function(s){var c=t[s],f=c.type,d=c.name,u=d.indexOf(".")>-1?"."+d.split(".").pop():"",h=f.replace(/\/.*$/,"");return e.split(",").map(function(p){return p.trim()}).filter(function(p){return p}).some(function(p){return/\..+$/.test(p)?u===p:/\/\*$/.test(p)?h===p.replace(/\/\*$/,""):/^[^\/]+\/[^\/]+$/.test(p)?f===p:!1})});return a.map(function(s){return t[s]})}function i(t){var o=[];return Object.keys(t.items).forEach(function(e){var a=t.items[e];if(a.kind==="file"){var s=a.getAsFile();s&&o.push(s)}}),o}},function(v,l,n){n.d(l,"a",function(){return e});var r=n(2),i=Object.prototype.hasOwnProperty;function t(a,s,c){var f=s[c];f!=null&&(!i.call(a,c)||!Object(r.f)(f)?a[c]=f:a[c]=o(Object(a[c]),s[c]))}function o(a,s){return Object.keys(s).forEach(function(c){t(a,s,c)}),a}var e=function(){function a(c){c===void 0&&(c={}),this.config={lang:"zh-CN",langConfig:{"zh-CN":{}}},this.options=c}var s=a.prototype;return s.use=function(f,d){var u;this.config.lang=f,this.add((u={},u[f]=d,u)),this.options.afterUse&&this.options.afterUse(f,d)},s.add=function(f){f===void 0&&(f={}),o(this.config.langConfig,f)},a}()},function(v,l,n){var r=n(20),i=n(24);function t(e,a){var s=new i(a);return s.process(e)}l=v.exports=t,l.FilterCSS=i;for(var o in r)l[o]=r[o];typeof window!="undefined"&&(window.filterCSS=v.exports)},function(v,l){v.exports={indexOf:function(n,r){var i,t;if(Array.prototype.indexOf)return n.indexOf(r);for(i=0,t=n.length;i/g,m=/"/g,C=/"/g,E=/&#([a-zA-Z0-9]*);?/gim,b=/:?/gim,y=/&newline;?/gim,_=/((j\s*a\s*v\s*a|v\s*b|l\s*i\s*v\s*e)\s*s\s*c\s*r\s*i\s*p\s*t\s*|m\s*o\s*c\s*h\s*a)\:/gi,P=/e\s*x\s*p\s*r\s*e\s*s\s*s\s*i\s*o\s*n\s*\(.*/gi,S=/u\s*r\s*l\s*\(.*/gi;function M(k){return k.replace(m,""")}function j(k){return k.replace(C,'"')}function F(k){return k.replace(E,function(O,N){return N[0]==="x"||N[0]==="X"?String.fromCharCode(parseInt(N.substr(1),16)):String.fromCharCode(parseInt(N,10))})}function z(k){return k.replace(b,":").replace(y," ")}function D(k){for(var x="",O=0,N=k.length;O/g;function B(k){var x=k.split("");return x=x.filter(function(O){var N=O.charCodeAt(0);return N===127?!1:N<=31?N===10||N===13:!0}),x.join("")}l.whiteList=o(),l.getDefaultWhiteList=o,l.onTag=a,l.onIgnoreTag=s,l.onTagAttr=c,l.onIgnoreTagAttr=f,l.safeAttrValue=u,l.escapeHtml=d,l.escapeQuote=M,l.unescapeQuote=j,l.escapeHtmlEntities=F,l.escapeDangerHtml5Entities=z,l.clearNonPrintableCharacter=D,l.friendlyAttrValue=w,l.escapeAttrValue=H,l.onIgnoreTagStripAll=$,l.StripTagBody=q,l.stripCommentTag=I,l.stripBlankChar=B,l.cssFilter=e,l.getDefaultCSSWhiteList=i},function(v,l){function n(){var e={};return e["align-content"]=!1,e["align-items"]=!1,e["align-self"]=!1,e["alignment-adjust"]=!1,e["alignment-baseline"]=!1,e.all=!1,e["anchor-point"]=!1,e.animation=!1,e["animation-delay"]=!1,e["animation-direction"]=!1,e["animation-duration"]=!1,e["animation-fill-mode"]=!1,e["animation-iteration-count"]=!1,e["animation-name"]=!1,e["animation-play-state"]=!1,e["animation-timing-function"]=!1,e.azimuth=!1,e["backface-visibility"]=!1,e.background=!0,e["background-attachment"]=!0,e["background-clip"]=!0,e["background-color"]=!0,e["background-image"]=!0,e["background-origin"]=!0,e["background-position"]=!0,e["background-repeat"]=!0,e["background-size"]=!0,e["baseline-shift"]=!1,e.binding=!1,e.bleed=!1,e["bookmark-label"]=!1,e["bookmark-level"]=!1,e["bookmark-state"]=!1,e.border=!0,e["border-bottom"]=!0,e["border-bottom-color"]=!0,e["border-bottom-left-radius"]=!0,e["border-bottom-right-radius"]=!0,e["border-bottom-style"]=!0,e["border-bottom-width"]=!0,e["border-collapse"]=!0,e["border-color"]=!0,e["border-image"]=!0,e["border-image-outset"]=!0,e["border-image-repeat"]=!0,e["border-image-slice"]=!0,e["border-image-source"]=!0,e["border-image-width"]=!0,e["border-left"]=!0,e["border-left-color"]=!0,e["border-left-style"]=!0,e["border-left-width"]=!0,e["border-radius"]=!0,e["border-right"]=!0,e["border-right-color"]=!0,e["border-right-style"]=!0,e["border-right-width"]=!0,e["border-spacing"]=!0,e["border-style"]=!0,e["border-top"]=!0,e["border-top-color"]=!0,e["border-top-left-radius"]=!0,e["border-top-right-radius"]=!0,e["border-top-style"]=!0,e["border-top-width"]=!0,e["border-width"]=!0,e.bottom=!1,e["box-decoration-break"]=!0,e["box-shadow"]=!0,e["box-sizing"]=!0,e["box-snap"]=!0,e["box-suppress"]=!0,e["break-after"]=!0,e["break-before"]=!0,e["break-inside"]=!0,e["caption-side"]=!1,e.chains=!1,e.clear=!0,e.clip=!1,e["clip-path"]=!1,e["clip-rule"]=!1,e.color=!0,e["color-interpolation-filters"]=!0,e["column-count"]=!1,e["column-fill"]=!1,e["column-gap"]=!1,e["column-rule"]=!1,e["column-rule-color"]=!1,e["column-rule-style"]=!1,e["column-rule-width"]=!1,e["column-span"]=!1,e["column-width"]=!1,e.columns=!1,e.contain=!1,e.content=!1,e["counter-increment"]=!1,e["counter-reset"]=!1,e["counter-set"]=!1,e.crop=!1,e.cue=!1,e["cue-after"]=!1,e["cue-before"]=!1,e.cursor=!1,e.direction=!1,e.display=!0,e["display-inside"]=!0,e["display-list"]=!0,e["display-outside"]=!0,e["dominant-baseline"]=!1,e.elevation=!1,e["empty-cells"]=!1,e.filter=!1,e.flex=!1,e["flex-basis"]=!1,e["flex-direction"]=!1,e["flex-flow"]=!1,e["flex-grow"]=!1,e["flex-shrink"]=!1,e["flex-wrap"]=!1,e.float=!1,e["float-offset"]=!1,e["flood-color"]=!1,e["flood-opacity"]=!1,e["flow-from"]=!1,e["flow-into"]=!1,e.font=!0,e["font-family"]=!0,e["font-feature-settings"]=!0,e["font-kerning"]=!0,e["font-language-override"]=!0,e["font-size"]=!0,e["font-size-adjust"]=!0,e["font-stretch"]=!0,e["font-style"]=!0,e["font-synthesis"]=!0,e["font-variant"]=!0,e["font-variant-alternates"]=!0,e["font-variant-caps"]=!0,e["font-variant-east-asian"]=!0,e["font-variant-ligatures"]=!0,e["font-variant-numeric"]=!0,e["font-variant-position"]=!0,e["font-weight"]=!0,e.grid=!1,e["grid-area"]=!1,e["grid-auto-columns"]=!1,e["grid-auto-flow"]=!1,e["grid-auto-rows"]=!1,e["grid-column"]=!1,e["grid-column-end"]=!1,e["grid-column-start"]=!1,e["grid-row"]=!1,e["grid-row-end"]=!1,e["grid-row-start"]=!1,e["grid-template"]=!1,e["grid-template-areas"]=!1,e["grid-template-columns"]=!1,e["grid-template-rows"]=!1,e["hanging-punctuation"]=!1,e.height=!0,e.hyphens=!1,e.icon=!1,e["image-orientation"]=!1,e["image-resolution"]=!1,e["ime-mode"]=!1,e["initial-letters"]=!1,e["inline-box-align"]=!1,e["justify-content"]=!1,e["justify-items"]=!1,e["justify-self"]=!1,e.left=!1,e["letter-spacing"]=!0,e["lighting-color"]=!0,e["line-box-contain"]=!1,e["line-break"]=!1,e["line-grid"]=!1,e["line-height"]=!1,e["line-snap"]=!1,e["line-stacking"]=!1,e["line-stacking-ruby"]=!1,e["line-stacking-shift"]=!1,e["line-stacking-strategy"]=!1,e["list-style"]=!0,e["list-style-image"]=!0,e["list-style-position"]=!0,e["list-style-type"]=!0,e.margin=!0,e["margin-bottom"]=!0,e["margin-left"]=!0,e["margin-right"]=!0,e["margin-top"]=!0,e["marker-offset"]=!1,e["marker-side"]=!1,e.marks=!1,e.mask=!1,e["mask-box"]=!1,e["mask-box-outset"]=!1,e["mask-box-repeat"]=!1,e["mask-box-slice"]=!1,e["mask-box-source"]=!1,e["mask-box-width"]=!1,e["mask-clip"]=!1,e["mask-image"]=!1,e["mask-origin"]=!1,e["mask-position"]=!1,e["mask-repeat"]=!1,e["mask-size"]=!1,e["mask-source-type"]=!1,e["mask-type"]=!1,e["max-height"]=!0,e["max-lines"]=!1,e["max-width"]=!0,e["min-height"]=!0,e["min-width"]=!0,e["move-to"]=!1,e["nav-down"]=!1,e["nav-index"]=!1,e["nav-left"]=!1,e["nav-right"]=!1,e["nav-up"]=!1,e["object-fit"]=!1,e["object-position"]=!1,e.opacity=!1,e.order=!1,e.orphans=!1,e.outline=!1,e["outline-color"]=!1,e["outline-offset"]=!1,e["outline-style"]=!1,e["outline-width"]=!1,e.overflow=!1,e["overflow-wrap"]=!1,e["overflow-x"]=!1,e["overflow-y"]=!1,e.padding=!0,e["padding-bottom"]=!0,e["padding-left"]=!0,e["padding-right"]=!0,e["padding-top"]=!0,e.page=!1,e["page-break-after"]=!1,e["page-break-before"]=!1,e["page-break-inside"]=!1,e["page-policy"]=!1,e.pause=!1,e["pause-after"]=!1,e["pause-before"]=!1,e.perspective=!1,e["perspective-origin"]=!1,e.pitch=!1,e["pitch-range"]=!1,e["play-during"]=!1,e.position=!1,e["presentation-level"]=!1,e.quotes=!1,e["region-fragment"]=!1,e.resize=!1,e.rest=!1,e["rest-after"]=!1,e["rest-before"]=!1,e.richness=!1,e.right=!1,e.rotation=!1,e["rotation-point"]=!1,e["ruby-align"]=!1,e["ruby-merge"]=!1,e["ruby-position"]=!1,e["shape-image-threshold"]=!1,e["shape-outside"]=!1,e["shape-margin"]=!1,e.size=!1,e.speak=!1,e["speak-as"]=!1,e["speak-header"]=!1,e["speak-numeral"]=!1,e["speak-punctuation"]=!1,e["speech-rate"]=!1,e.stress=!1,e["string-set"]=!1,e["tab-size"]=!1,e["table-layout"]=!1,e["text-align"]=!0,e["text-align-last"]=!0,e["text-combine-upright"]=!0,e["text-decoration"]=!0,e["text-decoration-color"]=!0,e["text-decoration-line"]=!0,e["text-decoration-skip"]=!0,e["text-decoration-style"]=!0,e["text-emphasis"]=!0,e["text-emphasis-color"]=!0,e["text-emphasis-position"]=!0,e["text-emphasis-style"]=!0,e["text-height"]=!0,e["text-indent"]=!0,e["text-justify"]=!0,e["text-orientation"]=!0,e["text-overflow"]=!0,e["text-shadow"]=!0,e["text-space-collapse"]=!0,e["text-transform"]=!0,e["text-underline-position"]=!0,e["text-wrap"]=!0,e.top=!1,e.transform=!1,e["transform-origin"]=!1,e["transform-style"]=!1,e.transition=!1,e["transition-delay"]=!1,e["transition-duration"]=!1,e["transition-property"]=!1,e["transition-timing-function"]=!1,e["unicode-bidi"]=!1,e["vertical-align"]=!1,e.visibility=!1,e["voice-balance"]=!1,e["voice-duration"]=!1,e["voice-family"]=!1,e["voice-pitch"]=!1,e["voice-range"]=!1,e["voice-rate"]=!1,e["voice-stress"]=!1,e["voice-volume"]=!1,e.volume=!1,e["white-space"]=!1,e.widows=!1,e.width=!0,e["will-change"]=!1,e["word-break"]=!0,e["word-spacing"]=!0,e["word-wrap"]=!0,e["wrap-flow"]=!1,e["wrap-through"]=!1,e["writing-mode"]=!1,e["z-index"]=!1,e}function r(e,a,s){}function i(e,a,s){}var t=/javascript\s*\:/img;function o(e,a){return t.test(a)?"":a}l.whiteList=n(),l.getDefaultWhiteList=n,l.onAttr=r,l.onIgnoreAttr=i,l.safeAttrValue=o},function(v,l){v.exports={indexOf:function(n,r){var i,t;if(Array.prototype.indexOf)return n.indexOf(r);for(i=0,t=n.length;i"){m+=p(u.slice(C,E)),S=u.slice(E,y+1),P=i(S),m+=h(E,m.length,P,S,t(S)),C=y+1,E=!1;continue}if(M==='"'||M==="'")for(var j=1,F=u.charAt(y-j);F.trim()===""||F==="=";){if(F==="="){b=M;continue t}F=u.charAt(y-++j)}}else if(M===b){b=!1;continue}}return C0;h--){var p=u[h];if(p!==" ")return p==="="?h:-1}}function f(u){return u[0]==='"'&&u[u.length-1]==='"'||u[0]==="'"&&u[u.length-1]==="'"}function d(u){return f(u)?u.substr(1,u.length-2):u}l.parseTag=o,l.parseAttr=a},function(v,l,n){n.r(l);var r=n(10),i=n.n(r),t=n(17),o=n(1),e=n(12);l.default={name:o.l,icon:"v-md-icon-img",title:function(s){return s.langConfig.image.toolbar},menus:[{name:"image-link",text:function(s){return s.langConfig.imageLink.toolbar},action:function(s,c){(c==null?void 0:c.insertWithSize)?s.execCommand(o.l,{width:"auto",height:"auto"}):s.execCommand(o.l)}},{name:"upload-image",text:function(s){return s.langConfig.uploadImage.toolbar},action:function(s){s.uploadConfig=s.uploadImgConfig,s.$nextTick(Object(t.a)(i.a.mark(function c(){var f,d;return i.a.wrap(function(h){for(;;)switch(h.prev=h.next){case 0:return h.next=2,s.$refs.uploadFile.upload();case 2:f=h.sent,d=Object(e.a)(f.target.files,s.uploadImgConfig),s.emitUploadImage(f,d);case 5:case"end":return h.stop()}},c)})))}}]}},function(v,l,n){var r=n(20),i=n(25);n(21);function t(a){return a==null}function o(a){var s={};for(var c in a)s[c]=a[c];return s}function e(a){a=o(a||{}),a.whiteList=a.whiteList||r.whiteList,a.onAttr=a.onAttr||r.onAttr,a.onIgnoreAttr=a.onIgnoreAttr||r.onIgnoreAttr,a.safeAttrValue=a.safeAttrValue||r.safeAttrValue,this.options=a}e.prototype.process=function(a){if(a=a||"",a=a.toString(),!a)return"";var s=this,c=s.options,f=c.whiteList,d=c.onAttr,u=c.onIgnoreAttr,h=c.safeAttrValue,p=i(a,function(m,C,E,b,y){var _=f[E],P=!1;if(_===!0?P=_:typeof _=="function"?P=_(b):_ instanceof RegExp&&(P=_.test(b)),P!==!0&&(P=!1),b=h(E,b),!!b){var S={position:C,sourcePosition:m,source:y,isWhite:P};if(P){var M=d(E,b,S);return t(M)?E+":"+b:M}else{var M=u(E,b,S);if(!t(M))return M}}});return p},v.exports=e},function(v,l,n){var r=n(21);function i(t,o){t=r.trimRight(t),t[t.length-1]!==";"&&(t+=";");var e=t.length,a=!1,s=0,c=0,f="";function d(){if(!a){var p=r.trim(t.slice(s,c)),m=p.indexOf(":");if(m!==-1){var C=r.trim(p.slice(0,m)),E=r.trim(p.slice(m+1));if(C){var b=o(s,f.length,C,E,p);b&&(f+=b+"; ")}}}s=c+1}for(;c";var I=c(w),R=m[D],B=e(I.html,function(x,O){var N=a.indexOf(R,x)!==-1,W=b(D,x,O,N);if(!s(W))return W;if(N)return O=_(D,x,O,S),O?x+'="'+O+'"':x;var W=y(D,x,O,N);return s(W)?void 0:W}),w="<"+D;return B&&(w+=" "+B),I.closing&&(w+=" /"),w+=">",w}else{var q=E(D,w,$);return s(q)?P(w):q}},P);return M&&(j=M.remove(j)),j},v.exports=d},function(v,l,n){},function(v,l,n){},function(v,l,n){},function(v,l,n){},function(v,l,n){},function(v,l,n){},function(v,l,n){},function(v,l,n){(function(r){var i=function(){if(typeof Map!="undefined")return Map;function I(R,B){var k=-1;return R.some(function(x,O){return x[0]===B?(k=O,!0):!1}),k}return function(){function R(){this.__entries__=[]}return Object.defineProperty(R.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),R.prototype.get=function(B){var k=I(this.__entries__,B),x=this.__entries__[k];return x&&x[1]},R.prototype.set=function(B,k){var x=I(this.__entries__,B);~x?this.__entries__[x][1]=k:this.__entries__.push([B,k])},R.prototype.delete=function(B){var k=this.__entries__,x=I(k,B);~x&&k.splice(x,1)},R.prototype.has=function(B){return!!~I(this.__entries__,B)},R.prototype.clear=function(){this.__entries__.splice(0)},R.prototype.forEach=function(B,k){k===void 0&&(k=null);for(var x=0,O=this.__entries__;x0},I.prototype.connect_=function(){!t||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),d?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},I.prototype.disconnect_=function(){!t||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},I.prototype.onTransitionEnd_=function(R){var B=R.propertyName,k=B===void 0?"":B,x=f.some(function(O){return!!~k.indexOf(O)});x&&this.refresh()},I.getInstance=function(){return this.instance_||(this.instance_=new I),this.instance_},I.instance_=null,I}(),h=function(I,R){for(var B=0,k=Object.keys(R);B0},I}(),H=typeof WeakMap!="undefined"?new WeakMap:new i,$=function(){function I(R){if(!(this instanceof I))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var B=u.getInstance(),k=new w(R,B,this);H.set(this,k)}return I}();["observe","unobserve","disconnect"].forEach(function(I){$.prototype[I]=function(){var R;return(R=H.get(this))[I].apply(R,arguments)}});var q=function(){return typeof o.ResizeObserver!="undefined"?o.ResizeObserver:$}();l.a=q}).call(this,n(86))},function(v,l,n){n.d(l,"a",function(){return ke});var r=n(13),i={undo:{toolbar:"\u64A4\u9500"},redo:{toolbar:"\u91CD\u505A"},clear:{toolbar:"\u6E05\u7A7A"},h:{toolbar:"\u6807\u9898"},h1:{toolbar:"\u4E00\u7EA7\u6807\u9898",placeholder:"\u4E00\u7EA7\u6807\u9898"},h2:{toolbar:"\u4E8C\u7EA7\u6807\u9898",placeholder:"\u4E8C\u7EA7\u6807\u9898"},h3:{toolbar:"\u4E09\u7EA7\u6807\u9898",placeholder:"\u4E09\u7EA7\u6807\u9898"},h4:{toolbar:"\u56DB\u7EA7\u6807\u9898",placeholder:"\u56DB\u7EA7\u6807\u9898"},h5:{toolbar:"\u4E94\u7EA7\u6807\u9898",placeholder:"\u4E94\u7EA7\u6807\u9898"},h6:{toolbar:"\u516D\u7EA7\u6807\u9898",placeholder:"\u516D\u7EA7\u6807\u9898"},bold:{toolbar:"\u7C97\u4F53",placeholder:"\u7C97\u4F53"},italic:{toolbar:"\u659C\u4F53",placeholder:"\u659C\u4F53"},strikethrough:{toolbar:"\u5220\u9664\u7EBF",placeholder:"\u5220\u9664\u7EBF"},quote:{toolbar:"\u63D2\u5165\u5F15\u7528",placeholder:"\u5F15\u7528"},ul:{toolbar:"\u65E0\u5E8F\u5217\u8868",placeholder:"\u65E0\u5E8F\u5217\u8868"},ol:{toolbar:"\u6709\u5E8F\u5217\u8868",placeholder:"\u6709\u5E8F\u5217\u8868"},table:{toolbar:"\u8868\u683C"},hr:{toolbar:"\u63D2\u5165\u5206\u5272\u7EBF"},link:{toolbar:"\u63D2\u5165\u94FE\u63A5",descPlaceholder:"\u94FE\u63A5"},image:{toolbar:"\u63D2\u5165\u56FE\u7247"},imageLink:{toolbar:"\u6DFB\u52A0\u56FE\u7247\u94FE\u63A5"},uploadImage:{toolbar:"\u4E0A\u4F20\u672C\u5730\u56FE\u7247"},code:{toolbar:"\u63D2\u5165\u4EE3\u7801\u5757"},save:{toolbar:"\u4FDD\u5B58"},preview:{enabled:"\u5F00\u542F\u9884\u89C8",disabled:"\u5173\u95ED\u9884\u89C8"},toc:{title:"\u76EE\u5F55\u5BFC\u822A",enabled:"\u5F00\u542F\u76EE\u5F55\u5BFC\u822A",disabled:"\u5173\u95ED\u76EE\u5F55\u5BFC\u822A"},syncScroll:{enabled:"\u5F00\u542F\u540C\u6B65\u6EDA\u52A8",disabled:"\u5173\u95ED\u540C\u6B65\u6EDA\u52A8"},fullscreen:{enabled:"\u5168\u5C4F\uFF08\u6309ESC\u8FD8\u539F\uFF09",disabled:"\u9000\u51FA\u5168\u5C4F"}},t=n(0),o=n(2),e={};Object(o.c)(e,n(38));function a(A,g,T){g?A[g]?console.error("The command name is already in use: "+g):A[g]=T:console.error("Command name is required")}function s(A){A.commands={},A.command=function(g,T){a(A.commands,g,T)},Object.keys(e).forEach(function(g){var T=e[g],U=T.name,G=T.default;A.command(U,G)})}var c=n(5),f={};Object(o.c)(f,n(61));function d(A,g,T){g?A[g]=Object(c.a)({},T):console.error("Toolbar name is required")}function u(A){A.toolbars={},A.toolbar=function(g,T){d(A.toolbars,g,T)},Object.keys(f).forEach(function(g){var T=f[g],U=T.default;A.toolbar(U.name,U)})}n(81);var h=n(9),p={class:"v-md-editor__left-area-body"},m={class:"v-md-editor__right-area"},C={class:"v-md-editor__toolbar",ref:"toolbarWrapper"},E={class:"v-md-editor__main"},b={class:"v-md-editor__preview-wrapper",ref:"previewWrapper"};function y(A,g,T,U,G,V){var Z=Object(t.resolveComponent)("editor-toolbar");return Object(t.openBlock)(),Object(t.createBlock)("div",{class:["v-md-editor",["v-md-editor--"+T.mode,{"v-md-editor--fullscreen":T.fullscreen,"v-md-editor--left-area-reverse":T.leftAreaReverse}]],style:{height:V.heightGetter}},[Object(t.withDirectives)(Object(t.createVNode)("div",{class:"v-md-editor__left-area",style:{width:T.leftAreaVisible?T.leftAreaWidth:0,borderWidth:T.leftAreaVisible?"1px":0}},[Object(t.createVNode)("div",{class:"v-md-editor__left-area-title",style:{height:G.toolbarHeight+"px",lineHeight:G.toolbarHeight+"px"}},Object(t.toDisplayString)(T.leftAreaTitle),5),Object(t.createVNode)("div",p,[Object(t.renderSlot)(A.$slots,"left-area")])],4),[[t.vShow,!V.isPreviewMode]]),Object(t.createVNode)("div",m,[Object(t.withDirectives)(Object(t.createVNode)("div",C,[Object(t.createVNode)(Z,{class:"v-md-editor__toolbar-left",groups:V.leftToolbarGroup,toolbars:T.toolbars,"disabled-menus":T.disabledMenus,onItemClick:V.handleToolbarItemClick,onToolbarMenuClick:V.handleToolbarMenuClick},null,8,["groups","toolbars","disabled-menus","onItemClick","onToolbarMenuClick"]),Object(t.createVNode)(Z,{class:"v-md-editor__toolbar-right",groups:V.rightToolbarGroup,toolbars:T.toolbars,"disabled-mens":T.disabledMenus,onItemClick:V.handleToolbarItemClick,onToolbarMenuClick:V.handleToolbarMenuClick},null,8,["groups","toolbars","disabled-mens","onItemClick","onToolbarMenuClick"])],512),[[t.vShow,!V.isPreviewMode]]),Object(t.createVNode)("div",E,[Object(t.withDirectives)(Object(t.createVNode)("div",{ref:"editorWrapper",class:"v-md-editor__editor-wrapper",onClick:g[1]||(g[1]=function(){return V.handleEditorWrapperClick.apply(V,arguments)})},[Object(t.renderSlot)(A.$slots,"editor")],512),[[t.vShow,!V.isPreviewMode]]),Object(t.withDirectives)(Object(t.createVNode)("div",b,[Object(t.renderSlot)(A.$slots,"preview")],512),[[t.vShow,!V.isEditMode]]),Object(t.renderSlot)(A.$slots,"default")])])],6)}var _={key:0},P={key:0,class:"v-md-editor__toolbar-divider"};function S(A,g,T,U,G,V){var Z=Object(t.resolveComponent)("toolbar-item");return T.groups.length?(Object(t.openBlock)(),Object(t.createBlock)("ul",_,[(Object(t.openBlock)(!0),Object(t.createBlock)(t.Fragment,null,Object(t.renderList)(T.groups,function(J,et){return Object(t.openBlock)(),Object(t.createBlock)(t.Fragment,null,[(Object(t.openBlock)(!0),Object(t.createBlock)(t.Fragment,null,Object(t.renderList)(J,function(Q){return Object(t.openBlock)(),Object(t.createBlock)(Z,{key:Q,name:Q,title:V.getConfig(Q,"title"),icon:V.getConfig(Q,"icon"),text:V.getConfig(Q,"text"),active:V.getConfig(Q,"active"),menus:V.getConfig(Q,"menus"),"disabled-menus":T.disabledMenus,onClick:function(it){return A.$emit("item-click",T.toolbars[Q])},onMenuClick:g[1]||(g[1]=function(nt){return A.$emit("toolbar-menu-click",nt)})},null,8,["name","title","icon","text","active","menus","disabled-menus","onClick"])}),128)),et!==T.groups.length-1?(Object(t.openBlock)(),Object(t.createBlock)("li",P)):Object(t.createCommentVNode)("v-if",!0)],64)}),256))])):Object(t.createCommentVNode)("v-if",!0)}var M={key:1,class:"v-md-icon-arrow-down v-md-editor__menu-ctrl",ref:"menuCtrl"};function j(A,g,T,U,G,V){var Z=Object(t.resolveComponent)("v-md-tooltip"),J=Object(t.resolveComponent)("v-md-menu"),et=Object(t.resolveDirective)("clickoutside");return Object(t.withDirectives)((Object(t.openBlock)(),Object(t.createBlock)("li",{class:["v-md-editor__toolbar-item",[T.icon,"v-md-editor__toolbar-item-"+T.name,{"v-md-editor__toolbar-item--active":T.active||G.menuActive},{"v-md-editor__toolbar-item--menu":V.hasMenu}]],onMousedown:g[3]||(g[3]=Object(t.withModifiers)(function(){},["prevent"])),onMouseleave:g[4]||(g[4]=function(){return V.handleHideTooltip.apply(V,arguments)}),onMousemove:g[5]||(g[5]=function(){return V.showTooltip.apply(V,arguments)}),onClick:g[6]||(g[6]=Object(t.withModifiers)(function(){return V.handleClick.apply(V,arguments)},["stop"]))},[Object(t.createTextVNode)(Object(t.toDisplayString)(T.text)+" ",1),Object(t.createVNode)(Z,{ref:"tooltip",text:T.title},null,8,["text"]),V.hasMenu?(Object(t.openBlock)(),Object(t.createBlock)(J,{key:0,ref:"menu",mode:V.menuMode,menus:V.menuItems,"item-width":T.menus.itemWidth,"row-num":T.menus.rowNum,visible:G.menuActive,"onUpdate:visible":g[1]||(g[1]=function(Q){return G.menuActive=Q}),onItemClick:g[2]||(g[2]=function(Q){return A.$emit("menu-click",Q)})},null,8,["mode","menus","item-width","row-num","visible"])):Object(t.createCommentVNode)("v-if",!0),V.hasMenu?(Object(t.openBlock)(),Object(t.createBlock)("i",M,null,512)):Object(t.createCommentVNode)("v-if",!0)],34)),[[et,V.hideMenu,"hideMenu"]])}function F(A,g,T,U,G,V){return Object(t.openBlock)(),Object(t.createBlock)(t.Transition,{name:"v-md-fade-in"},{default:Object(t.withCtx)(function(){return[Object(t.withDirectives)(Object(t.createVNode)("div",{style:{left:G.position.x+"px",top:G.position.y+"px"},class:"v-md-editor__tooltip"},Object(t.toDisplayString)(T.text),5),[[t.vShow,G.visible]])]}),_:1})}var z={name:"v-md-tooltip",props:{text:String},data:function(){return{position:{x:0,y:0},visible:!1}},methods:{show:function(g){this.position={x:g.x,y:g.y},this.visible=!0,this.$nextTick(this.calculateLayout)},hide:function(){this.visible=!1},calculateLayout:function(){var g=this.$el.getBoundingClientRect(),T=g.right,U=document.documentElement.clientWidth;U-T<0&&(this.position.x-=T-U)}}};n(82),z.render=F;var D=z,w={key:1},H={class:"v-md-editor__menu-row"};function $(A,g,T,U,G,V){var Z=Object(t.resolveComponent)("v-md-render");return Object(t.openBlock)(),Object(t.createBlock)(t.Transition,{name:"v-md-zoom-in-top"},{default:Object(t.withCtx)(function(){return[Object(t.withDirectives)(Object(t.createVNode)("ul",{class:["v-md-editor__menu",["v-md-editor__menu--"+T.mode]],style:G.style,onMousemove:g[1]||(g[1]=Object(t.withModifiers)(function(){},["stop"])),onClick:g[2]||(g[2]=Object(t.withModifiers)(function(){},["stop"]))},[V.isListMode?(Object(t.openBlock)(!0),Object(t.createBlock)(t.Fragment,{key:0},Object(t.renderList)(T.menus,function(J){return Object(t.openBlock)(),Object(t.createBlock)("li",{key:J.name,class:["v-md-editor__menu-item",["v-md-editor__menu-item-"+J.name,J.class]],onClick:Object(t.withModifiers)(function(et){return V.handleClick(J)},["stop"])},[J.render?(Object(t.openBlock)(),Object(t.createBlock)(Z,{key:0,render:J.render,editor:A.$self},null,8,["render","editor"])):(Object(t.openBlock)(),Object(t.createBlock)(t.Fragment,{key:1},[Object(t.createTextVNode)(Object(t.toDisplayString)(V.getText(J.text)),1)],64))],10,["onClick"])}),128)):(Object(t.openBlock)(),Object(t.createBlock)("li",w,[(Object(t.openBlock)(!0),Object(t.createBlock)(t.Fragment,null,Object(t.renderList)(V.rowCount,function(J){return Object(t.openBlock)(),Object(t.createBlock)("div",H,[(Object(t.openBlock)(!0),Object(t.createBlock)(t.Fragment,null,Object(t.renderList)(V.getRowMenus(J),function(et){return Object(t.openBlock)(),Object(t.createBlock)("span",{key:et.name,style:{width:T.itemWidth},class:["v-md-editor__menu-item",["v-md-editor__menu-item-"+et.name,et.class]],onClick:Object(t.withModifiers)(function(Q){return V.handleClick(et)},["stop"])},Object(t.toDisplayString)(et.text),15,["onClick"])}),128))])}),256))]))],38),[[t.vShow,T.visible]])]}),_:1})}var q=function(g,T){var U=T.data;return g.render.apply(g,U.$attrs)};q.props=["render"];var I=q,R={LIST:"list",PANEL:"panel"},B={name:"v-md-menu",components:{VMdRender:I},inject:["markdownEditor"],props:{mode:{type:String,default:R.PANEL},menus:Array,itemWidth:{type:String,default:"30px"},rowNum:{type:Number,default:10},visible:Boolean},emits:["update:visible","item-click"],data:function(){return{style:{left:0}}},computed:{rowCount:function(){return Math.ceil(this.menus.length/this.rowNum)},isListMode:function(){return this.mode===R.LIST}},watch:{visible:function(){this.visible&&this.$nextTick(this.calculateLayout)}},methods:{calculateLayout:function(){var g=this.$el.getBoundingClientRect(),T=g.right,U=document.documentElement.clientWidth;U-T<0&&(this.style={right:0})},getRowMenus:function(g){var T=g*this.rowNum,U=T-this.rowNum;return this.menus.slice(U,T)},getText:function(g){return typeof g=="function"?g(this.markdownEditor):g},hide:function(){this.$emit("update:visible",!1)},handleClick:function(g){this.$emit("item-click",g),this.hide()}}};n(83),B.render=$;var k=B,x=[],O="@@clickoutsideContext",N,W=0;o.d&&(document.addEventListener("mousedown",function(A){N=A}),document.addEventListener("mouseup",function(A){x.forEach(function(g){return g[O].documentHandler(A,N)})}));function K(A,g,T){return function(U,G){U===void 0&&(U={}),G===void 0&&(G={}),!(!T||!g||!g.instance||!U.target||!G.target||A.contains(U.target)||A.contains(G.target)||A===U.target)&&(g.arg&&A[O].methodName&&g.instance[A[O].methodName]?g.instance[A[O].methodName]():A[O].bindingFn&&A[O].bindingFn())}}var X={beforeMount:function(g,T,U){x.push(g);var G=W++;g[O]={id:G,documentHandler:K(g,T,U),methodName:T.arg,bindingFn:T.value}},updated:function(g,T,U){g[O].documentHandler=K(g,T,U),g[O].methodName=T.arg,g[O].bindingFn=T.value},unmounted:function(g){for(var T=x.length,U=0;Uet?Q:0,it=V>J?Q:0,ot="margin-bottom: "+nt+"; margin-right: "+it+";";Array.isArray(this.wrapStyle)?(T=Object(o.a)(this.wrapStyle),T.marginRight=Q,T.marginBottom=Q):typeof this.wrapStyle=="string"?T+=ot:T=ot}var ft=Object(t.h)(this.tag,{class:["scrollbar__view",this.viewClass],style:this.viewStyle,ref:"resize"},this.$slots.default()),ht=Object(t.createVNode)("div",{ref:"wrap",style:T,onScroll:this.handleScroll,class:[this.wrapClass,"scrollbar__wrap",g?"":"scrollbar__wrap--hidden-default"]},[[ft]]),pt;return this.native?pt=[Object(t.createVNode)("div",{ref:"wrap",class:[this.wrapClass,"scrollbar__wrap"],style:T},[[ft]])]:pt=[ht,Object(t.createVNode)(Ct,{move:this.moveX,size:this.sizeWidth},null),Object(t.createVNode)(Ct,{vertical:!0,move:this.moveY,size:this.sizeHeight},null)],Object(t.h)("div",{class:"scrollbar"},pt)}};n(88);var Dt=Xt,Yt={class:"v-md-editor__toc-nav"},Jt={class:"v-md-editor__toc-nav-title"};function Qt(A,g,T,U,G,V){return Object(t.openBlock)(),Object(t.createBlock)("ul",Yt,[(Object(t.openBlock)(!0),Object(t.createBlock)(t.Fragment,null,Object(t.renderList)(T.titles,function(Z){return Object(t.openBlock)(),Object(t.createBlock)("li",{style:{paddingLeft:T.indent*Z.indent+"px"},onClick:function(et){return A.$emit("nav-click",Z)},class:"v-md-editor__toc-nav-item"},[Object(t.createVNode)("span",Jt,Object(t.toDisplayString)(Z.title),1)],12,["onClick"])}),256))])}var Ot={name:"toc-nav",props:{titles:Array,indent:{type:Number,default:16}},emits:["nav-click"]};n(89),Ot.render=Qt;var St=Ot,ut,te={inheritAttrs:!1,components:(ut={},ut[h.default.name]=h.default,ut[Tt.name]=Tt,ut[Dt.name]=Dt,ut[St.name]=St,ut),provide:function(){return{markdownEditor:this}},props:{height:String,theme:Object,mode:{type:String,default:ct.a.EDITABLE},autofocus:Boolean,placeholder:String,tocNavPositionRight:Boolean,tabSize:{type:Number,default:2},beforePreviewChange:{type:Function,default:function(g,T){T(g)}}},emits:["blur","change","save","image-click"],data:function(){return{currentMode:this.mode,uploadConfig:{}}},watch:{mode:function(){this.currentMode=this.mode},currentMode:function(){this.currentMode===ct.a.EDITABLE&&this.enableSyncScroll&&this.$nextTick(this.previewSyncScroll)}},created:function(){this.theme&&this.$options.use(this.theme)},computed:{isPreviewMode:function(){return this.currentMode===ct.a.PREVIEW},isEditMode:function(){return this.currentMode===ct.a.EDIT}},mounted:function(){this.autofocus&&this.$nextTick(this.setFocusEnd)},methods:{setFocusEnd:function(){this.editorFocusEnd(),this.editorScrollToTop(9999),this.previewScrollTo(9999)},handleChange:function(g,T){this.$emit("change",g,T)},handleBlur:function(g){this.$emit("blur",g)},handlePreviewImageClick:function(g,T){this.$emit("image-click",g,T)},save:function(){this.$emit("save",this.text,this.$refs.preview.html)},insert:function(g){var T=this;this.focus();var U=this.getCurrentSelectedStr(),G=g(U),V=G.selected,Z=G.text;this.replaceSelectionText(Z),this.$nextTick(function(){T.changeSelctionTo(Z,V)})}}},ee={props:{modelValue:{type:String,default:""}},emits:["update:modelValue"],data:function(){return{text:this.modelValue}},methods:{handleInput:function(g){this.text=g,this.$emit("update:modelValue",g)}}},re={props:{defaultFullscreen:Boolean},emits:["fullscreen-change"],data:function(){return{fullscreen:!1}},watch:{fullscreen:function(){this.$emit("fullscreen-change",this.fullscreen)}},mounted:function(){window.addEventListener("keyup",this.handleWindowKeyup,!1),this.defaultFullscreen&&this.toggleFullScreen()},beforeUnmount:function(){window.removeEventListener("keyup",this.handleWindowKeyup,!1)},methods:{handleWindowKeyup:function(g){g.keyCode===27&&this.fullscreen&&this.toggleFullScreen(!1)},toggleFullScreen:function(g){g===void 0&&(g=!this.fullscreen),this.fullscreen=g;var T=document.querySelectorAll("html, body"),U=T[0],G=T[1],V=this.fullscreen?"hidden":null;G.style.overflow=V,U.style.overflow=V}}};function ne(A,g,T,U,G,V){return Object(t.openBlock)(),Object(t.createBlock)("input",{type:"file",style:{display:"none"},key:G.key,accept:T.uploadConfig.accept,multiple:T.uploadConfig.multiple,onInput:g[1]||(g[1]=function(){return G.handleUpload.apply(G,arguments)}),ref:"fileInput"},null,40,["accept","multiple"])}var ie=n(10),Mt=n.n(ie),oe=n(17),jt={name:"v-md-upload-file",props:{uploadConfig:Object},data:function(){return{handleUpload:function(){},key:0}},methods:{upload:function(){var g=this;return Object(oe.a)(Mt.a.mark(function T(){var U;return Mt.a.wrap(function(V){for(;;)switch(V.prev=V.next){case 0:return V.next=2,g.chooseFile();case 2:return U=V.sent,V.abrupt("return",U);case 4:case"end":return V.stop()}},T)}))()},chooseFile:function(){var g=this;return new Promise(function(T){g.handleUpload=function(U){T(U),g.key++},g.$refs.fileInput.click()})}}};jt.render=ne;var Lt=jt,ae=n(23),kt=n(12),se=n(1),Et,le={accept:"image/*",multiple:!1},ce={components:(Et={},Et[Lt.name]=Lt,Et),props:{uploadImageConfig:Object},emits:["upload-image"],computed:{uploadImgConfig:function(){return Object(c.a)({},le,this.uploadImageConfig)},hasUploadImage:function(){return!this.disabledMenus.includes(ae.default.name+"/upload-image")}},methods:{handleDrop:function(g){var T=Object(kt.a)(g.dataTransfer.files,this.uploadImgConfig);this.emitUploadImage(g,T)},handlePaste:function(g){var T=g.clipboardData;if(!!T){var U=Object(kt.a)(Object(kt.b)(T),this.uploadImgConfig);this.emitUploadImage(g,U)}},emitUploadImage:function(g,T){var U=this;this.hasUploadImage&&T.length&&(g.preventDefault(),this.$emit("upload-image",g,function(G){U.execCommand(se.l,G)},T))}}},dt=n(3),ue={data:function(){return{enableSyncScroll:!0}},methods:{toggleSyncScroll:function(g){g===void 0&&(g=!this.enableSyncScroll),this.enableSyncScroll=g,g&&this.previewSyncScroll()},previewSyncScroll:function(){if(!this.isEditMode){var g=this.$refs.preview.$el,T=this.$refs.previewScroller.$el,U=g.querySelectorAll("["+dt.c+"]"),G=this.getScrollInfo(),V=G.clientHeight,Z=G.top,J=G.height,et=T.querySelector(".scrollbar__wrap");if(V+Z===J){var Q=et.clientHeight,nt=et.scrollHeight;this.previewScrollTo(nt-Q)}else{for(var it,ot,ft=0;ft1?G-1:0),Z=1;Z=0;--N){var W=this.tryEntries[N],K=W.completion;if(W.tryLoc==="root")return O("end");if(W.tryLoc<=this.prev){var X=o.call(W,"catchLoc"),Y=o.call(W,"finallyLoc");if(X&&Y){if(this.prev=0;--O){var N=this.tryEntries[O];if(N.tryLoc<=this.prev&&o.call(N,"finallyLoc")&&this.prev=0;--x){var O=this.tryEntries[x];if(O.finallyLoc===k)return this.complete(O.completion,O.afterLoc),q(O),b}},catch:function(k){for(var x=this.tryEntries.length-1;x>=0;--x){var O=this.tryEntries[x];if(O.tryLoc===k){var N=O.completion;if(N.type==="throw"){var W=N.arg;q(O)}return W}}throw new Error("illegal catch attempt")},delegateYield:function(k,x,O){return this.delegate={iterator:R(k),resultName:x,nextLoc:O},this.method==="next"&&(this.arg=e),b}},i}(v.exports);try{regeneratorRuntime=r}catch{Function("r","regeneratorRuntime = r")(r)}},function(v,l,n){var r={"./bold.js":39,"./clear.js":40,"./code.js":41,"./fullscreen.js":42,"./h1.js":43,"./h2.js":44,"./h3.js":45,"./h4.js":46,"./h5.js":47,"./h6.js":48,"./hr.js":49,"./image.js":50,"./italic.js":51,"./link.js":52,"./ol.js":53,"./quote.js":54,"./redo.js":55,"./strikethrough.js":56,"./sync-scroll.js":57,"./table.js":58,"./ul.js":59,"./undo.js":60};function i(o){var e=t(o);return n(e)}function t(o){if(!n.o(r,o)){var e=new Error("Cannot find module '"+o+"'");throw e.code="MODULE_NOT_FOUND",e}return r[o]}i.keys=function(){return Object.keys(r)},i.resolve=t,v.exports=i,i.id=38},function(v,l,n){n.r(l);var r=n(2),i=n(1);n.d(l,"name",function(){return i.a}),l.default=function(t){t.insert(function(o){var e="**",a="**",s=t.langConfig.bold.placeholder,c=function(p){return p||s},f=Object(r.b)({selected:o,InsertGetter:function(p){return""+e+c(p)+a},selectedGetter:c}),d=f.insertContent,u=f.newSelected;return{text:d,selected:u}})}},function(v,l,n){n.r(l);var r=n(1);n.d(l,"name",function(){return r.b}),l.default=function(i){i.clear()}},function(v,l,n){n.r(l);var r=n(1);n.d(l,"name",function(){return r.c}),l.default=function(i){i.insert(function(t){var o="``` language",e="```",a=o+` +`+e;return t&&(a=o+` + `+t+` +`+e),{text:a,selected:"language"}})}},function(v,l,n){n.r(l);var r=n(1);n.d(l,"name",function(){return r.d}),l.default=function(i,t){i.toggleFullScreen(t)}},function(v,l,n){n.r(l);var r=n(2),i=n(1);n.d(l,"name",function(){return i.e}),l.default=function(t){t.insert(function(o){var e="#",a=t.langConfig.h1.placeholder,s=function(h){return h||a},c=Object(r.b)({selected:o,InsertGetter:function(h){return e+" "+s(h)},selectedGetter:s}),f=c.insertContent,d=c.newSelected;return{text:f,selected:d}})}},function(v,l,n){n.r(l);var r=n(2),i=n(1);n.d(l,"name",function(){return i.f}),l.default=function(t){t.insert(function(o){var e="##",a=t.langConfig.h2.placeholder,s=function(h){return h||a},c=Object(r.b)({selected:o,InsertGetter:function(h){return e+" "+s(h)},selectedGetter:s}),f=c.insertContent,d=c.newSelected;return{text:f,selected:d}})}},function(v,l,n){n.r(l);var r=n(2),i=n(1);n.d(l,"name",function(){return i.g}),l.default=function(t){t.insert(function(o){var e="###",a=t.langConfig.h3.placeholder,s=function(h){return h||a},c=Object(r.b)({selected:o,InsertGetter:function(h){return e+" "+s(h)},selectedGetter:s}),f=c.insertContent,d=c.newSelected;return{text:f,selected:d}})}},function(v,l,n){n.r(l);var r=n(2),i=n(1);n.d(l,"name",function(){return i.h}),l.default=function(t){t.insert(function(o){var e="####",a=t.langConfig.h4.placeholder,s=function(h){return h||a},c=Object(r.b)({selected:o,InsertGetter:function(h){return e+" "+s(h)},selectedGetter:s}),f=c.insertContent,d=c.newSelected;return{text:f,selected:d}})}},function(v,l,n){n.r(l);var r=n(2),i=n(1);n.d(l,"name",function(){return i.i}),l.default=function(t){t.insert(function(o){var e="#####",a=t.langConfig.h5.placeholder,s=function(h){return h||a},c=Object(r.b)({selected:o,InsertGetter:function(h){return e+" "+s(h)},selectedGetter:s}),f=c.insertContent,d=c.newSelected;return{text:f,selected:d}})}},function(v,l,n){n.r(l);var r=n(2),i=n(1);n.d(l,"name",function(){return i.j}),l.default=function(t){t.insert(function(o){var e="######",a=t.langConfig.h6.placeholder,s=function(h){return h||a},c=Object(r.b)({selected:o,InsertGetter:function(h){return e+" "+s(h)},selectedGetter:s}),f=c.insertContent,d=c.newSelected;return{text:f,selected:d}})}},function(v,l,n){n.r(l);var r=n(1);n.d(l,"name",function(){return r.k}),l.default=function(i){i.insert(function(){return{text:"------------------------------------"}})}},function(v,l,n){n.r(l);var r=n(1);n.d(l,"name",function(){return r.l}),l.default=function(i,t){var o=t===void 0?{}:t,e=o.url,a=o.desc,s=o.width,c=o.height;i.insert(function(){var f="http://",d="Description",u=f,h="!["+(a||d)+"]("+(e||f)+")",p=[];return s&&p.push('width="'+s+'"'),c&&p.push('height="'+c+'"'),p.length&&(h+="{{{"+p.join(" ")+"}}}"),e&&a?u=null:e?u=d:a&&(u=f),{text:h,selected:u}})}},function(v,l,n){n.r(l);var r=n(2),i=n(1);n.d(l,"name",function(){return i.m}),l.default=function(t){t.insert(function(o){var e="*",a="*",s=t.langConfig.italic.placeholder,c=function(p){return p||s},f=Object(r.b)({selected:o,InsertGetter:function(p){return""+e+c(p)+a},selectedGetter:c}),d=f.insertContent,u=f.newSelected;return{text:d,selected:u}})}},function(v,l,n){n.r(l);var r=n(2),i=n(1);n.d(l,"name",function(){return i.n}),l.default=function(t){t.insert(function(o){var e=t.langConfig.link.descPlaceholder,a="http://",s=Object(r.b)({selected:o,InsertGetter:function(u){return"["+(u||e)+"]("+a+")"},selectedGetter:function(u){return u?a:e}}),c=s.insertContent,f=s.newSelected;return{text:c,selected:f}})}},function(v,l,n){n.r(l);var r=n(2),i=n(1);n.d(l,"name",function(){return i.o}),l.default=function(t){t.insert(function(o){var e=t.langConfig.ol.placeholder,a=function(u){return u||e},s=Object(r.b)({selected:o,InsertGetter:function(u,h){return h+". "+a(u)},selectedGetter:a,ignoreEmptyLine:!1}),c=s.insertContent,f=s.newSelected;return{text:c,selected:f}})}},function(v,l,n){n.r(l);var r=n(1);n.d(l,"name",function(){return r.p}),l.default=function(i){i.insert(function(t){var o=">",e=t||i.langConfig.quote.placeholder;return{text:o+" "+e,selected:e}})}},function(v,l,n){n.r(l);var r=n(1);n.d(l,"name",function(){return r.q}),l.default=function(i){i.redo()}},function(v,l,n){n.r(l);var r=n(2),i=n(1);n.d(l,"name",function(){return i.r}),l.default=function(t){t.insert(function(o){var e="~~",a="~~",s=t.langConfig.strikethrough.placeholder,c=function(p){return p||s},f=Object(r.b)({selected:o,InsertGetter:function(p){return""+e+c(p)+a},selectedGetter:c}),d=f.insertContent,u=f.newSelected;return{text:d,selected:u}})}},function(v,l,n){n.r(l);var r=n(1);n.d(l,"name",function(){return r.s}),l.default=function(i,t){i.toggleSyncScroll(t)}},function(v,l,n){n.r(l);var r=n(1);n.d(l,"name",function(){return r.t}),l.default=function(i){i.insert(function(){var t=`|column1|column2|column3| +|-|-|-| +|content1|content2|content3|`;return{text:t,selected:"column1"}})}},function(v,l,n){n.r(l);var r=n(2),i=n(1);n.d(l,"name",function(){return i.u}),l.default=function(t){t.insert(function(o){var e=t.langConfig.ul.placeholder,a=function(u){return u||e},s=Object(r.b)({selected:o,InsertGetter:function(u){return"- "+a(u)},selectedGetter:a,ignoreEmptyLine:!1}),c=s.insertContent,f=s.newSelected;return{text:c,selected:f}})}},function(v,l,n){n.r(l);var r=n(1);n.d(l,"name",function(){return r.v}),l.default=function(i){i.undo()}},function(v,l,n){var r={"./bold.js":62,"./clear.js":63,"./code.js":64,"./fullscreen.js":65,"./h.js":66,"./hr.js":67,"./image.js":23,"./italic.js":68,"./link.js":69,"./ol.js":70,"./preview.js":71,"./quote.js":72,"./redo.js":73,"./save.js":74,"./strikethrough.js":75,"./sync-scroll.js":76,"./table.js":77,"./toc.js":78,"./ul.js":79,"./undo.js":80};function i(o){var e=t(o);return n(e)}function t(o){if(!n.o(r,o)){var e=new Error("Cannot find module '"+o+"'");throw e.code="MODULE_NOT_FOUND",e}return r[o]}i.keys=function(){return Object.keys(r)},i.resolve=t,v.exports=i,i.id=61},function(v,l,n){n.r(l);var r=n(1);l.default={name:r.a,icon:"v-md-icon-bold",title:function(t){return t.langConfig.bold.toolbar+"\uFF08Ctrl+B\uFF09"},action:function(t){t.execCommand(r.a)}}},function(v,l,n){n.r(l);var r=n(1);l.default={name:r.b,icon:"v-md-icon-clear",title:function(t){return t.langConfig.clear.toolbar},action:function(t){t.execCommand(r.b)}}},function(v,l,n){n.r(l);var r=n(1);l.default={name:r.c,icon:"v-md-icon-code",title:function(t){return t.langConfig.code.toolbar},action:function(t){t.execCommand(r.c)}}},function(v,l,n){n.r(l);var r=n(1);l.default={name:r.d,icon:"v-md-icon-fullscreen",title:function(t){var o=t.langConfig.fullscreen;return t.fullscreen?o.disabled:o.enabled},active:function(t){return t.fullscreen},action:function(t){t.execCommand(r.d,!t.fullscreen)}}},function(v,l,n){n.r(l);var r=n(1);l.default={name:"h",text:"H",title:function(t){return t.langConfig.h.toolbar+"\uFF08Ctrl+1~6\uFF09"},menus:[{name:r.e,text:function(t){return t.langConfig.h1.toolbar},action:function(t){t.execCommand(r.e)}},{name:r.f,text:function(t){return t.langConfig.h2.toolbar},action:function(t){t.execCommand(r.f)}},{name:r.g,text:function(t){return t.langConfig.h3.toolbar},action:function(t){t.execCommand(r.g)}},{name:r.h,text:function(t){return t.langConfig.h4.toolbar},action:function(t){t.execCommand(r.h)}},{name:r.i,text:function(t){return t.langConfig.h5.toolbar},action:function(t){t.execCommand(r.i)}},{name:r.j,text:function(t){return t.langConfig.h6.toolbar},action:function(t){t.execCommand(r.j)}}]}},function(v,l,n){n.r(l);var r=n(1);l.default={name:r.k,icon:"v-md-icon-horizontal",title:function(t){return t.langConfig.hr.toolbar},action:function(t){t.execCommand(r.k)}}},function(v,l,n){n.r(l);var r=n(1);l.default={name:r.m,icon:"v-md-icon-italic",title:function(t){return t.langConfig.italic.toolbar+"\uFF08Ctrl+I\uFF09"},action:function(t){t.execCommand(r.m)}}},function(v,l,n){n.r(l);var r=n(1);l.default={name:r.n,icon:"v-md-icon-link",title:function(t){return t.langConfig.link.toolbar+"\uFF08Ctrl+L\uFF09"},action:function(t){t.execCommand(r.n)}}},function(v,l,n){n.r(l);var r=n(1);l.default={name:r.o,icon:"v-md-icon-ol",title:function(t){return t.langConfig.ol.toolbar+"\uFF08Ctrl+O\uFF09"},action:function(t){t.execCommand(r.o)}}},function(v,l,n){n.r(l);var r=n(4);l.default={name:"preview",icon:"v-md-icon-preview",title:function(t){var o=t.langConfig.preview;return t.currentMode===r.a.EDITABLE?o.disabled:o.enabled},active:function(t){return t.currentMode===r.a.EDITABLE},action:function(t){t.currentMode=t.currentMode===r.a.EDITABLE?r.a.EDIT:r.a.EDITABLE}}},function(v,l,n){n.r(l);var r=n(1);l.default={name:r.p,icon:"v-md-icon-quote",title:function(t){return t.langConfig.quote.toolbar+"\uFF08Ctrl+Q\uFF09"},action:function(t){t.execCommand(r.p)}}},function(v,l,n){n.r(l);var r=n(1);l.default={name:r.q,icon:"v-md-icon-redo",title:function(t){return t.langConfig.redo.toolbar+"\uFF08Ctrl+Y\uFF09"},action:function(t){t.execCommand(r.q)}}},function(v,l,n){n.r(l),l.default={name:"save",icon:"v-md-icon-save",title:function(i){return i.langConfig.save.toolbar+"\uFF08Ctrl+S\uFF09"},action:function(i){i.save()}}},function(v,l,n){n.r(l);var r=n(1);l.default={name:r.r,icon:"v-md-icon-strikethrough",title:function(t){return t.langConfig.strikethrough.toolbar},action:function(t){t.execCommand(r.r)}}},function(v,l,n){n.r(l);var r=n(1);l.default={name:r.s,icon:"v-md-icon-sync",title:function(t){var o=t.langConfig.syncScroll;return t.enableSyncScroll?o.disabled:o.enabled},active:function(t){return t.enableSyncScroll},action:function(t){t.execCommand(r.s,!t.enableSyncScroll)}}},function(v,l,n){n.r(l);var r=n(1);l.default={name:r.t,icon:"v-md-icon-table",title:function(t){return t.langConfig.table.toolbar},action:function(t){t.execCommand(r.t)}}},function(v,l,n){n.r(l),l.default={name:"toc",icon:"v-md-icon-toc",title:function(i){var t=i.langConfig.toc;return i.tocVisible?t.disabled:t.enabled},active:function(i){return i.tocVisible},action:function(i){i.toggleToc()}}},function(v,l,n){n.r(l);var r=n(1);l.default={name:r.u,icon:"v-md-icon-ul",title:function(t){return t.langConfig.ul.toolbar+"\uFF08Ctrl+U\uFF09"},action:function(t){t.execCommand(r.u)}}},function(v,l,n){n.r(l);var r=n(1);l.default={name:r.v,icon:"v-md-icon-undo",title:function(t){return t.langConfig.undo.toolbar+"\uFF08Ctrl+Z\uFF09"},action:function(t){t.execCommand(r.v)}}},function(v,l,n){},function(v,l,n){n(27)},function(v,l,n){n(28)},function(v,l,n){n(29)},function(v,l,n){n(30)},function(v,l){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch{typeof window=="object"&&(n=window)}v.exports=n},function(v,l,n){n(31)},function(v,l,n){n(32)},function(v,l,n){n(33)},function(v,l,n){var r={"./bold.js":91,"./h1.js":92,"./h2.js":93,"./h3.js":94,"./h4.js":95,"./h5.js":96,"./h6.js":97,"./italic.js":98,"./link.js":99,"./ol.js":100,"./quote.js":101,"./save.js":102,"./ul.js":103};function i(o){var e=t(o);return n(e)}function t(o){if(!n.o(r,o)){var e=new Error("Cannot find module '"+o+"'");throw e.code="MODULE_NOT_FOUND",e}return r[o]}i.keys=function(){return Object.keys(r)},i.resolve=t,v.exports=i,i.id=90},function(v,l,n){n.r(l);var r=n(1);l.default={modifier:"ctrl",key:"b",action:function(t){t.execCommand(r.a)}}},function(v,l,n){n.r(l);var r=n(1);l.default={modifier:"ctrl",key:"1",action:function(t){t.execCommand(r.e)}}},function(v,l,n){n.r(l);var r=n(1);l.default={modifier:"ctrl",key:"2",action:function(t){t.execCommand(r.f)}}},function(v,l,n){n.r(l);var r=n(1);l.default={modifier:"ctrl",key:"3",action:function(t){t.execCommand(r.g)}}},function(v,l,n){n.r(l);var r=n(1);l.default={modifier:"ctrl",key:"4",action:function(t){t.execCommand(r.h)}}},function(v,l,n){n.r(l);var r=n(1);l.default={modifier:"ctrl",key:"5",action:function(t){t.execCommand(r.i)}}},function(v,l,n){n.r(l);var r=n(1);l.default={modifier:"ctrl",key:"6",action:function(t){t.execCommand(r.j)}}},function(v,l,n){n.r(l);var r=n(1);l.default={modifier:"ctrl",key:"i",action:function(t){t.execCommand(r.m)}}},function(v,l,n){n.r(l);var r=n(1);l.default={modifier:"ctrl",key:"l",action:function(t){t.execCommand(r.n)}}},function(v,l,n){n.r(l);var r=n(1);l.default={modifier:"ctrl",key:"o",action:function(t){t.execCommand(r.o)}}},function(v,l,n){n.r(l);var r=n(1);l.default={modifier:"ctrl",key:"q",action:function(t){t.execCommand(r.p)}}},function(v,l,n){n.r(l),l.default={modifier:"ctrl",key:"s",action:function(i){i.save()}}},function(v,l,n){n.r(l);var r=n(1);l.default={modifier:"ctrl",key:"u",action:function(t){t.execCommand(r.u)}}},function(v,l,n){},,function(v,l,n){n(104)},,function(v,l,n){n.r(l);var r=n(0);function i(D,w,H,$,q,I){var R=Object(r.resolveComponent)("toc-nav"),B=Object(r.resolveComponent)("scrollbar"),k=Object(r.resolveComponent)("v-md-textarea-editor"),x=Object(r.resolveComponent)("v-md-preview"),O=Object(r.resolveComponent)("v-md-upload-file"),N=Object(r.resolveComponent)("v-md-container");return Object(r.openBlock)(),Object(r.createBlock)(N,{"left-toolbar":D.leftToolbar,"right-toolbar":D.rightToolbar,toolbars:D.toolbars,"disabled-menus":D.disabledMenus,height:D.height,fullscreen:D.fullscreen,"left-area-visible":D.tocVisible,"left-area-title":D.langConfig.toc.title,"left-area-reverse":D.tocNavPositionRight,mode:D.currentMode,onEditorWrapperClick:D.handleEditorWrapperClick,onToolbarItemClick:D.handleToolbarItemClick,onToolbarMenuClick:D.handleToolbarMenuClick,ref:"contaner"},{"left-area":Object(r.withCtx)(function(){return[Object(r.createVNode)(B,null,{default:Object(r.withCtx)(function(){return[Object(r.createVNode)(R,{titles:D.titles,onNavClick:D.handleNavClick},null,8,["titles","onNavClick"])]}),_:1})]}),editor:Object(r.withCtx)(function(){return[Object(r.createVNode)(B,{onScroll:D.handleEditorScroll,ref:"editorScroller"},{default:Object(r.withCtx)(function(){return[Object(r.createVNode)(k,{"model-value":D.text,"min-height":D.textEditorMinHeight,placeholder:D.placeholder,"onUpdate:modelValue":D.handleInput,onClick:w[1]||(w[1]=Object(r.withModifiers)(function(){},["stop"])),onDrop:D.handleDrop,onPaste:D.handlePaste,onBlur:D.handleBlur,ref:"editorEgine"},null,8,["model-value","min-height","placeholder","onUpdate:modelValue","onDrop","onPaste","onBlur"])]}),_:1},8,["onScroll"])]}),preview:Object(r.withCtx)(function(){return[Object(r.createVNode)(B,{ref:"previewScroller"},{default:Object(r.withCtx)(function(){return[Object(r.createVNode)(x,{text:D.text,"tab-size":D.tabSize,"scroll-container":D.getPreviewScrollContainer,"before-change":D.beforePreviewChange,onChange:D.handleChange,onImageClick:D.handlePreviewImageClick,ref:"preview"},null,8,["text","tab-size","scroll-container","before-change","onChange","onImageClick"])]}),_:1},512)]}),default:Object(r.withCtx)(function(){return[D.hasUploadImage?(Object(r.openBlock)(),Object(r.createBlock)(O,{key:0,"upload-config":D.uploadConfig,ref:"uploadFile"},null,8,["upload-config"])):Object(r.createCommentVNode)("v-if",!0)]}),_:1},8,["left-toolbar","right-toolbar","toolbars","disabled-menus","height","fullscreen","left-area-visible","left-area-title","left-area-reverse","mode","onEditorWrapperClick","onToolbarItemClick","onToolbarMenuClick"])}var t=n(10),o=n.n(t),e=n(17),a={class:"v-md-textarea-editor"},s=Object(r.createVNode)("br",null,null,-1);function c(D,w,H,$,q,I){return Object(r.openBlock)(),Object(r.createBlock)("div",a,[Object(r.createVNode)("pre",{style:{minHeight:H.minHeight}},[(Object(r.openBlock)(!0),Object(r.createBlock)(r.Fragment,null,Object(r.renderList)(H.modelValue.split(` +`),function(R,B){return Object(r.openBlock)(),Object(r.createBlock)("section",{"data-line":B+1},[Object(r.createTextVNode)(Object(r.toDisplayString)(R||" "),1),s],8,["data-line"])}),256))],4),Object(r.createVNode)("textarea",{ref:"textarea",value:H.modelValue,placeholder:H.placeholder,spellcheck:"false",onCompositionstart:w[1]||(w[1]=function(){return I.handleCompositionStart.apply(I,arguments)}),onCompositionupdate:w[2]||(w[2]=function(){return I.handleCompositionUpdate.apply(I,arguments)}),onCompositionend:w[3]||(w[3]=function(){return I.handleCompositionEnd.apply(I,arguments)}),onInput:w[4]||(w[4]=function(){return I.handleInput.apply(I,arguments)}),onClick:w[5]||(w[5]=function(){return I.updateCurrentHistoryRange.apply(I,arguments)}),onPaste:w[6]||(w[6]=function(){return I.handlePaste.apply(I,arguments)}),onBlur:w[7]||(w[7]=function(){return I.handleBlur.apply(I,arguments)}),onKeydown:[w[8]||(w[8]=Object(r.withKeys)(Object(r.withModifiers)(function(){},["prevent"]),["tab"])),w[9]||(w[9]=Object(r.withKeys)(Object(r.withModifiers)(function(){return I.undo.apply(I,arguments)},["ctrl","prevent","exact"]),["z"])),w[10]||(w[10]=Object(r.withKeys)(Object(r.withModifiers)(function(){return I.undo.apply(I,arguments)},["meta","prevent","exact"]),["z"])),w[11]||(w[11]=Object(r.withKeys)(Object(r.withModifiers)(function(){return I.redo.apply(I,arguments)},["ctrl","prevent","exact"]),["y"])),w[12]||(w[12]=Object(r.withKeys)(Object(r.withModifiers)(function(){return I.redo.apply(I,arguments)},["meta","prevent","exact"]),["y"]))],onKeyup:[w[13]||(w[13]=Object(r.withKeys)(Object(r.withModifiers)(function(){return I.updateCurrentHistoryRange.apply(I,arguments)},["shift","exact"]),["up"])),w[14]||(w[14]=Object(r.withKeys)(Object(r.withModifiers)(function(){return I.updateCurrentHistoryRange.apply(I,arguments)},["shift","exact"]),["down"])),w[15]||(w[15]=Object(r.withKeys)(Object(r.withModifiers)(function(){return I.updateCurrentHistoryRange.apply(I,arguments)},["shift","exact"]),["left"])),w[16]||(w[16]=Object(r.withKeys)(Object(r.withModifiers)(function(){return I.updateCurrentHistoryRange.apply(I,arguments)},["shift","exact"]),["right"]))]},null,40,["value","placeholder"])])}var f=n(5),d;function u(D){if(D.nodeName!=="TEXTAREA")return!1;if(typeof d=="undefined"){var w=document.createElement("textarea");w.value=1,d=!!w.firstChild}return d}function h(D,w){if(D.focus(),document.selection){var H=document.selection.createRange();H.text=w,H.collapse(!1),H.select();return}var $=document.execCommand("insertText",!1,w);if(!$){var q=D.selectionStart,I=D.selectionEnd;if(typeof D.setRangeText=="function")D.setRangeText(w);else{var R=document.createRange(),B=document.createTextNode(w);if(u(D)){var k=D.firstChild;if(!k)D.appendChild(B);else{for(var x=0,O=null,N=null;k&&(O===null||N===null);){var W=k.nodeValue.length;q>=x&&q<=x+W&&R.setStart(O=k,q-x),I>=x&&I<=x+W&&R.setEnd(N=k,I-x),x+=W,k=k.nextSibling}q!==I&&R.deleteContents()}}if(u(D)&&R.commonAncestorContainer.nodeName==="#text")R.insertNode(B);else{var K=D.value;D.value=K.slice(0,q)+w+K.slice(I)}}D.setSelectionRange(q+w.length,q+w.length);var X=document.createEvent("UIEvent");X.initEvent("input",!0,!1),D.dispatchEvent(X)}}var p=h,m=n(36),C=n(2),E={name:"v-md-textarea-editor",props:{modelValue:String,minHeight:String,placeholder:String,historyDebounce:{type:Number,default:400},historyMax:{type:Number,default:30}},emits:["blur","paste","update:modelValue"],data:function(){return{isComposing:!1}},computed:{textareaEl:function(){return this.$refs.textarea}},watch:{modelValue:function(){var w=this;this.clearTimeout(),this.triggerInputBySetHistory||(this.timmer=setTimeout(function(){w.saveHistory(),w.clearTimeout()},this.historyDebounce))}},created:function(){this.historyStack=[],this.historyIndex=0,this.hotkeysManager=new m.a},mounted:function(){this.saveHistory(),this.textareaEl.addEventListener("keydown",this.handleKeydown,!1)},beforeUnmount:function(){this.textareaEl.removeEventListener("keydown",this.handleKeydown,!1)},methods:{handleCompositionStart:function(){this.isComposing=!0},handleCompositionUpdate:function(w){var H=w.target.value,$=H[H.length-1]||"";this.isComposing=!Object(C.e)($)},handleCompositionEnd:function(w){this.isComposing&&(this.isComposing=!1,this.handleInput(w))},handlePaste:function(w){this.$emit("paste",w)},handleBlur:function(w){this.$emit("blur",w)},registerHotkeys:function(){var w;(w=this.hotkeysManager).registerHotkeys.apply(w,arguments)},handleKeydown:function(w){this.hotkeysManager.dispatch(w)},heightAtLine:function(w){var H=this.$el.querySelector('section[data-line="'+w+'"]');return H?H.offsetTop+H.offsetHeight:0},clearTimeout:function(D){function w(){return D.apply(this,arguments)}return w.toString=function(){return D.toString()},w}(function(){this.timmer&&clearTimeout(this.timmer),this.timmer=null}),updateCurrentHistoryRange:function(){this.timmer||this.updateHistory(this.historyIndex,{range:this.getRange()})},handleInput:function(w){this.isComposing||this.$emit("update:modelValue",w.target.value)},saveHistory:function(){var w=this.getRange(),H={value:this.modelValue,range:w};this.historyStack=this.historyStack.slice(0,this.historyIndex+1),this.historyStack.push(H),this.historyStack.length>this.historyMax&&this.historyStack.shift(),this.historyIndex=this.historyStack.length-1},updateHistory:function(w,H){var $=this.historyStack[w];"value"in H&&($.value=H.value),Object(f.a)($.range,H.range)},goHistory:function(w){var H=this,$=this.historyStack[w],q=$.value,I=$.range;this.$emit("update:modelValue",q),this.triggerInputBySetHistory=!0,this.$nextTick(function(){H.triggerInputBySetHistory=!1,H.setRange(I)})},getRange:function(){return{start:this.textareaEl.selectionStart,end:this.textareaEl.selectionEnd}},setRange:function(w){var H=w.start,$=w.end;this.textareaEl.setSelectionRange(H,$),this.updateCurrentHistoryRange()},focus:function(){this.textareaEl.focus()},insertText:function(w){p(this.textareaEl,w)},undo:function(){this.historyIndex>0&&(this.historyIndex--,this.goHistory(this.historyIndex))},redo:function(){this.historyIndexH?this.text.slice(H,$):null},changeSelctionTo:function(w,H){var $=this.$refs.editorEgine,q=w.indexOf(H),I=$.getRange().end;if(q!==-1){var R=this.text.slice(0,I),B=R.length-w.length,k=B+q,x=k+H.length;this.$refs.editorEgine.setRange({start:k,end:x})}}}};Object(y.a)(P);var S=P;S.render=i;var M=S,j=n(7);n(18);var F="2.3.15",z=function(w){w.component(M.name,M)};M.version=F,M.install=z,M.xss=j.a,M.use=function(D,w){return typeof D=="function"?D(M,w):D.install(M,w),M},l.default=M}]).default})})(zt);var De=Bt(zt.exports),Ut={exports:{}};(function(vt,Nt){(function(L,v){vt.exports=v()})(typeof self!="undefined"?self:Rt,function(){return function(L){var v={};function l(n){if(v[n])return v[n].exports;var r=v[n]={i:n,l:!1,exports:{}};return L[n].call(r.exports,r,r.exports,l),r.l=!0,r.exports}return l.m=L,l.c=v,l.d=function(n,r,i){l.o(n,r)||Object.defineProperty(n,r,{enumerable:!0,get:i})},l.r=function(n){typeof Symbol!="undefined"&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},l.t=function(n,r){if(1&r&&(n=l(n)),8&r||4&r&&typeof n=="object"&&n&&n.__esModule)return n;var i=Object.create(null);if(l.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&r&&typeof n!="string")for(var t in n)l.d(i,t,function(o){return n[o]}.bind(null,t));return i},l.n=function(n){var r=n&&n.__esModule?function(){return n.default}:function(){return n};return l.d(r,"a",r),r},l.o=function(n,r){return Object.prototype.hasOwnProperty.call(n,r)},l.p="",l(l.s=86)}([function(L,v,l){var n=Object.prototype.hasOwnProperty;function r(m,C){return n.call(m,C)}function i(m){return!(m>=55296&&m<=57343)&&!(m>=64976&&m<=65007)&&(65535&m)!=65535&&(65535&m)!=65534&&!(m>=0&&m<=8)&&m!==11&&!(m>=14&&m<=31)&&!(m>=127&&m<=159)&&!(m>1114111)}function t(m){if(m>65535){var C=55296+((m-=65536)>>10),E=56320+(1023&m);return String.fromCharCode(C,E)}return String.fromCharCode(m)}var o=/\\([!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])/g,e=new RegExp(o.source+"|"+/&([a-z#][a-z0-9]{1,31});/gi.source,"gi"),a=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i,s=l(7),c=/[&<>"]/,f=/[&<>"]/g,d={"&":"&","<":"<",">":">",'"':"""};function u(m){return d[m]}var h=/[.?*+^$[\]\\(){}|-]/g,p=l(3);v.lib={},v.lib.mdurl=l(8),v.lib.ucmicro=l(26),v.assign=function(m){var C=Array.prototype.slice.call(arguments,1);return C.forEach(function(E){if(E){if(typeof E!="object")throw new TypeError(E+"must be object");Object.keys(E).forEach(function(b){m[b]=E[b]})}}),m},v.isString=function(m){return function(C){return Object.prototype.toString.call(C)}(m)==="[object String]"},v.has=r,v.unescapeMd=function(m){return m.indexOf("\\")<0?m:m.replace(o,"$1")},v.unescapeAll=function(m){return m.indexOf("\\")<0&&m.indexOf("&")<0?m:m.replace(e,function(C,E,b){return E||function(y,_){var P=0;return r(s,_)?s[_]:_.charCodeAt(0)===35&&a.test(_)&&i(P=_[1].toLowerCase()==="x"?parseInt(_.slice(2),16):parseInt(_.slice(1),10))?t(P):y}(C,b)})},v.isValidEntityCode=i,v.fromCodePoint=t,v.escapeHtml=function(m){return c.test(m)?m.replace(f,u):m},v.arrayReplaceAt=function(m,C,E){return[].concat(m.slice(0,C),E,m.slice(C+1))},v.isSpace=function(m){switch(m){case 9:case 32:return!0}return!1},v.isWhiteSpace=function(m){if(m>=8192&&m<=8202)return!0;switch(m){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1},v.isMdAsciiPunct=function(m){switch(m){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}},v.isPunctChar=function(m){return p.test(m)},v.escapeRE=function(m){return m.replace(h,"\\$&")},v.normalizeReference=function(m){return m=m.trim().replace(/\s+/g," "),"\u1E9E".toLowerCase()==="\u1E7E"&&(m=m.replace(/ẞ/g,"\xDF")),m.toLowerCase().toUpperCase()}},function(L,v,l){function n(){return(n=Object.assign||function(r){for(var i=1;i'+m+""}}v.b=function(){var o=new r.a;return o.set({html:!0,breaks:!0,linkify:!1,typographer:!0}),o}},function(L,v){L.exports=/[!-#%-\*,-\/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4E\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD803[\uDF55-\uDF59]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD806[\uDC3B\uDE3F-\uDE46\uDE9A-\uDE9C\uDE9E-\uDEA2]|\uD807[\uDC41-\uDC45\uDC70\uDC71\uDEF7\uDEF8]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD81B[\uDE97-\uDE9A]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/},function(L,v,l){function n(){this.__rules__=[],this.__cache__=null}n.prototype.__find__=function(r){for(var i=0;i=0&&(t=this.attrs[i][1]),t},n.prototype.attrJoin=function(r,i){var t=this.attrIndex(r);t<0?this.attrPush([r,i]):this.attrs[t][1]=this.attrs[t][1]+" "+i},L.exports=n},function(L,v,l){const n=/[\u0000-\u001f]/g,r=/[\s~`!@#$%^&*()\-_+=[\]{}|\\;:"'“”‘’–—<>,.?/]+/g,i=/[\u0300-\u036F]/g;L.exports=function(t){return t.normalize("NFKD").replace(i,"").replace(n,"").replace(r,"-").replace(/\-{2,}/g,"-").replace(/^\-+|\-+$/g,"").replace(/^(\d)/,"_$1").toLowerCase()}},function(L,v,l){L.exports=l(21)},function(L,v,l){L.exports.encode=l(22),L.exports.decode=l(23),L.exports.format=l(24),L.exports.parse=l(25)},function(L,v){L.exports=/[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/},function(L,v){L.exports=/[\0-\x1F\x7F-\x9F]/},function(L,v){L.exports=/[ \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]/},function(L,v,l){var n=`<[A-Za-z][A-Za-z0-9\\-]*(?:\\s+[a-zA-Z_:][a-zA-Z0-9:._-]*(?:\\s*=\\s*(?:[^"'=<>\`\\x00-\\x20]+|'[^']*'|"[^"]*"))?)*\\s*\\/?>`,r="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",i=new RegExp("^(?:"+n+"|"+r+"|||<[?][\\s\\S]*?[?]>|]*>|)"),t=new RegExp("^(?:"+n+"|"+r+")");L.exports.HTML_TAG_RE=i,L.exports.HTML_OPEN_CLOSE_TAG_RE=t},function(L,v,l){function n(r,i){var t,o,e,a,s,c=[],f=i.length;for(t=0;t=0;t--)(o=i[t]).marker!==95&&o.marker!==42||o.end!==-1&&(e=i[o.end],c=t>0&&i[t-1].end===o.end+1&&i[t-1].marker===o.marker&&i[t-1].token===o.token-1&&i[o.end+1].token===e.token+1,s=String.fromCharCode(o.marker),(a=r.tokens[o.token]).type=c?"strong_open":"em_open",a.tag=c?"strong":"em",a.nesting=1,a.markup=c?s+s:s,a.content="",(a=r.tokens[e.token]).type=c?"strong_close":"em_close",a.tag=c?"strong":"em",a.nesting=-1,a.markup=c?s+s:s,a.content="",c&&(r.tokens[i[t-1].token].content="",r.tokens[i[o.end+1].token].content="",t--))}L.exports.tokenize=function(r,i){var t,o,e=r.pos,a=r.src.charCodeAt(e);if(i||a!==95&&a!==42)return!1;for(o=r.scanDelims(r.pos,a===42),t=0;t=0?h[p]:h[h.length+p]);var h,p;if(u===void 0)return f;for(let m in c)if(m!=="shift"&&m!=="position"){if(u[m]===void 0)return f;if(m==="children"&&t(c.children)){if(u.children.length===0)return f;let C,E=c.children,b=u.children;if(E.every(y=>y.position!==void 0)){if(C=E.every(y=>i(b,y.position,y).match),C){let y=e(E).position;f.j=y>=0?y:b.length+y}}else for(let y=0;yi(b,y,_).match),C){f.j=y;break}if(C===!1)return f}else switch(typeof c[m]){case"boolean":case"number":case"string":if(u[m]!==c[m])return f;break;case"function":if(!c[m](u[m]))return f;break;case"object":if(o(c[m])){if(c[m].every(C=>C(u[m]))===!1)return f;break}default:throw new Error(`Unknown type of pattern test (key: ${m}). Test should be of type boolean, number, string, function or array of functions.`)}}return f.match=!0,f}function t(a){return Array.isArray(a)&&a.length&&a.every(s=>typeof s=="object")}function o(a){return Array.isArray(a)&&a.length&&a.every(s=>typeof s=="function")}function e(a){return a.slice(-1)[0]||{}}L.exports=function(a,s){let c=Object.assign({},r);c=Object.assign(c,s);const f=n(c);a.core.ruler.before("linkify","curly_attributes",function(d){let u=d.tokens;for(let h=0;h{let b=i(u,h,E);return b.j!==null&&(C=b.j),b.match})&&(m.transform(u,h,C),m.name!=="inline attributes"&&m.name!=="inline nesting 0"||p--)}})}},function(L,v,l){L.exports=l(20)},function(L,v,l){l.r(v),l.d(v,"default",function(){return h});var n=l(1),r=l(15),i=l.n(r),t=function(p,m){var C=(m===void 0?{}:m).lineMarkup,E=C===void 0?"data-line":C,b=function(S,M,j,F,z){return z.renderToken(S,M,j)};function y(S){return function(M,j,F,z,D){var w=M[j];return w.attrPush([E,w.map[0]+1]),S(M,j,F,z,D)}}function _(S){return function(M,j,F,z,D){var w=S(M,j,F,z,D),H=M[j].map[0]+1;return"
'+w+"
"}}var P={table_open:y,blockquote_open:y,bullet_list_open:y,ordered_list_open:y,reference_open:y,heading_open:y,lheading_open:y,paragraph_open:y,hr:y,html_block:_,code_block:_,fence:_};Object.keys(P).forEach(function(S){var M=p.renderer.rules[S]||b;p.renderer.rules[S]=P[S](M)})},o=function(p,m){m===void 0&&(m={});var C=m.getMarks;C&&p.core.ruler.push("anchor",function(E){var b={},y=E.tokens;y.filter(function(_){return _.type==="heading_open"}).forEach(function(_){var P=y[y.indexOf(_)+1].content,S=Number(_.tag.substr(1));b[P]=P in b?Number(b[P])+1:"";var M=C(P,S,b[P]);M&&M.forEach(function(j){var F=j.attr,z=j.value;_.attrPush([F,z])})})})},e={includeLevel:[2,3],containerClass:"table-of-contents",listClass:"table-of-content-list",listItemClass:"table-of-content-list-item",markerPattern:/^\[\[toc\]\]/im,listType:"ul",getAnchorAttrs:function(){return[]},format:void 0,forceFullToc:!1,containerHeaderHtml:void 0,containerFooterHtml:void 0,transformLink:void 0},a=function(p,m){var C,E=Object(n.a)({},e,m),b=E.markerPattern;function y(_,P,S){for(var M,j,F=[],z="",D=P.length,w=_;wM){z+=(j=y(w,P,S))[1],w=j[0];continue}if(q'+F.join("")+""];q==M&&(z+="",F.push(z))}else M=q;var I=$.children.reduce(function(x,O){return x+O.content},""),R=$.content,B=S[R]=R in S?Number(S[R])+1:"",k=E.getAnchorAttrs(R,q,B);z='
  • + ",z+=I,z+="",w++}else w++}return z+=z===""?"":"
  • ",F.push(z),[w,"<"+E.listType+' class="'+E.listClass+'">'+F.join("")+""]}p.renderer.rules.toc_open=function(_,P){var S='
    ';return E.containerHeaderHtml&&(S+=E.containerHeaderHtml),S},p.renderer.rules.toc_close=function(_,P){var S="";return E.containerFooterHtml&&(S=E.containerFooterHtml),S+"
    "},p.renderer.rules.toc_body=function(_,P){var S={};if(E.forceFullToc){for(var M="",j=0,F=C&&C.tokens&&C.tokens.length;j
    '+H+"
    "}},y=p.renderer.rules,_=y.fence,P=y.code_block;p.renderer.rules.fence=b(_),p.renderer.rules.code_block=b(P)},c=function(p,m){var C=m.externalAttrs,E=m.openLinkIcon,b=m.openLinkIconClass,y=!1;p.renderer.rules.link_open=function(_,P,S,M,j){var F=_[P],z=F.attrIndex("href");if(z>=0){var D=F.attrs[z][1];/^https?:/.test(D)&&(Object.keys(C).forEach(function(w){F.attrSet(w,C[w])}),/_blank/i.test(C.target)&&(y=!0))}return j.renderToken(_,P,S)},p.renderer.rules.link_close=function(_,P,S,M,j){return y&&(y=!1,E)?b?''+j.renderToken(_,P,S):''+j.renderToken(_,P,S):j.renderToken(_,P,S)}},f=l(6),d=l.n(f),u=l(2);function h(p){var m=p===void 0?{}:p,C=m.toc,E=m.link,b=m.attrs,y=Object(u.b)();return y.use(c,Object(n.a)({externalAttrs:{target:"_blank"}},E)).use(s,{getWrapperClass:function(_){return"v-md-pre-wrapper v-md-pre-wrapper-"+_}}).use(i.a,Object(n.a)({leftDelimiter:"{{{",rightDelimiter:"}}}"},b,{allowedAttributes:["width","height"].concat(b==null?void 0:b.allowedAttributes)})).use(o,{getMarks:function(_,P,S){return[{attr:"data-v-md-heading",value:d()(_)+(S?"-"+S:"")}]}}).use(a,Object(n.a)({listClass:"v-md-toc",listItemClass:"v-md-toc-item",getAnchorAttrs:function(_,P,S){return[{attr:"data-v-md-anchor",value:d()(_)+(S?"-"+S:"")}]}},C)).use(t,{lineMarkup:"data-v-md-line"}),{previewClass:"markdown-body",extend:function(_){_(y)},markdownParser:y}}},function(L,v,l){const n=l(19);function r(i){return i.slice(-1)[0]}L.exports=i=>{const t=new RegExp("^ {0,3}[-*_]{3,} ?"+n.escapeRegExp(i.leftDelimiter)+"[^"+n.escapeRegExp(i.rightDelimiter)+"]");return[{name:"fenced code blocks",tests:[{shift:0,block:!0,info:n.hasDelimiters("end",i)}],transform:(o,e)=>{let a=o[e],s=a.info.lastIndexOf(i.leftDelimiter),c=n.getAttrs(a.info,s,i);n.addAttrs(c,a),a.info=n.removeDelimiter(a.info,i)}},{name:"inline nesting 0",tests:[{shift:0,type:"inline",children:[{shift:-1,type:o=>o==="image"||o==="code_inline"},{shift:0,type:"text",content:n.hasDelimiters("start",i)}]}],transform:(o,e,a)=>{let s=o[e].children[a],c=s.content.indexOf(i.rightDelimiter),f=o[e].children[a-1],d=n.getAttrs(s.content,0,i);n.addAttrs(d,f),s.content.length===c+i.rightDelimiter.length?o[e].children.splice(a,1):s.content=s.content.slice(c+i.rightDelimiter.length)}},{name:"tables",tests:[{shift:0,type:"table_close"},{shift:1,type:"paragraph_open"},{shift:2,type:"inline",content:n.hasDelimiters("only",i)}],transform:(o,e)=>{let a=o[e+2],s=n.getMatchingOpeningToken(o,e),c=n.getAttrs(a.content,0,i);n.addAttrs(c,s),o.splice(e+1,3)}},{name:"inline attributes",tests:[{shift:0,type:"inline",children:[{shift:-1,nesting:-1},{shift:0,type:"text",content:n.hasDelimiters("start",i)}]}],transform:(o,e,a)=>{let s=o[e].children[a],c=s.content,f=n.getAttrs(c,0,i),d=n.getMatchingOpeningToken(o[e].children,a-1);n.addAttrs(f,d),s.content=c.slice(c.indexOf(i.rightDelimiter)+i.rightDelimiter.length)}},{name:"list softbreak",tests:[{shift:-2,type:"list_item_open"},{shift:0,type:"inline",children:[{position:-2,type:"softbreak"},{position:-1,type:"text",content:n.hasDelimiters("only",i)}]}],transform:(o,e,a)=>{let s=o[e].children[a].content,c=n.getAttrs(s,0,i),f=e-2;for(;o[f-1]&&o[f-1].type!=="ordered_list_open"&&o[f-1].type!=="bullet_list_open";)f--;n.addAttrs(c,o[f-1]),o[e].children=o[e].children.slice(0,-2)}},{name:"list double softbreak",tests:[{shift:0,type:o=>o==="bullet_list_close"||o==="ordered_list_close"},{shift:1,type:"paragraph_open"},{shift:2,type:"inline",content:n.hasDelimiters("only",i),children:o=>o.length===1},{shift:3,type:"paragraph_close"}],transform:(o,e)=>{let a=o[e+2].content,s=n.getAttrs(a,0,i),c=n.getMatchingOpeningToken(o,e);n.addAttrs(s,c),o.splice(e+1,3)}},{name:"list item end",tests:[{shift:-2,type:"list_item_open"},{shift:0,type:"inline",children:[{position:-1,type:"text",content:n.hasDelimiters("end",i)}]}],transform:(o,e,a)=>{let s=o[e].children[a],c=s.content,f=n.getAttrs(c,c.lastIndexOf(i.leftDelimiter),i);n.addAttrs(f,o[e-2]);let d=c.slice(0,c.lastIndexOf(i.leftDelimiter));s.content=r(d)!==" "?d:d.slice(0,-1)}},{name:` +{.a} softbreak then curly in start`,tests:[{shift:0,type:"inline",children:[{position:-2,type:"softbreak"},{position:-1,type:"text",content:n.hasDelimiters("only",i)}]}],transform:(o,e,a)=>{let s=o[e].children[a],c=n.getAttrs(s.content,0,i),f=e+1;for(;o[f+1]&&o[f+1].nesting===-1;)f++;let d=n.getMatchingOpeningToken(o,f);n.addAttrs(c,d),o[e].children=o[e].children.slice(0,-2)}},{name:"horizontal rule",tests:[{shift:0,type:"paragraph_open"},{shift:1,type:"inline",children:o=>o.length===1,content:o=>o.match(t)!==null},{shift:2,type:"paragraph_close"}],transform:(o,e)=>{let a=o[e];a.type="hr",a.tag="hr",a.nesting=0;let s=o[e+1].content,c=s.lastIndexOf(i.leftDelimiter);a.attrs=n.getAttrs(s,c,i),a.markup=s,o.splice(e+1,2)}},{name:"end of block",tests:[{shift:0,type:"inline",children:[{position:-1,content:n.hasDelimiters("end",i),type:o=>o!=="code_inline"}]}],transform:(o,e,a)=>{let s=o[e].children[a],c=s.content,f=n.getAttrs(c,c.lastIndexOf(i.leftDelimiter),i),d=e+1;for(;o[d+1]&&o[d+1].nesting===-1;)d++;let u=n.getMatchingOpeningToken(o,d);n.addAttrs(f,u);let h=c.slice(0,c.lastIndexOf(i.leftDelimiter));s.content=r(h)!==" "?h:h.slice(0,-1)}}]}},function(L,v,l){function n(e){return e.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")}v.getAttrs=function(e,a,s){const c=/[^\t\n\f />"'=]/,f=[];let d="",u="",h=!0,p=!1;for(let m=a+s.leftDelimiter.length;m=h+1:m.length>=h}(s.substring(c,f+a.rightDelimiter.length))}},v.removeDelimiter=function(e,a){const s=n(a.leftDelimiter),c=n(a.rightDelimiter);let f=new RegExp("[ \\n]?"+s+"[^"+s+c+"]+"+c+"$"),d=e.search(f);return d!==-1?e.slice(0,d):e},v.escapeRegExp=n,v.getMatchingOpeningToken=function(e,a){if(e[a].type==="softbreak")return!1;if(e[a].nesting===0)return e[a];let s=e[a].level,c=e[a].type.replace("_close","_open");for(;a>=0;--a)if(e[a].type===c&&e[a].level===s)return e[a]};let r=/[&<>"]/,i=/[&<>"]/g,t={"&":"&","<":"<",">":">",'"':"""};function o(e){return t[e]}v.escapeHtml=function(e){return r.test(e)?e.replace(i,o):e}},function(L,v,l){var n=l(0),r=l(28),i=l(32),t=l(33),o=l(41),e=l(55),a=l(68),s=l(8),c=l(70),f={default:l(73),zero:l(74),commonmark:l(75)},d=/^(vbscript|javascript|file|data):/,u=/^data:image\/(gif|png|jpeg|webp);/;function h(b){var y=b.trim().toLowerCase();return!d.test(y)||!!u.test(y)}var p=["http:","https:","mailto:"];function m(b){var y=s.parse(b,!0);if(y.hostname&&(!y.protocol||p.indexOf(y.protocol)>=0))try{y.hostname=c.toASCII(y.hostname)}catch{}return s.encode(s.format(y))}function C(b){var y=s.parse(b,!0);if(y.hostname&&(!y.protocol||p.indexOf(y.protocol)>=0))try{y.hostname=c.toUnicode(y.hostname)}catch{}return s.decode(s.format(y),s.decode.defaultChars+"%")}function E(b,y){if(!(this instanceof E))return new E(b,y);y||n.isString(b)||(y=b||{},b="default"),this.inline=new e,this.block=new o,this.core=new t,this.renderer=new i,this.linkify=new a,this.validateLink=h,this.normalizeLink=m,this.normalizeLinkText=C,this.utils=n,this.helpers=n.assign({},r),this.options={},this.configure(b),y&&this.set(y)}E.prototype.set=function(b){return n.assign(this.options,b),this},E.prototype.configure=function(b){var y,_=this;if(n.isString(b)&&!(b=f[y=b]))throw new Error('Wrong `markdown-it` preset "'+y+'", check name');if(!b)throw new Error("Wrong `markdown-it` preset, can't be empty");return b.options&&_.set(b.options),b.components&&Object.keys(b.components).forEach(function(P){b.components[P].rules&&_[P].ruler.enableOnly(b.components[P].rules),b.components[P].rules2&&_[P].ruler2.enableOnly(b.components[P].rules2)}),this},E.prototype.enable=function(b,y){var _=[];Array.isArray(b)||(b=[b]),["core","block","inline"].forEach(function(S){_=_.concat(this[S].ruler.enable(b,!0))},this),_=_.concat(this.inline.ruler2.enable(b,!0));var P=b.filter(function(S){return _.indexOf(S)<0});if(P.length&&!y)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+P);return this},E.prototype.disable=function(b,y){var _=[];Array.isArray(b)||(b=[b]),["core","block","inline"].forEach(function(S){_=_.concat(this[S].ruler.disable(b,!0))},this),_=_.concat(this.inline.ruler2.disable(b,!0));var P=b.filter(function(S){return _.indexOf(S)<0});if(P.length&&!y)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+P);return this},E.prototype.use=function(b){var y=[this].concat(Array.prototype.slice.call(arguments,1));return b.apply(b,y),this},E.prototype.parse=function(b,y){if(typeof b!="string")throw new Error("Input data should be a String");var _=new this.core.State(b,this,y);return this.core.process(_),_.tokens},E.prototype.render=function(b,y){return y=y||{},this.renderer.render(this.parse(b,y),this.options,y)},E.prototype.parseInline=function(b,y){var _=new this.core.State(b,this,y);return _.inlineMode=!0,this.core.process(_),_.tokens},E.prototype.renderInline=function(b,y){return y=y||{},this.renderer.render(this.parseInline(b,y),this.options,y)},L.exports=E},function(L){L.exports=JSON.parse('{"Aacute":"\xC1","aacute":"\xE1","Abreve":"\u0102","abreve":"\u0103","ac":"\u223E","acd":"\u223F","acE":"\u223E\u0333","Acirc":"\xC2","acirc":"\xE2","acute":"\xB4","Acy":"\u0410","acy":"\u0430","AElig":"\xC6","aelig":"\xE6","af":"\u2061","Afr":"\u{1D504}","afr":"\u{1D51E}","Agrave":"\xC0","agrave":"\xE0","alefsym":"\u2135","aleph":"\u2135","Alpha":"\u0391","alpha":"\u03B1","Amacr":"\u0100","amacr":"\u0101","amalg":"\u2A3F","amp":"&","AMP":"&","andand":"\u2A55","And":"\u2A53","and":"\u2227","andd":"\u2A5C","andslope":"\u2A58","andv":"\u2A5A","ang":"\u2220","ange":"\u29A4","angle":"\u2220","angmsdaa":"\u29A8","angmsdab":"\u29A9","angmsdac":"\u29AA","angmsdad":"\u29AB","angmsdae":"\u29AC","angmsdaf":"\u29AD","angmsdag":"\u29AE","angmsdah":"\u29AF","angmsd":"\u2221","angrt":"\u221F","angrtvb":"\u22BE","angrtvbd":"\u299D","angsph":"\u2222","angst":"\xC5","angzarr":"\u237C","Aogon":"\u0104","aogon":"\u0105","Aopf":"\u{1D538}","aopf":"\u{1D552}","apacir":"\u2A6F","ap":"\u2248","apE":"\u2A70","ape":"\u224A","apid":"\u224B","apos":"\'","ApplyFunction":"\u2061","approx":"\u2248","approxeq":"\u224A","Aring":"\xC5","aring":"\xE5","Ascr":"\u{1D49C}","ascr":"\u{1D4B6}","Assign":"\u2254","ast":"*","asymp":"\u2248","asympeq":"\u224D","Atilde":"\xC3","atilde":"\xE3","Auml":"\xC4","auml":"\xE4","awconint":"\u2233","awint":"\u2A11","backcong":"\u224C","backepsilon":"\u03F6","backprime":"\u2035","backsim":"\u223D","backsimeq":"\u22CD","Backslash":"\u2216","Barv":"\u2AE7","barvee":"\u22BD","barwed":"\u2305","Barwed":"\u2306","barwedge":"\u2305","bbrk":"\u23B5","bbrktbrk":"\u23B6","bcong":"\u224C","Bcy":"\u0411","bcy":"\u0431","bdquo":"\u201E","becaus":"\u2235","because":"\u2235","Because":"\u2235","bemptyv":"\u29B0","bepsi":"\u03F6","bernou":"\u212C","Bernoullis":"\u212C","Beta":"\u0392","beta":"\u03B2","beth":"\u2136","between":"\u226C","Bfr":"\u{1D505}","bfr":"\u{1D51F}","bigcap":"\u22C2","bigcirc":"\u25EF","bigcup":"\u22C3","bigodot":"\u2A00","bigoplus":"\u2A01","bigotimes":"\u2A02","bigsqcup":"\u2A06","bigstar":"\u2605","bigtriangledown":"\u25BD","bigtriangleup":"\u25B3","biguplus":"\u2A04","bigvee":"\u22C1","bigwedge":"\u22C0","bkarow":"\u290D","blacklozenge":"\u29EB","blacksquare":"\u25AA","blacktriangle":"\u25B4","blacktriangledown":"\u25BE","blacktriangleleft":"\u25C2","blacktriangleright":"\u25B8","blank":"\u2423","blk12":"\u2592","blk14":"\u2591","blk34":"\u2593","block":"\u2588","bne":"=\u20E5","bnequiv":"\u2261\u20E5","bNot":"\u2AED","bnot":"\u2310","Bopf":"\u{1D539}","bopf":"\u{1D553}","bot":"\u22A5","bottom":"\u22A5","bowtie":"\u22C8","boxbox":"\u29C9","boxdl":"\u2510","boxdL":"\u2555","boxDl":"\u2556","boxDL":"\u2557","boxdr":"\u250C","boxdR":"\u2552","boxDr":"\u2553","boxDR":"\u2554","boxh":"\u2500","boxH":"\u2550","boxhd":"\u252C","boxHd":"\u2564","boxhD":"\u2565","boxHD":"\u2566","boxhu":"\u2534","boxHu":"\u2567","boxhU":"\u2568","boxHU":"\u2569","boxminus":"\u229F","boxplus":"\u229E","boxtimes":"\u22A0","boxul":"\u2518","boxuL":"\u255B","boxUl":"\u255C","boxUL":"\u255D","boxur":"\u2514","boxuR":"\u2558","boxUr":"\u2559","boxUR":"\u255A","boxv":"\u2502","boxV":"\u2551","boxvh":"\u253C","boxvH":"\u256A","boxVh":"\u256B","boxVH":"\u256C","boxvl":"\u2524","boxvL":"\u2561","boxVl":"\u2562","boxVL":"\u2563","boxvr":"\u251C","boxvR":"\u255E","boxVr":"\u255F","boxVR":"\u2560","bprime":"\u2035","breve":"\u02D8","Breve":"\u02D8","brvbar":"\xA6","bscr":"\u{1D4B7}","Bscr":"\u212C","bsemi":"\u204F","bsim":"\u223D","bsime":"\u22CD","bsolb":"\u29C5","bsol":"\\\\","bsolhsub":"\u27C8","bull":"\u2022","bullet":"\u2022","bump":"\u224E","bumpE":"\u2AAE","bumpe":"\u224F","Bumpeq":"\u224E","bumpeq":"\u224F","Cacute":"\u0106","cacute":"\u0107","capand":"\u2A44","capbrcup":"\u2A49","capcap":"\u2A4B","cap":"\u2229","Cap":"\u22D2","capcup":"\u2A47","capdot":"\u2A40","CapitalDifferentialD":"\u2145","caps":"\u2229\uFE00","caret":"\u2041","caron":"\u02C7","Cayleys":"\u212D","ccaps":"\u2A4D","Ccaron":"\u010C","ccaron":"\u010D","Ccedil":"\xC7","ccedil":"\xE7","Ccirc":"\u0108","ccirc":"\u0109","Cconint":"\u2230","ccups":"\u2A4C","ccupssm":"\u2A50","Cdot":"\u010A","cdot":"\u010B","cedil":"\xB8","Cedilla":"\xB8","cemptyv":"\u29B2","cent":"\xA2","centerdot":"\xB7","CenterDot":"\xB7","cfr":"\u{1D520}","Cfr":"\u212D","CHcy":"\u0427","chcy":"\u0447","check":"\u2713","checkmark":"\u2713","Chi":"\u03A7","chi":"\u03C7","circ":"\u02C6","circeq":"\u2257","circlearrowleft":"\u21BA","circlearrowright":"\u21BB","circledast":"\u229B","circledcirc":"\u229A","circleddash":"\u229D","CircleDot":"\u2299","circledR":"\xAE","circledS":"\u24C8","CircleMinus":"\u2296","CirclePlus":"\u2295","CircleTimes":"\u2297","cir":"\u25CB","cirE":"\u29C3","cire":"\u2257","cirfnint":"\u2A10","cirmid":"\u2AEF","cirscir":"\u29C2","ClockwiseContourIntegral":"\u2232","CloseCurlyDoubleQuote":"\u201D","CloseCurlyQuote":"\u2019","clubs":"\u2663","clubsuit":"\u2663","colon":":","Colon":"\u2237","Colone":"\u2A74","colone":"\u2254","coloneq":"\u2254","comma":",","commat":"@","comp":"\u2201","compfn":"\u2218","complement":"\u2201","complexes":"\u2102","cong":"\u2245","congdot":"\u2A6D","Congruent":"\u2261","conint":"\u222E","Conint":"\u222F","ContourIntegral":"\u222E","copf":"\u{1D554}","Copf":"\u2102","coprod":"\u2210","Coproduct":"\u2210","copy":"\xA9","COPY":"\xA9","copysr":"\u2117","CounterClockwiseContourIntegral":"\u2233","crarr":"\u21B5","cross":"\u2717","Cross":"\u2A2F","Cscr":"\u{1D49E}","cscr":"\u{1D4B8}","csub":"\u2ACF","csube":"\u2AD1","csup":"\u2AD0","csupe":"\u2AD2","ctdot":"\u22EF","cudarrl":"\u2938","cudarrr":"\u2935","cuepr":"\u22DE","cuesc":"\u22DF","cularr":"\u21B6","cularrp":"\u293D","cupbrcap":"\u2A48","cupcap":"\u2A46","CupCap":"\u224D","cup":"\u222A","Cup":"\u22D3","cupcup":"\u2A4A","cupdot":"\u228D","cupor":"\u2A45","cups":"\u222A\uFE00","curarr":"\u21B7","curarrm":"\u293C","curlyeqprec":"\u22DE","curlyeqsucc":"\u22DF","curlyvee":"\u22CE","curlywedge":"\u22CF","curren":"\xA4","curvearrowleft":"\u21B6","curvearrowright":"\u21B7","cuvee":"\u22CE","cuwed":"\u22CF","cwconint":"\u2232","cwint":"\u2231","cylcty":"\u232D","dagger":"\u2020","Dagger":"\u2021","daleth":"\u2138","darr":"\u2193","Darr":"\u21A1","dArr":"\u21D3","dash":"\u2010","Dashv":"\u2AE4","dashv":"\u22A3","dbkarow":"\u290F","dblac":"\u02DD","Dcaron":"\u010E","dcaron":"\u010F","Dcy":"\u0414","dcy":"\u0434","ddagger":"\u2021","ddarr":"\u21CA","DD":"\u2145","dd":"\u2146","DDotrahd":"\u2911","ddotseq":"\u2A77","deg":"\xB0","Del":"\u2207","Delta":"\u0394","delta":"\u03B4","demptyv":"\u29B1","dfisht":"\u297F","Dfr":"\u{1D507}","dfr":"\u{1D521}","dHar":"\u2965","dharl":"\u21C3","dharr":"\u21C2","DiacriticalAcute":"\xB4","DiacriticalDot":"\u02D9","DiacriticalDoubleAcute":"\u02DD","DiacriticalGrave":"`","DiacriticalTilde":"\u02DC","diam":"\u22C4","diamond":"\u22C4","Diamond":"\u22C4","diamondsuit":"\u2666","diams":"\u2666","die":"\xA8","DifferentialD":"\u2146","digamma":"\u03DD","disin":"\u22F2","div":"\xF7","divide":"\xF7","divideontimes":"\u22C7","divonx":"\u22C7","DJcy":"\u0402","djcy":"\u0452","dlcorn":"\u231E","dlcrop":"\u230D","dollar":"$","Dopf":"\u{1D53B}","dopf":"\u{1D555}","Dot":"\xA8","dot":"\u02D9","DotDot":"\u20DC","doteq":"\u2250","doteqdot":"\u2251","DotEqual":"\u2250","dotminus":"\u2238","dotplus":"\u2214","dotsquare":"\u22A1","doublebarwedge":"\u2306","DoubleContourIntegral":"\u222F","DoubleDot":"\xA8","DoubleDownArrow":"\u21D3","DoubleLeftArrow":"\u21D0","DoubleLeftRightArrow":"\u21D4","DoubleLeftTee":"\u2AE4","DoubleLongLeftArrow":"\u27F8","DoubleLongLeftRightArrow":"\u27FA","DoubleLongRightArrow":"\u27F9","DoubleRightArrow":"\u21D2","DoubleRightTee":"\u22A8","DoubleUpArrow":"\u21D1","DoubleUpDownArrow":"\u21D5","DoubleVerticalBar":"\u2225","DownArrowBar":"\u2913","downarrow":"\u2193","DownArrow":"\u2193","Downarrow":"\u21D3","DownArrowUpArrow":"\u21F5","DownBreve":"\u0311","downdownarrows":"\u21CA","downharpoonleft":"\u21C3","downharpoonright":"\u21C2","DownLeftRightVector":"\u2950","DownLeftTeeVector":"\u295E","DownLeftVectorBar":"\u2956","DownLeftVector":"\u21BD","DownRightTeeVector":"\u295F","DownRightVectorBar":"\u2957","DownRightVector":"\u21C1","DownTeeArrow":"\u21A7","DownTee":"\u22A4","drbkarow":"\u2910","drcorn":"\u231F","drcrop":"\u230C","Dscr":"\u{1D49F}","dscr":"\u{1D4B9}","DScy":"\u0405","dscy":"\u0455","dsol":"\u29F6","Dstrok":"\u0110","dstrok":"\u0111","dtdot":"\u22F1","dtri":"\u25BF","dtrif":"\u25BE","duarr":"\u21F5","duhar":"\u296F","dwangle":"\u29A6","DZcy":"\u040F","dzcy":"\u045F","dzigrarr":"\u27FF","Eacute":"\xC9","eacute":"\xE9","easter":"\u2A6E","Ecaron":"\u011A","ecaron":"\u011B","Ecirc":"\xCA","ecirc":"\xEA","ecir":"\u2256","ecolon":"\u2255","Ecy":"\u042D","ecy":"\u044D","eDDot":"\u2A77","Edot":"\u0116","edot":"\u0117","eDot":"\u2251","ee":"\u2147","efDot":"\u2252","Efr":"\u{1D508}","efr":"\u{1D522}","eg":"\u2A9A","Egrave":"\xC8","egrave":"\xE8","egs":"\u2A96","egsdot":"\u2A98","el":"\u2A99","Element":"\u2208","elinters":"\u23E7","ell":"\u2113","els":"\u2A95","elsdot":"\u2A97","Emacr":"\u0112","emacr":"\u0113","empty":"\u2205","emptyset":"\u2205","EmptySmallSquare":"\u25FB","emptyv":"\u2205","EmptyVerySmallSquare":"\u25AB","emsp13":"\u2004","emsp14":"\u2005","emsp":"\u2003","ENG":"\u014A","eng":"\u014B","ensp":"\u2002","Eogon":"\u0118","eogon":"\u0119","Eopf":"\u{1D53C}","eopf":"\u{1D556}","epar":"\u22D5","eparsl":"\u29E3","eplus":"\u2A71","epsi":"\u03B5","Epsilon":"\u0395","epsilon":"\u03B5","epsiv":"\u03F5","eqcirc":"\u2256","eqcolon":"\u2255","eqsim":"\u2242","eqslantgtr":"\u2A96","eqslantless":"\u2A95","Equal":"\u2A75","equals":"=","EqualTilde":"\u2242","equest":"\u225F","Equilibrium":"\u21CC","equiv":"\u2261","equivDD":"\u2A78","eqvparsl":"\u29E5","erarr":"\u2971","erDot":"\u2253","escr":"\u212F","Escr":"\u2130","esdot":"\u2250","Esim":"\u2A73","esim":"\u2242","Eta":"\u0397","eta":"\u03B7","ETH":"\xD0","eth":"\xF0","Euml":"\xCB","euml":"\xEB","euro":"\u20AC","excl":"!","exist":"\u2203","Exists":"\u2203","expectation":"\u2130","exponentiale":"\u2147","ExponentialE":"\u2147","fallingdotseq":"\u2252","Fcy":"\u0424","fcy":"\u0444","female":"\u2640","ffilig":"\uFB03","fflig":"\uFB00","ffllig":"\uFB04","Ffr":"\u{1D509}","ffr":"\u{1D523}","filig":"\uFB01","FilledSmallSquare":"\u25FC","FilledVerySmallSquare":"\u25AA","fjlig":"fj","flat":"\u266D","fllig":"\uFB02","fltns":"\u25B1","fnof":"\u0192","Fopf":"\u{1D53D}","fopf":"\u{1D557}","forall":"\u2200","ForAll":"\u2200","fork":"\u22D4","forkv":"\u2AD9","Fouriertrf":"\u2131","fpartint":"\u2A0D","frac12":"\xBD","frac13":"\u2153","frac14":"\xBC","frac15":"\u2155","frac16":"\u2159","frac18":"\u215B","frac23":"\u2154","frac25":"\u2156","frac34":"\xBE","frac35":"\u2157","frac38":"\u215C","frac45":"\u2158","frac56":"\u215A","frac58":"\u215D","frac78":"\u215E","frasl":"\u2044","frown":"\u2322","fscr":"\u{1D4BB}","Fscr":"\u2131","gacute":"\u01F5","Gamma":"\u0393","gamma":"\u03B3","Gammad":"\u03DC","gammad":"\u03DD","gap":"\u2A86","Gbreve":"\u011E","gbreve":"\u011F","Gcedil":"\u0122","Gcirc":"\u011C","gcirc":"\u011D","Gcy":"\u0413","gcy":"\u0433","Gdot":"\u0120","gdot":"\u0121","ge":"\u2265","gE":"\u2267","gEl":"\u2A8C","gel":"\u22DB","geq":"\u2265","geqq":"\u2267","geqslant":"\u2A7E","gescc":"\u2AA9","ges":"\u2A7E","gesdot":"\u2A80","gesdoto":"\u2A82","gesdotol":"\u2A84","gesl":"\u22DB\uFE00","gesles":"\u2A94","Gfr":"\u{1D50A}","gfr":"\u{1D524}","gg":"\u226B","Gg":"\u22D9","ggg":"\u22D9","gimel":"\u2137","GJcy":"\u0403","gjcy":"\u0453","gla":"\u2AA5","gl":"\u2277","glE":"\u2A92","glj":"\u2AA4","gnap":"\u2A8A","gnapprox":"\u2A8A","gne":"\u2A88","gnE":"\u2269","gneq":"\u2A88","gneqq":"\u2269","gnsim":"\u22E7","Gopf":"\u{1D53E}","gopf":"\u{1D558}","grave":"`","GreaterEqual":"\u2265","GreaterEqualLess":"\u22DB","GreaterFullEqual":"\u2267","GreaterGreater":"\u2AA2","GreaterLess":"\u2277","GreaterSlantEqual":"\u2A7E","GreaterTilde":"\u2273","Gscr":"\u{1D4A2}","gscr":"\u210A","gsim":"\u2273","gsime":"\u2A8E","gsiml":"\u2A90","gtcc":"\u2AA7","gtcir":"\u2A7A","gt":">","GT":">","Gt":"\u226B","gtdot":"\u22D7","gtlPar":"\u2995","gtquest":"\u2A7C","gtrapprox":"\u2A86","gtrarr":"\u2978","gtrdot":"\u22D7","gtreqless":"\u22DB","gtreqqless":"\u2A8C","gtrless":"\u2277","gtrsim":"\u2273","gvertneqq":"\u2269\uFE00","gvnE":"\u2269\uFE00","Hacek":"\u02C7","hairsp":"\u200A","half":"\xBD","hamilt":"\u210B","HARDcy":"\u042A","hardcy":"\u044A","harrcir":"\u2948","harr":"\u2194","hArr":"\u21D4","harrw":"\u21AD","Hat":"^","hbar":"\u210F","Hcirc":"\u0124","hcirc":"\u0125","hearts":"\u2665","heartsuit":"\u2665","hellip":"\u2026","hercon":"\u22B9","hfr":"\u{1D525}","Hfr":"\u210C","HilbertSpace":"\u210B","hksearow":"\u2925","hkswarow":"\u2926","hoarr":"\u21FF","homtht":"\u223B","hookleftarrow":"\u21A9","hookrightarrow":"\u21AA","hopf":"\u{1D559}","Hopf":"\u210D","horbar":"\u2015","HorizontalLine":"\u2500","hscr":"\u{1D4BD}","Hscr":"\u210B","hslash":"\u210F","Hstrok":"\u0126","hstrok":"\u0127","HumpDownHump":"\u224E","HumpEqual":"\u224F","hybull":"\u2043","hyphen":"\u2010","Iacute":"\xCD","iacute":"\xED","ic":"\u2063","Icirc":"\xCE","icirc":"\xEE","Icy":"\u0418","icy":"\u0438","Idot":"\u0130","IEcy":"\u0415","iecy":"\u0435","iexcl":"\xA1","iff":"\u21D4","ifr":"\u{1D526}","Ifr":"\u2111","Igrave":"\xCC","igrave":"\xEC","ii":"\u2148","iiiint":"\u2A0C","iiint":"\u222D","iinfin":"\u29DC","iiota":"\u2129","IJlig":"\u0132","ijlig":"\u0133","Imacr":"\u012A","imacr":"\u012B","image":"\u2111","ImaginaryI":"\u2148","imagline":"\u2110","imagpart":"\u2111","imath":"\u0131","Im":"\u2111","imof":"\u22B7","imped":"\u01B5","Implies":"\u21D2","incare":"\u2105","in":"\u2208","infin":"\u221E","infintie":"\u29DD","inodot":"\u0131","intcal":"\u22BA","int":"\u222B","Int":"\u222C","integers":"\u2124","Integral":"\u222B","intercal":"\u22BA","Intersection":"\u22C2","intlarhk":"\u2A17","intprod":"\u2A3C","InvisibleComma":"\u2063","InvisibleTimes":"\u2062","IOcy":"\u0401","iocy":"\u0451","Iogon":"\u012E","iogon":"\u012F","Iopf":"\u{1D540}","iopf":"\u{1D55A}","Iota":"\u0399","iota":"\u03B9","iprod":"\u2A3C","iquest":"\xBF","iscr":"\u{1D4BE}","Iscr":"\u2110","isin":"\u2208","isindot":"\u22F5","isinE":"\u22F9","isins":"\u22F4","isinsv":"\u22F3","isinv":"\u2208","it":"\u2062","Itilde":"\u0128","itilde":"\u0129","Iukcy":"\u0406","iukcy":"\u0456","Iuml":"\xCF","iuml":"\xEF","Jcirc":"\u0134","jcirc":"\u0135","Jcy":"\u0419","jcy":"\u0439","Jfr":"\u{1D50D}","jfr":"\u{1D527}","jmath":"\u0237","Jopf":"\u{1D541}","jopf":"\u{1D55B}","Jscr":"\u{1D4A5}","jscr":"\u{1D4BF}","Jsercy":"\u0408","jsercy":"\u0458","Jukcy":"\u0404","jukcy":"\u0454","Kappa":"\u039A","kappa":"\u03BA","kappav":"\u03F0","Kcedil":"\u0136","kcedil":"\u0137","Kcy":"\u041A","kcy":"\u043A","Kfr":"\u{1D50E}","kfr":"\u{1D528}","kgreen":"\u0138","KHcy":"\u0425","khcy":"\u0445","KJcy":"\u040C","kjcy":"\u045C","Kopf":"\u{1D542}","kopf":"\u{1D55C}","Kscr":"\u{1D4A6}","kscr":"\u{1D4C0}","lAarr":"\u21DA","Lacute":"\u0139","lacute":"\u013A","laemptyv":"\u29B4","lagran":"\u2112","Lambda":"\u039B","lambda":"\u03BB","lang":"\u27E8","Lang":"\u27EA","langd":"\u2991","langle":"\u27E8","lap":"\u2A85","Laplacetrf":"\u2112","laquo":"\xAB","larrb":"\u21E4","larrbfs":"\u291F","larr":"\u2190","Larr":"\u219E","lArr":"\u21D0","larrfs":"\u291D","larrhk":"\u21A9","larrlp":"\u21AB","larrpl":"\u2939","larrsim":"\u2973","larrtl":"\u21A2","latail":"\u2919","lAtail":"\u291B","lat":"\u2AAB","late":"\u2AAD","lates":"\u2AAD\uFE00","lbarr":"\u290C","lBarr":"\u290E","lbbrk":"\u2772","lbrace":"{","lbrack":"[","lbrke":"\u298B","lbrksld":"\u298F","lbrkslu":"\u298D","Lcaron":"\u013D","lcaron":"\u013E","Lcedil":"\u013B","lcedil":"\u013C","lceil":"\u2308","lcub":"{","Lcy":"\u041B","lcy":"\u043B","ldca":"\u2936","ldquo":"\u201C","ldquor":"\u201E","ldrdhar":"\u2967","ldrushar":"\u294B","ldsh":"\u21B2","le":"\u2264","lE":"\u2266","LeftAngleBracket":"\u27E8","LeftArrowBar":"\u21E4","leftarrow":"\u2190","LeftArrow":"\u2190","Leftarrow":"\u21D0","LeftArrowRightArrow":"\u21C6","leftarrowtail":"\u21A2","LeftCeiling":"\u2308","LeftDoubleBracket":"\u27E6","LeftDownTeeVector":"\u2961","LeftDownVectorBar":"\u2959","LeftDownVector":"\u21C3","LeftFloor":"\u230A","leftharpoondown":"\u21BD","leftharpoonup":"\u21BC","leftleftarrows":"\u21C7","leftrightarrow":"\u2194","LeftRightArrow":"\u2194","Leftrightarrow":"\u21D4","leftrightarrows":"\u21C6","leftrightharpoons":"\u21CB","leftrightsquigarrow":"\u21AD","LeftRightVector":"\u294E","LeftTeeArrow":"\u21A4","LeftTee":"\u22A3","LeftTeeVector":"\u295A","leftthreetimes":"\u22CB","LeftTriangleBar":"\u29CF","LeftTriangle":"\u22B2","LeftTriangleEqual":"\u22B4","LeftUpDownVector":"\u2951","LeftUpTeeVector":"\u2960","LeftUpVectorBar":"\u2958","LeftUpVector":"\u21BF","LeftVectorBar":"\u2952","LeftVector":"\u21BC","lEg":"\u2A8B","leg":"\u22DA","leq":"\u2264","leqq":"\u2266","leqslant":"\u2A7D","lescc":"\u2AA8","les":"\u2A7D","lesdot":"\u2A7F","lesdoto":"\u2A81","lesdotor":"\u2A83","lesg":"\u22DA\uFE00","lesges":"\u2A93","lessapprox":"\u2A85","lessdot":"\u22D6","lesseqgtr":"\u22DA","lesseqqgtr":"\u2A8B","LessEqualGreater":"\u22DA","LessFullEqual":"\u2266","LessGreater":"\u2276","lessgtr":"\u2276","LessLess":"\u2AA1","lesssim":"\u2272","LessSlantEqual":"\u2A7D","LessTilde":"\u2272","lfisht":"\u297C","lfloor":"\u230A","Lfr":"\u{1D50F}","lfr":"\u{1D529}","lg":"\u2276","lgE":"\u2A91","lHar":"\u2962","lhard":"\u21BD","lharu":"\u21BC","lharul":"\u296A","lhblk":"\u2584","LJcy":"\u0409","ljcy":"\u0459","llarr":"\u21C7","ll":"\u226A","Ll":"\u22D8","llcorner":"\u231E","Lleftarrow":"\u21DA","llhard":"\u296B","lltri":"\u25FA","Lmidot":"\u013F","lmidot":"\u0140","lmoustache":"\u23B0","lmoust":"\u23B0","lnap":"\u2A89","lnapprox":"\u2A89","lne":"\u2A87","lnE":"\u2268","lneq":"\u2A87","lneqq":"\u2268","lnsim":"\u22E6","loang":"\u27EC","loarr":"\u21FD","lobrk":"\u27E6","longleftarrow":"\u27F5","LongLeftArrow":"\u27F5","Longleftarrow":"\u27F8","longleftrightarrow":"\u27F7","LongLeftRightArrow":"\u27F7","Longleftrightarrow":"\u27FA","longmapsto":"\u27FC","longrightarrow":"\u27F6","LongRightArrow":"\u27F6","Longrightarrow":"\u27F9","looparrowleft":"\u21AB","looparrowright":"\u21AC","lopar":"\u2985","Lopf":"\u{1D543}","lopf":"\u{1D55D}","loplus":"\u2A2D","lotimes":"\u2A34","lowast":"\u2217","lowbar":"_","LowerLeftArrow":"\u2199","LowerRightArrow":"\u2198","loz":"\u25CA","lozenge":"\u25CA","lozf":"\u29EB","lpar":"(","lparlt":"\u2993","lrarr":"\u21C6","lrcorner":"\u231F","lrhar":"\u21CB","lrhard":"\u296D","lrm":"\u200E","lrtri":"\u22BF","lsaquo":"\u2039","lscr":"\u{1D4C1}","Lscr":"\u2112","lsh":"\u21B0","Lsh":"\u21B0","lsim":"\u2272","lsime":"\u2A8D","lsimg":"\u2A8F","lsqb":"[","lsquo":"\u2018","lsquor":"\u201A","Lstrok":"\u0141","lstrok":"\u0142","ltcc":"\u2AA6","ltcir":"\u2A79","lt":"<","LT":"<","Lt":"\u226A","ltdot":"\u22D6","lthree":"\u22CB","ltimes":"\u22C9","ltlarr":"\u2976","ltquest":"\u2A7B","ltri":"\u25C3","ltrie":"\u22B4","ltrif":"\u25C2","ltrPar":"\u2996","lurdshar":"\u294A","luruhar":"\u2966","lvertneqq":"\u2268\uFE00","lvnE":"\u2268\uFE00","macr":"\xAF","male":"\u2642","malt":"\u2720","maltese":"\u2720","Map":"\u2905","map":"\u21A6","mapsto":"\u21A6","mapstodown":"\u21A7","mapstoleft":"\u21A4","mapstoup":"\u21A5","marker":"\u25AE","mcomma":"\u2A29","Mcy":"\u041C","mcy":"\u043C","mdash":"\u2014","mDDot":"\u223A","measuredangle":"\u2221","MediumSpace":"\u205F","Mellintrf":"\u2133","Mfr":"\u{1D510}","mfr":"\u{1D52A}","mho":"\u2127","micro":"\xB5","midast":"*","midcir":"\u2AF0","mid":"\u2223","middot":"\xB7","minusb":"\u229F","minus":"\u2212","minusd":"\u2238","minusdu":"\u2A2A","MinusPlus":"\u2213","mlcp":"\u2ADB","mldr":"\u2026","mnplus":"\u2213","models":"\u22A7","Mopf":"\u{1D544}","mopf":"\u{1D55E}","mp":"\u2213","mscr":"\u{1D4C2}","Mscr":"\u2133","mstpos":"\u223E","Mu":"\u039C","mu":"\u03BC","multimap":"\u22B8","mumap":"\u22B8","nabla":"\u2207","Nacute":"\u0143","nacute":"\u0144","nang":"\u2220\u20D2","nap":"\u2249","napE":"\u2A70\u0338","napid":"\u224B\u0338","napos":"\u0149","napprox":"\u2249","natural":"\u266E","naturals":"\u2115","natur":"\u266E","nbsp":"\xA0","nbump":"\u224E\u0338","nbumpe":"\u224F\u0338","ncap":"\u2A43","Ncaron":"\u0147","ncaron":"\u0148","Ncedil":"\u0145","ncedil":"\u0146","ncong":"\u2247","ncongdot":"\u2A6D\u0338","ncup":"\u2A42","Ncy":"\u041D","ncy":"\u043D","ndash":"\u2013","nearhk":"\u2924","nearr":"\u2197","neArr":"\u21D7","nearrow":"\u2197","ne":"\u2260","nedot":"\u2250\u0338","NegativeMediumSpace":"\u200B","NegativeThickSpace":"\u200B","NegativeThinSpace":"\u200B","NegativeVeryThinSpace":"\u200B","nequiv":"\u2262","nesear":"\u2928","nesim":"\u2242\u0338","NestedGreaterGreater":"\u226B","NestedLessLess":"\u226A","NewLine":"\\n","nexist":"\u2204","nexists":"\u2204","Nfr":"\u{1D511}","nfr":"\u{1D52B}","ngE":"\u2267\u0338","nge":"\u2271","ngeq":"\u2271","ngeqq":"\u2267\u0338","ngeqslant":"\u2A7E\u0338","nges":"\u2A7E\u0338","nGg":"\u22D9\u0338","ngsim":"\u2275","nGt":"\u226B\u20D2","ngt":"\u226F","ngtr":"\u226F","nGtv":"\u226B\u0338","nharr":"\u21AE","nhArr":"\u21CE","nhpar":"\u2AF2","ni":"\u220B","nis":"\u22FC","nisd":"\u22FA","niv":"\u220B","NJcy":"\u040A","njcy":"\u045A","nlarr":"\u219A","nlArr":"\u21CD","nldr":"\u2025","nlE":"\u2266\u0338","nle":"\u2270","nleftarrow":"\u219A","nLeftarrow":"\u21CD","nleftrightarrow":"\u21AE","nLeftrightarrow":"\u21CE","nleq":"\u2270","nleqq":"\u2266\u0338","nleqslant":"\u2A7D\u0338","nles":"\u2A7D\u0338","nless":"\u226E","nLl":"\u22D8\u0338","nlsim":"\u2274","nLt":"\u226A\u20D2","nlt":"\u226E","nltri":"\u22EA","nltrie":"\u22EC","nLtv":"\u226A\u0338","nmid":"\u2224","NoBreak":"\u2060","NonBreakingSpace":"\xA0","nopf":"\u{1D55F}","Nopf":"\u2115","Not":"\u2AEC","not":"\xAC","NotCongruent":"\u2262","NotCupCap":"\u226D","NotDoubleVerticalBar":"\u2226","NotElement":"\u2209","NotEqual":"\u2260","NotEqualTilde":"\u2242\u0338","NotExists":"\u2204","NotGreater":"\u226F","NotGreaterEqual":"\u2271","NotGreaterFullEqual":"\u2267\u0338","NotGreaterGreater":"\u226B\u0338","NotGreaterLess":"\u2279","NotGreaterSlantEqual":"\u2A7E\u0338","NotGreaterTilde":"\u2275","NotHumpDownHump":"\u224E\u0338","NotHumpEqual":"\u224F\u0338","notin":"\u2209","notindot":"\u22F5\u0338","notinE":"\u22F9\u0338","notinva":"\u2209","notinvb":"\u22F7","notinvc":"\u22F6","NotLeftTriangleBar":"\u29CF\u0338","NotLeftTriangle":"\u22EA","NotLeftTriangleEqual":"\u22EC","NotLess":"\u226E","NotLessEqual":"\u2270","NotLessGreater":"\u2278","NotLessLess":"\u226A\u0338","NotLessSlantEqual":"\u2A7D\u0338","NotLessTilde":"\u2274","NotNestedGreaterGreater":"\u2AA2\u0338","NotNestedLessLess":"\u2AA1\u0338","notni":"\u220C","notniva":"\u220C","notnivb":"\u22FE","notnivc":"\u22FD","NotPrecedes":"\u2280","NotPrecedesEqual":"\u2AAF\u0338","NotPrecedesSlantEqual":"\u22E0","NotReverseElement":"\u220C","NotRightTriangleBar":"\u29D0\u0338","NotRightTriangle":"\u22EB","NotRightTriangleEqual":"\u22ED","NotSquareSubset":"\u228F\u0338","NotSquareSubsetEqual":"\u22E2","NotSquareSuperset":"\u2290\u0338","NotSquareSupersetEqual":"\u22E3","NotSubset":"\u2282\u20D2","NotSubsetEqual":"\u2288","NotSucceeds":"\u2281","NotSucceedsEqual":"\u2AB0\u0338","NotSucceedsSlantEqual":"\u22E1","NotSucceedsTilde":"\u227F\u0338","NotSuperset":"\u2283\u20D2","NotSupersetEqual":"\u2289","NotTilde":"\u2241","NotTildeEqual":"\u2244","NotTildeFullEqual":"\u2247","NotTildeTilde":"\u2249","NotVerticalBar":"\u2224","nparallel":"\u2226","npar":"\u2226","nparsl":"\u2AFD\u20E5","npart":"\u2202\u0338","npolint":"\u2A14","npr":"\u2280","nprcue":"\u22E0","nprec":"\u2280","npreceq":"\u2AAF\u0338","npre":"\u2AAF\u0338","nrarrc":"\u2933\u0338","nrarr":"\u219B","nrArr":"\u21CF","nrarrw":"\u219D\u0338","nrightarrow":"\u219B","nRightarrow":"\u21CF","nrtri":"\u22EB","nrtrie":"\u22ED","nsc":"\u2281","nsccue":"\u22E1","nsce":"\u2AB0\u0338","Nscr":"\u{1D4A9}","nscr":"\u{1D4C3}","nshortmid":"\u2224","nshortparallel":"\u2226","nsim":"\u2241","nsime":"\u2244","nsimeq":"\u2244","nsmid":"\u2224","nspar":"\u2226","nsqsube":"\u22E2","nsqsupe":"\u22E3","nsub":"\u2284","nsubE":"\u2AC5\u0338","nsube":"\u2288","nsubset":"\u2282\u20D2","nsubseteq":"\u2288","nsubseteqq":"\u2AC5\u0338","nsucc":"\u2281","nsucceq":"\u2AB0\u0338","nsup":"\u2285","nsupE":"\u2AC6\u0338","nsupe":"\u2289","nsupset":"\u2283\u20D2","nsupseteq":"\u2289","nsupseteqq":"\u2AC6\u0338","ntgl":"\u2279","Ntilde":"\xD1","ntilde":"\xF1","ntlg":"\u2278","ntriangleleft":"\u22EA","ntrianglelefteq":"\u22EC","ntriangleright":"\u22EB","ntrianglerighteq":"\u22ED","Nu":"\u039D","nu":"\u03BD","num":"#","numero":"\u2116","numsp":"\u2007","nvap":"\u224D\u20D2","nvdash":"\u22AC","nvDash":"\u22AD","nVdash":"\u22AE","nVDash":"\u22AF","nvge":"\u2265\u20D2","nvgt":">\u20D2","nvHarr":"\u2904","nvinfin":"\u29DE","nvlArr":"\u2902","nvle":"\u2264\u20D2","nvlt":"<\u20D2","nvltrie":"\u22B4\u20D2","nvrArr":"\u2903","nvrtrie":"\u22B5\u20D2","nvsim":"\u223C\u20D2","nwarhk":"\u2923","nwarr":"\u2196","nwArr":"\u21D6","nwarrow":"\u2196","nwnear":"\u2927","Oacute":"\xD3","oacute":"\xF3","oast":"\u229B","Ocirc":"\xD4","ocirc":"\xF4","ocir":"\u229A","Ocy":"\u041E","ocy":"\u043E","odash":"\u229D","Odblac":"\u0150","odblac":"\u0151","odiv":"\u2A38","odot":"\u2299","odsold":"\u29BC","OElig":"\u0152","oelig":"\u0153","ofcir":"\u29BF","Ofr":"\u{1D512}","ofr":"\u{1D52C}","ogon":"\u02DB","Ograve":"\xD2","ograve":"\xF2","ogt":"\u29C1","ohbar":"\u29B5","ohm":"\u03A9","oint":"\u222E","olarr":"\u21BA","olcir":"\u29BE","olcross":"\u29BB","oline":"\u203E","olt":"\u29C0","Omacr":"\u014C","omacr":"\u014D","Omega":"\u03A9","omega":"\u03C9","Omicron":"\u039F","omicron":"\u03BF","omid":"\u29B6","ominus":"\u2296","Oopf":"\u{1D546}","oopf":"\u{1D560}","opar":"\u29B7","OpenCurlyDoubleQuote":"\u201C","OpenCurlyQuote":"\u2018","operp":"\u29B9","oplus":"\u2295","orarr":"\u21BB","Or":"\u2A54","or":"\u2228","ord":"\u2A5D","order":"\u2134","orderof":"\u2134","ordf":"\xAA","ordm":"\xBA","origof":"\u22B6","oror":"\u2A56","orslope":"\u2A57","orv":"\u2A5B","oS":"\u24C8","Oscr":"\u{1D4AA}","oscr":"\u2134","Oslash":"\xD8","oslash":"\xF8","osol":"\u2298","Otilde":"\xD5","otilde":"\xF5","otimesas":"\u2A36","Otimes":"\u2A37","otimes":"\u2297","Ouml":"\xD6","ouml":"\xF6","ovbar":"\u233D","OverBar":"\u203E","OverBrace":"\u23DE","OverBracket":"\u23B4","OverParenthesis":"\u23DC","para":"\xB6","parallel":"\u2225","par":"\u2225","parsim":"\u2AF3","parsl":"\u2AFD","part":"\u2202","PartialD":"\u2202","Pcy":"\u041F","pcy":"\u043F","percnt":"%","period":".","permil":"\u2030","perp":"\u22A5","pertenk":"\u2031","Pfr":"\u{1D513}","pfr":"\u{1D52D}","Phi":"\u03A6","phi":"\u03C6","phiv":"\u03D5","phmmat":"\u2133","phone":"\u260E","Pi":"\u03A0","pi":"\u03C0","pitchfork":"\u22D4","piv":"\u03D6","planck":"\u210F","planckh":"\u210E","plankv":"\u210F","plusacir":"\u2A23","plusb":"\u229E","pluscir":"\u2A22","plus":"+","plusdo":"\u2214","plusdu":"\u2A25","pluse":"\u2A72","PlusMinus":"\xB1","plusmn":"\xB1","plussim":"\u2A26","plustwo":"\u2A27","pm":"\xB1","Poincareplane":"\u210C","pointint":"\u2A15","popf":"\u{1D561}","Popf":"\u2119","pound":"\xA3","prap":"\u2AB7","Pr":"\u2ABB","pr":"\u227A","prcue":"\u227C","precapprox":"\u2AB7","prec":"\u227A","preccurlyeq":"\u227C","Precedes":"\u227A","PrecedesEqual":"\u2AAF","PrecedesSlantEqual":"\u227C","PrecedesTilde":"\u227E","preceq":"\u2AAF","precnapprox":"\u2AB9","precneqq":"\u2AB5","precnsim":"\u22E8","pre":"\u2AAF","prE":"\u2AB3","precsim":"\u227E","prime":"\u2032","Prime":"\u2033","primes":"\u2119","prnap":"\u2AB9","prnE":"\u2AB5","prnsim":"\u22E8","prod":"\u220F","Product":"\u220F","profalar":"\u232E","profline":"\u2312","profsurf":"\u2313","prop":"\u221D","Proportional":"\u221D","Proportion":"\u2237","propto":"\u221D","prsim":"\u227E","prurel":"\u22B0","Pscr":"\u{1D4AB}","pscr":"\u{1D4C5}","Psi":"\u03A8","psi":"\u03C8","puncsp":"\u2008","Qfr":"\u{1D514}","qfr":"\u{1D52E}","qint":"\u2A0C","qopf":"\u{1D562}","Qopf":"\u211A","qprime":"\u2057","Qscr":"\u{1D4AC}","qscr":"\u{1D4C6}","quaternions":"\u210D","quatint":"\u2A16","quest":"?","questeq":"\u225F","quot":"\\"","QUOT":"\\"","rAarr":"\u21DB","race":"\u223D\u0331","Racute":"\u0154","racute":"\u0155","radic":"\u221A","raemptyv":"\u29B3","rang":"\u27E9","Rang":"\u27EB","rangd":"\u2992","range":"\u29A5","rangle":"\u27E9","raquo":"\xBB","rarrap":"\u2975","rarrb":"\u21E5","rarrbfs":"\u2920","rarrc":"\u2933","rarr":"\u2192","Rarr":"\u21A0","rArr":"\u21D2","rarrfs":"\u291E","rarrhk":"\u21AA","rarrlp":"\u21AC","rarrpl":"\u2945","rarrsim":"\u2974","Rarrtl":"\u2916","rarrtl":"\u21A3","rarrw":"\u219D","ratail":"\u291A","rAtail":"\u291C","ratio":"\u2236","rationals":"\u211A","rbarr":"\u290D","rBarr":"\u290F","RBarr":"\u2910","rbbrk":"\u2773","rbrace":"}","rbrack":"]","rbrke":"\u298C","rbrksld":"\u298E","rbrkslu":"\u2990","Rcaron":"\u0158","rcaron":"\u0159","Rcedil":"\u0156","rcedil":"\u0157","rceil":"\u2309","rcub":"}","Rcy":"\u0420","rcy":"\u0440","rdca":"\u2937","rdldhar":"\u2969","rdquo":"\u201D","rdquor":"\u201D","rdsh":"\u21B3","real":"\u211C","realine":"\u211B","realpart":"\u211C","reals":"\u211D","Re":"\u211C","rect":"\u25AD","reg":"\xAE","REG":"\xAE","ReverseElement":"\u220B","ReverseEquilibrium":"\u21CB","ReverseUpEquilibrium":"\u296F","rfisht":"\u297D","rfloor":"\u230B","rfr":"\u{1D52F}","Rfr":"\u211C","rHar":"\u2964","rhard":"\u21C1","rharu":"\u21C0","rharul":"\u296C","Rho":"\u03A1","rho":"\u03C1","rhov":"\u03F1","RightAngleBracket":"\u27E9","RightArrowBar":"\u21E5","rightarrow":"\u2192","RightArrow":"\u2192","Rightarrow":"\u21D2","RightArrowLeftArrow":"\u21C4","rightarrowtail":"\u21A3","RightCeiling":"\u2309","RightDoubleBracket":"\u27E7","RightDownTeeVector":"\u295D","RightDownVectorBar":"\u2955","RightDownVector":"\u21C2","RightFloor":"\u230B","rightharpoondown":"\u21C1","rightharpoonup":"\u21C0","rightleftarrows":"\u21C4","rightleftharpoons":"\u21CC","rightrightarrows":"\u21C9","rightsquigarrow":"\u219D","RightTeeArrow":"\u21A6","RightTee":"\u22A2","RightTeeVector":"\u295B","rightthreetimes":"\u22CC","RightTriangleBar":"\u29D0","RightTriangle":"\u22B3","RightTriangleEqual":"\u22B5","RightUpDownVector":"\u294F","RightUpTeeVector":"\u295C","RightUpVectorBar":"\u2954","RightUpVector":"\u21BE","RightVectorBar":"\u2953","RightVector":"\u21C0","ring":"\u02DA","risingdotseq":"\u2253","rlarr":"\u21C4","rlhar":"\u21CC","rlm":"\u200F","rmoustache":"\u23B1","rmoust":"\u23B1","rnmid":"\u2AEE","roang":"\u27ED","roarr":"\u21FE","robrk":"\u27E7","ropar":"\u2986","ropf":"\u{1D563}","Ropf":"\u211D","roplus":"\u2A2E","rotimes":"\u2A35","RoundImplies":"\u2970","rpar":")","rpargt":"\u2994","rppolint":"\u2A12","rrarr":"\u21C9","Rrightarrow":"\u21DB","rsaquo":"\u203A","rscr":"\u{1D4C7}","Rscr":"\u211B","rsh":"\u21B1","Rsh":"\u21B1","rsqb":"]","rsquo":"\u2019","rsquor":"\u2019","rthree":"\u22CC","rtimes":"\u22CA","rtri":"\u25B9","rtrie":"\u22B5","rtrif":"\u25B8","rtriltri":"\u29CE","RuleDelayed":"\u29F4","ruluhar":"\u2968","rx":"\u211E","Sacute":"\u015A","sacute":"\u015B","sbquo":"\u201A","scap":"\u2AB8","Scaron":"\u0160","scaron":"\u0161","Sc":"\u2ABC","sc":"\u227B","sccue":"\u227D","sce":"\u2AB0","scE":"\u2AB4","Scedil":"\u015E","scedil":"\u015F","Scirc":"\u015C","scirc":"\u015D","scnap":"\u2ABA","scnE":"\u2AB6","scnsim":"\u22E9","scpolint":"\u2A13","scsim":"\u227F","Scy":"\u0421","scy":"\u0441","sdotb":"\u22A1","sdot":"\u22C5","sdote":"\u2A66","searhk":"\u2925","searr":"\u2198","seArr":"\u21D8","searrow":"\u2198","sect":"\xA7","semi":";","seswar":"\u2929","setminus":"\u2216","setmn":"\u2216","sext":"\u2736","Sfr":"\u{1D516}","sfr":"\u{1D530}","sfrown":"\u2322","sharp":"\u266F","SHCHcy":"\u0429","shchcy":"\u0449","SHcy":"\u0428","shcy":"\u0448","ShortDownArrow":"\u2193","ShortLeftArrow":"\u2190","shortmid":"\u2223","shortparallel":"\u2225","ShortRightArrow":"\u2192","ShortUpArrow":"\u2191","shy":"\xAD","Sigma":"\u03A3","sigma":"\u03C3","sigmaf":"\u03C2","sigmav":"\u03C2","sim":"\u223C","simdot":"\u2A6A","sime":"\u2243","simeq":"\u2243","simg":"\u2A9E","simgE":"\u2AA0","siml":"\u2A9D","simlE":"\u2A9F","simne":"\u2246","simplus":"\u2A24","simrarr":"\u2972","slarr":"\u2190","SmallCircle":"\u2218","smallsetminus":"\u2216","smashp":"\u2A33","smeparsl":"\u29E4","smid":"\u2223","smile":"\u2323","smt":"\u2AAA","smte":"\u2AAC","smtes":"\u2AAC\uFE00","SOFTcy":"\u042C","softcy":"\u044C","solbar":"\u233F","solb":"\u29C4","sol":"/","Sopf":"\u{1D54A}","sopf":"\u{1D564}","spades":"\u2660","spadesuit":"\u2660","spar":"\u2225","sqcap":"\u2293","sqcaps":"\u2293\uFE00","sqcup":"\u2294","sqcups":"\u2294\uFE00","Sqrt":"\u221A","sqsub":"\u228F","sqsube":"\u2291","sqsubset":"\u228F","sqsubseteq":"\u2291","sqsup":"\u2290","sqsupe":"\u2292","sqsupset":"\u2290","sqsupseteq":"\u2292","square":"\u25A1","Square":"\u25A1","SquareIntersection":"\u2293","SquareSubset":"\u228F","SquareSubsetEqual":"\u2291","SquareSuperset":"\u2290","SquareSupersetEqual":"\u2292","SquareUnion":"\u2294","squarf":"\u25AA","squ":"\u25A1","squf":"\u25AA","srarr":"\u2192","Sscr":"\u{1D4AE}","sscr":"\u{1D4C8}","ssetmn":"\u2216","ssmile":"\u2323","sstarf":"\u22C6","Star":"\u22C6","star":"\u2606","starf":"\u2605","straightepsilon":"\u03F5","straightphi":"\u03D5","strns":"\xAF","sub":"\u2282","Sub":"\u22D0","subdot":"\u2ABD","subE":"\u2AC5","sube":"\u2286","subedot":"\u2AC3","submult":"\u2AC1","subnE":"\u2ACB","subne":"\u228A","subplus":"\u2ABF","subrarr":"\u2979","subset":"\u2282","Subset":"\u22D0","subseteq":"\u2286","subseteqq":"\u2AC5","SubsetEqual":"\u2286","subsetneq":"\u228A","subsetneqq":"\u2ACB","subsim":"\u2AC7","subsub":"\u2AD5","subsup":"\u2AD3","succapprox":"\u2AB8","succ":"\u227B","succcurlyeq":"\u227D","Succeeds":"\u227B","SucceedsEqual":"\u2AB0","SucceedsSlantEqual":"\u227D","SucceedsTilde":"\u227F","succeq":"\u2AB0","succnapprox":"\u2ABA","succneqq":"\u2AB6","succnsim":"\u22E9","succsim":"\u227F","SuchThat":"\u220B","sum":"\u2211","Sum":"\u2211","sung":"\u266A","sup1":"\xB9","sup2":"\xB2","sup3":"\xB3","sup":"\u2283","Sup":"\u22D1","supdot":"\u2ABE","supdsub":"\u2AD8","supE":"\u2AC6","supe":"\u2287","supedot":"\u2AC4","Superset":"\u2283","SupersetEqual":"\u2287","suphsol":"\u27C9","suphsub":"\u2AD7","suplarr":"\u297B","supmult":"\u2AC2","supnE":"\u2ACC","supne":"\u228B","supplus":"\u2AC0","supset":"\u2283","Supset":"\u22D1","supseteq":"\u2287","supseteqq":"\u2AC6","supsetneq":"\u228B","supsetneqq":"\u2ACC","supsim":"\u2AC8","supsub":"\u2AD4","supsup":"\u2AD6","swarhk":"\u2926","swarr":"\u2199","swArr":"\u21D9","swarrow":"\u2199","swnwar":"\u292A","szlig":"\xDF","Tab":"\\t","target":"\u2316","Tau":"\u03A4","tau":"\u03C4","tbrk":"\u23B4","Tcaron":"\u0164","tcaron":"\u0165","Tcedil":"\u0162","tcedil":"\u0163","Tcy":"\u0422","tcy":"\u0442","tdot":"\u20DB","telrec":"\u2315","Tfr":"\u{1D517}","tfr":"\u{1D531}","there4":"\u2234","therefore":"\u2234","Therefore":"\u2234","Theta":"\u0398","theta":"\u03B8","thetasym":"\u03D1","thetav":"\u03D1","thickapprox":"\u2248","thicksim":"\u223C","ThickSpace":"\u205F\u200A","ThinSpace":"\u2009","thinsp":"\u2009","thkap":"\u2248","thksim":"\u223C","THORN":"\xDE","thorn":"\xFE","tilde":"\u02DC","Tilde":"\u223C","TildeEqual":"\u2243","TildeFullEqual":"\u2245","TildeTilde":"\u2248","timesbar":"\u2A31","timesb":"\u22A0","times":"\xD7","timesd":"\u2A30","tint":"\u222D","toea":"\u2928","topbot":"\u2336","topcir":"\u2AF1","top":"\u22A4","Topf":"\u{1D54B}","topf":"\u{1D565}","topfork":"\u2ADA","tosa":"\u2929","tprime":"\u2034","trade":"\u2122","TRADE":"\u2122","triangle":"\u25B5","triangledown":"\u25BF","triangleleft":"\u25C3","trianglelefteq":"\u22B4","triangleq":"\u225C","triangleright":"\u25B9","trianglerighteq":"\u22B5","tridot":"\u25EC","trie":"\u225C","triminus":"\u2A3A","TripleDot":"\u20DB","triplus":"\u2A39","trisb":"\u29CD","tritime":"\u2A3B","trpezium":"\u23E2","Tscr":"\u{1D4AF}","tscr":"\u{1D4C9}","TScy":"\u0426","tscy":"\u0446","TSHcy":"\u040B","tshcy":"\u045B","Tstrok":"\u0166","tstrok":"\u0167","twixt":"\u226C","twoheadleftarrow":"\u219E","twoheadrightarrow":"\u21A0","Uacute":"\xDA","uacute":"\xFA","uarr":"\u2191","Uarr":"\u219F","uArr":"\u21D1","Uarrocir":"\u2949","Ubrcy":"\u040E","ubrcy":"\u045E","Ubreve":"\u016C","ubreve":"\u016D","Ucirc":"\xDB","ucirc":"\xFB","Ucy":"\u0423","ucy":"\u0443","udarr":"\u21C5","Udblac":"\u0170","udblac":"\u0171","udhar":"\u296E","ufisht":"\u297E","Ufr":"\u{1D518}","ufr":"\u{1D532}","Ugrave":"\xD9","ugrave":"\xF9","uHar":"\u2963","uharl":"\u21BF","uharr":"\u21BE","uhblk":"\u2580","ulcorn":"\u231C","ulcorner":"\u231C","ulcrop":"\u230F","ultri":"\u25F8","Umacr":"\u016A","umacr":"\u016B","uml":"\xA8","UnderBar":"_","UnderBrace":"\u23DF","UnderBracket":"\u23B5","UnderParenthesis":"\u23DD","Union":"\u22C3","UnionPlus":"\u228E","Uogon":"\u0172","uogon":"\u0173","Uopf":"\u{1D54C}","uopf":"\u{1D566}","UpArrowBar":"\u2912","uparrow":"\u2191","UpArrow":"\u2191","Uparrow":"\u21D1","UpArrowDownArrow":"\u21C5","updownarrow":"\u2195","UpDownArrow":"\u2195","Updownarrow":"\u21D5","UpEquilibrium":"\u296E","upharpoonleft":"\u21BF","upharpoonright":"\u21BE","uplus":"\u228E","UpperLeftArrow":"\u2196","UpperRightArrow":"\u2197","upsi":"\u03C5","Upsi":"\u03D2","upsih":"\u03D2","Upsilon":"\u03A5","upsilon":"\u03C5","UpTeeArrow":"\u21A5","UpTee":"\u22A5","upuparrows":"\u21C8","urcorn":"\u231D","urcorner":"\u231D","urcrop":"\u230E","Uring":"\u016E","uring":"\u016F","urtri":"\u25F9","Uscr":"\u{1D4B0}","uscr":"\u{1D4CA}","utdot":"\u22F0","Utilde":"\u0168","utilde":"\u0169","utri":"\u25B5","utrif":"\u25B4","uuarr":"\u21C8","Uuml":"\xDC","uuml":"\xFC","uwangle":"\u29A7","vangrt":"\u299C","varepsilon":"\u03F5","varkappa":"\u03F0","varnothing":"\u2205","varphi":"\u03D5","varpi":"\u03D6","varpropto":"\u221D","varr":"\u2195","vArr":"\u21D5","varrho":"\u03F1","varsigma":"\u03C2","varsubsetneq":"\u228A\uFE00","varsubsetneqq":"\u2ACB\uFE00","varsupsetneq":"\u228B\uFE00","varsupsetneqq":"\u2ACC\uFE00","vartheta":"\u03D1","vartriangleleft":"\u22B2","vartriangleright":"\u22B3","vBar":"\u2AE8","Vbar":"\u2AEB","vBarv":"\u2AE9","Vcy":"\u0412","vcy":"\u0432","vdash":"\u22A2","vDash":"\u22A8","Vdash":"\u22A9","VDash":"\u22AB","Vdashl":"\u2AE6","veebar":"\u22BB","vee":"\u2228","Vee":"\u22C1","veeeq":"\u225A","vellip":"\u22EE","verbar":"|","Verbar":"\u2016","vert":"|","Vert":"\u2016","VerticalBar":"\u2223","VerticalLine":"|","VerticalSeparator":"\u2758","VerticalTilde":"\u2240","VeryThinSpace":"\u200A","Vfr":"\u{1D519}","vfr":"\u{1D533}","vltri":"\u22B2","vnsub":"\u2282\u20D2","vnsup":"\u2283\u20D2","Vopf":"\u{1D54D}","vopf":"\u{1D567}","vprop":"\u221D","vrtri":"\u22B3","Vscr":"\u{1D4B1}","vscr":"\u{1D4CB}","vsubnE":"\u2ACB\uFE00","vsubne":"\u228A\uFE00","vsupnE":"\u2ACC\uFE00","vsupne":"\u228B\uFE00","Vvdash":"\u22AA","vzigzag":"\u299A","Wcirc":"\u0174","wcirc":"\u0175","wedbar":"\u2A5F","wedge":"\u2227","Wedge":"\u22C0","wedgeq":"\u2259","weierp":"\u2118","Wfr":"\u{1D51A}","wfr":"\u{1D534}","Wopf":"\u{1D54E}","wopf":"\u{1D568}","wp":"\u2118","wr":"\u2240","wreath":"\u2240","Wscr":"\u{1D4B2}","wscr":"\u{1D4CC}","xcap":"\u22C2","xcirc":"\u25EF","xcup":"\u22C3","xdtri":"\u25BD","Xfr":"\u{1D51B}","xfr":"\u{1D535}","xharr":"\u27F7","xhArr":"\u27FA","Xi":"\u039E","xi":"\u03BE","xlarr":"\u27F5","xlArr":"\u27F8","xmap":"\u27FC","xnis":"\u22FB","xodot":"\u2A00","Xopf":"\u{1D54F}","xopf":"\u{1D569}","xoplus":"\u2A01","xotime":"\u2A02","xrarr":"\u27F6","xrArr":"\u27F9","Xscr":"\u{1D4B3}","xscr":"\u{1D4CD}","xsqcup":"\u2A06","xuplus":"\u2A04","xutri":"\u25B3","xvee":"\u22C1","xwedge":"\u22C0","Yacute":"\xDD","yacute":"\xFD","YAcy":"\u042F","yacy":"\u044F","Ycirc":"\u0176","ycirc":"\u0177","Ycy":"\u042B","ycy":"\u044B","yen":"\xA5","Yfr":"\u{1D51C}","yfr":"\u{1D536}","YIcy":"\u0407","yicy":"\u0457","Yopf":"\u{1D550}","yopf":"\u{1D56A}","Yscr":"\u{1D4B4}","yscr":"\u{1D4CE}","YUcy":"\u042E","yucy":"\u044E","yuml":"\xFF","Yuml":"\u0178","Zacute":"\u0179","zacute":"\u017A","Zcaron":"\u017D","zcaron":"\u017E","Zcy":"\u0417","zcy":"\u0437","Zdot":"\u017B","zdot":"\u017C","zeetrf":"\u2128","ZeroWidthSpace":"\u200B","Zeta":"\u0396","zeta":"\u03B6","zfr":"\u{1D537}","Zfr":"\u2128","ZHcy":"\u0416","zhcy":"\u0436","zigrarr":"\u21DD","zopf":"\u{1D56B}","Zopf":"\u2124","Zscr":"\u{1D4B5}","zscr":"\u{1D4CF}","zwj":"\u200D","zwnj":"\u200C"}')},function(L,v,l){var n={};function r(i,t,o){var e,a,s,c,f,d="";for(typeof t!="string"&&(o=t,t=r.defaultChars),o===void 0&&(o=!0),f=function(u){var h,p,m=n[u];if(m)return m;for(m=n[u]=[],h=0;h<128;h++)p=String.fromCharCode(h),/^[0-9a-z]$/i.test(p)?m.push(p):m.push("%"+("0"+h.toString(16).toUpperCase()).slice(-2));for(h=0;h=55296&&s<=57343){if(s>=55296&&s<=56319&&e+1=56320&&c<=57343){d+=encodeURIComponent(i[e]+i[e+1]),e++;continue}d+="%EF%BF%BD"}else d+=encodeURIComponent(i[e]);return d}r.defaultChars=";/?:@&=+$,-_.!~*'()#",r.componentChars="-_.!~*'()",L.exports=r},function(L,v,l){var n={};function r(i,t){var o;return typeof t!="string"&&(t=r.defaultChars),o=function(e){var a,s,c=n[e];if(c)return c;for(c=n[e]=[],a=0;a<128;a++)s=String.fromCharCode(a),c.push(s);for(a=0;a=55296&&h<=57343?"\uFFFD\uFFFD\uFFFD":String.fromCharCode(h),a+=6):(248&c)==240&&a+91114111?p+="\uFFFD\uFFFD\uFFFD\uFFFD":(h-=65536,p+=String.fromCharCode(55296+(h>>10),56320+(1023&h))),a+=9):p+="\uFFFD";return p})}r.defaultChars=";/?:@&=+$,#",r.componentChars="",L.exports=r},function(L,v,l){L.exports=function(n){var r="";return r+=n.protocol||"",r+=n.slashes?"//":"",r+=n.auth?n.auth+"@":"",n.hostname&&n.hostname.indexOf(":")!==-1?r+="["+n.hostname+"]":r+=n.hostname||"",r+=n.port?":"+n.port:"",r+=n.pathname||"",r+=n.search||"",r+=n.hash||""}},function(L,v,l){function n(){this.protocol=null,this.slashes=null,this.auth=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.pathname=null}var r=/^([a-z0-9.+-]+:)/i,i=/:[0-9]*$/,t=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,o=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r",` +`," "]),e=["'"].concat(o),a=["%","/","?",";","#"].concat(e),s=["/","?","#"],c=/^[+a-z0-9A-Z_-]{0,63}$/,f=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,d={javascript:!0,"javascript:":!0},u={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};n.prototype.parse=function(h,p){var m,C,E,b,y,_=h;if(_=_.trim(),!p&&h.split("#").length===1){var P=t.exec(_);if(P)return this.pathname=P[1],P[2]&&(this.search=P[2]),this}var S=r.exec(_);if(S&&(E=(S=S[0]).toLowerCase(),this.protocol=S,_=_.substr(S.length)),(p||S||_.match(/^\/\/[^@\/]+@[^@\/]+/))&&(!(y=_.substr(0,2)==="//")||S&&d[S]||(_=_.substr(2),this.slashes=!0)),!d[S]&&(y||S&&!u[S])){var M,j,F=-1;for(m=0;m127?$+="x":$+=H[q];if(!$.match(c)){var R=w.slice(0,m),B=w.slice(m+1),k=H.match(f);k&&(R.push(k[1]),B.unshift(k[2])),B.length&&(_=B.join(".")+_),this.hostname=R.join(".");break}}}}this.hostname.length>255&&(this.hostname=""),D&&(this.hostname=this.hostname.substr(1,this.hostname.length-2))}var x=_.indexOf("#");x!==-1&&(this.hash=_.substr(x),_=_.slice(0,x));var O=_.indexOf("?");return O!==-1&&(this.search=_.substr(O),_=_.slice(0,O)),_&&(this.pathname=_),u[E]&&this.hostname&&!this.pathname&&(this.pathname=""),this},n.prototype.parseHost=function(h){var p=i.exec(h);p&&((p=p[0])!==":"&&(this.port=p.substr(1)),h=h.substr(0,h.length-p.length)),h&&(this.hostname=h)},L.exports=function(h,p){if(h&&h instanceof n)return h;var m=new n;return m.parse(h,p),m}},function(L,v,l){v.Any=l(9),v.Cc=l(10),v.Cf=l(27),v.P=l(3),v.Z=l(11)},function(L,v){L.exports=/[\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804[\uDCBD\uDCCD]|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/},function(L,v,l){v.parseLinkLabel=l(29),v.parseLinkDestination=l(30),v.parseLinkTitle=l(31)},function(L,v,l){L.exports=function(n,r,i){var t,o,e,a,s=-1,c=n.posMax,f=n.pos;for(n.pos=r+1,t=1;n.pos32)return s;if(o===41){if(e===0)break;e--}i++}return a===i||e!==0||(s.str=n(r.slice(a,i)),s.lines=0,s.pos=i,s.ok=!0),s}},function(L,v,l){var n=l(0).unescapeAll;L.exports=function(r,i,t){var o,e,a=0,s=i,c={ok:!1,pos:0,lines:0,str:""};if(i>=t||(e=r.charCodeAt(i))!==34&&e!==39&&e!==40)return c;for(i++,e===40&&(e=41);i"+i(e[a].content)+""},t.code_block=function(e,a,s,c,f){var d=e[a];return""+i(e[a].content)+` +`},t.fence=function(e,a,s,c,f){var d,u,h,p,m,C=e[a],E=C.info?r(C.info).trim():"",b="",y="";return E&&(b=(h=E.split(/(\s+)/g))[0],y=h.slice(2).join("")),(d=s.highlight&&s.highlight(C.content,b,y)||i(C.content)).indexOf(""+d+` +`):"
    "+d+`
    +`},t.image=function(e,a,s,c,f){var d=e[a];return d.attrs[d.attrIndex("alt")][1]=f.renderInlineAsText(d.children,s,c),f.renderToken(e,a,s)},t.hardbreak=function(e,a,s){return s.xhtmlOut?`
    +`:`
    +`},t.softbreak=function(e,a,s){return s.breaks?s.xhtmlOut?`
    +`:`
    +`:` +`},t.text=function(e,a){return i(e[a].content)},t.html_block=function(e,a){return e[a].content},t.html_inline=function(e,a){return e[a].content},o.prototype.renderAttrs=function(e){var a,s,c;if(!e.attrs)return"";for(c="",a=0,s=e.attrs.length;a +`:">")},o.prototype.renderInline=function(e,a,s){for(var c,f="",d=this.rules,u=0,h=e.length;u/i.test(i)}L.exports=function(i){var t,o,e,a,s,c,f,d,u,h,p,m,C,E,b,y,_,P,S=i.tokens;if(i.md.options.linkify){for(o=0,e=S.length;o=0;t--)if((c=a[t]).type!=="link_close"){if(c.type==="html_inline"&&(P=c.content,/^\s]/i.test(P)&&C>0&&C--,r(c.content)&&C++),!(C>0)&&c.type==="text"&&i.md.linkify.test(c.content)){for(u=c.content,_=i.md.linkify.match(u),f=[],m=c.level,p=0,d=0;d<_.length;d++)E=_[d].url,b=i.md.normalizeLink(E),i.md.validateLink(b)&&(y=_[d].text,y=_[d].schema?_[d].schema!=="mailto:"||/^mailto:/i.test(y)?i.md.normalizeLinkText(y):i.md.normalizeLinkText("mailto:"+y).replace(/^mailto:/,""):i.md.normalizeLinkText("http://"+y).replace(/^http:\/\//,""),(h=_[d].index)>p&&((s=new i.Token("text","",0)).content=u.slice(p,h),s.level=m,f.push(s)),(s=new i.Token("link_open","a",1)).attrs=[["href",b]],s.level=m++,s.markup="linkify",s.info="auto",f.push(s),(s=new i.Token("text","",0)).content=y,s.level=m,f.push(s),(s=new i.Token("link_close","a",-1)).level=--m,s.markup="linkify",s.info="auto",f.push(s),p=_[d].lastIndex);p=0;c--)(f=s[c]).type!=="text"||d||(f.content=f.content.replace(i,o)),f.type==="link_open"&&f.info==="auto"&&d--,f.type==="link_close"&&f.info==="auto"&&d++}function a(s){var c,f,d=0;for(c=s.length-1;c>=0;c--)(f=s[c]).type!=="text"||d||n.test(f.content)&&(f.content=f.content.replace(/\+-/g,"\xB1").replace(/\.{2,}/g,"\u2026").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---(?=[^-]|$)/gm,"$1\u2014").replace(/(^|\s)--(?=\s|$)/gm,"$1\u2013").replace(/(^|[^-\s])--(?=[^-\s]|$)/gm,"$1\u2013")),f.type==="link_open"&&f.info==="auto"&&d--,f.type==="link_close"&&f.info==="auto"&&d++}L.exports=function(s){var c;if(s.md.options.typographer)for(c=s.tokens.length-1;c>=0;c--)s.tokens[c].type==="inline"&&(r.test(s.tokens[c].content)&&e(s.tokens[c].children),n.test(s.tokens[c].content)&&a(s.tokens[c].children))}},function(L,v,l){var n=l(0).isWhiteSpace,r=l(0).isPunctChar,i=l(0).isMdAsciiPunct,t=/['"]/,o=/['"]/g;function e(s,c,f){return s.substr(0,c)+f+s.substr(c+1)}function a(s,c){var f,d,u,h,p,m,C,E,b,y,_,P,S,M,j,F,z,D,w,H,$;for(w=[],f=0;f=0&&!(w[z].level<=C);z--);if(w.length=z+1,d.type==="text"){p=0,m=(u=d.content).length;t:for(;p=0)b=u.charCodeAt(h.index-1);else for(z=f-1;z>=0&&s[z].type!=="softbreak"&&s[z].type!=="hardbreak";z--)if(s[z].content){b=s[z].content.charCodeAt(s[z].content.length-1);break}if(y=32,p=48&&b<=57&&(F=j=!1),j&&F&&(j=_,F=P),j||F){if(F){for(z=w.length-1;z>=0&&(E=w[z],!(w[z].level=0;c--)s.tokens[c].type==="inline"&&t.test(s.tokens[c].content)&&a(s.tokens[c].children,s)}},function(L,v,l){var n=l(5);function r(i,t,o){this.src=i,this.env=o,this.tokens=[],this.inlineMode=!1,this.md=t}r.prototype.Token=n,L.exports=r},function(L,v,l){var n=l(4),r=[["table",l(42),["paragraph","reference"]],["code",l(43)],["fence",l(44),["paragraph","reference","blockquote","list"]],["blockquote",l(45),["paragraph","reference","blockquote","list"]],["hr",l(46),["paragraph","reference","blockquote","list"]],["list",l(47),["paragraph","reference","blockquote"]],["reference",l(48)],["html_block",l(49),["paragraph","reference","blockquote"]],["heading",l(51),["paragraph","reference","blockquote"]],["lheading",l(52)],["paragraph",l(53)]];function i(){this.ruler=new n;for(var t=0;t=e))&&!(t.sCount[f]=u){t.line=e;break}for(a=0;ae||(h=o+1,t.sCount[h]=4||(f=t.bMarks[h]+t.tShift[h])>=t.eMarks[h]||(j=t.src.charCodeAt(f++))!==124&&j!==45&&j!==58||f>=t.eMarks[h]||(F=t.src.charCodeAt(f++))!==124&&F!==45&&F!==58&&!n(F)||j===45&&n(F))return!1;for(;f=4||((p=i(c)).length&&p[0]===""&&p.shift(),p.length&&p[p.length-1]===""&&p.pop(),(m=p.length)===0||m!==E.length))return!1;if(a)return!0;for(P=t.parentType,t.parentType="table",M=t.md.block.ruler.getRules("blockquote"),(C=t.push("table_open","table",1)).map=y=[o,0],(C=t.push("thead_open","thead",1)).map=[o,o+1],(C=t.push("tr_open","tr",1)).map=[o,o+1],d=0;d=4)break;for((p=i(c)).length&&p[0]===""&&p.shift(),p.length&&p[p.length-1]===""&&p.pop(),h===o+2&&((C=t.push("tbody_open","tbody",1)).map=_=[o+2,0]),(C=t.push("tr_open","tr",1)).map=[h,h+1],d=0;d=4))break;o=++t}return n.line=o,(e=n.push("code_block","code",0)).content=n.getLines(r,o,4+n.blkIndent,!1)+` +`,e.map=[r,n.line],!0}},function(L,v,l){L.exports=function(n,r,i,t){var o,e,a,s,c,f,d,u=!1,h=n.bMarks[r]+n.tShift[r],p=n.eMarks[r];if(n.sCount[r]-n.blkIndent>=4||h+3>p||(o=n.src.charCodeAt(h))!==126&&o!==96||(c=h,(e=(h=n.skipChars(h,o))-c)<3)||(d=n.src.slice(c,h),a=n.src.slice(h,p),o===96&&a.indexOf(String.fromCharCode(o))>=0))return!1;if(t)return!0;for(s=r;!(++s>=i)&&!((h=c=n.bMarks[s]+n.tShift[s])<(p=n.eMarks[s])&&n.sCount[s]=4||(h=n.skipChars(h,o))-c=4||r.src.charCodeAt(D++)!==62)return!1;if(o)return!0;for(c=p=r.sCount[i]+1,r.src.charCodeAt(D)===32?(D++,c++,p++,e=!1,P=!0):r.src.charCodeAt(D)===9?(P=!0,(r.bsCount[i]+p)%4==3?(D++,c++,p++,e=!1):e=!0):P=!1,m=[r.bMarks[i]],r.bMarks[i]=D;D=w,y=[r.sCount[i]],r.sCount[i]=p-c,_=[r.tShift[i]],r.tShift[i]=D-r.bMarks[i],M=r.md.block.ruler.getRules("blockquote"),b=r.parentType,r.parentType="blockquote",h=i+1;h=(w=r.eMarks[h])));h++)if(r.src.charCodeAt(D++)!==62||F){if(d)break;for(S=!1,s=0,f=M.length;s=w,C.push(r.bsCount[h]),r.bsCount[h]=r.sCount[h]+1+(P?1:0),y.push(r.sCount[h]),r.sCount[h]=p-c,_.push(r.tShift[h]),r.tShift[h]=D-r.bMarks[h]}for(E=r.blkIndent,r.blkIndent=0,(j=r.push("blockquote_open","blockquote",1)).markup=">",j.map=u=[i,0],r.md.block.tokenize(r,i,h),(j=r.push("blockquote_close","blockquote",-1)).markup=">",r.lineMax=z,r.parentType=b,u[1]=r.line,s=0;s<_.length;s++)r.bMarks[s+i]=m[s],r.tShift[s+i]=_[s],r.sCount[s+i]=y[s],r.bsCount[s+i]=C[s];return r.blkIndent=E,!0}},function(L,v,l){var n=l(0).isSpace;L.exports=function(r,i,t,o){var e,a,s,c,f=r.bMarks[i]+r.tShift[i],d=r.eMarks[i];if(r.sCount[i]-r.blkIndent>=4||(e=r.src.charCodeAt(f++))!==42&&e!==45&&e!==95)return!1;for(a=1;f=c||(e=t.src.charCodeAt(s++))<48||e>57)return-1;for(;;){if(s>=c)return-1;if(!((e=t.src.charCodeAt(s++))>=48&&e<=57)){if(e===41||e===46)break;return-1}if(s-a>=10)return-1}return s=4||t.listIndent>=0&&t.sCount[o]-t.listIndent>=4&&t.sCount[o]=t.blkIndent&&(x=!0),($=i(t,o))>=0){if(p=!0,I=t.bMarks[o]+t.tShift[o],_=Number(t.src.slice(I,$-1)),x&&_!==1)return!1}else{if(!(($=r(t,o))>=0))return!1;p=!1}if(x&&t.skipSpaces($)>=t.eMarks[o])return!1;if(y=t.src.charCodeAt($-1),a)return!0;for(b=t.tokens.length,p?(k=t.push("ordered_list_open","ol",1),_!==1&&(k.attrs=[["start",_]])):k=t.push("bullet_list_open","ul",1),k.map=E=[o,0],k.markup=String.fromCharCode(y),S=o,q=!1,B=t.md.block.ruler.getRules("list"),F=t.parentType,t.parentType="list";S=P?1:M-h)>4&&(u=1),d=h+u,(k=t.push("list_item_open","li",1)).markup=String.fromCharCode(y),k.map=m=[o,0],p&&(k.info=t.src.slice(I,$-1)),w=t.tight,D=t.tShift[o],z=t.sCount[o],j=t.listIndent,t.listIndent=t.blkIndent,t.blkIndent=d,t.tight=!0,t.tShift[o]=c-t.bMarks[o],t.sCount[o]=M,c>=P&&t.isEmpty(o+1)?t.line=Math.min(t.line+2,e):t.md.block.tokenize(t,o,e,!0),t.tight&&!q||(O=!1),q=t.line-o>1&&t.isEmpty(t.line-1),t.blkIndent=t.listIndent,t.listIndent=j,t.tShift[o]=D,t.sCount[o]=z,t.tight=w,(k=t.push("list_item_close","li",-1)).markup=String.fromCharCode(y),S=o=t.line,m[1]=S,c=t.bMarks[o],S>=e||t.sCount[S]=4)break;for(R=!1,f=0,C=B.length;f=4||i.src.charCodeAt(j)!==91)return!1;for(;++j3||i.sCount[z]<0)){for(_=!1,u=0,h=P.length;u|$))/i,/<\/(script|pre|style|textarea)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(r.source+"\\s*$"),/^$/,!1]];L.exports=function(t,o,e,a){var s,c,f,d,u=t.bMarks[o]+t.tShift[o],h=t.eMarks[o];if(t.sCount[o]-t.blkIndent>=4||!t.md.options.html||t.src.charCodeAt(u)!==60)return!1;for(d=t.src.slice(u,h),s=0;s=4||(e=r.src.charCodeAt(f))!==35||f>=d)return!1;for(a=1,e=r.src.charCodeAt(++f);e===35&&f6||ff&&n(r.src.charCodeAt(s-1))&&(d=s),r.line=i+1,(c=r.push("heading_open","h"+String(a),1)).markup="########".slice(0,a),c.map=[i,r.line],(c=r.push("inline","",0)).content=r.src.slice(f,d).trim(),c.map=[i,r.line],c.children=[],(c=r.push("heading_close","h"+String(a),-1)).markup="########".slice(0,a)),!0)}},function(L,v,l){L.exports=function(n,r,i){var t,o,e,a,s,c,f,d,u,h,p=r+1,m=n.md.block.ruler.getRules("paragraph");if(n.sCount[r]-n.blkIndent>=4)return!1;for(h=n.parentType,n.parentType="paragraph";p3)){if(n.sCount[p]>=n.blkIndent&&(c=n.bMarks[p]+n.tShift[p])<(f=n.eMarks[p])&&((u=n.src.charCodeAt(c))===45||u===61)&&(c=n.skipChars(c,u),(c=n.skipSpaces(c))>=f)){d=u===61?1:2;break}if(!(n.sCount[p]<0)){for(o=!1,e=0,a=m.length;e3||n.sCount[c]<0)){for(t=!1,o=0,e=f.length;o0&&this.level++,this.tokens.push(a),a},i.prototype.isEmpty=function(t){return this.bMarks[t]+this.tShift[t]>=this.eMarks[t]},i.prototype.skipEmptyLines=function(t){for(var o=this.lineMax;to;)if(!r(this.src.charCodeAt(--t)))return t+1;return t},i.prototype.skipChars=function(t,o){for(var e=this.src.length;te;)if(o!==this.src.charCodeAt(--t))return t+1;return t},i.prototype.getLines=function(t,o,e,a){var s,c,f,d,u,h,p,m=t;if(t>=o)return"";for(h=new Array(o-t),s=0;me?new Array(c-e+1).join(" ")+this.src.slice(d,u):this.src.slice(d,u)}return h.join("")},i.prototype.Token=n,L.exports=i},function(L,v,l){var n=l(4),r=[["text",l(56)],["newline",l(57)],["escape",l(58)],["backticks",l(59)],["strikethrough",l(13).tokenize],["emphasis",l(14).tokenize],["link",l(60)],["image",l(61)],["autolink",l(62)],["html_inline",l(63)],["entity",l(64)]],i=[["balance_pairs",l(65)],["strikethrough",l(13).postProcess],["emphasis",l(14).postProcess],["text_collapse",l(66)]];function t(){var o;for(this.ruler=new n,o=0;o=f)break}else o.pending+=o.src[o.pos++]}o.pending&&o.pushPending()},t.prototype.parse=function(o,e,a,s){var c,f,d,u=new this.State(o,e,a,s);for(this.tokenize(u),d=(f=this.ruler2.getRules("")).length,c=0;c=0&&r.pending.charCodeAt(t)===32)if(t>=1&&r.pending.charCodeAt(t-1)===32){for(e=t-1;e>=1&&r.pending.charCodeAt(e-1)===32;)e--;r.pending=r.pending.slice(0,e),r.push("hardbreak","br",0)}else r.pending=r.pending.slice(0,-1),r.push("softbreak","br",0);else r.push("softbreak","br",0);for(a++;a?@[]^_`{|}~-".split("").forEach(function(t){r[t.charCodeAt(0)]=1}),L.exports=function(t,o){var e,a=t.pos,s=t.posMax;if(t.src.charCodeAt(a)!==92)return!1;if(++a=C)return!1;if(E=f,(d=i.md.helpers.parseLinkDestination(i.src,f,i.posMax)).ok){for(h=i.md.normalizeLink(d.str),i.md.validateLink(h)?f=d.pos:h="",E=f;f=C||i.src.charCodeAt(f)!==41)&&(b=!0),f++}if(b){if(i.env.references===void 0)return!1;if(f=0?a=i.src.slice(E,f++):f=s+1):f=s+1,a||(a=i.src.slice(c,s)),!(u=i.env.references[n(a)]))return i.pos=m,!1;h=u.href,p=u.title}return t||(i.pos=c,i.posMax=s,i.push("link_open","a",1).attrs=o=[["href",h]],p&&o.push(["title",p]),i.md.inline.tokenize(i),i.push("link_close","a",-1)),i.pos=f,i.posMax=C,!0}},function(L,v,l){var n=l(0).normalizeReference,r=l(0).isSpace;L.exports=function(i,t){var o,e,a,s,c,f,d,u,h,p,m,C,E,b="",y=i.pos,_=i.posMax;if(i.src.charCodeAt(i.pos)!==33||i.src.charCodeAt(i.pos+1)!==91||(f=i.pos+2,(c=i.md.helpers.parseLinkLabel(i,i.pos+1,!1))<0))return!1;if((d=c+1)<_&&i.src.charCodeAt(d)===40){for(d++;d<_&&(e=i.src.charCodeAt(d),r(e)||e===10);d++);if(d>=_)return!1;for(E=d,(h=i.md.helpers.parseLinkDestination(i.src,d,i.posMax)).ok&&(b=i.md.normalizeLink(h.str),i.md.validateLink(b)?d=h.pos:b=""),E=d;d<_&&(e=i.src.charCodeAt(d),r(e)||e===10);d++);if(h=i.md.helpers.parseLinkTitle(i.src,d,i.posMax),d<_&&E!==d&&h.ok)for(p=h.str,d=h.pos;d<_&&(e=i.src.charCodeAt(d),r(e)||e===10);d++);else p="";if(d>=_||i.src.charCodeAt(d)!==41)return i.pos=y,!1;d++}else{if(i.env.references===void 0)return!1;if(d<_&&i.src.charCodeAt(d)===91?(E=d+1,(d=i.md.helpers.parseLinkLabel(i,d))>=0?s=i.src.slice(E,d++):d=c+1):d=c+1,s||(s=i.src.slice(f,c)),!(u=i.env.references[n(s)]))return i.pos=y,!1;b=u.href,p=u.title}return t||(a=i.src.slice(f,c),i.md.inline.parse(a,i.md,i.env,C=[]),(m=i.push("image","img",0)).attrs=o=[["src",b],["alt",""]],m.children=C,m.content=a,p&&o.push(["title",p])),i.pos=d,i.posMax=_,!0}},function(L,v,l){var n=/^([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/,r=/^([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)$/;L.exports=function(i,t){var o,e,a,s,c,f,d=i.pos;if(i.src.charCodeAt(d)!==60)return!1;for(c=i.pos,f=i.posMax;;){if(++d>=f||(s=i.src.charCodeAt(d))===60)return!1;if(s===62)break}return o=i.src.slice(c+1,d),r.test(o)?(e=i.md.normalizeLink(o),!!i.md.validateLink(e)&&(t||((a=i.push("link_open","a",1)).attrs=[["href",e]],a.markup="autolink",a.info="auto",(a=i.push("text","",0)).content=i.md.normalizeLinkText(o),(a=i.push("link_close","a",-1)).markup="autolink",a.info="auto"),i.pos+=o.length+2,!0)):!!n.test(o)&&(e=i.md.normalizeLink("mailto:"+o),!!i.md.validateLink(e)&&(t||((a=i.push("link_open","a",1)).attrs=[["href",e]],a.markup="autolink",a.info="auto",(a=i.push("text","",0)).content=i.md.normalizeLinkText(o),(a=i.push("link_close","a",-1)).markup="autolink",a.info="auto"),i.pos+=o.length+2,!0))}},function(L,v,l){var n=l(12).HTML_TAG_RE;L.exports=function(r,i){var t,o,e,a=r.pos;return!!r.md.options.html&&(e=r.posMax,!(r.src.charCodeAt(a)!==60||a+2>=e)&&!((t=r.src.charCodeAt(a+1))!==33&&t!==63&&t!==47&&!function(s){var c=32|s;return c>=97&&c<=122}(t))&&!!(o=r.src.slice(a).match(n))&&(i||(r.push("html_inline","",0).content=r.src.slice(a,a+o[0].length)),r.pos+=o[0].length,!0))}},function(L,v,l){var n=l(7),r=l(0).has,i=l(0).isValidEntityCode,t=l(0).fromCodePoint,o=/^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i,e=/^&([a-z][a-z0-9]{1,31});/i;L.exports=function(a,s){var c,f,d=a.pos,u=a.posMax;if(a.src.charCodeAt(d)!==38)return!1;if(d+1s;o-=C[o]+1)if((a=i[o]).marker===e.marker&&a.open&&a.end<0&&(f=!1,(a.close||e.open)&&(a.length+e.length)%3==0&&(a.length%3==0&&e.length%3==0||(f=!0)),!f)){d=o>0&&!i[o-1].open?C[o-1]+1:0,C[t]=t-o+d,C[o]=d,e.open=!1,a.end=t,a.close=!1,c=-1,m=-2;break}c!==-1&&(u[e.marker][(e.open?3:0)+(e.length||0)%3]=c)}}}L.exports=function(r){var i,t=r.tokens_meta,o=r.tokens_meta.length;for(n(0,r.delimiters),i=0;i0&&t++,o[r].type==="text"&&r+10&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],f={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(c),this.tokens_meta.push(f),c},o.prototype.scanDelims=function(e,a){var s,c,f,d,u,h,p,m,C,E=e,b=!0,y=!0,_=this.posMax,P=this.src.charCodeAt(e);for(s=e>0?this.src.charCodeAt(e-1):32;E<_&&this.src.charCodeAt(E)===P;)E++;return f=E-e,c=E<_?this.src.charCodeAt(E):32,p=t(s)||i(String.fromCharCode(s)),C=t(c)||i(String.fromCharCode(c)),h=r(s),(m=r(c))?b=!1:C&&(h||p||(b=!1)),h?y=!1:p&&(m||C||(y=!1)),a?(d=b,u=y):(d=b&&(!y||p),u=y&&(!b||C)),{can_open:d,can_close:u,length:f}},o.prototype.Token=n,L.exports=o},function(L,v,l){function n(u){var h=Array.prototype.slice.call(arguments,1);return h.forEach(function(p){p&&Object.keys(p).forEach(function(m){u[m]=p[m]})}),u}function r(u){return Object.prototype.toString.call(u)}function i(u){return r(u)==="[object Function]"}function t(u){return u.replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}var o={fuzzyLink:!0,fuzzyEmail:!0,fuzzyIP:!1},e={"http:":{validate:function(u,h,p){var m=u.slice(h);return p.re.http||(p.re.http=new RegExp("^\\/\\/"+p.re.src_auth+p.re.src_host_port_strict+p.re.src_path,"i")),p.re.http.test(m)?m.match(p.re.http)[0].length:0}},"https:":"http:","ftp:":"http:","//":{validate:function(u,h,p){var m=u.slice(h);return p.re.no_http||(p.re.no_http=new RegExp("^"+p.re.src_auth+"(?:localhost|(?:(?:"+p.re.src_domain+")\\.)+"+p.re.src_domain_root+")"+p.re.src_port+p.re.src_host_terminator+p.re.src_path,"i")),p.re.no_http.test(m)?h>=3&&u[h-3]===":"||h>=3&&u[h-3]==="/"?0:m.match(p.re.no_http)[0].length:0}},"mailto:":{validate:function(u,h,p){var m=u.slice(h);return p.re.mailto||(p.re.mailto=new RegExp("^"+p.re.src_email_name+"@"+p.re.src_host_strict,"i")),p.re.mailto.test(m)?m.match(p.re.mailto)[0].length:0}}},a="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|\u0440\u0444".split("|");function s(u){var h=u.re=l(69)(u.__opts__),p=u.__tlds__.slice();function m(y){return y.replace("%TLDS%",h.src_tlds)}u.onCompile(),u.__tlds_replaced__||p.push("a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]"),p.push(h.src_xn),h.src_tlds=p.join("|"),h.email_fuzzy=RegExp(m(h.tpl_email_fuzzy),"i"),h.link_fuzzy=RegExp(m(h.tpl_link_fuzzy),"i"),h.link_no_ip_fuzzy=RegExp(m(h.tpl_link_no_ip_fuzzy),"i"),h.host_fuzzy_test=RegExp(m(h.tpl_host_fuzzy_test),"i");var C=[];function E(y,_){throw new Error('(LinkifyIt) Invalid schema "'+y+'": '+_)}u.__compiled__={},Object.keys(u.__schemas__).forEach(function(y){var _=u.__schemas__[y];if(_!==null){var P={validate:null,link:null};if(u.__compiled__[y]=P,r(_)==="[object Object]")return function(S){return r(S)==="[object RegExp]"}(_.validate)?P.validate=function(S){return function(M,j){var F=M.slice(j);return S.test(F)?F.match(S)[0].length:0}}(_.validate):i(_.validate)?P.validate=_.validate:E(y,_),void(i(_.normalize)?P.normalize=_.normalize:_.normalize?E(y,_):P.normalize=function(S,M){M.normalize(S)});(function(S){return r(S)==="[object String]"})(_)?C.push(y):E(y,_)}}),C.forEach(function(y){u.__compiled__[u.__schemas__[y]]&&(u.__compiled__[y].validate=u.__compiled__[u.__schemas__[y]].validate,u.__compiled__[y].normalize=u.__compiled__[u.__schemas__[y]].normalize)}),u.__compiled__[""]={validate:null,normalize:function(y,_){_.normalize(y)}};var b=Object.keys(u.__compiled__).filter(function(y){return y.length>0&&u.__compiled__[y]}).map(t).join("|");u.re.schema_test=RegExp("(^|(?!_)(?:[><\uFF5C]|"+h.src_ZPCc+"))("+b+")","i"),u.re.schema_search=RegExp("(^|(?!_)(?:[><\uFF5C]|"+h.src_ZPCc+"))("+b+")","ig"),u.re.pretest=RegExp("("+u.re.schema_test.source+")|("+u.re.host_fuzzy_test.source+")|@","i"),function(y){y.__index__=-1,y.__text_cache__=""}(u)}function c(u,h){var p=u.__index__,m=u.__last_index__,C=u.__text_cache__.slice(p,m);this.schema=u.__schema__.toLowerCase(),this.index=p+h,this.lastIndex=m+h,this.raw=C,this.text=C,this.url=C}function f(u,h){var p=new c(u,h);return u.__compiled__[p.schema].normalize(p,u),p}function d(u,h){if(!(this instanceof d))return new d(u,h);var p;h||(p=u,Object.keys(p||{}).reduce(function(m,C){return m||o.hasOwnProperty(C)},!1)&&(h=u,u={})),this.__opts__=n({},o,h),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=n({},e,u),this.__compiled__={},this.__tlds__=a,this.__tlds_replaced__=!1,this.re={},s(this)}d.prototype.add=function(u,h){return this.__schemas__[u]=h,s(this),this},d.prototype.set=function(u){return this.__opts__=n(this.__opts__,u),this},d.prototype.test=function(u){if(this.__text_cache__=u,this.__index__=-1,!u.length)return!1;var h,p,m,C,E,b,y,_;if(this.re.schema_test.test(u)){for((y=this.re.schema_search).lastIndex=0;(h=y.exec(u))!==null;)if(C=this.testSchemaAt(u,h[2],y.lastIndex)){this.__schema__=h[2],this.__index__=h.index+h[1].length,this.__last_index__=h.index+h[0].length+C;break}}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(_=u.search(this.re.host_fuzzy_test))>=0&&(this.__index__<0||_=0&&(m=u.match(this.re.email_fuzzy))!==null&&(E=m.index+m[1].length,b=m.index+m[0].length,(this.__index__<0||Ethis.__last_index__)&&(this.__schema__="mailto:",this.__index__=E,this.__last_index__=b)),this.__index__>=0},d.prototype.pretest=function(u){return this.re.pretest.test(u)},d.prototype.testSchemaAt=function(u,h,p){return this.__compiled__[h.toLowerCase()]?this.__compiled__[h.toLowerCase()].validate(u,p,this):0},d.prototype.match=function(u){var h=0,p=[];this.__index__>=0&&this.__text_cache__===u&&(p.push(f(this,h)),h=this.__last_index__);for(var m=h?u.slice(h):u;this.test(m);)p.push(f(this,h)),m=m.slice(this.__last_index__),h+=this.__last_index__;return p.length?p:null},d.prototype.tlds=function(u,h){return u=Array.isArray(u)?u:[u],h?(this.__tlds__=this.__tlds__.concat(u).sort().filter(function(p,m,C){return p!==C[m-1]}).reverse(),s(this),this):(this.__tlds__=u.slice(),this.__tlds_replaced__=!0,s(this),this)},d.prototype.normalize=function(u){u.schema||(u.url="http://"+u.url),u.schema!=="mailto:"||/^mailto:/i.test(u.url)||(u.url="mailto:"+u.url)},d.prototype.onCompile=function(){},L.exports=d},function(L,v,l){L.exports=function(n){var r={};return r.src_Any=l(9).source,r.src_Cc=l(10).source,r.src_Z=l(11).source,r.src_P=l(3).source,r.src_ZPCc=[r.src_Z,r.src_P,r.src_Cc].join("|"),r.src_ZCc=[r.src_Z,r.src_Cc].join("|"),r.src_pseudo_letter="(?:(?![><\uFF5C]|"+r.src_ZPCc+")"+r.src_Any+")",r.src_ip4="(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)",r.src_auth="(?:(?:(?!"+r.src_ZCc+"|[@/\\[\\]()]).)+@)?",r.src_port="(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?",r.src_host_terminator="(?=$|[><\uFF5C]|"+r.src_ZPCc+")(?!-|_|:\\d|\\.-|\\.(?!$|"+r.src_ZPCc+"))",r.src_path="(?:[/?#](?:(?!"+r.src_ZCc+`|[><\uFF5C]|[()[\\]{}.,"'?!\\-]).|\\[(?:(?!`+r.src_ZCc+"|\\]).)*\\]|\\((?:(?!"+r.src_ZCc+"|[)]).)*\\)|\\{(?:(?!"+r.src_ZCc+'|[}]).)*\\}|\\"(?:(?!'+r.src_ZCc+`|["]).)+\\"|\\'(?:(?!`+r.src_ZCc+"|[']).)+\\'|\\'(?="+r.src_pseudo_letter+"|[-]).|\\.{2,}[a-zA-Z0-9%/&]|\\.(?!"+r.src_ZCc+"|[.]).|"+(n&&n["---"]?"\\-(?!--(?:[^-]|$))(?:-*)|":"\\-+|")+"\\,(?!"+r.src_ZCc+").|\\!+(?!"+r.src_ZCc+"|[!]).|\\?(?!"+r.src_ZCc+"|[?]).)+|\\/)?",r.src_email_name='[\\-;:&=\\+\\$,\\.a-zA-Z0-9_][\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]*',r.src_xn="xn--[a-z0-9\\-]{1,59}",r.src_domain_root="(?:"+r.src_xn+"|"+r.src_pseudo_letter+"{1,63})",r.src_domain="(?:"+r.src_xn+"|(?:"+r.src_pseudo_letter+")|(?:"+r.src_pseudo_letter+"(?:-|"+r.src_pseudo_letter+"){0,61}"+r.src_pseudo_letter+"))",r.src_host="(?:(?:(?:(?:"+r.src_domain+")\\.)*"+r.src_domain+"))",r.tpl_host_fuzzy="(?:"+r.src_ip4+"|(?:(?:(?:"+r.src_domain+")\\.)+(?:%TLDS%)))",r.tpl_host_no_ip_fuzzy="(?:(?:(?:"+r.src_domain+")\\.)+(?:%TLDS%))",r.src_host_strict=r.src_host+r.src_host_terminator,r.tpl_host_fuzzy_strict=r.tpl_host_fuzzy+r.src_host_terminator,r.src_host_port_strict=r.src_host+r.src_port+r.src_host_terminator,r.tpl_host_port_fuzzy_strict=r.tpl_host_fuzzy+r.src_port+r.src_host_terminator,r.tpl_host_port_no_ip_fuzzy_strict=r.tpl_host_no_ip_fuzzy+r.src_port+r.src_host_terminator,r.tpl_host_fuzzy_test="localhost|www\\.|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:"+r.src_ZPCc+"|>|$))",r.tpl_email_fuzzy='(^|[><\uFF5C]|"|\\(|'+r.src_ZCc+")("+r.src_email_name+"@"+r.tpl_host_fuzzy_strict+")",r.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`|\uFF5C]|"+r.src_ZPCc+"))((?![$+<=>^`|\uFF5C])"+r.tpl_host_port_fuzzy_strict+r.src_path+")",r.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`|\uFF5C]|"+r.src_ZPCc+"))((?![$+<=>^`|\uFF5C])"+r.tpl_host_port_no_ip_fuzzy_strict+r.src_path+")",r}},function(L,v,l){(function(n,r){var i;/*! https://mths.be/punycode v1.4.1 by @mathias */(function(t){v&&v.nodeType,n&&n.nodeType;var o=typeof r=="object"&&r;o.global!==o&&o.window!==o&&o.self;var e,a=2147483647,s=/^xn--/,c=/[^\x20-\x7E]/,f=/[\x2E\u3002\uFF0E\uFF61]/g,d={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},u=Math.floor,h=String.fromCharCode;function p(M){throw new RangeError(d[M])}function m(M,j){for(var F=M.length,z=[];F--;)z[F]=j(M[F]);return z}function C(M,j){var F=M.split("@"),z="";return F.length>1&&(z=F[0]+"@",M=F[1]),z+m((M=M.replace(f,".")).split("."),j).join(".")}function E(M){for(var j,F,z=[],D=0,w=M.length;D=55296&&j<=56319&&D65535&&(F+=h((j-=65536)>>>10&1023|55296),j=56320|1023&j),F+=h(j)}).join("")}function y(M,j){return M+22+75*(M<26)-((j!=0)<<5)}function _(M,j,F){var z=0;for(M=F?u(M/700):M>>1,M+=u(M/j);M>455;z+=36)M=u(M/35);return u(z+36*M/(M+38))}function P(M){var j,F,z,D,w,H,$,q,I,R,B,k=[],x=M.length,O=0,N=128,W=72;for((F=M.lastIndexOf("-"))<0&&(F=0),z=0;z=128&&p("not-basic"),k.push(M.charCodeAt(z));for(D=F>0?F+1:0;D=x&&p("invalid-input"),((q=(B=M.charCodeAt(D++))-48<10?B-22:B-65<26?B-65:B-97<26?B-97:36)>=36||q>u((a-O)/H))&&p("overflow"),O+=q*H,!(q<(I=$<=W?1:$>=W+26?26:$-W));$+=36)H>u(a/(R=36-I))&&p("overflow"),H*=R;W=_(O-w,j=k.length+1,w==0),u(O/j)>a-N&&p("overflow"),N+=u(O/j),O%=j,k.splice(O++,0,N)}return b(k)}function S(M){var j,F,z,D,w,H,$,q,I,R,B,k,x,O,N,W=[];for(k=(M=E(M)).length,j=128,F=0,w=72,H=0;H=j&&B<$&&($=B);for($-j>u((a-F)/(x=z+1))&&p("overflow"),F+=($-j)*x,j=$,H=0;Ha&&p("overflow"),B==j){for(q=F,I=36;!(q<(R=I<=w?1:I>=w+26?26:I-w));I+=36)N=q-R,O=36-R,W.push(h(y(R+N%O,0))),q=u(N/O);W.push(h(y(q,0))),w=_(F,x,z==D),F=0,++z}++F,++j}return W.join("")}e={version:"1.4.1",ucs2:{decode:E,encode:b},decode:P,encode:S,toASCII:function(M){return C(M,function(j){return c.test(j)?"xn--"+S(j):j})},toUnicode:function(M){return C(M,function(j){return s.test(j)?P(j.slice(4).toLowerCase()):j})}},(i=function(){return e}.call(v,l,v,n))===void 0||(n.exports=i)})()}).call(this,l(71)(L),l(72))},function(L,v){L.exports=function(l){return l.webpackPolyfill||(l.deprecate=function(){},l.paths=[],l.children||(l.children=[]),Object.defineProperty(l,"loaded",{enumerable:!0,get:function(){return l.l}}),Object.defineProperty(l,"id",{enumerable:!0,get:function(){return l.i}}),l.webpackPolyfill=1),l}},function(L,v){var l;l=function(){return this}();try{l=l||new Function("return this")()}catch{typeof window=="object"&&(l=window)}L.exports=l},function(L,v,l){L.exports={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"\u201C\u201D\u2018\u2019",highlight:null,maxNesting:100},components:{core:{},block:{},inline:{}}}},function(L,v,l){L.exports={options:{html:!1,xhtmlOut:!1,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"\u201C\u201D\u2018\u2019",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline"]},block:{rules:["paragraph"]},inline:{rules:["text"],rules2:["balance_pairs","text_collapse"]}}}},function(L,v,l){L.exports={options:{html:!0,xhtmlOut:!0,breaks:!1,langPrefix:"language-",linkify:!1,typographer:!1,quotes:"\u201C\u201D\u2018\u2019",highlight:null,maxNesting:20},components:{core:{rules:["normalize","block","inline"]},block:{rules:["blockquote","code","fence","heading","hr","html_block","lheading","list","reference","paragraph"]},inline:{rules:["autolink","backticks","emphasis","entity","escape","html_inline","image","link","newline","text"],rules2:["balance_pairs","emphasis","text_collapse"]}}}},,function(L,v,l){l.r(v),l.d(v,"default",function(){return i});var n=l(17),r=l(2);function i(t){var o=t===void 0?{}:t,e=o.Prism,a=o.baseConfig,s=o.codeBlockClass,c=o.codeHighlightExtensionMap,f=c===void 0?{}:c,d=Object(n.default)(a);return d.extend(function(u){u.set({highlight:Object(r.a)({codeHighlightExtensionMap:f,hasLang:function(h){return e.languages[h]},codeBlockClass:s,highlight:function(h,p){return e.highlight(h,e.languages[p],p)}})})}),{previewClass:"markdown-body",extend:function(u){d.extend(function(){for(var h=arguments.length,p=new Array(h),m=0;m=d)&&!((S=c.bMarks[p]+c.tShift[p])<(M=c.eMarks[p])&&c.sCount[p]=4)){for(h=S+1;h<=M&&t[(h-S)%e]===c.src[h];h++);if(!(Math.floor((h-S)/e)'+(P?'

    '+P+"

    ":"")+` +`},_=function(){return` +`}),d=function(P,S){var M=P[S],j=M.info.trim().slice(u.length).trim();return!j&&C&&(j=typeof C=="function"?C():C),M.nesting===1?y(j):_(j)}),a.use(i.a,u,{render:d,validate:c,marker:f})}},e=function(a){a.extendMarkdown(function(s){var c=function(){var f=a.lang.config;return f.langConfig[f.lang]};o(s,{type:"tip",defaultTitle:function(){return c().tip.tip.defaultTitle},blockClass:"v-md-plugin-tip"}),o(s,{type:"warning",defaultTitle:function(){return c().tip.warning.defaultTitle},blockClass:"v-md-plugin-tip"}),o(s,{type:"danger",defaultTitle:function(){return c().tip.danger.defaultTitle},blockClass:"v-md-plugin-tip"}),o(s,{type:"details",defaultTitle:function(){return c().tip.details.defaultTitle},before:function(f){return'
    '+(f?""+f+"":"")+` +`},after:function(){return`
    +`}})}),a.lang.add({"zh-CN":{tip:{tip:{defaultTitle:"\u63D0\u793A"},warning:{defaultTitle:"\u6CE8\u610F"},danger:{defaultTitle:"\u8B66\u544A"},details:{defaultTitle:"\u8BE6\u7EC6\u4FE1\u606F"}}},"en-US":{tip:{tip:{defaultTitle:"TIP"},warning:{defaultTitle:"WARNING"},danger:{defaultTitle:"DANGER"},details:{defaultTitle:"DETAILS"}}}})};l(80),l(84),l(85),v.default={install:function(a,s){var c,f,d,u,h,p,m,C,E=(f=(c={}).name,d=f===void 0?"tip":f,u=c.icon,h=u===void 0?"v-md-icon-tip":u,p=c.text,m=function(b,y){y===void 0&&(y="tip"),b.insert(function(_){var P=_||b.langConfig.tip[y].placeholder;return{text:"::: "+y+` + `+P+` +:::`,selected:P}})},C={title:function(b){return b.langConfig.tip.toolbar},icon:h,text:p,menus:[{name:"tip",text:function(b){return b.langConfig.tip.tip.toolbar},action:function(b){b.execCommand(d)}},{name:"warning",text:function(b){return b.langConfig.tip.warning.toolbar},action:function(b){b.execCommand(d,"warning")}},{name:"danger",text:function(b){return b.langConfig.tip.danger.toolbar},action:function(b){b.execCommand(d,"danger")}},{name:"details",text:function(b){return b.langConfig.tip.details.toolbar},action:function(b){b.execCommand(d,"details")}}]},{install:function(b){b.name==="v-md-editor"&&(b.command(d,m),b.toolbar(d,C),b.lang.add({"zh-CN":{tip:{toolbar:"\u63D2\u5165\u63D0\u793A",tip:{toolbar:"\u63D0\u793A",placeholder:"\u5728\u6B64\u8F93\u5165\u5185\u5BB9"},warning:{toolbar:"\u6CE8\u610F",placeholder:"\u5728\u6B64\u8F93\u5165\u5185\u5BB9"},danger:{toolbar:"\u8B66\u544A",placeholder:"\u5728\u6B64\u8F93\u5165\u5185\u5BB9"},details:{toolbar:"\u8BE6\u7EC6\u4FE1\u606F",placeholder:"\u5185\u5BB9"}}},"en-US":{tip:{toolbar:"Insert tip",tip:{toolbar:"Tip",placeholder:"Insert content"},warning:{toolbar:"Warning",placeholder:"Insert content"},danger:{toolbar:"Danger",placeholder:"Insert content"},details:{toolbar:"Details",placeholder:"Content"}}}})),b.vMdParser.use(e)}});a.vMdParser.use(n.default,s),a.use(E)}}}]).default})})(Ut);var Oe=Bt(Ut.exports);export{De as V,Oe as v}; diff --git a/public/exadmin/assets/@tinymce.24a850ec.js b/public/exadmin/assets/@tinymce.24a850ec.js new file mode 100644 index 0000000..c230843 --- /dev/null +++ b/public/exadmin/assets/@tinymce.24a850ec.js @@ -0,0 +1 @@ +import"./vue.db505ee4.js";import{w as b,d as L,t as V,r as j,o as U,a as _,b as R,e as x,h as E,n as p}from"./@vue.cb43a243.js";var K=["onActivate","onAddUndo","onBeforeAddUndo","onBeforeExecCommand","onBeforeGetContent","onBeforeRenderUI","onBeforeSetContent","onBeforePaste","onBlur","onChange","onClearUndos","onClick","onContextMenu","onCopy","onCut","onDblclick","onDeactivate","onDirty","onDrag","onDragDrop","onDragEnd","onDragGesture","onDragOver","onDrop","onExecCommand","onFocus","onFocusIn","onFocusOut","onGetContent","onHide","onInit","onKeyDown","onKeyPress","onKeyUp","onLoadContent","onMouseDown","onMouseEnter","onMouseLeave","onMouseMove","onMouseOut","onMouseOver","onMouseUp","onNodeChange","onObjectResizeStart","onObjectResized","onObjectSelected","onPaste","onPostProcess","onPostRender","onPreProcess","onProgressState","onRedo","onRemove","onReset","onSaveContent","onSelectionChange","onSetAttrib","onSetContent","onShow","onSubmit","onUndo","onVisualAid"],N=function(n){return K.map(function(t){return t.toLowerCase()}).indexOf(n.toLowerCase())!==-1},T=function(n,t,e){Object.keys(t).filter(N).forEach(function(o){var r=t[o];typeof r=="function"&&(o==="onInit"?r(n,e):e.on(o.substring(2),function(i){return r(i,e)}))})},z=function(n,t,e,o){var r=n.modelEvents?n.modelEvents:null,i=Array.isArray(r)?r.join(" "):r;b(o,function(d,l){e&&typeof d=="string"&&d!==l&&d!==e.getContent({format:n.outputFormat})&&e.setContent(d)}),e.on(i||"change input undo redo",function(){t.emit("update:modelValue",e.getContent({format:n.outputFormat}))})},F=function(n,t,e,o,r,i){o.setContent(i()),e.attrs["onUpdate:modelValue"]&&z(t,e,o,r),T(n,e.attrs,o)},w=0,M=function(n){var t=Date.now(),e=Math.floor(Math.random()*1e9);return w++,n+"_"+e+w+String(t)},G=function(n){return n!==null&&n.tagName.toLowerCase()==="textarea"},D=function(n){return typeof n=="undefined"||n===""?[]:Array.isArray(n)?n:n.split(" ")},H=function(n,t){return D(n).concat(D(t))},k=function(n){return n==null},A=function(){return{listeners:[],scriptId:M("tiny-script"),scriptLoaded:!1}},q=function(){var n=A(),t=function(r,i,d,l){var a=i.createElement("script");a.referrerPolicy="origin",a.type="application/javascript",a.id=r,a.src=d;var s=function(){a.removeEventListener("load",s),l()};a.addEventListener("load",s),i.head&&i.head.appendChild(a)},e=function(r,i,d){n.scriptLoaded?d():(n.listeners.push(d),r.getElementById(n.scriptId)||t(n.scriptId,r,i,function(){n.listeners.forEach(function(l){return l()}),n.scriptLoaded=!0}))},o=function(){n=A()};return{load:e,reinitialize:o}},W=q(),J=function(){return typeof window!="undefined"?window:global},f=function(){var n=J();return n&&n.tinymce?n.tinymce:null},Q={apiKey:String,cloudChannel:String,id:String,init:Object,initialValue:String,inline:Boolean,modelEvents:[String,Array],plugins:[String,Array],tagName:String,toolbar:[String,Array],modelValue:String,disabled:Boolean,tinymceScriptSrc:String,outputFormat:{type:String,validator:function(n){return n==="html"||n==="text"}}},v=globalThis&&globalThis.__assign||function(){return v=Object.assign||function(n){for(var t,e=1,o=arguments.length;e!!n[r.toLowerCase()]:r=>!!n[r]}const Of="Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt",Pf=ve(Of),Af="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",Rf=ve(Af);function il(e){return!!e||e===""}function Kn(e){if(H(e)){const t={};for(let n=0;n{if(n){const s=n.split(Mf);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function jn(e){let t="";if(q(e))t=e;else if(H(e))for(let n=0;nht(n,t))}const Uf=e=>q(e)?e:e==null?"":H(e)||ce(e)&&(e.toString===cl||!x(e.toString))?JSON.stringify(e,ll,2):String(e),ll=(e,t)=>t&&t.__v_isRef?ll(e,t.value):Qt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r])=>(n[`${s} =>`]=r,n),{})}:$t(t)?{[`Set(${t.size})`]:[...t.values()]}:ce(t)&&!H(t)&&!fl(t)?String(t):t,X={},Zt=[],Ae=()=>{},fs=()=>!1,Kf=/^on[^a-z]/,Bt=e=>Kf.test(e),Yr=e=>e.startsWith("onUpdate:"),G=Object.assign,Zr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},jf=Object.prototype.hasOwnProperty,Q=(e,t)=>jf.call(e,t),H=Array.isArray,Qt=e=>Ds(e)==="[object Map]",$t=e=>Ds(e)==="[object Set]",io=e=>e instanceof Date,x=e=>typeof e=="function",q=e=>typeof e=="string",an=e=>typeof e=="symbol",ce=e=>e!==null&&typeof e=="object",Qr=e=>ce(e)&&x(e.then)&&x(e.catch),cl=Object.prototype.toString,Ds=e=>cl.call(e),xf=e=>Ds(e).slice(8,-1),fl=e=>Ds(e)==="[object Object]",Xr=e=>q(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Rt=ve(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Wf=ve("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"),Bs=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},qf=/-(\w)/g,be=Bs(e=>e.replace(qf,(t,n)=>n?n.toUpperCase():"")),zf=/\B([A-Z])/g,Ue=Bs(e=>e.replace(zf,"-$1").toLowerCase()),Ht=Bs(e=>e.charAt(0).toUpperCase()+e.slice(1)),Xt=Bs(e=>e?`on${Ht(e)}`:""),Rn=(e,t)=>!Object.is(e,t),Gt=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},gt=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let oo;const Jf=()=>oo||(oo=typeof globalThis!="undefined"?globalThis:typeof self!="undefined"?self:typeof window!="undefined"?window:typeof global!="undefined"?global:{});let Le;class Gr{constructor(t=!1){this.active=!0,this.effects=[],this.cleanups=[],!t&&Le&&(this.parent=Le,this.index=(Le.scopes||(Le.scopes=[])).push(this)-1)}run(t){if(this.active)try{return Le=this,t()}finally{Le=this.parent}}on(){Le=this}off(){Le=this.parent}stop(t){if(this.active){let n,s;for(n=0,s=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},ul=e=>(e.w&mt)>0,pl=e=>(e.n&mt)>0,Xf=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let s=0;s{(f==="length"||f>=s)&&l.push(c)});else switch(n!==void 0&&l.push(o.get(n)),t){case"add":H(e)?Xr(n)&&l.push(o.get("length")):(l.push(o.get(It)),Qt(e)&&l.push(o.get(Cr)));break;case"delete":H(e)||(l.push(o.get(It)),Qt(e)&&l.push(o.get(Cr)));break;case"set":Qt(e)&&l.push(o.get(It));break}if(l.length===1)l[0]&&Sr(l[0]);else{const c=[];for(const f of l)f&&c.push(...f);Sr(ei(c))}}function Sr(e,t){for(const n of H(e)?e:[...e])(n!==We||n.allowRecurse)&&(n.scheduler?n.scheduler():n.run())}const na=ve("__proto__,__v_isRef,__isVue"),gl=new Set(Object.getOwnPropertyNames(Symbol).map(e=>Symbol[e]).filter(an)),sa=$s(),ra=$s(!1,!0),ia=$s(!0),oa=$s(!0,!0),co=la();function la(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=Y(this);for(let i=0,o=this.length;i{e[t]=function(...n){Vt();const s=Y(this)[t].apply(this,n);return Ut(),s}}),e}function $s(e=!1,t=!1){return function(s,r,i){if(r==="__v_isReactive")return!e;if(r==="__v_isReadonly")return e;if(r==="__v_isShallow")return t;if(r==="__v_raw"&&i===(e?t?Sl:Cl:t?El:bl).get(s))return s;const o=H(s);if(!e&&o&&Q(co,r))return Reflect.get(co,r,i);const l=Reflect.get(s,r,i);return(an(r)?gl.has(r):na(r))||(e||Me(s,"get",r),t)?l:pe(l)?!o||!Xr(r)?l.value:l:ce(l)?e?ni(l):Us(l):l}}const ca=ml(),fa=ml(!0);function ml(e=!1){return function(n,s,r,i){let o=n[s];if(tn(o)&&pe(o)&&!pe(r))return!1;if(!e&&!tn(r)&&(si(r)||(r=Y(r),o=Y(o)),!H(n)&&pe(o)&&!pe(r)))return o.value=r,!0;const l=H(n)&&Xr(s)?Number(s)e,Hs=e=>Reflect.getPrototypeOf(e);function Gn(e,t,n=!1,s=!1){e=e.__v_raw;const r=Y(e),i=Y(t);t!==i&&!n&&Me(r,"get",t),!n&&Me(r,"get",i);const{has:o}=Hs(r),l=s?ti:n?oi:In;if(o.call(r,t))return l(e.get(t));if(o.call(r,i))return l(e.get(i));e!==r&&e.get(t)}function es(e,t=!1){const n=this.__v_raw,s=Y(n),r=Y(e);return e!==r&&!t&&Me(s,"has",e),!t&&Me(s,"has",r),e===r?n.has(e):n.has(e)||n.has(r)}function ts(e,t=!1){return e=e.__v_raw,!t&&Me(Y(e),"iterate",It),Reflect.get(e,"size",e)}function fo(e){e=Y(e);const t=Y(this);return Hs(t).has.call(t,e)||(t.add(e),nt(t,"add",e,e)),this}function ao(e,t){t=Y(t);const n=Y(this),{has:s,get:r}=Hs(n);let i=s.call(n,e);i||(e=Y(e),i=s.call(n,e));const o=r.call(n,e);return n.set(e,t),i?Rn(t,o)&&nt(n,"set",e,t):nt(n,"add",e,t),this}function uo(e){const t=Y(this),{has:n,get:s}=Hs(t);let r=n.call(t,e);r||(e=Y(e),r=n.call(t,e)),s&&s.call(t,e);const i=t.delete(e);return r&&nt(t,"delete",e,void 0),i}function po(){const e=Y(this),t=e.size!==0,n=e.clear();return t&&nt(e,"clear",void 0,void 0),n}function ns(e,t){return function(s,r){const i=this,o=i.__v_raw,l=Y(o),c=t?ti:e?oi:In;return!e&&Me(l,"iterate",It),o.forEach((f,a)=>s.call(r,c(f),c(a),i))}}function ss(e,t,n){return function(...s){const r=this.__v_raw,i=Y(r),o=Qt(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,f=r[e](...s),a=n?ti:t?oi:In;return!t&&Me(i,"iterate",c?Cr:It),{next(){const{value:u,done:d}=f.next();return d?{value:u,done:d}:{value:l?[a(u[0]),a(u[1])]:a(u),done:d}},[Symbol.iterator](){return this}}}}function it(e){return function(...t){return e==="delete"?!1:this}}function ga(){const e={get(i){return Gn(this,i)},get size(){return ts(this)},has:es,add:fo,set:ao,delete:uo,clear:po,forEach:ns(!1,!1)},t={get(i){return Gn(this,i,!1,!0)},get size(){return ts(this)},has:es,add:fo,set:ao,delete:uo,clear:po,forEach:ns(!1,!0)},n={get(i){return Gn(this,i,!0)},get size(){return ts(this,!0)},has(i){return es.call(this,i,!0)},add:it("add"),set:it("set"),delete:it("delete"),clear:it("clear"),forEach:ns(!0,!1)},s={get(i){return Gn(this,i,!0,!0)},get size(){return ts(this,!0)},has(i){return es.call(this,i,!0)},add:it("add"),set:it("set"),delete:it("delete"),clear:it("clear"),forEach:ns(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=ss(i,!1,!1),n[i]=ss(i,!0,!1),t[i]=ss(i,!1,!0),s[i]=ss(i,!0,!0)}),[e,n,t,s]}const[ma,ya,_a,ba]=ga();function Vs(e,t){const n=t?e?ba:_a:e?ya:ma;return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(Q(n,r)&&r in s?n:s,r,i)}const Ea={get:Vs(!1,!1)},Ca={get:Vs(!1,!0)},Sa={get:Vs(!0,!1)},Ta={get:Vs(!0,!0)},bl=new WeakMap,El=new WeakMap,Cl=new WeakMap,Sl=new WeakMap;function va(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function wa(e){return e.__v_skip||!Object.isExtensible(e)?0:va(xf(e))}function Us(e){return tn(e)?e:Ks(e,!1,yl,Ea,bl)}function Tl(e){return Ks(e,!1,da,Ca,El)}function ni(e){return Ks(e,!0,_l,Sa,Cl)}function Na(e){return Ks(e,!0,ha,Ta,Sl)}function Ks(e,t,n,s,r){if(!ce(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=r.get(e);if(i)return i;const o=wa(e);if(o===0)return e;const l=new Proxy(e,o===2?s:n);return r.set(e,l),l}function Mt(e){return tn(e)?Mt(e.__v_raw):!!(e&&e.__v_isReactive)}function tn(e){return!!(e&&e.__v_isReadonly)}function si(e){return!!(e&&e.__v_isShallow)}function ri(e){return Mt(e)||tn(e)}function Y(e){const t=e&&e.__v_raw;return t?Y(t):e}function ii(e){return gs(e,"__v_skip",!0),e}const In=e=>ce(e)?Us(e):e,oi=e=>ce(e)?ni(e):e;function li(e){ut&&We&&(e=Y(e),hl(e.dep||(e.dep=ei())))}function js(e,t){e=Y(e),e.dep&&Sr(e.dep)}function pe(e){return!!(e&&e.__v_isRef===!0)}function as(e){return vl(e,!1)}function Oa(e){return vl(e,!0)}function vl(e,t){return pe(e)?e:new Pa(e,t)}class Pa{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:Y(t),this._value=n?t:In(t)}get value(){return li(this),this._value}set value(t){t=this.__v_isShallow?t:Y(t),Rn(t,this._rawValue)&&(this._rawValue=t,this._value=this.__v_isShallow?t:In(t),js(this))}}function Aa(e){js(e)}function wl(e){return pe(e)?e.value:e}const Ra={get:(e,t,n)=>wl(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return pe(r)&&!pe(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function ci(e){return Mt(e)?e:new Proxy(e,Ra)}class Ia{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:s}=t(()=>li(this),()=>js(this));this._get=n,this._set=s}get value(){return this._get()}set value(t){this._set(t)}}function Ma(e){return new Ia(e)}function ka(e){const t=H(e)?new Array(e.length):{};for(const n in e)t[n]=Nl(e,n);return t}class Fa{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}}function Nl(e,t,n){const s=e[t];return pe(s)?s:new Fa(e,t,n)}class La{constructor(t,n,s,r){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this._dirty=!0,this.effect=new xn(t,()=>{this._dirty||(this._dirty=!0,js(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=s}get value(){const t=Y(this);return li(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function Da(e,t,n=!1){let s,r;const i=x(e);return i?(s=e,r=Ae):(s=e.get,r=e.set),new La(s,r,i||!r,n)}Promise.resolve();const En=[];function Ol(e,...t){Vt();const n=En.length?En[En.length-1].component:null,s=n&&n.appContext.config.warnHandler,r=Ba();if(s)qe(s,n,11,[e+t.join(""),n&&n.proxy,r.map(({vnode:i})=>`at <${_c(n,i.type)}>`).join(` +`),r]);else{const i=[`[Vue warn]: ${e}`,...t];r.length&&i.push(` +`,...$a(r)),console.warn(...i)}Ut()}function Ba(){let e=En[En.length-1];if(!e)return[];const t=[];for(;e;){const n=t[0];n&&n.vnode===e?n.recurseCount++:t.push({vnode:e,recurseCount:0});const s=e.component&&e.component.parent;e=s&&s.vnode}return t}function $a(e){const t=[];return e.forEach((n,s)=>{t.push(...s===0?[]:[` +`],...Ha(n))}),t}function Ha({vnode:e,recurseCount:t}){const n=t>0?`... (${t} recursive calls)`:"",s=e.component?e.component.parent==null:!1,r=` at <${_c(e.component,e.type,s)}`,i=">"+n;return e.props?[r,...Va(e.props),i]:[r+i]}function Va(e){const t=[],n=Object.keys(e);return n.slice(0,3).forEach(s=>{t.push(...Pl(s,e[s]))}),n.length>3&&t.push(" ..."),t}function Pl(e,t,n){return q(t)?(t=JSON.stringify(t),n?t:[`${e}=${t}`]):typeof t=="number"||typeof t=="boolean"||t==null?n?t:[`${e}=${t}`]:pe(t)?(t=Pl(e,Y(t.value),!0),n?t:[`${e}=Ref<`,t,">"]):x(t)?[`${e}=fn${t.name?`<${t.name}>`:""}`]:(t=Y(t),n?t:[`${e}=`,t])}function qe(e,t,n,s){let r;try{r=s?e(...s):e()}catch(i){Kt(i,t,n)}return r}function Re(e,t,n,s){if(x(e)){const i=qe(e,t,n,s);return i&&Qr(i)&&i.catch(o=>{Kt(o,t,n)}),i}const r=[];for(let i=0;i>>1;Mn(Oe[s])Ge&&Oe.splice(t,1)}function Il(e,t,n,s){H(e)?n.push(...e):(!t||!t.includes(e,e.allowRecurse?s+1:s))&&n.push(e),Rl()}function xa(e){Il(e,yn,Cn,zt)}function pi(e){Il(e,ct,Sn,Jt)}function di(e,t=null){if(Cn.length){for(vr=t,yn=[...new Set(Cn)],Cn.length=0,zt=0;ztMn(n)-Mn(s)),Jt=0;Jte.id==null?1/0:e.id;function Ml(e){Tr=!1,ms=!0,di(e),Oe.sort((n,s)=>Mn(n)-Mn(s));const t=Ae;try{for(Ge=0;Geat.emit(r,...i)),_n=[]):typeof window!="undefined"&&window.HTMLElement&&!((s=(n=window.navigator)===null||n===void 0?void 0:n.userAgent)===null||s===void 0?void 0:s.includes("jsdom"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(i=>{hi(i,t)}),setTimeout(()=>{at||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,wr=!0,_n=[])},3e3)):(wr=!0,_n=[])}function Wa(e,t){xs("app:init",e,t,{Fragment:ge,Text:Lt,Comment:Ee,Static:pt})}function qa(e){xs("app:unmount",e)}const Nr=gi("component:added"),kl=gi("component:updated"),za=gi("component:removed");function gi(e){return t=>{xs(e,t.appContext.app,t.uid,t.parent?t.parent.uid:void 0,t)}}function Ja(e,t,n){xs("component:emit",e.appContext.app,e,t,n)}function Ya(e,t,...n){const s=e.vnode.props||X;let r=n;const i=t.startsWith("update:"),o=i&&t.slice(7);if(o&&o in s){const a=`${o==="modelValue"?"model":o}Modifiers`,{number:u,trim:d}=s[a]||X;d?r=n.map(m=>m.trim()):u&&(r=n.map(gt))}Ja(e,t,r);let l,c=s[l=Xt(t)]||s[l=Xt(be(t))];!c&&i&&(c=s[l=Xt(Ue(t))]),c&&Re(c,e,6,r);const f=s[l+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Re(f,e,6,r)}}function Fl(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!x(e)){const c=f=>{const a=Fl(f,t,!0);a&&(l=!0,G(o,a))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(s.set(e,null),null):(H(i)?i.forEach(c=>o[c]=null):G(o,i),s.set(e,o),o)}function mi(e,t){return!e||!Bt(t)?!1:(t=t.slice(2).replace(/Once$/,""),Q(e,t[0].toLowerCase()+t.slice(1))||Q(e,Ue(t))||Q(e,t))}let Pe=null,Ws=null;function kn(e){const t=Pe;return Pe=e,Ws=e&&e.type.__scopeId||null,t}function Za(e){Ws=e}function Qa(){Ws=null}const Xa=e=>yi;function yi(e,t=Pe,n){if(!t||e._n)return e;const s=(...r)=>{s._d&&Ir(-1);const i=kn(t),o=e(...r);return kn(i),s._d&&Ir(1),kl(t),o};return s._n=!0,s._c=!0,s._d=!0,s}function us(e){const{type:t,vnode:n,proxy:s,withProxy:r,props:i,propsOptions:[o],slots:l,attrs:c,emit:f,render:a,renderCache:u,data:d,setupState:m,ctx:b,inheritAttrs:S}=e;let g,_;const y=kn(e);try{if(n.shapeFlag&4){const w=r||s;g=Ne(a.call(w,w,u,i,m,d,b)),_=c}else{const w=t;g=Ne(w.length>1?w(i,{attrs:c,slots:l,emit:f}):w(i,null)),_=t.props?c:eu(c)}}catch(w){Nn.length=0,Kt(w,e,1),g=ie(Ee)}let T=g;if(_&&S!==!1){const w=Object.keys(_),{shapeFlag:D}=T;w.length&&D&7&&(o&&w.some(Yr)&&(_=tu(_,o)),T=_t(T,_))}return n.dirs&&(T.dirs=T.dirs?T.dirs.concat(n.dirs):n.dirs),n.transition&&(T.transition=n.transition),g=T,kn(y),g}function Ga(e){let t;for(let n=0;n{let t;for(const n in e)(n==="class"||n==="style"||Bt(n))&&((t||(t={}))[n]=e[n]);return t},tu=(e,t)=>{const n={};for(const s in e)(!Yr(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function nu(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,f=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?ho(s,o,f):!!o;if(c&8){const a=t.dynamicProps;for(let u=0;ue.__isSuspense,ru={name:"Suspense",__isSuspense:!0,process(e,t,n,s,r,i,o,l,c,f){e==null?ou(t,n,s,r,i,o,l,c,f):lu(e,t,n,s,r,o,l,c,f)},hydrate:cu,create:bi,normalize:fu},iu=ru;function Fn(e,t){const n=e.props&&e.props[t];x(n)&&n()}function ou(e,t,n,s,r,i,o,l,c){const{p:f,o:{createElement:a}}=c,u=a("div"),d=e.suspense=bi(e,r,s,t,u,n,i,o,l,c);f(null,d.pendingBranch=e.ssContent,u,null,s,d,i,o),d.deps>0?(Fn(e,"onPending"),Fn(e,"onFallback"),f(null,e.ssFallback,t,n,s,null,i,o),en(d,e.ssFallback)):d.resolve()}function lu(e,t,n,s,r,i,o,l,{p:c,um:f,o:{createElement:a}}){const u=t.suspense=e.suspense;u.vnode=t,t.el=e.el;const d=t.ssContent,m=t.ssFallback,{activeBranch:b,pendingBranch:S,isInFallback:g,isHydrating:_}=u;if(S)u.pendingBranch=d,xe(d,S)?(c(S,d,u.hiddenContainer,null,r,u,i,o,l),u.deps<=0?u.resolve():g&&(c(b,m,n,s,r,null,i,o,l),en(u,m))):(u.pendingId++,_?(u.isHydrating=!1,u.activeBranch=S):f(S,r,u),u.deps=0,u.effects.length=0,u.hiddenContainer=a("div"),g?(c(null,d,u.hiddenContainer,null,r,u,i,o,l),u.deps<=0?u.resolve():(c(b,m,n,s,r,null,i,o,l),en(u,m))):b&&xe(d,b)?(c(b,d,n,s,r,u,i,o,l),u.resolve(!0)):(c(null,d,u.hiddenContainer,null,r,u,i,o,l),u.deps<=0&&u.resolve()));else if(b&&xe(d,b))c(b,d,n,s,r,u,i,o,l),en(u,d);else if(Fn(t,"onPending"),u.pendingBranch=d,u.pendingId++,c(null,d,u.hiddenContainer,null,r,u,i,o,l),u.deps<=0)u.resolve();else{const{timeout:y,pendingId:T}=u;y>0?setTimeout(()=>{u.pendingId===T&&u.fallback(m)},y):y===0&&u.fallback(m)}}function bi(e,t,n,s,r,i,o,l,c,f,a=!1){const{p:u,m:d,um:m,n:b,o:{parentNode:S,remove:g}}=f,_=gt(e.props&&e.props.timeout),y={vnode:e,parent:t,parentComponent:n,isSVG:o,container:s,hiddenContainer:r,anchor:i,deps:0,pendingId:0,timeout:typeof _=="number"?_:-1,activeBranch:null,pendingBranch:null,isInFallback:!0,isHydrating:a,isUnmounted:!1,effects:[],resolve(T=!1){const{vnode:w,activeBranch:D,pendingBranch:M,pendingId:E,effects:v,parentComponent:O,container:L}=y;if(y.isHydrating)y.isHydrating=!1;else if(!T){const U=D&&M.transition&&M.transition.mode==="out-in";U&&(D.transition.afterLeave=()=>{E===y.pendingId&&d(M,L,J,0)});let{anchor:J}=y;D&&(J=b(D),m(D,O,y,!0)),U||d(M,L,J,0)}en(y,M),y.pendingBranch=null,y.isInFallback=!1;let $=y.parent,N=!1;for(;$;){if($.pendingBranch){$.effects.push(...v),N=!0;break}$=$.parent}N||pi(v),y.effects=[],Fn(w,"onResolve")},fallback(T){if(!y.pendingBranch)return;const{vnode:w,activeBranch:D,parentComponent:M,container:E,isSVG:v}=y;Fn(w,"onFallback");const O=b(D),L=()=>{!y.isInFallback||(u(null,T,E,O,M,null,v,l,c),en(y,T))},$=T.transition&&T.transition.mode==="out-in";$&&(D.transition.afterLeave=L),y.isInFallback=!0,m(D,M,null,!0),$||L()},move(T,w,D){y.activeBranch&&d(y.activeBranch,T,w,D),y.container=T},next(){return y.activeBranch&&b(y.activeBranch)},registerDep(T,w){const D=!!y.pendingBranch;D&&y.deps++;const M=T.vnode.el;T.asyncDep.catch(E=>{Kt(E,T,0)}).then(E=>{if(T.isUnmounted||y.isUnmounted||y.pendingId!==T.suspenseId)return;T.asyncResolved=!0;const{vnode:v}=T;Fr(T,E,!1),M&&(v.el=M);const O=!M&&T.subTree.el;w(T,v,S(M||T.subTree.el),M?null:b(T.subTree),y,o,c),O&&g(O),_i(T,v.el),D&&--y.deps===0&&y.resolve()})},unmount(T,w){y.isUnmounted=!0,y.activeBranch&&m(y.activeBranch,n,T,w),y.pendingBranch&&m(y.pendingBranch,n,T,w)}};return y}function cu(e,t,n,s,r,i,o,l,c){const f=t.suspense=bi(t,s,n,e.parentNode,document.createElement("div"),null,r,i,o,l,!0),a=c(e,f.pendingBranch=t.ssContent,n,f,i,o);return f.deps===0&&f.resolve(),a}function fu(e){const{shapeFlag:t,children:n}=e,s=t&32;e.ssContent=go(s?n.default:n),e.ssFallback=s?go(n.fallback):ie(Ee)}function go(e){let t;if(x(e)){const n=sn&&e._c;n&&(e._d=!1,Qs()),e=e(),n&&(e._d=!0,t=ze,lc())}return H(e)&&(e=Ga(e)),e=Ne(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(n=>n!==e)),e}function Ll(e,t){t&&t.pendingBranch?H(e)?t.effects.push(...e):t.effects.push(e):pi(e)}function en(e,t){e.activeBranch=t;const{vnode:n,parentComponent:s}=e,r=n.el=t.el;s&&s.subTree===n&&(s.vnode.el=r,_i(s,r))}function Dl(e,t){if(de){let n=de.provides;const s=de.parent&&de.parent.provides;s===n&&(n=de.provides=Object.create(s)),n[e]=t}}function Tn(e,t,n=!1){const s=de||Pe;if(s){const r=s.parent==null?s.vnode.appContext&&s.vnode.appContext.provides:s.parent.provides;if(r&&e in r)return r[e];if(arguments.length>1)return n&&x(t)?t.call(s.proxy):t}}function au(e,t){return Wn(e,null,t)}function Bl(e,t){return Wn(e,null,{flush:"post"})}function uu(e,t){return Wn(e,null,{flush:"sync"})}const mo={};function vn(e,t,n){return Wn(e,t,n)}function Wn(e,t,{immediate:n,deep:s,flush:r,onTrack:i,onTrigger:o}=X){const l=de;let c,f=!1,a=!1;if(pe(e)?(c=()=>e.value,f=si(e)):Mt(e)?(c=()=>e,s=!0):H(e)?(a=!0,f=e.some(Mt),c=()=>e.map(_=>{if(pe(_))return _.value;if(Mt(_))return Pt(_);if(x(_))return qe(_,l,2)})):x(e)?t?c=()=>qe(e,l,2):c=()=>{if(!(l&&l.isUnmounted))return u&&u(),Re(e,l,3,[d])}:c=Ae,t&&s){const _=c;c=()=>Pt(_())}let u,d=_=>{u=g.onStop=()=>{qe(_,l,4)}};if(rn)return d=Ae,t?n&&Re(t,l,3,[c(),a?[]:void 0,d]):c(),Ae;let m=a?[]:mo;const b=()=>{if(!!g.active)if(t){const _=g.run();(s||f||(a?_.some((y,T)=>Rn(y,m[T])):Rn(_,m)))&&(u&&u(),Re(t,l,3,[_,m===mo?void 0:m,d]),m=_)}else g.run()};b.allowRecurse=!!t;let S;r==="sync"?S=b:r==="post"?S=()=>me(b,l&&l.suspense):S=()=>{!l||l.isMounted?xa(b):b()};const g=new xn(c,S);return t?n?b():m=g.run():r==="post"?me(g.run.bind(g),l&&l.suspense):g.run(),()=>{g.stop(),l&&l.scope&&Zr(l.scope.effects,g)}}function pu(e,t,n){const s=this.proxy,r=q(e)?e.includes(".")?$l(s,e):()=>s[e]:e.bind(s,s);let i;x(t)?i=t:(i=t.handler,n=t);const o=de;bt(this);const l=Wn(r,i.bind(s),n);return o?bt(o):dt(),l}function $l(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;r{Pt(n,t)});else if(fl(e))for(const n in e)Pt(e[n],t);return e}function Ei(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return zn(()=>{e.isMounted=!0}),Ys(()=>{e.isUnmounting=!0}),e}const Fe=[Function,Array],du={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Fe,onEnter:Fe,onAfterEnter:Fe,onEnterCancelled:Fe,onBeforeLeave:Fe,onLeave:Fe,onAfterLeave:Fe,onLeaveCancelled:Fe,onBeforeAppear:Fe,onAppear:Fe,onAfterAppear:Fe,onAppearCancelled:Fe},setup(e,{slots:t}){const n=St(),s=Ei();let r;return()=>{const i=t.default&&qs(t.default(),!0);if(!i||!i.length)return;const o=Y(e),{mode:l}=o,c=i[0];if(s.isLeaving)return cr(c);const f=yo(c);if(!f)return cr(c);const a=nn(f,o,s,n);Ft(f,a);const u=n.subTree,d=u&&yo(u);let m=!1;const{getTransitionKey:b}=f.type;if(b){const S=b();r===void 0?r=S:S!==r&&(r=S,m=!0)}if(d&&d.type!==Ee&&(!xe(f,d)||m)){const S=nn(d,o,s,n);if(Ft(d,S),l==="out-in")return s.isLeaving=!0,S.afterLeave=()=>{s.isLeaving=!1,n.update()},cr(c);l==="in-out"&&f.type!==Ee&&(S.delayLeave=(g,_,y)=>{const T=Hl(s,d);T[String(d.key)]=d,g._leaveCb=()=>{_(),g._leaveCb=void 0,delete a.delayedLeave},a.delayedLeave=y})}return c}}},Ci=du;function Hl(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function nn(e,t,n,s){const{appear:r,mode:i,persisted:o=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:f,onEnterCancelled:a,onBeforeLeave:u,onLeave:d,onAfterLeave:m,onLeaveCancelled:b,onBeforeAppear:S,onAppear:g,onAfterAppear:_,onAppearCancelled:y}=t,T=String(e.key),w=Hl(n,e),D=(E,v)=>{E&&Re(E,s,9,v)},M={mode:i,persisted:o,beforeEnter(E){let v=l;if(!n.isMounted)if(r)v=S||l;else return;E._leaveCb&&E._leaveCb(!0);const O=w[T];O&&xe(e,O)&&O.el._leaveCb&&O.el._leaveCb(),D(v,[E])},enter(E){let v=c,O=f,L=a;if(!n.isMounted)if(r)v=g||c,O=_||f,L=y||a;else return;let $=!1;const N=E._enterCb=U=>{$||($=!0,U?D(L,[E]):D(O,[E]),M.delayedLeave&&M.delayedLeave(),E._enterCb=void 0)};v?(v(E,N),v.length<=1&&N()):N()},leave(E,v){const O=String(e.key);if(E._enterCb&&E._enterCb(!0),n.isUnmounting)return v();D(u,[E]);let L=!1;const $=E._leaveCb=N=>{L||(L=!0,v(),N?D(b,[E]):D(m,[E]),E._leaveCb=void 0,w[O]===e&&delete w[O])};w[O]=e,d?(d(E,$),d.length<=1&&$()):$()},clone(E){return nn(E,t,n,s)}};return M}function cr(e){if(qn(e))return e=_t(e),e.children=null,e}function yo(e){return qn(e)?e.children?e.children[0]:void 0:e}function Ft(e,t){e.shapeFlag&6&&e.component?Ft(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function qs(e,t=!1){let n=[],s=0;for(let r=0;r1)for(let r=0;r!!e.type.__asyncLoader;function hu(e){x(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:r=200,timeout:i,suspensible:o=!0,onError:l}=e;let c=null,f,a=0;const u=()=>(a++,c=null,d()),d=()=>{let m;return c||(m=c=t().catch(b=>{if(b=b instanceof Error?b:new Error(String(b)),l)return new Promise((S,g)=>{l(b,()=>S(u()),()=>g(b),a+1)});throw b}).then(b=>m!==c&&c?c:(b&&(b.__esModule||b[Symbol.toStringTag]==="Module")&&(b=b.default),f=b,b)))};return Si({name:"AsyncComponentWrapper",__asyncLoader:d,get __asyncResolved(){return f},setup(){const m=de;if(f)return()=>fr(f,m);const b=y=>{c=null,Kt(y,m,13,!s)};if(o&&m.suspense||rn)return d().then(y=>()=>fr(y,m)).catch(y=>(b(y),()=>s?ie(s,{error:y}):null));const S=as(!1),g=as(),_=as(!!r);return r&&setTimeout(()=>{_.value=!1},r),i!=null&&setTimeout(()=>{if(!S.value&&!g.value){const y=new Error(`Async component timed out after ${i}ms.`);b(y),g.value=y}},i),d().then(()=>{S.value=!0,m.parent&&qn(m.parent.vnode)&&ui(m.parent.update)}).catch(y=>{b(y),g.value=y}),()=>{if(S.value&&f)return fr(f,m);if(g.value&&s)return ie(s,{error:g.value});if(n&&!_.value)return ie(n)}}})}function fr(e,{vnode:{ref:t,props:n,children:s}}){const r=ie(e,n,s);return r.ref=t,r}const qn=e=>e.type.__isKeepAlive,gu={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=St(),s=n.ctx;if(!s.renderer)return t.default;const r=new Map,i=new Set;let o=null;n.__v_cache=r;const l=n.suspense,{renderer:{p:c,m:f,um:a,o:{createElement:u}}}=s,d=u("div");s.activate=(y,T,w,D,M)=>{const E=y.component;f(y,T,w,0,l),c(E.vnode,y,T,w,E,l,D,y.slotScopeIds,M),me(()=>{E.isDeactivated=!1,E.a&&Gt(E.a);const v=y.props&&y.props.onVnodeMounted;v&&Se(v,E.parent,y)},l),Nr(E)},s.deactivate=y=>{const T=y.component;f(y,d,null,1,l),me(()=>{T.da&&Gt(T.da);const w=y.props&&y.props.onVnodeUnmounted;w&&Se(w,T.parent,y),T.isDeactivated=!0},l),Nr(T)};function m(y){ar(y),a(y,n,l,!0)}function b(y){r.forEach((T,w)=>{const D=Ss(T.type);D&&(!y||!y(D))&&S(w)})}function S(y){const T=r.get(y);!o||T.type!==o.type?m(T):o&&ar(o),r.delete(y),i.delete(y)}vn(()=>[e.include,e.exclude],([y,T])=>{y&&b(w=>bn(y,w)),T&&b(w=>!bn(T,w))},{flush:"post",deep:!0});let g=null;const _=()=>{g!=null&&r.set(g,ur(n.subTree))};return zn(_),Js(_),Ys(()=>{r.forEach(y=>{const{subTree:T,suspense:w}=n,D=ur(T);if(y.type===D.type){ar(D);const M=D.component.da;M&&me(M,w);return}m(y)})}),()=>{if(g=null,!t.default)return null;const y=t.default(),T=y[0];if(y.length>1)return o=null,y;if(!yt(T)||!(T.shapeFlag&4)&&!(T.shapeFlag&128))return o=null,T;let w=ur(T);const D=w.type,M=Ss(Ln(w)?w.type.__asyncResolved||{}:D),{include:E,exclude:v,max:O}=e;if(E&&(!M||!bn(E,M))||v&&M&&bn(v,M))return o=w,T;const L=w.key==null?D:w.key,$=r.get(L);return w.el&&(w=_t(w),T.shapeFlag&128&&(T.ssContent=w)),g=L,$?(w.el=$.el,w.component=$.component,w.transition&&Ft(w,w.transition),w.shapeFlag|=512,i.delete(L),i.add(L)):(i.add(L),O&&i.size>parseInt(O,10)&&S(i.values().next().value)),w.shapeFlag|=256,o=w,T}}},mu=gu;function bn(e,t){return H(e)?e.some(n=>bn(n,t)):q(e)?e.split(",").includes(t):e.test?e.test(t):!1}function Vl(e,t){Kl(e,"a",t)}function Ul(e,t){Kl(e,"da",t)}function Kl(e,t,n=de){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(zs(t,s,n),n){let r=n.parent;for(;r&&r.parent;)qn(r.parent.vnode)&&yu(s,t,n,r),r=r.parent}}function yu(e,t,n,s){const r=zs(t,e,s,!0);Zs(()=>{Zr(s[t],r)},n)}function ar(e){let t=e.shapeFlag;t&256&&(t-=256),t&512&&(t-=512),e.shapeFlag=t}function ur(e){return e.shapeFlag&128?e.ssContent:e}function zs(e,t,n=de,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;Vt(),bt(n);const l=Re(t,n,e,o);return dt(),Ut(),l});return s?r.unshift(i):r.push(i),i}}const st=e=>(t,n=de)=>(!rn||e==="sp")&&zs(e,t,n),jl=st("bm"),zn=st("m"),xl=st("bu"),Js=st("u"),Ys=st("bum"),Zs=st("um"),Wl=st("sp"),ql=st("rtg"),zl=st("rtc");function Jl(e,t=de){zs("ec",e,t)}let Or=!0;function _u(e){const t=Zl(e),n=e.proxy,s=e.ctx;Or=!1,t.beforeCreate&&_o(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:f,created:a,beforeMount:u,mounted:d,beforeUpdate:m,updated:b,activated:S,deactivated:g,beforeDestroy:_,beforeUnmount:y,destroyed:T,unmounted:w,render:D,renderTracked:M,renderTriggered:E,errorCaptured:v,serverPrefetch:O,expose:L,inheritAttrs:$,components:N,directives:U,filters:J}=t;if(f&&bu(f,s,null,e.appContext.config.unwrapInjectedRef),o)for(const ne in o){const se=o[ne];x(se)&&(s[ne]=se.bind(n))}if(r){const ne=r.call(n,n);ce(ne)&&(e.data=Us(ne))}if(Or=!0,i)for(const ne in i){const se=i[ne],Ze=x(se)?se.bind(n,n):x(se.get)?se.get.bind(n,n):Ae,ir=!x(se)&&x(se.set)?se.set.bind(n):Ae,un=bc({get:Ze,set:ir});Object.defineProperty(s,ne,{enumerable:!0,configurable:!0,get:()=>un.value,set:jt=>un.value=jt})}if(l)for(const ne in l)Yl(l[ne],s,n,ne);if(c){const ne=x(c)?c.call(n):c;Reflect.ownKeys(ne).forEach(se=>{Dl(se,ne[se])})}a&&_o(a,e,"c");function ae(ne,se){H(se)?se.forEach(Ze=>ne(Ze.bind(n))):se&&ne(se.bind(n))}if(ae(jl,u),ae(zn,d),ae(xl,m),ae(Js,b),ae(Vl,S),ae(Ul,g),ae(Jl,v),ae(zl,M),ae(ql,E),ae(Ys,y),ae(Zs,w),ae(Wl,O),H(L))if(L.length){const ne=e.exposed||(e.exposed={});L.forEach(se=>{Object.defineProperty(ne,se,{get:()=>n[se],set:Ze=>n[se]=Ze})})}else e.exposed||(e.exposed={});D&&e.render===Ae&&(e.render=D),$!=null&&(e.inheritAttrs=$),N&&(e.components=N),U&&(e.directives=U)}function bu(e,t,n=Ae,s=!1){H(e)&&(e=Pr(e));for(const r in e){const i=e[r];let o;ce(i)?"default"in i?o=Tn(i.from||r,i.default,!0):o=Tn(i.from||r):o=Tn(i),pe(o)&&s?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>o.value,set:l=>o.value=l}):t[r]=o}}function _o(e,t,n){Re(H(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Yl(e,t,n,s){const r=s.includes(".")?$l(n,s):()=>n[s];if(q(e)){const i=t[e];x(i)&&vn(r,i)}else if(x(e))vn(r,e.bind(n));else if(ce(e))if(H(e))e.forEach(i=>Yl(i,t,n,s));else{const i=x(e.handler)?e.handler.bind(n):t[e.handler];x(i)&&vn(r,i,e)}}function Zl(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(f=>_s(c,f,o,!0)),_s(c,t,o)),i.set(t,c),c}function _s(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&_s(e,i,n,!0),r&&r.forEach(o=>_s(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=Eu[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Eu={data:bo,props:wt,emits:wt,methods:wt,computed:wt,beforeCreate:Ce,created:Ce,beforeMount:Ce,mounted:Ce,beforeUpdate:Ce,updated:Ce,beforeDestroy:Ce,beforeUnmount:Ce,destroyed:Ce,unmounted:Ce,activated:Ce,deactivated:Ce,errorCaptured:Ce,serverPrefetch:Ce,components:wt,directives:wt,watch:Su,provide:bo,inject:Cu};function bo(e,t){return t?e?function(){return G(x(e)?e.call(this,this):e,x(t)?t.call(this,this):t)}:t:e}function Cu(e,t){return wt(Pr(e),Pr(t))}function Pr(e){if(H(e)){const t={};for(let n=0;n0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let u=0;u{c=!0;const[d,m]=Xl(u,t,!0);G(o,d),m&&l.push(...m)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!i&&!c)return s.set(e,Zt),Zt;if(H(i))for(let a=0;a-1,m[1]=S<0||b-1||Q(m,"default"))&&l.push(u)}}}const f=[o,l];return s.set(e,f),f}function Eo(e){return e[0]!=="$"}function Co(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:e===null?"null":""}function So(e,t){return Co(e)===Co(t)}function To(e,t){return H(t)?t.findIndex(n=>So(n,e)):x(t)&&So(t,e)?0:-1}const Gl=e=>e[0]==="_"||e==="$stable",Ti=e=>H(e)?e.map(Ne):[Ne(e)],wu=(e,t,n)=>{const s=yi((...r)=>Ti(t(...r)),n);return s._c=!1,s},ec=(e,t,n)=>{const s=e._ctx;for(const r in e){if(Gl(r))continue;const i=e[r];if(x(i))t[r]=wu(r,i,s);else if(i!=null){const o=Ti(i);t[r]=()=>o}}},tc=(e,t)=>{const n=Ti(t);e.slots.default=()=>n},Nu=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=Y(t),gs(t,"_",n)):ec(t,e.slots={})}else e.slots={},t&&tc(e,t);gs(e.slots,Xs,1)},Ou=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=X;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:(G(r,t),!n&&l===1&&delete r._):(i=!t.$stable,ec(t,r)),o=t}else t&&(tc(e,t),o={default:1});if(i)for(const l in r)!Gl(l)&&!(l in o)&&delete r[l]};function Pu(e,t){const n=Pe;if(n===null)return e;const s=n.proxy,r=e.dirs||(e.dirs=[]);for(let i=0;ibs(d,t&&(H(t)?t[m]:t),n,s,r));return}if(Ln(s)&&!r)return;const i=s.shapeFlag&4?Ii(s.component)||s.component.proxy:s.el,o=r?null:i,{i:l,r:c}=e,f=t&&t.r,a=l.refs===X?l.refs={}:l.refs,u=l.setupState;if(f!=null&&f!==c&&(q(f)?(a[f]=null,Q(u,f)&&(u[f]=null)):pe(f)&&(f.value=null)),x(c))qe(c,l,12,[o,a]);else{const d=q(c),m=pe(c);if(d||m){const b=()=>{if(e.f){const S=d?a[c]:c.value;r?H(S)&&Zr(S,i):H(S)?S.includes(i)||S.push(i):d?a[c]=[i]:(c.value=[i],e.k&&(a[e.k]=c.value))}else d?(a[c]=o,Q(u,c)&&(u[c]=o)):pe(c)&&(c.value=o,e.k&&(a[e.k]=o))};o?(b.id=-1,me(b,n)):b()}}}let ot=!1;const rs=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",pr=e=>e.nodeType===8;function Iu(e){const{mt:t,p:n,o:{patchProp:s,nextSibling:r,parentNode:i,remove:o,insert:l,createComment:c}}=e,f=(g,_)=>{if(!_.hasChildNodes()){n(null,g,_),ys();return}ot=!1,a(_.firstChild,g,null,null,null),ys(),ot&&console.error("Hydration completed but contains mismatches.")},a=(g,_,y,T,w,D=!1)=>{const M=pr(g)&&g.data==="[",E=()=>b(g,_,y,T,w,M),{type:v,ref:O,shapeFlag:L}=_,$=g.nodeType;_.el=g;let N=null;switch(v){case Lt:$!==3?N=E():(g.data!==_.children&&(ot=!0,g.data=_.children),N=r(g));break;case Ee:$!==8||M?N=E():N=r(g);break;case pt:if($!==1)N=E();else{N=g;const U=!_.children.length;for(let J=0;J<_.staticCount;J++)U&&(_.children+=N.outerHTML),J===_.staticCount-1&&(_.anchor=N),N=r(N);return N}break;case ge:M?N=m(g,_,y,T,w,D):N=E();break;default:if(L&1)$!==1||_.type.toLowerCase()!==g.tagName.toLowerCase()?N=E():N=u(g,_,y,T,w,D);else if(L&6){_.slotScopeIds=w;const U=i(g);if(t(_,U,null,y,T,rs(U),D),N=M?S(g):r(g),Ln(_)){let J;M?(J=ie(ge),J.anchor=N?N.previousSibling:U.lastChild):J=g.nodeType===3?Ai(""):ie("div"),J.el=g,_.component.subTree=J}}else L&64?$!==8?N=E():N=_.type.hydrate(g,_,y,T,w,D,e,d):L&128&&(N=_.type.hydrate(g,_,y,T,rs(i(g)),w,D,e,a))}return O!=null&&bs(O,null,T,_),N},u=(g,_,y,T,w,D)=>{D=D||!!_.dynamicChildren;const{type:M,props:E,patchFlag:v,shapeFlag:O,dirs:L}=_,$=M==="input"&&L||M==="option";if($||v!==-1){if(L&&je(_,null,y,"created"),E)if($||!D||v&48)for(const U in E)($&&U.endsWith("value")||Bt(U)&&!Rt(U))&&s(g,U,null,E[U],!1,void 0,y);else E.onClick&&s(g,"onClick",null,E.onClick,!1,void 0,y);let N;if((N=E&&E.onVnodeBeforeMount)&&Se(N,y,_),L&&je(_,null,y,"beforeMount"),((N=E&&E.onVnodeMounted)||L)&&Ll(()=>{N&&Se(N,y,_),L&&je(_,null,y,"mounted")},T),O&16&&!(E&&(E.innerHTML||E.textContent))){let U=d(g.firstChild,_,g,y,T,w,D);for(;U;){ot=!0;const J=U;U=U.nextSibling,o(J)}}else O&8&&g.textContent!==_.children&&(ot=!0,g.textContent=_.children)}return g.nextSibling},d=(g,_,y,T,w,D,M)=>{M=M||!!_.dynamicChildren;const E=_.children,v=E.length;for(let O=0;O{const{slotScopeIds:M}=_;M&&(w=w?w.concat(M):M);const E=i(g),v=d(r(g),_,E,y,T,w,D);return v&&pr(v)&&v.data==="]"?r(_.anchor=v):(ot=!0,l(_.anchor=c("]"),E,v),v)},b=(g,_,y,T,w,D)=>{if(ot=!0,_.el=null,D){const v=S(g);for(;;){const O=r(g);if(O&&O!==v)o(O);else break}}const M=r(g),E=i(g);return o(g),n(null,_,E,M,y,T,rs(E),w),M},S=g=>{let _=0;for(;g;)if(g=r(g),g&&pr(g)&&(g.data==="["&&_++,g.data==="]")){if(_===0)return r(g);_--}return g};return[f,a]}const me=Ll;function sc(e){return ic(e)}function rc(e){return ic(e,Iu)}function ic(e,t){const n=Jf();n.__VUE__=!0,hi(n.__VUE_DEVTOOLS_GLOBAL_HOOK__,n);const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:f,setElementText:a,parentNode:u,nextSibling:d,setScopeId:m=Ae,cloneNode:b,insertStaticContent:S}=e,g=(p,h,C,P=null,A=null,k=null,B=!1,I=null,F=!!h.dynamicChildren)=>{if(p===h)return;p&&!xe(p,h)&&(P=Xn(p),rt(p,A,k,!0),p=null),h.patchFlag===-2&&(F=!1,h.dynamicChildren=null);const{type:R,ref:K,shapeFlag:V}=h;switch(R){case Lt:_(p,h,C,P);break;case Ee:y(p,h,C,P);break;case pt:p==null&&T(h,C,P,B);break;case ge:U(p,h,C,P,A,k,B,I,F);break;default:V&1?M(p,h,C,P,A,k,B,I,F):V&6?J(p,h,C,P,A,k,B,I,F):(V&64||V&128)&&R.process(p,h,C,P,A,k,B,I,F,xt)}K!=null&&A&&bs(K,p&&p.ref,k,h||p,!h)},_=(p,h,C,P)=>{if(p==null)s(h.el=l(h.children),C,P);else{const A=h.el=p.el;h.children!==p.children&&f(A,h.children)}},y=(p,h,C,P)=>{p==null?s(h.el=c(h.children||""),C,P):h.el=p.el},T=(p,h,C,P)=>{[p.el,p.anchor]=S(p.children,h,C,P,p.el,p.anchor)},w=({el:p,anchor:h},C,P)=>{let A;for(;p&&p!==h;)A=d(p),s(p,C,P),p=A;s(h,C,P)},D=({el:p,anchor:h})=>{let C;for(;p&&p!==h;)C=d(p),r(p),p=C;r(h)},M=(p,h,C,P,A,k,B,I,F)=>{B=B||h.type==="svg",p==null?E(h,C,P,A,k,B,I,F):L(p,h,A,k,B,I,F)},E=(p,h,C,P,A,k,B,I)=>{let F,R;const{type:K,props:V,shapeFlag:j,transition:W,patchFlag:Z,dirs:oe}=p;if(p.el&&b!==void 0&&Z===-1)F=p.el=b(p.el);else{if(F=p.el=o(p.type,k,V&&V.is,V),j&8?a(F,p.children):j&16&&O(p.children,F,null,P,A,k&&K!=="foreignObject",B,I),oe&&je(p,null,P,"created"),V){for(const re in V)re!=="value"&&!Rt(re)&&i(F,re,null,V[re],k,p.children,P,A,Qe);"value"in V&&i(F,"value",null,V.value),(R=V.onVnodeBeforeMount)&&Se(R,P,p)}v(F,p,p.scopeId,B,P)}Object.defineProperty(F,"__vnode",{value:p,enumerable:!1}),Object.defineProperty(F,"__vueParentComponent",{value:P,enumerable:!1}),oe&&je(p,null,P,"beforeMount");const te=(!A||A&&!A.pendingBranch)&&W&&!W.persisted;te&&W.beforeEnter(F),s(F,h,C),((R=V&&V.onVnodeMounted)||te||oe)&&me(()=>{R&&Se(R,P,p),te&&W.enter(F),oe&&je(p,null,P,"mounted")},A)},v=(p,h,C,P,A)=>{if(C&&m(p,C),P)for(let k=0;k{for(let R=F;R{const I=h.el=p.el;let{patchFlag:F,dynamicChildren:R,dirs:K}=h;F|=p.patchFlag&16;const V=p.props||X,j=h.props||X;let W;C&&Tt(C,!1),(W=j.onVnodeBeforeUpdate)&&Se(W,C,h,p),K&&je(h,p,C,"beforeUpdate"),C&&Tt(C,!0);const Z=A&&h.type!=="foreignObject";if(R?$(p.dynamicChildren,R,I,C,P,Z,k):B||Ze(p,h,I,null,C,P,Z,k,!1),F>0){if(F&16)N(I,h,V,j,C,P,A);else if(F&2&&V.class!==j.class&&i(I,"class",null,j.class,A),F&4&&i(I,"style",V.style,j.style,A),F&8){const oe=h.dynamicProps;for(let te=0;te{W&&Se(W,C,h,p),K&&je(h,p,C,"updated")},P)},$=(p,h,C,P,A,k,B)=>{for(let I=0;I{if(C!==P){for(const I in P){if(Rt(I))continue;const F=P[I],R=C[I];F!==R&&I!=="value"&&i(p,I,R,F,B,h.children,A,k,Qe)}if(C!==X)for(const I in C)!Rt(I)&&!(I in P)&&i(p,I,C[I],null,B,h.children,A,k,Qe);"value"in P&&i(p,"value",C.value,P.value)}},U=(p,h,C,P,A,k,B,I,F)=>{const R=h.el=p?p.el:l(""),K=h.anchor=p?p.anchor:l("");let{patchFlag:V,dynamicChildren:j,slotScopeIds:W}=h;W&&(I=I?I.concat(W):W),p==null?(s(R,C,P),s(K,C,P),O(h.children,C,K,A,k,B,I,F)):V>0&&V&64&&j&&p.dynamicChildren?($(p.dynamicChildren,j,C,A,k,B,I),(h.key!=null||A&&h===A.subTree)&&vi(p,h,!0)):Ze(p,h,C,K,A,k,B,I,F)},J=(p,h,C,P,A,k,B,I,F)=>{h.slotScopeIds=I,p==null?h.shapeFlag&512?A.ctx.activate(h,C,P,B,F):Ye(h,C,P,A,k,B,F):ae(p,h,F)},Ye=(p,h,C,P,A,k,B)=>{const I=p.component=dc(p,P,A);if(qn(p)&&(I.ctx.renderer=xt),gc(I),I.asyncDep){if(A&&A.registerDep(I,ne),!p.el){const F=I.subTree=ie(Ee);y(null,F,h,C)}return}ne(I,p,h,C,A,k,B)},ae=(p,h,C)=>{const P=h.component=p.component;if(nu(p,h,C))if(P.asyncDep&&!P.asyncResolved){se(P,h,C);return}else P.next=h,ja(P.update),P.update();else h.component=p.component,h.el=p.el,P.vnode=h},ne=(p,h,C,P,A,k,B)=>{const I=()=>{if(p.isMounted){let{next:K,bu:V,u:j,parent:W,vnode:Z}=p,oe=K,te;Tt(p,!1),K?(K.el=Z.el,se(p,K,B)):K=Z,V&&Gt(V),(te=K.props&&K.props.onVnodeBeforeUpdate)&&Se(te,W,K,Z),Tt(p,!0);const re=us(p),Ve=p.subTree;p.subTree=re,g(Ve,re,u(Ve.el),Xn(Ve),p,A,k),K.el=re.el,oe===null&&_i(p,re.el),j&&me(j,A),(te=K.props&&K.props.onVnodeUpdated)&&me(()=>Se(te,W,K,Z),A),kl(p)}else{let K;const{el:V,props:j}=h,{bm:W,m:Z,parent:oe}=p,te=Ln(h);if(Tt(p,!1),W&&Gt(W),!te&&(K=j&&j.onVnodeBeforeMount)&&Se(K,oe,h),Tt(p,!0),V&&lr){const re=()=>{p.subTree=us(p),lr(V,p.subTree,p,A,null)};te?h.type.__asyncLoader().then(()=>!p.isUnmounted&&re()):re()}else{const re=p.subTree=us(p);g(null,re,C,P,p,A,k),h.el=re.el}if(Z&&me(Z,A),!te&&(K=j&&j.onVnodeMounted)){const re=h;me(()=>Se(K,oe,re),A)}h.shapeFlag&256&&p.a&&me(p.a,A),p.isMounted=!0,Nr(p),h=C=P=null}},F=p.effect=new xn(I,()=>ui(p.update),p.scope),R=p.update=F.run.bind(F);R.id=p.uid,Tt(p,!0),R()},se=(p,h,C)=>{h.component=p;const P=p.vnode.props;p.vnode=h,p.next=null,vu(p,h.props,P,C),Ou(p,h.children,C),Vt(),di(void 0,p.update),Ut()},Ze=(p,h,C,P,A,k,B,I,F=!1)=>{const R=p&&p.children,K=p?p.shapeFlag:0,V=h.children,{patchFlag:j,shapeFlag:W}=h;if(j>0){if(j&128){un(R,V,C,P,A,k,B,I,F);return}else if(j&256){ir(R,V,C,P,A,k,B,I,F);return}}W&8?(K&16&&Qe(R,A,k),V!==R&&a(C,V)):K&16?W&16?un(R,V,C,P,A,k,B,I,F):Qe(R,A,k,!0):(K&8&&a(C,""),W&16&&O(V,C,P,A,k,B,I,F))},ir=(p,h,C,P,A,k,B,I,F)=>{p=p||Zt,h=h||Zt;const R=p.length,K=h.length,V=Math.min(R,K);let j;for(j=0;jK?Qe(p,A,k,!0,!1,V):O(h,C,P,A,k,B,I,F,V)},un=(p,h,C,P,A,k,B,I,F)=>{let R=0;const K=h.length;let V=p.length-1,j=K-1;for(;R<=V&&R<=j;){const W=p[R],Z=h[R]=F?ft(h[R]):Ne(h[R]);if(xe(W,Z))g(W,Z,C,null,A,k,B,I,F);else break;R++}for(;R<=V&&R<=j;){const W=p[V],Z=h[j]=F?ft(h[j]):Ne(h[j]);if(xe(W,Z))g(W,Z,C,null,A,k,B,I,F);else break;V--,j--}if(R>V){if(R<=j){const W=j+1,Z=Wj)for(;R<=V;)rt(p[R],A,k,!0),R++;else{const W=R,Z=R,oe=new Map;for(R=Z;R<=j;R++){const we=h[R]=F?ft(h[R]):Ne(h[R]);we.key!=null&&oe.set(we.key,R)}let te,re=0;const Ve=j-Z+1;let Wt=!1,no=0;const pn=new Array(Ve);for(R=0;R=Ve){rt(we,A,k,!0);continue}let Ke;if(we.key!=null)Ke=oe.get(we.key);else for(te=Z;te<=j;te++)if(pn[te-Z]===0&&xe(we,h[te])){Ke=te;break}Ke===void 0?rt(we,A,k,!0):(pn[Ke-Z]=R+1,Ke>=no?no=Ke:Wt=!0,g(we,h[Ke],C,null,A,k,B,I,F),re++)}const so=Wt?Mu(pn):Zt;for(te=so.length-1,R=Ve-1;R>=0;R--){const we=Z+R,Ke=h[we],ro=we+1{const{el:k,type:B,transition:I,children:F,shapeFlag:R}=p;if(R&6){jt(p.component.subTree,h,C,P);return}if(R&128){p.suspense.move(h,C,P);return}if(R&64){B.move(p,h,C,xt);return}if(B===ge){s(k,h,C);for(let V=0;VI.enter(k),A);else{const{leave:V,delayLeave:j,afterLeave:W}=I,Z=()=>s(k,h,C),oe=()=>{V(k,()=>{Z(),W&&W()})};j?j(k,Z,oe):oe()}else s(k,h,C)},rt=(p,h,C,P=!1,A=!1)=>{const{type:k,props:B,ref:I,children:F,dynamicChildren:R,shapeFlag:K,patchFlag:V,dirs:j}=p;if(I!=null&&bs(I,null,C,p,!0),K&256){h.ctx.deactivate(p);return}const W=K&1&&j,Z=!Ln(p);let oe;if(Z&&(oe=B&&B.onVnodeBeforeUnmount)&&Se(oe,h,p),K&6)Nf(p.component,C,P);else{if(K&128){p.suspense.unmount(C,P);return}W&&je(p,null,h,"beforeUnmount"),K&64?p.type.remove(p,h,C,A,xt,P):R&&(k!==ge||V>0&&V&64)?Qe(R,h,C,!1,!0):(k===ge&&V&384||!A&&K&16)&&Qe(F,h,C),P&&eo(p)}(Z&&(oe=B&&B.onVnodeUnmounted)||W)&&me(()=>{oe&&Se(oe,h,p),W&&je(p,null,h,"unmounted")},C)},eo=p=>{const{type:h,el:C,anchor:P,transition:A}=p;if(h===ge){wf(C,P);return}if(h===pt){D(p);return}const k=()=>{r(C),A&&!A.persisted&&A.afterLeave&&A.afterLeave()};if(p.shapeFlag&1&&A&&!A.persisted){const{leave:B,delayLeave:I}=A,F=()=>B(C,k);I?I(p.el,k,F):F()}else k()},wf=(p,h)=>{let C;for(;p!==h;)C=d(p),r(p),p=C;r(h)},Nf=(p,h,C)=>{const{bum:P,scope:A,update:k,subTree:B,um:I}=p;P&&Gt(P),A.stop(),k&&(k.active=!1,rt(B,p,h,C)),I&&me(I,h),me(()=>{p.isUnmounted=!0},h),h&&h.pendingBranch&&!h.isUnmounted&&p.asyncDep&&!p.asyncResolved&&p.suspenseId===h.pendingId&&(h.deps--,h.deps===0&&h.resolve()),za(p)},Qe=(p,h,C,P=!1,A=!1,k=0)=>{for(let B=k;Bp.shapeFlag&6?Xn(p.component.subTree):p.shapeFlag&128?p.suspense.next():d(p.anchor||p.el),to=(p,h,C)=>{p==null?h._vnode&&rt(h._vnode,null,null,!0):g(h._vnode||null,p,h,null,null,null,C),ys(),h._vnode=p},xt={p:g,um:rt,m:jt,r:eo,mt:Ye,mc:O,pc:Ze,pbc:$,n:Xn,o:e};let or,lr;return t&&([or,lr]=t(xt)),{render:to,hydrate:or,createApp:Ru(to,or)}}function Tt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function vi(e,t,n=!1){const s=e.children,r=t.children;if(H(s)&&H(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}const ku=e=>e.__isTeleport,wn=e=>e&&(e.disabled||e.disabled===""),vo=e=>typeof SVGElement!="undefined"&&e instanceof SVGElement,Rr=(e,t)=>{const n=e&&e.to;return q(n)?t?t(n):null:n},Fu={__isTeleport:!0,process(e,t,n,s,r,i,o,l,c,f){const{mc:a,pc:u,pbc:d,o:{insert:m,querySelector:b,createText:S,createComment:g}}=f,_=wn(t.props);let{shapeFlag:y,children:T,dynamicChildren:w}=t;if(e==null){const D=t.el=S(""),M=t.anchor=S("");m(D,n,s),m(M,n,s);const E=t.target=Rr(t.props,b),v=t.targetAnchor=S("");E&&(m(v,E),o=o||vo(E));const O=(L,$)=>{y&16&&a(T,L,$,r,i,o,l,c)};_?O(n,M):E&&O(E,v)}else{t.el=e.el;const D=t.anchor=e.anchor,M=t.target=e.target,E=t.targetAnchor=e.targetAnchor,v=wn(e.props),O=v?n:M,L=v?D:E;if(o=o||vo(M),w?(d(e.dynamicChildren,w,O,r,i,o,l),vi(e,t,!0)):c||u(e,t,O,L,r,i,o,l,!1),_)v||is(t,n,D,f,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const $=t.target=Rr(t.props,b);$&&is(t,$,null,f,0)}else v&&is(t,M,E,f,1)}},remove(e,t,n,s,{um:r,o:{remove:i}},o){const{shapeFlag:l,children:c,anchor:f,targetAnchor:a,target:u,props:d}=e;if(u&&i(a),(o||!wn(d))&&(i(f),l&16))for(let m=0;m0?ze||Zt:null,lc(),sn>0&&ze&&ze.push(e),e}function Uu(e,t,n,s,r,i){return cc(Pi(e,t,n,s,r,i,!0))}function Oi(e,t,n,s,r){return cc(ie(e,t,n,s,r,!0))}function yt(e){return e?e.__v_isVNode===!0:!1}function xe(e,t){return e.type===t.type&&e.key===t.key}function Ku(e){}const Xs="__vInternal",fc=({key:e})=>e!=null?e:null,ps=({ref:e,ref_key:t,ref_for:n})=>e!=null?q(e)||pe(e)||x(e)?{i:Pe,r:e,k:t,f:!!n}:e:null;function Pi(e,t=null,n=null,s=0,r=null,i=e===ge?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&fc(t),ref:t&&ps(t),scopeId:Ws,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null};return l?(Ri(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=q(n)?8:16),sn>0&&!o&&ze&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&ze.push(c),c}const ie=ju;function ju(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===oc)&&(e=Ee),yt(e)){const l=_t(e,t,!0);return n&&Ri(l,n),l}if(ip(e)&&(e=e.__vccOpts),t){t=ac(t);let{class:l,style:c}=t;l&&!q(l)&&(t.class=jn(l)),ce(c)&&(ri(c)&&!H(c)&&(c=G({},c)),t.style=Kn(c))}const o=q(e)?1:su(e)?128:ku(e)?64:ce(e)?4:x(e)?2:0;return Pi(e,t,n,s,r,o,i,!0)}function ac(e){return e?ri(e)||Xs in e?G({},e):e:null}function _t(e,t,n=!1){const{props:s,ref:r,patchFlag:i,children:o}=e,l=t?uc(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&fc(l),ref:t&&t.ref?n&&r?H(r)?r.concat(ps(t)):[r,ps(t)]:ps(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ge?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&_t(e.ssContent),ssFallback:e.ssFallback&&_t(e.ssFallback),el:e.el,anchor:e.anchor}}function Ai(e=" ",t=0){return ie(Lt,null,e,t)}function xu(e,t){const n=ie(pt,null,e);return n.staticCount=t,n}function Wu(e="",t=!1){return t?(Qs(),Oi(Ee,null,e)):ie(Ee,null,e)}function Ne(e){return e==null||typeof e=="boolean"?ie(Ee):H(e)?ie(ge,null,e.slice()):typeof e=="object"?ft(e):ie(Lt,null,String(e))}function ft(e){return e.el===null||e.memo?e:_t(e)}function Ri(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(H(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),Ri(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!(Xs in t)?t._ctx=Pe:r===3&&Pe&&(Pe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else x(t)?(t={default:t,_ctx:Pe},n=32):(t=String(t),s&64?(n=16,t=[Ai(t)]):n=8);e.children=t,e.shapeFlag|=n}function uc(...e){const t={};for(let n=0;nt(o,l,void 0,i&&i[l]));else{const o=Object.keys(e);r=new Array(o.length);for(let l=0,c=o.length;lyt(t)?!(t.type===Ee||t.type===ge&&!pc(t.children)):!0)?e:null}function Yu(e){const t={};for(const n in e)t[Xt(n)]=e[n];return t}const Mr=e=>e?hc(e)?Ii(e)||e.proxy:Mr(e.parent):null,Es=G(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Mr(e.parent),$root:e=>Mr(e.root),$emit:e=>e.emit,$options:e=>Zl(e),$forceUpdate:e=>()=>ui(e.update),$nextTick:e=>ai.bind(e.proxy),$watch:e=>pu.bind(e)}),kr={get({_:e},t){const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;let f;if(t[0]!=="$"){const m=o[t];if(m!==void 0)switch(m){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(s!==X&&Q(s,t))return o[t]=1,s[t];if(r!==X&&Q(r,t))return o[t]=2,r[t];if((f=e.propsOptions[0])&&Q(f,t))return o[t]=3,i[t];if(n!==X&&Q(n,t))return o[t]=4,n[t];Or&&(o[t]=0)}}const a=Es[t];let u,d;if(a)return t==="$attrs"&&Me(e,"get",t),a(e);if((u=l.__cssModules)&&(u=u[t]))return u;if(n!==X&&Q(n,t))return o[t]=4,n[t];if(d=c.config.globalProperties,Q(d,t))return d[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return r!==X&&Q(r,t)?(r[t]=n,!0):s!==X&&Q(s,t)?(s[t]=n,!0):Q(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:i}},o){let l;return!!n[o]||e!==X&&Q(e,o)||t!==X&&Q(t,o)||(l=i[0])&&Q(l,o)||Q(s,o)||Q(Es,o)||Q(r.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?this.set(e,t,n.get(),null):n.value!=null&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},Zu=G({},kr,{get(e,t){if(t!==Symbol.unscopables)return kr.get(e,t,e)},has(e,t){return t[0]!=="_"&&!Pf(t)}}),Qu=nc();let Xu=0;function dc(e,t,n){const s=e.type,r=(t?t.appContext:e.appContext)||Qu,i={uid:Xu++,vnode:e,type:s,parent:t,appContext:r,root:null,next:null,subTree:null,effect:null,update:null,scope:new Gr(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(r.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:Xl(s,r),emitsOptions:Fl(s,r),emit:null,emitted:null,propsDefaults:X,inheritAttrs:s.inheritAttrs,ctx:X,data:X,props:X,attrs:X,slots:X,refs:X,setupState:X,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return i.ctx={_:i},i.root=t?t.root:i,i.emit=Ya.bind(null,i),e.ce&&e.ce(i),i}let de=null;const St=()=>de||Pe,bt=e=>{de=e,e.scope.on()},dt=()=>{de&&de.scope.off(),de=null};function hc(e){return e.vnode.shapeFlag&4}let rn=!1;function gc(e,t=!1){rn=t;const{props:n,children:s}=e.vnode,r=hc(e);Tu(e,n,r,t),Nu(e,s);const i=r?Gu(e,t):void 0;return rn=!1,i}function Gu(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=ii(new Proxy(e.ctx,kr));const{setup:s}=n;if(s){const r=e.setupContext=s.length>1?yc(e):null;bt(e),Vt();const i=qe(s,e,0,[e.props,r]);if(Ut(),dt(),Qr(i)){if(i.then(dt,dt),t)return i.then(o=>{Fr(e,o,t)}).catch(o=>{Kt(o,e,0)});e.asyncDep=i}else Fr(e,i,t)}else mc(e,t)}function Fr(e,t,n){x(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ce(t)&&(e.devtoolsRawSetupState=t,e.setupState=ci(t)),mc(e,n)}let Cs,Lr;function ep(e){Cs=e,Lr=t=>{t.render._rc&&(t.withProxy=new Proxy(t.ctx,Zu))}}const tp=()=>!Cs;function mc(e,t,n){const s=e.type;if(!e.render){if(!t&&Cs&&!s.render){const r=s.template;if(r){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,f=G(G({isCustomElement:i,delimiters:l},o),c);s.render=Cs(r,f)}}e.render=s.render||Ae,Lr&&Lr(e)}bt(e),Vt(),_u(e),Ut(),dt()}function np(e){return new Proxy(e.attrs,{get(t,n){return Me(e,"get","$attrs"),t[n]}})}function yc(e){const t=s=>{e.exposed=s||{}};let n;return{get attrs(){return n||(n=np(e))},slots:e.slots,emit:e.emit,expose:t}}function Ii(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(ci(ii(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Es)return Es[n](e)}}))}const sp=/(?:^|[-_])(\w)/g,rp=e=>e.replace(sp,t=>t.toUpperCase()).replace(/[-_]/g,"");function Ss(e){return x(e)&&e.displayName||e.name}function _c(e,t,n=!1){let s=Ss(t);if(!s&&t.__file){const r=t.__file.match(/([^/\\]+)\.\w+$/);r&&(s=r[1])}if(!s&&e&&e.parent){const r=i=>{for(const o in i)if(i[o]===t)return o};s=r(e.components||e.parent.type.components)||r(e.appContext.components)}return s?rp(s):n?"App":"Anonymous"}function ip(e){return x(e)&&"__vccOpts"in e}const bc=(e,t)=>Da(e,t,rn);function op(){return null}function lp(){return null}function cp(e){}function fp(e,t){return null}function ap(){return Ec().slots}function up(){return Ec().attrs}function Ec(){const e=St();return e.setupContext||(e.setupContext=yc(e))}function pp(e,t){const n=H(e)?e.reduce((s,r)=>(s[r]={},s),{}):e;for(const s in t){const r=n[s];r?H(r)||x(r)?n[s]={type:r,default:t[s]}:r.default=t[s]:r===null&&(n[s]={default:t[s]})}return n}function dp(e,t){const n={};for(const s in e)t.includes(s)||Object.defineProperty(n,s,{enumerable:!0,get:()=>e[s]});return n}function hp(e){const t=St();let n=e();return dt(),Qr(n)&&(n=n.catch(s=>{throw bt(t),s})),[n,()=>bt(t)]}function Cc(e,t,n){const s=arguments.length;return s===2?ce(t)&&!H(t)?yt(t)?ie(e,null,[t]):ie(e,t):ie(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&yt(n)&&(n=[n]),ie(e,t,n))}const Sc=Symbol(""),gp=()=>{{const e=Tn(Sc);return e||Ol("Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build."),e}};function mp(){}function yp(e,t,n,s){const r=n[s];if(r&&Tc(r,e))return r;const i=t();return i.memo=e.slice(),n[s]=i}function Tc(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let s=0;s0&&ze&&ze.push(e),!0}const Dr="3.2.31",_p={createComponentInstance:dc,setupComponent:gc,renderComponentRoot:us,setCurrentRenderingInstance:kn,isVNode:yt,normalizeVNode:Ne},bp=_p,Ep=null,Cp=null,Sp="http://www.w3.org/2000/svg",Ot=typeof document!="undefined"?document:null,No=Ot&&Ot.createElement("template"),Tp={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t?Ot.createElementNS(Sp,e):Ot.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>Ot.createTextNode(e),createComment:e=>Ot.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ot.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},cloneNode(e){const t=e.cloneNode(!0);return"_value"in e&&(t._value=e._value),t},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{No.innerHTML=s?`${e}`:e;const l=No.content;if(s){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function vp(e,t,n){const s=e._vtc;s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function wp(e,t,n){const s=e.style,r=q(n);if(n&&!r){for(const i in n)Br(s,i,n[i]);if(t&&!q(t))for(const i in t)n[i]==null&&Br(s,i,"")}else{const i=s.display;r?t!==n&&(s.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(s.display=i)}}const Oo=/\s*!important$/;function Br(e,t,n){if(H(n))n.forEach(s=>Br(e,t,s));else if(t.startsWith("--"))e.setProperty(t,n);else{const s=Np(e,t);Oo.test(n)?e.setProperty(Ue(s),n.replace(Oo,""),"important"):e[s]=n}}const Po=["Webkit","Moz","ms"],dr={};function Np(e,t){const n=dr[t];if(n)return n;let s=be(t);if(s!=="filter"&&s in e)return dr[t]=s;s=Ht(s);for(let r=0;rdocument.createEvent("Event").timeStamp&&(Ts=()=>performance.now());const e=navigator.userAgent.match(/firefox\/(\d+)/i);vc=!!(e&&Number(e[1])<=53)}let $r=0;const Ap=Promise.resolve(),Rp=()=>{$r=0},Ip=()=>$r||(Ap.then(Rp),$r=Ts());function et(e,t,n,s){e.addEventListener(t,n,s)}function Mp(e,t,n,s){e.removeEventListener(t,n,s)}function kp(e,t,n,s,r=null){const i=e._vei||(e._vei={}),o=i[t];if(s&&o)o.value=s;else{const[l,c]=Fp(t);if(s){const f=i[t]=Lp(s,r);et(e,l,f,c)}else o&&(Mp(e,l,o,c),i[t]=void 0)}}const Ro=/(?:Once|Passive|Capture)$/;function Fp(e){let t;if(Ro.test(e)){t={};let n;for(;n=e.match(Ro);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[Ue(e.slice(2)),t]}function Lp(e,t){const n=s=>{const r=s.timeStamp||Ts();(vc||r>=n.attached-1)&&Re(Dp(s,n.value),t,5,[s])};return n.value=e,n.attached=Ip(),n}function Dp(e,t){if(H(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const Io=/^on[a-z]/,Bp=(e,t,n,s,r=!1,i,o,l,c)=>{t==="class"?vp(e,s,r):t==="style"?wp(e,n,s):Bt(t)?Yr(t)||kp(e,t,n,s,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):$p(e,t,s,r))?Pp(e,t,s,i,o,l,c):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Op(e,t,s,r))};function $p(e,t,n,s){return s?!!(t==="innerHTML"||t==="textContent"||t in e&&Io.test(t)&&x(n)):t==="spellcheck"||t==="draggable"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||Io.test(t)&&q(n)?!1:t in e}function wc(e,t){const n=Si(e);class s extends Gs{constructor(i){super(n,i,t)}}return s.def=n,s}const Hp=e=>wc(e,$c),Vp=typeof HTMLElement!="undefined"?HTMLElement:class{};class Gs extends Vp{constructor(t,n={},s){super();this._def=t,this._props=n,this._instance=null,this._connected=!1,this._resolved=!1,this._numberProps=null,this.shadowRoot&&s?s(this._createVNode(),this.shadowRoot):this.attachShadow({mode:"open"})}connectedCallback(){this._connected=!0,this._instance||this._resolveDef()}disconnectedCallback(){this._connected=!1,ai(()=>{this._connected||(Vr(null,this.shadowRoot),this._instance=null)})}_resolveDef(){if(this._resolved)return;this._resolved=!0;for(let s=0;s{for(const r of s)this._setAttr(r.attributeName)}).observe(this,{attributes:!0});const t=s=>{const{props:r,styles:i}=s,o=!H(r),l=r?o?Object.keys(r):r:[];let c;if(o)for(const f in this._props){const a=r[f];(a===Number||a&&a.type===Number)&&(this._props[f]=gt(this._props[f]),(c||(c=Object.create(null)))[f]=!0)}this._numberProps=c;for(const f of Object.keys(this))f[0]!=="_"&&this._setProp(f,this[f],!0,!1);for(const f of l.map(be))Object.defineProperty(this,f,{get(){return this._getProp(f)},set(a){this._setProp(f,a)}});this._applyStyles(i),this._update()},n=this._def.__asyncLoader;n?n().then(t):t(this._def)}_setAttr(t){let n=this.getAttribute(t);this._numberProps&&this._numberProps[t]&&(n=gt(n)),this._setProp(be(t),n,!1)}_getProp(t){return this._props[t]}_setProp(t,n,s=!0,r=!0){n!==this._props[t]&&(this._props[t]=n,r&&this._instance&&this._update(),s&&(n===!0?this.setAttribute(Ue(t),""):typeof n=="string"||typeof n=="number"?this.setAttribute(Ue(t),n+""):n||this.removeAttribute(Ue(t))))}_update(){Vr(this._createVNode(),this.shadowRoot)}_createVNode(){const t=ie(this._def,G({},this._props));return this._instance||(t.ce=n=>{this._instance=n,n.isCE=!0,n.emit=(r,...i)=>{this.dispatchEvent(new CustomEvent(r,{detail:i}))};let s=this;for(;s=s&&(s.parentNode||s.host);)if(s instanceof Gs){n.parent=s._instance;break}}),t}_applyStyles(t){t&&t.forEach(n=>{const s=document.createElement("style");s.textContent=n,this.shadowRoot.appendChild(s)})}}function Up(e="$style"){{const t=St();if(!t)return X;const n=t.type.__cssModules;if(!n)return X;const s=n[e];return s||X}}function Kp(e){const t=St();if(!t)return;const n=()=>Hr(t.subTree,e(t.proxy));Bl(n),zn(()=>{const s=new MutationObserver(n);s.observe(t.subTree.el.parentNode,{childList:!0}),Zs(()=>s.disconnect())})}function Hr(e,t){if(e.shapeFlag&128){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{Hr(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)Mo(e.el,t);else if(e.type===ge)e.children.forEach(n=>Hr(n,t));else if(e.type===pt){let{el:n,anchor:s}=e;for(;n&&(Mo(n,t),n!==s);)n=n.nextSibling}}function Mo(e,t){if(e.nodeType===1){const n=e.style;for(const s in t)n.setProperty(`--${s}`,t[s])}}const lt="transition",dn="animation",Mi=(e,{slots:t})=>Cc(Ci,Oc(e),t);Mi.displayName="Transition";const Nc={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},jp=Mi.props=G({},Ci.props,Nc),vt=(e,t=[])=>{H(e)?e.forEach(n=>n(...t)):e&&e(...t)},ko=e=>e?H(e)?e.some(t=>t.length>1):e.length>1:!1;function Oc(e){const t={};for(const N in e)N in Nc||(t[N]=e[N]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:f=o,appearToClass:a=l,leaveFromClass:u=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:m=`${n}-leave-to`}=e,b=xp(r),S=b&&b[0],g=b&&b[1],{onBeforeEnter:_,onEnter:y,onEnterCancelled:T,onLeave:w,onLeaveCancelled:D,onBeforeAppear:M=_,onAppear:E=y,onAppearCancelled:v=T}=t,O=(N,U,J)=>{Nt(N,U?a:l),Nt(N,U?f:o),J&&J()},L=(N,U)=>{Nt(N,m),Nt(N,d),U&&U()},$=N=>(U,J)=>{const Ye=N?E:y,ae=()=>O(U,N,J);vt(Ye,[U,ae]),Fo(()=>{Nt(U,N?c:i),Xe(U,N?a:l),ko(Ye)||Lo(U,s,S,ae)})};return G(t,{onBeforeEnter(N){vt(_,[N]),Xe(N,i),Xe(N,o)},onBeforeAppear(N){vt(M,[N]),Xe(N,c),Xe(N,f)},onEnter:$(!1),onAppear:$(!0),onLeave(N,U){const J=()=>L(N,U);Xe(N,u),Ac(),Xe(N,d),Fo(()=>{Nt(N,u),Xe(N,m),ko(w)||Lo(N,s,g,J)}),vt(w,[N,J])},onEnterCancelled(N){O(N,!1),vt(T,[N])},onAppearCancelled(N){O(N,!0),vt(v,[N])},onLeaveCancelled(N){L(N),vt(D,[N])}})}function xp(e){if(e==null)return null;if(ce(e))return[hr(e.enter),hr(e.leave)];{const t=hr(e);return[t,t]}}function hr(e){return gt(e)}function Xe(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function Nt(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function Fo(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Wp=0;function Lo(e,t,n,s){const r=e._endId=++Wp,i=()=>{r===e._endId&&s()};if(n)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=Pc(e,t);if(!o)return s();const f=o+"end";let a=0;const u=()=>{e.removeEventListener(f,d),i()},d=m=>{m.target===e&&++a>=c&&u()};setTimeout(()=>{a(n[b]||"").split(", "),r=s(lt+"Delay"),i=s(lt+"Duration"),o=Do(r,i),l=s(dn+"Delay"),c=s(dn+"Duration"),f=Do(l,c);let a=null,u=0,d=0;t===lt?o>0&&(a=lt,u=o,d=i.length):t===dn?f>0&&(a=dn,u=f,d=c.length):(u=Math.max(o,f),a=u>0?o>f?lt:dn:null,d=a?a===lt?i.length:c.length:0);const m=a===lt&&/\b(transform|all)(,|$)/.test(n[lt+"Property"]);return{type:a,timeout:u,propCount:d,hasTransform:m}}function Do(e,t){for(;e.lengthBo(n)+Bo(e[s])))}function Bo(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function Ac(){return document.body.offsetHeight}const Rc=new WeakMap,Ic=new WeakMap,qp={name:"TransitionGroup",props:G({},jp,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=St(),s=Ei();let r,i;return Js(()=>{if(!r.length)return;const o=e.moveClass||`${e.name||"v"}-move`;if(!Qp(r[0].el,n.vnode.el,o))return;r.forEach(Jp),r.forEach(Yp);const l=r.filter(Zp);Ac(),l.forEach(c=>{const f=c.el,a=f.style;Xe(f,o),a.transform=a.webkitTransform=a.transitionDuration="";const u=f._moveCb=d=>{d&&d.target!==f||(!d||/transform$/.test(d.propertyName))&&(f.removeEventListener("transitionend",u),f._moveCb=null,Nt(f,o))};f.addEventListener("transitionend",u)})}),()=>{const o=Y(e),l=Oc(o);let c=o.tag||ge;r=i,i=t.default?qs(t.default()):[];for(let f=0;f{o.split(/\s+/).forEach(l=>l&&s.classList.remove(l))}),n.split(/\s+/).forEach(o=>o&&s.classList.add(o)),s.style.display="none";const r=t.nodeType===1?t:t.parentNode;r.appendChild(s);const{hasTransform:i}=Pc(s);return r.removeChild(s),i}const Et=e=>{const t=e.props["onUpdate:modelValue"];return H(t)?n=>Gt(t,n):t};function Xp(e){e.target.composing=!0}function $o(e){const t=e.target;t.composing&&(t.composing=!1,Gp(t,"input"))}function Gp(e,t){const n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}const vs={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e._assign=Et(r);const i=s||r.props&&r.props.type==="number";et(e,t?"change":"input",o=>{if(o.target.composing)return;let l=e.value;n?l=l.trim():i&&(l=gt(l)),e._assign(l)}),n&&et(e,"change",()=>{e.value=e.value.trim()}),t||(et(e,"compositionstart",Xp),et(e,"compositionend",$o),et(e,"change",$o))},mounted(e,{value:t}){e.value=t==null?"":t},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:s,number:r}},i){if(e._assign=Et(i),e.composing||document.activeElement===e&&(n||s&&e.value.trim()===t||(r||e.type==="number")&>(e.value)===t))return;const o=t==null?"":t;e.value!==o&&(e.value=o)}},ki={deep:!0,created(e,t,n){e._assign=Et(n),et(e,"change",()=>{const s=e._modelValue,r=on(e),i=e.checked,o=e._assign;if(H(s)){const l=Ls(s,r),c=l!==-1;if(i&&!c)o(s.concat(r));else if(!i&&c){const f=[...s];f.splice(l,1),o(f)}}else if($t(s)){const l=new Set(s);i?l.add(r):l.delete(r),o(l)}else o(kc(e,i))})},mounted:Ho,beforeUpdate(e,t,n){e._assign=Et(n),Ho(e,t,n)}};function Ho(e,{value:t,oldValue:n},s){e._modelValue=t,H(t)?e.checked=Ls(t,s.props.value)>-1:$t(t)?e.checked=t.has(s.props.value):t!==n&&(e.checked=ht(t,kc(e,!0)))}const Fi={created(e,{value:t},n){e.checked=ht(t,n.props.value),e._assign=Et(n),et(e,"change",()=>{e._assign(on(e))})},beforeUpdate(e,{value:t,oldValue:n},s){e._assign=Et(s),t!==n&&(e.checked=ht(t,s.props.value))}},Mc={deep:!0,created(e,{value:t,modifiers:{number:n}},s){const r=$t(t);et(e,"change",()=>{const i=Array.prototype.filter.call(e.options,o=>o.selected).map(o=>n?gt(on(o)):on(o));e._assign(e.multiple?r?new Set(i):i:i[0])}),e._assign=Et(s)},mounted(e,{value:t}){Vo(e,t)},beforeUpdate(e,t,n){e._assign=Et(n)},updated(e,{value:t}){Vo(e,t)}};function Vo(e,t){const n=e.multiple;if(!(n&&!H(t)&&!$t(t))){for(let s=0,r=e.options.length;s-1:i.selected=t.has(o);else if(ht(on(i),t)){e.selectedIndex!==s&&(e.selectedIndex=s);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function on(e){return"_value"in e?e._value:e.value}function kc(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const ed={created(e,t,n){os(e,t,n,null,"created")},mounted(e,t,n){os(e,t,n,null,"mounted")},beforeUpdate(e,t,n,s){os(e,t,n,s,"beforeUpdate")},updated(e,t,n,s){os(e,t,n,s,"updated")}};function os(e,t,n,s,r){let i;switch(e.tagName){case"SELECT":i=Mc;break;case"TEXTAREA":i=vs;break;default:switch(n.props&&n.props.type){case"checkbox":i=ki;break;case"radio":i=Fi;break;default:i=vs}}const o=i[r];o&&o(e,t,n,s)}function td(){vs.getSSRProps=({value:e})=>({value:e}),Fi.getSSRProps=({value:e},t)=>{if(t.props&&ht(t.props.value,e))return{checked:!0}},ki.getSSRProps=({value:e},t)=>{if(H(e)){if(t.props&&Ls(e,t.props.value)>-1)return{checked:!0}}else if($t(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}}}const nd=["ctrl","shift","alt","meta"],sd={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>nd.some(n=>e[`${n}Key`]&&!t.includes(n))},rd=(e,t)=>(n,...s)=>{for(let r=0;rn=>{if(!("key"in n))return;const s=Ue(n.key);if(t.some(r=>r===s||id[r]===s))return e(n)},Fc={beforeMount(e,{value:t},{transition:n}){e._vod=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):hn(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:s}){!t!=!n&&(s?t?(s.beforeEnter(e),hn(e,!0),s.enter(e)):s.leave(e,()=>{hn(e,!1)}):hn(e,t))},beforeUnmount(e,{value:t}){hn(e,t)}};function hn(e,t){e.style.display=t?e._vod:"none"}function ld(){Fc.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}}}const Lc=G({patchProp:Bp},Tp);let On,Uo=!1;function Dc(){return On||(On=sc(Lc))}function Bc(){return On=Uo?On:rc(Lc),Uo=!0,On}const Vr=(...e)=>{Dc().render(...e)},$c=(...e)=>{Bc().hydrate(...e)},cd=(...e)=>{const t=Dc().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Hc(s);if(!r)return;const i=t._component;!x(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.innerHTML="";const o=n(r,!1,r instanceof SVGElement);return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t},fd=(...e)=>{const t=Bc().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Hc(s);if(r)return n(r,!0,r instanceof SVGElement)},t};function Hc(e){return q(e)?document.querySelector(e):e}let Ko=!1;const ad=()=>{Ko||(Ko=!0,td(),ld())};var fg=Object.freeze({__proto__:null,[Symbol.toStringTag]:"Module",Transition:Mi,TransitionGroup:zp,VueElement:Gs,createApp:cd,createSSRApp:fd,defineCustomElement:wc,defineSSRCustomElement:Hp,hydrate:$c,initDirectivesForSSR:ad,render:Vr,useCssModule:Up,useCssVars:Kp,vModelCheckbox:ki,vModelDynamic:ed,vModelRadio:Fi,vModelSelect:Mc,vModelText:vs,vShow:Fc,withKeys:od,withModifiers:rd,EffectScope:Gr,ReactiveEffect:xn,customRef:Ma,effect:ea,effectScope:Yf,getCurrentScope:Zf,isProxy:ri,isReactive:Mt,isReadonly:tn,isRef:pe,isShallow:si,markRaw:ii,onScopeDispose:Qf,proxyRefs:ci,reactive:Us,readonly:ni,ref:as,shallowReactive:Tl,shallowReadonly:Na,shallowRef:Oa,stop:ta,toRaw:Y,toRef:Nl,toRefs:ka,triggerRef:Aa,unref:wl,camelize:be,capitalize:Ht,normalizeClass:jn,normalizeProps:kf,normalizeStyle:Kn,toDisplayString:Uf,toHandlerKey:Xt,BaseTransition:Ci,Comment:Ee,Fragment:ge,KeepAlive:mu,Static:pt,Suspense:iu,Teleport:Du,Text:Lt,callWithAsyncErrorHandling:Re,callWithErrorHandling:qe,cloneVNode:_t,compatUtils:Cp,computed:bc,createBlock:Oi,createCommentVNode:Wu,createElementBlock:Uu,createElementVNode:Pi,createHydrationRenderer:rc,createPropsRestProxy:dp,createRenderer:sc,createSlots:zu,createStaticVNode:xu,createTextVNode:Ai,createVNode:ie,defineAsyncComponent:hu,defineComponent:Si,defineEmits:lp,defineExpose:cp,defineProps:op,get devtools(){return at},getCurrentInstance:St,getTransitionRawChildren:qs,guardReactiveProps:ac,h:Cc,handleError:Kt,initCustomFormatter:mp,inject:Tn,isMemoSame:Tc,isRuntimeOnly:tp,isVNode:yt,mergeDefaults:pp,mergeProps:uc,nextTick:ai,onActivated:Vl,onBeforeMount:jl,onBeforeUnmount:Ys,onBeforeUpdate:xl,onDeactivated:Ul,onErrorCaptured:Jl,onMounted:zn,onRenderTracked:zl,onRenderTriggered:ql,onServerPrefetch:Wl,onUnmounted:Zs,onUpdated:Js,openBlock:Qs,popScopeId:Qa,provide:Dl,pushScopeId:Za,queuePostFlushCb:pi,registerRuntimeCompiler:ep,renderList:qu,renderSlot:Ju,resolveComponent:$u,resolveDirective:Vu,resolveDynamicComponent:Hu,resolveFilter:Ep,resolveTransitionHooks:nn,setBlockTracking:Ir,setDevtoolsHook:hi,setTransitionHooks:Ft,ssrContextKey:Sc,ssrUtils:bp,toHandlers:Yu,transformVNodeArgs:Ku,useAttrs:up,useSSRContext:gp,useSlots:ap,useTransitionState:Ei,version:Dr,warn:Ol,watch:vn,watchEffect:au,watchPostEffect:Bl,watchSyncEffect:uu,withAsyncContext:hp,withCtx:yi,withDefaults:fp,withDirectives:Pu,withMemo:yp,withScopeId:Xa});function Li(e){throw e}function Vc(e){}function le(e,t,n,s){const r=e,i=new SyntaxError(String(r));return i.code=e,i.loc=t,i}const Dn=Symbol(""),Pn=Symbol(""),Di=Symbol(""),ws=Symbol(""),Uc=Symbol(""),Dt=Symbol(""),Kc=Symbol(""),jc=Symbol(""),Bi=Symbol(""),$i=Symbol(""),Jn=Symbol(""),Hi=Symbol(""),xc=Symbol(""),Vi=Symbol(""),Ns=Symbol(""),Ui=Symbol(""),Ki=Symbol(""),ji=Symbol(""),xi=Symbol(""),Wc=Symbol(""),qc=Symbol(""),er=Symbol(""),Os=Symbol(""),Wi=Symbol(""),qi=Symbol(""),Bn=Symbol(""),Yn=Symbol(""),zi=Symbol(""),Ur=Symbol(""),ud=Symbol(""),Kr=Symbol(""),Ps=Symbol(""),pd=Symbol(""),dd=Symbol(""),Ji=Symbol(""),hd=Symbol(""),gd=Symbol(""),Yi=Symbol(""),zc=Symbol(""),Ct={[Dn]:"Fragment",[Pn]:"Teleport",[Di]:"Suspense",[ws]:"KeepAlive",[Uc]:"BaseTransition",[Dt]:"openBlock",[Kc]:"createBlock",[jc]:"createElementBlock",[Bi]:"createVNode",[$i]:"createElementVNode",[Jn]:"createCommentVNode",[Hi]:"createTextVNode",[xc]:"createStaticVNode",[Vi]:"resolveComponent",[Ns]:"resolveDynamicComponent",[Ui]:"resolveDirective",[Ki]:"resolveFilter",[ji]:"withDirectives",[xi]:"renderList",[Wc]:"renderSlot",[qc]:"createSlots",[er]:"toDisplayString",[Os]:"mergeProps",[Wi]:"normalizeClass",[qi]:"normalizeStyle",[Bn]:"normalizeProps",[Yn]:"guardReactiveProps",[zi]:"toHandlers",[Ur]:"camelize",[ud]:"capitalize",[Kr]:"toHandlerKey",[Ps]:"setBlockTracking",[pd]:"pushScopeId",[dd]:"popScopeId",[Ji]:"withCtx",[hd]:"unref",[gd]:"isRef",[Yi]:"withMemo",[zc]:"isMemoSame"};function md(e){Object.getOwnPropertySymbols(e).forEach(t=>{Ct[t]=e[t]})}const ke={source:"",start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0}};function yd(e,t=ke){return{type:0,children:e,helpers:[],components:[],directives:[],hoists:[],imports:[],cached:0,temps:0,codegenNode:void 0,loc:t}}function $n(e,t,n,s,r,i,o,l=!1,c=!1,f=!1,a=ke){return e&&(l?(e.helper(Dt),e.helper(fn(e.inSSR,f))):e.helper(cn(e.inSSR,f)),o&&e.helper(ji)),{type:13,tag:t,props:n,children:s,patchFlag:r,dynamicProps:i,directives:o,isBlock:l,disableTracking:c,isComponent:f,loc:a}}function Zn(e,t=ke){return{type:17,loc:t,elements:e}}function Be(e,t=ke){return{type:15,loc:t,properties:e}}function fe(e,t){return{type:16,loc:ke,key:q(e)?z(e,!0):e,value:t}}function z(e,t=!1,n=ke,s=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:s}}function Je(e,t=ke){return{type:8,loc:t,children:e}}function ue(e,t=[],n=ke){return{type:14,loc:n,callee:e,arguments:t}}function ln(e,t=void 0,n=!1,s=!1,r=ke){return{type:18,params:e,returns:t,newline:n,isSlot:s,loc:r}}function jr(e,t,n,s=!0){return{type:19,test:e,consequent:t,alternate:n,newline:s,loc:ke}}function _d(e,t,n=!1){return{type:20,index:e,value:t,isVNode:n,loc:ke}}function bd(e){return{type:21,body:e,loc:ke}}const Te=e=>e.type===4&&e.isStatic,Yt=(e,t)=>e===t||e===Ue(t);function Jc(e){if(Yt(e,"Teleport"))return Pn;if(Yt(e,"Suspense"))return Di;if(Yt(e,"KeepAlive"))return ws;if(Yt(e,"BaseTransition"))return Uc}const Ed=/^\d|[^\$\w]/,Zi=e=>!Ed.test(e),Cd=/[A-Za-z_$\xA0-\uFFFF]/,Sd=/[\.\?\w$\xA0-\uFFFF]/,Td=/\s+[.[]\s*|\s*[.[]\s+/g,vd=e=>{e=e.trim().replace(Td,o=>o.trim());let t=0,n=[],s=0,r=0,i=null;for(let o=0;ot.type===7&&t.name==="bind"&&(!t.arg||t.arg.type!==4||!t.arg.isStatic))}function gr(e){return e.type===5||e.type===2}function Nd(e){return e.type===7&&e.name==="slot"}function Is(e){return e.type===1&&e.tagType===3}function Ms(e){return e.type===1&&e.tagType===2}function cn(e,t){return e||t?Bi:$i}function fn(e,t){return e||t?Kc:jc}const Od=new Set([Bn,Yn]);function Qc(e,t=[]){if(e&&!q(e)&&e.type===14){const n=e.callee;if(!q(n)&&Od.has(n))return Qc(e.arguments[0],t.concat(e))}return[e,t]}function ks(e,t,n){let s,r=e.type===13?e.props:e.arguments[2],i=[],o;if(r&&!q(r)&&r.type===14){const l=Qc(r);r=l[0],i=l[1],o=i[i.length-1]}if(r==null||q(r))s=Be([t]);else if(r.type===14){const l=r.arguments[0];!q(l)&&l.type===15?l.properties.unshift(t):r.callee===zi?s=ue(n.helper(Os),[Be([t]),r]):r.arguments.unshift(Be([t])),!s&&(s=r)}else if(r.type===15){let l=!1;if(t.key.type===4){const c=t.key.content;l=r.properties.some(f=>f.key.type===4&&f.key.content===c)}l||r.properties.unshift(t),s=r}else s=ue(n.helper(Os),[Be([t]),r]),o&&o.callee===Yn&&(o=i[i.length-2]);e.type===13?o?o.arguments[0]=s:e.props=s:o?o.arguments[0]=s:e.arguments[2]=s}function Hn(e,t){return`_${t}_${e.replace(/[^\w]/g,(n,s)=>n==="-"?"_":e.charCodeAt(s).toString())}`}function Pd(e){return e.type===14&&e.callee===Yi?e.arguments[1].returns:e}function Qi(e,{helper:t,removeHelper:n,inSSR:s}){e.isBlock||(e.isBlock=!0,n(cn(s,e.isComponent)),t(Dt),t(fn(s,e.isComponent)))}function jo(e,t){const n=t.options?t.options.compatConfig:t.compatConfig,s=n&&n[e];return e==="MODE"?s||3:s}function kt(e,t){const n=jo("MODE",t),s=jo(e,t);return n===3?s===!0:s!==!1}function Vn(e,t,n,...s){return kt(e,t)}const Ad=/&(gt|lt|amp|apos|quot);/g,Rd={gt:">",lt:"<",amp:"&",apos:"'",quot:'"'},xo={delimiters:["{{","}}"],getNamespace:()=>0,getTextMode:()=>0,isVoidTag:fs,isPreTag:fs,isCustomElement:fs,decodeEntities:e=>e.replace(Ad,(t,n)=>Rd[n]),onError:Li,onWarn:Vc,comments:!1};function Id(e,t={}){const n=Md(e,t),s=Ie(n);return yd(Xi(n,0,[]),He(n,s))}function Md(e,t){const n=G({},xo);let s;for(s in t)n[s]=t[s]===void 0?xo[s]:t[s];return{options:n,column:1,line:1,offset:0,originalSource:e,source:e,inPre:!1,inVPre:!1,onWarn:n.onWarn}}function Xi(e,t,n){const s=nr(n),r=s?s.ns:0,i=[];for(;!Ud(e,t,n);){const l=e.source;let c;if(t===0||t===1){if(!e.inVPre&&ye(l,e.options.delimiters[0]))c=Hd(e,t);else if(t===0&&l[0]==="<")if(l.length===1)ee(e,5,1);else if(l[1]==="!")ye(l,"=0;){const f=o[l];f&&f.type===9&&(c+=f.branches.length)}return()=>{if(i)s.codegenNode=Yo(r,c,n);else{const f=ph(s.codegenNode);f.alternate=Yo(r,c+s.branches.length-1,n)}}}));function uh(e,t,n,s){if(t.name!=="else"&&(!t.exp||!t.exp.content.trim())){const r=t.exp?t.exp.loc:e.loc;n.onError(le(28,t.loc)),t.exp=z("true",!1,r)}if(t.name==="if"){const r=Jo(e,t),i={type:9,loc:e.loc,branches:[r]};if(n.replaceNode(i),s)return s(i,r,!0)}else{const r=n.parent.children;let i=r.indexOf(e);for(;i-->=-1;){const o=r[i];if(o&&o.type===2&&!o.content.trim().length){n.removeNode(o);continue}if(o&&o.type===9){t.name==="else-if"&&o.branches[o.branches.length-1].condition===void 0&&n.onError(le(30,e.loc)),n.removeNode();const l=Jo(e,t);o.branches.push(l);const c=s&&s(o,l,!1);sr(l,n),c&&c(),n.currentNode=null}else n.onError(le(30,e.loc));break}}}function Jo(e,t){return{type:10,loc:e.loc,condition:t.name==="else"?void 0:t.exp,children:e.tagType===3&&!De(e,"for")?e.children:[e],userKey:tr(e,"key")}}function Yo(e,t,n){return e.condition?jr(e.condition,Zo(e,t,n),ue(n.helper(Jn),['""',"true"])):Zo(e,t,n)}function Zo(e,t,n){const{helper:s}=n,r=fe("key",z(`${t}`,!1,ke,2)),{children:i}=e,o=i[0];if(i.length!==1||o.type!==1)if(i.length===1&&o.type===11){const c=o.codegenNode;return ks(c,r,n),c}else{let c=64;return $n(n,s(Dn),Be([r]),i,c+"",void 0,void 0,!0,!1,!1,e.loc)}else{const c=o.codegenNode,f=Pd(c);return f.type===13&&Qi(f,n),ks(f,r,n),c}}function ph(e){for(;;)if(e.type===19)if(e.alternate.type===19)e=e.alternate;else return e;else e.type===20&&(e=e.value)}const dh=rf("for",(e,t,n)=>{const{helper:s,removeHelper:r}=n;return hh(e,t,n,i=>{const o=ue(s(xi),[i.source]),l=Is(e),c=De(e,"memo"),f=tr(e,"key"),a=f&&(f.type===6?z(f.value.content,!0):f.exp),u=f?fe("key",a):null,d=i.source.type===4&&i.source.constType>0,m=d?64:f?128:256;return i.codegenNode=$n(n,s(Dn),void 0,o,m+"",void 0,void 0,!0,!d,!1,e.loc),()=>{let b;const{children:S}=i,g=S.length!==1||S[0].type!==1,_=Ms(e)?e:l&&e.children.length===1&&Ms(e.children[0])?e.children[0]:null;if(_?(b=_.codegenNode,l&&u&&ks(b,u,n)):g?b=$n(n,s(Dn),u?Be([u]):void 0,e.children,64+"",void 0,void 0,!0,void 0,!1):(b=S[0].codegenNode,l&&u&&ks(b,u,n),b.isBlock!==!d&&(b.isBlock?(r(Dt),r(fn(n.inSSR,b.isComponent))):r(cn(n.inSSR,b.isComponent))),b.isBlock=!d,b.isBlock?(s(Dt),s(fn(n.inSSR,b.isComponent))):s(cn(n.inSSR,b.isComponent))),c){const y=ln(qr(i.parseResult,[z("_cached")]));y.body=bd([Je(["const _memo = (",c.exp,")"]),Je(["if (_cached",...a?[" && _cached.key === ",a]:[],` && ${n.helperString(zc)}(_cached, _memo)) return _cached`]),Je(["const _item = ",b]),z("_item.memo = _memo"),z("return _item")]),o.arguments.push(y,z("_cache"),z(String(n.cached++)))}else o.arguments.push(ln(qr(i.parseResult),b,!0))}})});function hh(e,t,n,s){if(!t.exp){n.onError(le(31,t.loc));return}const r=cf(t.exp);if(!r){n.onError(le(32,t.loc));return}const{addIdentifiers:i,removeIdentifiers:o,scopes:l}=n,{source:c,value:f,key:a,index:u}=r,d={type:11,loc:t.loc,source:c,valueAlias:f,keyAlias:a,objectIndexAlias:u,parseResult:r,children:Is(e)?e.children:[e]};n.replaceNode(d),l.vFor++;const m=s&&s(d);return()=>{l.vFor--,m&&m()}}const gh=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,Qo=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,mh=/^\(|\)$/g;function cf(e,t){const n=e.loc,s=e.content,r=s.match(gh);if(!r)return;const[,i,o]=r,l={source:ls(n,o.trim(),s.indexOf(o,i.length)),value:void 0,key:void 0,index:void 0};let c=i.trim().replace(mh,"").trim();const f=i.indexOf(c),a=c.match(Qo);if(a){c=c.replace(Qo,"").trim();const u=a[1].trim();let d;if(u&&(d=s.indexOf(u,f+c.length),l.key=ls(n,u,d)),a[2]){const m=a[2].trim();m&&(l.index=ls(n,m,s.indexOf(m,l.key?d+u.length:f+c.length)))}}return c&&(l.value=ls(n,c,f)),l}function ls(e,t,n){return z(t,!1,Zc(e,n,t.length))}function qr({value:e,key:t,index:n},s=[]){return yh([e,t,n,...s])}function yh(e){let t=e.length;for(;t--&&!e[t];);return e.slice(0,t+1).map((n,s)=>n||z("_".repeat(s+1),!1))}const Xo=z("undefined",!1),_h=(e,t)=>{if(e.type===1&&(e.tagType===1||e.tagType===3)){const n=De(e,"slot");if(n)return n.exp,t.scopes.vSlot++,()=>{t.scopes.vSlot--}}},bh=(e,t,n)=>ln(e,t,!1,!0,t.length?t[0].loc:n);function Eh(e,t,n=bh){t.helper(Ji);const{children:s,loc:r}=e,i=[],o=[];let l=t.scopes.vSlot>0||t.scopes.vFor>0;const c=De(e,"slot",!0);if(c){const{arg:S,exp:g}=c;S&&!Te(S)&&(l=!0),i.push(fe(S||z("default",!0),n(g,s,r)))}let f=!1,a=!1;const u=[],d=new Set;for(let S=0;S{const y=n(g,_,r);return t.compatConfig&&(y.isNonScopedSlot=!0),fe("default",y)};f?u.length&&u.some(g=>ff(g))&&(a?t.onError(le(39,u[0].loc)):i.push(S(void 0,u))):i.push(S(void 0,s))}const m=l?2:hs(e.children)?3:1;let b=Be(i.concat(fe("_",z(m+"",!1))),r);return o.length&&(b=ue(t.helper(qc),[b,Zn(o)])),{slots:b,hasDynamicSlots:l}}function cs(e,t){return Be([fe("name",e),fe("fn",t)])}function hs(e){for(let t=0;tfunction(){if(e=t.currentNode,!(e.type===1&&(e.tagType===0||e.tagType===1)))return;const{tag:s,props:r}=e,i=e.tagType===1;let o=i?Sh(e,t):`"${s}"`;const l=ce(o)&&o.callee===Ns;let c,f,a,u=0,d,m,b,S=l||o===Pn||o===Di||!i&&(s==="svg"||s==="foreignObject");if(r.length>0){const g=uf(e,t);c=g.props,u=g.patchFlag,m=g.dynamicPropNames;const _=g.directives;b=_&&_.length?Zn(_.map(y=>vh(y,t))):void 0,g.shouldUseBlock&&(S=!0)}if(e.children.length>0)if(o===ws&&(S=!0,u|=1024),i&&o!==Pn&&o!==ws){const{slots:_,hasDynamicSlots:y}=Eh(e,t);f=_,y&&(u|=1024)}else if(e.children.length===1&&o!==Pn){const _=e.children[0],y=_.type,T=y===5||y===8;T&&$e(_,t)===0&&(u|=1),T||y===2?f=_:f=e.children}else f=e.children;u!==0&&(a=String(u),m&&m.length&&(d=wh(m))),e.codegenNode=$n(t,o,c,f,a,d,b,!!S,!1,i,e.loc)};function Sh(e,t,n=!1){let{tag:s}=e;const r=zr(s),i=tr(e,"is");if(i)if(r||kt("COMPILER_IS_ON_ELEMENT",t)){const c=i.type===6?i.value&&z(i.value.content,!0):i.exp;if(c)return ue(t.helper(Ns),[c])}else i.type===6&&i.value.content.startsWith("vue:")&&(s=i.value.content.slice(4));const o=!r&&De(e,"is");if(o&&o.exp)return ue(t.helper(Ns),[o.exp]);const l=Jc(s)||t.isBuiltInComponent(s);return l?(n||t.helper(l),l):(t.helper(Vi),t.components.add(s),Hn(s,"component"))}function uf(e,t,n=e.props,s=!1){const{tag:r,loc:i,children:o}=e,l=e.tagType===1;let c=[];const f=[],a=[],u=o.length>0;let d=!1,m=0,b=!1,S=!1,g=!1,_=!1,y=!1,T=!1;const w=[],D=({key:E,value:v})=>{if(Te(E)){const O=E.content,L=Bt(O);if(!l&&L&&O.toLowerCase()!=="onclick"&&O!=="onUpdate:modelValue"&&!Rt(O)&&(_=!0),L&&Rt(O)&&(T=!0),v.type===20||(v.type===4||v.type===8)&&$e(v,t)>0)return;O==="ref"?b=!0:O==="class"?S=!0:O==="style"?g=!0:O!=="key"&&!w.includes(O)&&w.push(O),l&&(O==="class"||O==="style")&&!w.includes(O)&&w.push(O)}else y=!0};for(let E=0;E0&&c.push(fe(z("ref_for",!0),z("true")))),L==="is"&&(zr(r)||$&&$.content.startsWith("vue:")||kt("COMPILER_IS_ON_ELEMENT",t)))continue;c.push(fe(z(L,!0,Zc(O,0,L.length)),z($?$.content:"",N,$?$.loc:O)))}else{const{name:O,arg:L,exp:$,loc:N}=v,U=O==="bind",J=O==="on";if(O==="slot"){l||t.onError(le(40,N));continue}if(O==="once"||O==="memo"||O==="is"||U&&At(L,"is")&&(zr(r)||kt("COMPILER_IS_ON_ELEMENT",t))||J&&s)continue;if((U&&At(L,"key")||J&&u&&At(L,"vue:before-update"))&&(d=!0),U&&At(L,"ref")&&t.scopes.vFor>0&&c.push(fe(z("ref_for",!0),z("true"))),!L&&(U||J)){if(y=!0,$)if(c.length&&(f.push(Be(yr(c),i)),c=[]),U){if(kt("COMPILER_V_BIND_OBJECT_ORDER",t)){f.unshift($);continue}f.push($)}else f.push({type:14,loc:N,callee:t.helper(zi),arguments:[$]});else t.onError(le(U?34:35,N));continue}const Ye=t.directiveTransforms[O];if(Ye){const{props:ae,needRuntime:ne}=Ye(v,e,t);!s&&ae.forEach(D),c.push(...ae),ne&&(a.push(v),an(ne)&&af.set(v,ne))}else Wf(O)||(a.push(v),u&&(d=!0))}}let M;if(f.length?(c.length&&f.push(Be(yr(c),i)),f.length>1?M=ue(t.helper(Os),f,i):M=f[0]):c.length&&(M=Be(yr(c),i)),y?m|=16:(S&&!l&&(m|=2),g&&!l&&(m|=4),w.length&&(m|=8),_&&(m|=32)),!d&&(m===0||m===32)&&(b||T||a.length>0)&&(m|=512),!t.inSSR&&M)switch(M.type){case 15:let E=-1,v=-1,O=!1;for(let N=0;Nfe(o,i)),r))}return Zn(n,e.loc)}function wh(e){let t="[";for(let n=0,s=e.length;n{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Oh=/-(\w)/g,Go=Nh(e=>e.replace(Oh,(t,n)=>n?n.toUpperCase():"")),Ph=(e,t)=>{if(Ms(e)){const{children:n,loc:s}=e,{slotName:r,slotProps:i}=Ah(e,t),o=[t.prefixIdentifiers?"_ctx.$slots":"$slots",r,"{}","undefined","true"];let l=2;i&&(o[2]=i,l=3),n.length&&(o[3]=ln([],n,!1,!1,s),l=4),t.scopeId&&!t.slotted&&(l=5),o.splice(l),e.codegenNode=ue(t.helper(Wc),o,s)}};function Ah(e,t){let n='"default"',s;const r=[];for(let i=0;i0){const{props:i,directives:o}=uf(e,t,r);s=i,o.length&&t.onError(le(36,o[0].loc))}return{slotName:n,slotProps:s}}const Rh=/^\s*([\w$_]+|(async\s*)?\([^)]*?\))\s*=>|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/,pf=(e,t,n,s)=>{const{loc:r,modifiers:i,arg:o}=e;!e.exp&&!i.length&&n.onError(le(35,r));let l;if(o.type===4)if(o.isStatic){let u=o.content;u.startsWith("vue:")&&(u=`vnode-${u.slice(4)}`),l=z(Xt(be(u)),!0,o.loc)}else l=Je([`${n.helperString(Kr)}(`,o,")"]);else l=o,l.children.unshift(`${n.helperString(Kr)}(`),l.children.push(")");let c=e.exp;c&&!c.content.trim()&&(c=void 0);let f=n.cacheHandlers&&!c&&!n.inVOnce;if(c){const u=Yc(c.content),d=!(u||Rh.test(c.content)),m=c.content.includes(";");(d||f&&u)&&(c=Je([`${d?"$event":"(...args)"} => ${m?"{":"("}`,c,m?"}":")"]))}let a={props:[fe(l,c||z("() => {}",!1,r))]};return s&&(a=s(a)),f&&(a.props[0].value=n.cache(a.props[0].value)),a.props.forEach(u=>u.key.isHandlerKey=!0),a},Ih=(e,t,n)=>{const{exp:s,modifiers:r,loc:i}=e,o=e.arg;return o.type!==4?(o.children.unshift("("),o.children.push(') || ""')):o.isStatic||(o.content=`${o.content} || ""`),r.includes("camel")&&(o.type===4?o.isStatic?o.content=be(o.content):o.content=`${n.helperString(Ur)}(${o.content})`:(o.children.unshift(`${n.helperString(Ur)}(`),o.children.push(")"))),n.inSSR||(r.includes("prop")&&el(o,"."),r.includes("attr")&&el(o,"^")),!s||s.type===4&&!s.content.trim()?(n.onError(le(34,i)),{props:[fe(o,z("",!0,i))]}):{props:[fe(o,s)]}},el=(e,t)=>{e.type===4?e.isStatic?e.content=t+e.content:e.content=`\`${t}\${${e.content}}\``:(e.children.unshift(`'${t}' + (`),e.children.push(")"))},Mh=(e,t)=>{if(e.type===0||e.type===1||e.type===11||e.type===10)return()=>{const n=e.children;let s,r=!1;for(let i=0;ii.type===7&&!t.directiveTransforms[i.name])&&e.tag!=="template")))for(let i=0;i{if(e.type===1&&De(e,"once",!0))return tl.has(e)||t.inVOnce?void 0:(tl.add(e),t.inVOnce=!0,t.helper(Ps),()=>{t.inVOnce=!1;const n=t.currentNode;n.codegenNode&&(n.codegenNode=t.cache(n.codegenNode,!0))})},df=(e,t,n)=>{const{exp:s,arg:r}=e;if(!s)return n.onError(le(41,e.loc)),_r();const i=s.loc.source,o=s.type===4?s.content:i;n.bindingMetadata[i];const l=!1;if(!o.trim()||!Yc(o)&&!l)return n.onError(le(42,s.loc)),_r();const c=r||z("modelValue",!0),f=r?Te(r)?`onUpdate:${r.content}`:Je(['"onUpdate:" + ',r]):"onUpdate:modelValue";let a;const u=n.isTS?"($event: any)":"$event";a=Je([`${u} => ((`,s,") = $event)"]);const d=[fe(c,e.exp),fe(f,a)];if(e.modifiers.length&&t.tagType===1){const m=e.modifiers.map(S=>(Zi(S)?S:JSON.stringify(S))+": true").join(", "),b=r?Te(r)?`${r.content}Modifiers`:Je([r,' + "Modifiers"']):"modelModifiers";d.push(fe(b,z(`{ ${m} }`,!1,e.loc,2)))}return _r(d)};function _r(e=[]){return{props:e}}const Fh=/[\w).+\-_$\]]/,Lh=(e,t)=>{!kt("COMPILER_FILTER",t)||(e.type===5&&Fs(e.content,t),e.type===1&&e.props.forEach(n=>{n.type===7&&n.name!=="for"&&n.exp&&Fs(n.exp,t)}))};function Fs(e,t){if(e.type===4)nl(e,t);else for(let n=0;n=0&&(y=n.charAt(_),y===" ");_--);(!y||!Fh.test(y))&&(o=!0)}}b===void 0?b=n.slice(0,m).trim():a!==0&&g();function g(){S.push(n.slice(a,m).trim()),a=m+1}if(S.length){for(m=0;m{if(e.type===1){const n=De(e,"memo");return!n||sl.has(e)?void 0:(sl.add(e),()=>{const s=e.codegenNode||t.currentNode.codegenNode;s&&s.type===13&&(e.tagType!==1&&Qi(s,t),e.codegenNode=ue(t.helper(Yi),[n.exp,ln(void 0,s),"_cache",String(t.cached++)]))})}};function $h(e){return[[kh,ah,Bh,dh,Lh,Ph,Ch,_h,Mh],{on:pf,bind:Ih,model:df}]}function Hh(e,t={}){const n=t.onError||Li,s=t.mode==="module";t.prefixIdentifiers===!0?n(le(46)):s&&n(le(47));const r=!1;t.cacheHandlers&&n(le(48)),t.scopeId&&!s&&n(le(49));const i=q(e)?Id(e,t):e,[o,l]=$h();return Wd(i,G({},t,{prefixIdentifiers:r,nodeTransforms:[...o,...t.nodeTransforms||[]],directiveTransforms:G({},l,t.directiveTransforms||{})})),Yd(i,G({},t,{prefixIdentifiers:r}))}const Vh=()=>({props:[]}),hf=Symbol(""),gf=Symbol(""),mf=Symbol(""),yf=Symbol(""),Jr=Symbol(""),_f=Symbol(""),bf=Symbol(""),Ef=Symbol(""),Cf=Symbol(""),Sf=Symbol("");md({[hf]:"vModelRadio",[gf]:"vModelCheckbox",[mf]:"vModelText",[yf]:"vModelSelect",[Jr]:"vModelDynamic",[_f]:"withModifiers",[bf]:"withKeys",[Ef]:"vShow",[Cf]:"Transition",[Sf]:"TransitionGroup"});let qt;function Uh(e,t=!1){return qt||(qt=document.createElement("div")),t?(qt.innerHTML=`
    `,qt.children[0].getAttribute("foo")):(qt.innerHTML=e,qt.textContent)}const Kh=ve("style,iframe,script,noscript",!0),jh={isVoidTag:Hf,isNativeTag:e=>Bf(e)||$f(e),isPreTag:e=>e==="pre",decodeEntities:Uh,isBuiltInComponent:e=>{if(Yt(e,"Transition"))return Cf;if(Yt(e,"TransitionGroup"))return Sf},getNamespace(e,t){let n=t?t.ns:0;if(t&&n===2)if(t.tag==="annotation-xml"){if(e==="svg")return 1;t.props.some(s=>s.type===6&&s.name==="encoding"&&s.value!=null&&(s.value.content==="text/html"||s.value.content==="application/xhtml+xml"))&&(n=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&e!=="mglyph"&&e!=="malignmark"&&(n=0);else t&&n===1&&(t.tag==="foreignObject"||t.tag==="desc"||t.tag==="title")&&(n=0);if(n===0){if(e==="svg")return 1;if(e==="math")return 2}return n},getTextMode({tag:e,ns:t}){if(t===0){if(e==="textarea"||e==="title")return 1;if(Kh(e))return 2}return 0}},xh=e=>{e.type===1&&e.props.forEach((t,n)=>{t.type===6&&t.name==="style"&&t.value&&(e.props[n]={type:7,name:"bind",arg:z("style",!0,t.loc),exp:Wh(t.value.content,t.loc),modifiers:[],loc:t.loc})})},Wh=(e,t)=>{const n=ol(e);return z(JSON.stringify(n),!1,t,3)};function tt(e,t){return le(e,t)}const qh=(e,t,n)=>{const{exp:s,loc:r}=e;return s||n.onError(tt(50,r)),t.children.length&&(n.onError(tt(51,r)),t.children.length=0),{props:[fe(z("innerHTML",!0,r),s||z("",!0))]}},zh=(e,t,n)=>{const{exp:s,loc:r}=e;return s||n.onError(tt(52,r)),t.children.length&&(n.onError(tt(53,r)),t.children.length=0),{props:[fe(z("textContent",!0),s?ue(n.helperString(er),[s],r):z("",!0))]}},Jh=(e,t,n)=>{const s=df(e,t,n);if(!s.props.length||t.tagType===1)return s;e.arg&&n.onError(tt(55,e.arg.loc));const{tag:r}=t,i=n.isCustomElement(r);if(r==="input"||r==="textarea"||r==="select"||i){let o=mf,l=!1;if(r==="input"||i){const c=tr(t,"type");if(c){if(c.type===7)o=Jr;else if(c.value)switch(c.value.content){case"radio":o=hf;break;case"checkbox":o=gf;break;case"file":l=!0,n.onError(tt(56,e.loc));break}}else wd(t)&&(o=Jr)}else r==="select"&&(o=yf);l||(s.needRuntime=n.helper(o))}else n.onError(tt(54,e.loc));return s.props=s.props.filter(o=>!(o.key.type===4&&o.key.content==="modelValue")),s},Yh=ve("passive,once,capture"),Zh=ve("stop,prevent,self,ctrl,shift,alt,meta,exact,middle"),Qh=ve("left,right"),Tf=ve("onkeyup,onkeydown,onkeypress",!0),Xh=(e,t,n,s)=>{const r=[],i=[],o=[];for(let l=0;lTe(e)&&e.content.toLowerCase()==="onclick"?z(t,!0):e.type!==4?Je(["(",e,`) === "onClick" ? "${t}" : (`,e,")"]):e,Gh=(e,t,n)=>pf(e,t,n,s=>{const{modifiers:r}=e;if(!r.length)return s;let{key:i,value:o}=s.props[0];const{keyModifiers:l,nonKeyModifiers:c,eventOptionModifiers:f}=Xh(i,r,n,e.loc);if(c.includes("right")&&(i=rl(i,"onContextmenu")),c.includes("middle")&&(i=rl(i,"onMouseup")),c.length&&(o=ue(n.helper(_f),[o,JSON.stringify(c)])),l.length&&(!Te(i)||Tf(i.content))&&(o=ue(n.helper(bf),[o,JSON.stringify(l)])),f.length){const a=f.map(Ht).join("");i=Te(i)?z(`${i.content}${a}`,!0):Je(["(",i,`) + "${a}"`])}return{props:[fe(i,o)]}}),eg=(e,t,n)=>{const{exp:s,loc:r}=e;return s||n.onError(tt(58,r)),{props:[],needRuntime:n.helper(Ef)}},tg=(e,t)=>{e.type===1&&e.tagType===0&&(e.tag==="script"||e.tag==="style")&&(t.onError(tt(60,e.loc)),t.removeNode())},ng=[xh],sg={cloak:Vh,html:qh,text:zh,model:Jh,on:Gh,show:eg};function ag(e,t={}){return Hh(e,G({},jh,t,{nodeTransforms:[tg,...ng,...t.nodeTransforms||[]],directiveTransforms:G({},sg,t.directiveTransforms||{}),transformHoist:null}))}function rg(){return vf().__VUE_DEVTOOLS_GLOBAL_HOOK__}function vf(){return typeof navigator!="undefined"&&typeof window!="undefined"?window:typeof global!="undefined"?global:{}}const ig=typeof Proxy=="function",og="devtools-plugin:setup",lg="plugin:settings:set";class cg{constructor(t,n){this.target=null,this.targetQueue=[],this.onQueue=[],this.plugin=t,this.hook=n;const s={};if(t.settings)for(const o in t.settings){const l=t.settings[o];s[o]=l.defaultValue}const r=`__vue-devtools-plugin-settings__${t.id}`;let i=Object.assign({},s);try{const o=localStorage.getItem(r),l=JSON.parse(o);Object.assign(i,l)}catch{}this.fallbacks={getSettings(){return i},setSettings(o){try{localStorage.setItem(r,JSON.stringify(o))}catch{}i=o}},n&&n.on(lg,(o,l)=>{o===this.plugin.id&&this.fallbacks.setSettings(l)}),this.proxiedOn=new Proxy({},{get:(o,l)=>this.target?this.target.on[l]:(...c)=>{this.onQueue.push({method:l,args:c})}}),this.proxiedTarget=new Proxy({},{get:(o,l)=>this.target?this.target[l]:l==="on"?this.proxiedOn:Object.keys(this.fallbacks).includes(l)?(...c)=>(this.targetQueue.push({method:l,args:c,resolve:()=>{}}),this.fallbacks[l](...c)):(...c)=>new Promise(f=>{this.targetQueue.push({method:l,args:c,resolve:f})})})}async setRealTarget(t){this.target=t;for(const n of this.onQueue)this.target.on[n.method](...n.args);for(const n of this.targetQueue)n.resolve(await this.target[n.method](...n.args))}}function ug(e,t){const n=e,s=vf(),r=rg(),i=ig&&n.enableEarlyProxy;if(r&&(s.__VUE_DEVTOOLS_PLUGIN_API_AVAILABLE__||!i))r.emit(og,e,t);else{const o=i?new cg(n,r):null;(s.__VUE_DEVTOOLS_PLUGINS__=s.__VUE_DEVTOOLS_PLUGINS__||[]).push({pluginDescriptor:n,setupFn:t,proxy:o}),o&&t(o.proxiedTarget)}}export{Ae as $,Dl as A,Tn as B,Mt as C,Js as D,ii as E,xl as F,Ee as G,ge as H,yt as I,Mi as J,zp as K,Du as L,Vr as M,Pu as N,Vu as O,_t as P,Fc as Q,rd as R,Ai as S,Lt as T,Y as U,up as V,be as W,Ju as X,cd as Y,ep as Z,q as _,Ys as a,hi as a$,ag as a0,G as a1,fg as a2,Gr as a3,xn as a4,ea as a5,ri as a6,tn as a7,si as a8,ci as a9,hu as aA,lp as aB,cp as aC,op as aD,at as aE,qs as aF,ac as aG,Kt as aH,mp as aI,Tc as aJ,tp as aK,pp as aL,uc as aM,Jl as aN,zl as aO,ql as aP,Wl as aQ,Qs as aR,Qa as aS,Za as aT,pi as aU,qu as aV,$u as aW,Hu as aX,Ep as aY,nn as aZ,Ir as a_,Tl as aa,Na as ab,ta as ac,Aa as ad,Ht as ae,jn as af,kf as ag,Kn as ah,Uf as ai,Xt as aj,Ci as ak,mu as al,pt as am,iu as an,Re as ao,qe as ap,Cp as aq,Oi as ar,Wu as as,Uu as at,Pi as au,rc as av,dp as aw,sc as ax,zu as ay,xu as az,Vl as b,Ft as b0,Sc as b1,bp as b2,Yu as b3,Ku as b4,gp as b5,ap as b6,Ei as b7,Dr as b8,Ol as b9,Bl as ba,uu as bb,hp as bc,yi as bd,fp as be,yp as bf,Xa as bg,Gs as bh,fd as bi,wc as bj,Hp as bk,$c as bl,ad as bm,Up as bn,Kp as bo,ki as bp,ed as bq,Fi as br,Mc as bs,vs as bt,od as bu,ug as bv,ie as c,Si as d,Ul as e,au as f,ni as g,Cc as h,Ma as i,Yf as j,Zf as k,Qf as l,pe as m,ai as n,zn as o,bc as p,Us as q,as as r,Oa as s,ka as t,wl as u,Nl as v,vn as w,St as x,jl as y,Zs as z}; diff --git a/public/exadmin/assets/@vueuse.952f4739.js b/public/exadmin/assets/@vueuse.952f4739.js new file mode 100644 index 0000000..f6badb2 --- /dev/null +++ b/public/exadmin/assets/@vueuse.952f4739.js @@ -0,0 +1 @@ +import{i as Qe}from"./vue-demi.5fb18120.js";import{s as G,f as Re,g as le,u as C,r as p,w as D,i as $e,j as ir,k as lr,l as no,m as q,p as S,q as B,v as ro,t as cr,x as fe,y as oo,n as Ee,a as ao,o as ft,z as uo,A as so,B as Ce,C as io,D as fr,E as lo,F as co}from"./@vue.cb43a243.js";import"./vue.db505ee4.js";var fo=Object.defineProperty,vo=Object.defineProperties,po=Object.getOwnPropertyDescriptors,Et=Object.getOwnPropertySymbols,mo=Object.prototype.hasOwnProperty,ho=Object.prototype.propertyIsEnumerable,xt=(e,t,n)=>t in e?fo(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,go=(e,t)=>{for(var n in t||(t={}))mo.call(t,n)&&xt(e,n,t[n]);if(Et)for(var n of Et(t))ho.call(t,n)&&xt(e,n,t[n]);return e},yo=(e,t)=>vo(e,po(t));function Tt(e,t){var n;const r=G();return Re(()=>{r.value=e()},yo(go({},t),{flush:(n=t==null?void 0:t.flush)!=null?n:"sync"})),le(r)}var Dt;const Q=typeof window!="undefined",Ne=e=>typeof e!="undefined",_o=(e,...t)=>{e||console.warn(...t)},vr=Object.prototype.toString,wo=e=>typeof e=="boolean",oe=e=>typeof e=="function",ye=e=>typeof e=="number",xe=e=>typeof e=="string",dr=e=>vr.call(e)==="[object Object]",Oo=e=>typeof window!="undefined"&&vr.call(e)==="[object Window]",bo=()=>Date.now(),ce=()=>+Date.now(),Me=(e,t,n)=>Math.min(n,Math.max(t,e)),L=()=>{},Po=(e,t)=>(e=Math.ceil(e),t=Math.floor(t),Math.floor(Math.random()*(t-e+1))+e),ut=Q&&((Dt=window==null?void 0:window.navigator)==null?void 0:Dt.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent),pr=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function P(e){return typeof e=="function"?e():C(e)}function ve(e,t){function n(...r){e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})}return n}const Te=e=>e();function qe(e,t={}){let n,r;return a=>{const s=P(e),u=P(t.maxWait);if(n&&clearTimeout(n),s<=0||u!==void 0&&u<=0)return r&&(clearTimeout(r),r=null),a();u&&!r&&(r=setTimeout(()=>{n&&clearTimeout(n),r=null,a()},u)),n=setTimeout(()=>{r&&clearTimeout(r),r=null,a()},s)}}function De(e,t=!0,n=!0){let r=0,o,a=!0;const s=()=>{o&&(clearTimeout(o),o=void 0)};return i=>{const l=P(e),c=Date.now()-r;if(s(),l<=0)return r=Date.now(),i();c>l&&(n||!a)?(r=Date.now(),i()):t&&(o=setTimeout(()=>{r=Date.now(),a=!0,s(),i()},l)),!n&&!o&&(o=setTimeout(()=>a=!0,l)),a=!1}}function vt(e=Te){const t=p(!0);function n(){t.value=!1}function r(){t.value=!0}return{isActive:t,pause:n,resume:r,eventFilter:(...a)=>{t.value&&e(...a)}}}function So(e="this function"){}const $o={mounted:Qe?"mounted":"inserted",updated:Qe?"updated":"componentUpdated",unmounted:Qe?"unmounted":"unbind"};function ke(e,t=!1,n="Timeout"){return new Promise((r,o)=>{setTimeout(t?()=>o(n):r,e)})}function dt(e){return e}function mr(e){let t;function n(){return t||(t=e()),t}return n.reset=async()=>{const r=t;t=void 0,r&&await r},n}function Eo(e){return e()}function hr(e,...t){return t.some(n=>n in e)}function gr(e,t){var n;if(typeof e=="number")return e+t;const r=((n=e.match(/^-?[0-9]+\.?[0-9]*/))==null?void 0:n[0])||"",o=e.slice(r.length),a=parseFloat(r)+t;return Number.isNaN(a)?e:a+o}function yr(e,t,n=!1){return t.reduce((r,o)=>(o in e&&(!n||e[o]!==void 0)&&(r[o]=e[o]),r),{})}function Le(e,t){let n,r,o;const a=p(!0),s=()=>{a.value=!0,o()};D(e,s,{flush:"sync"});const u=oe(t)?t:t.get,i=oe(t)?void 0:t.set,l=$e((c,f)=>(r=c,o=f,{get(){return a.value&&(n=u(),a.value=!1),r(),n},set(v){i==null||i(v)}}));return Object.isExtensible(l)&&(l.trigger=s),l}function z(){const e=[],t=o=>{const a=e.indexOf(o);a!==-1&&e.splice(a,1)};return{on:o=>(e.push(o),{off:()=>t(o)}),off:t,trigger:o=>{e.forEach(a=>a(o))}}}function xo(e){let t=!1,n;const r=ir(!0);return()=>(t||(n=r.run(e),t=!0),n)}function To(e){const t=Symbol("InjectionState");return[(...o)=>{so(t,e(...o))},()=>Ce(t)]}function N(e){return lr()?(no(e),!0):!1}function Do(e){let t=0,n,r;const o=()=>{t-=1,r&&t<=0&&(r.stop(),n=void 0,r=void 0)};return(...a)=>(t+=1,n||(r=ir(!0),n=r.run(()=>e(...a))),N(o),n)}function _r(e,t,{enumerable:n=!1,unwrap:r=!0}={}){for(const[o,a]of Object.entries(t))o!=="value"&&(q(a)&&r?Object.defineProperty(e,o,{get(){return a.value},set(s){a.value=s},enumerable:n}):Object.defineProperty(e,o,{value:a,enumerable:n}));return e}function Io(e,t){return t==null?C(e):C(e)[t]}function Fo(e){return C(e)!=null}var jo=Object.defineProperty,It=Object.getOwnPropertySymbols,Ao=Object.prototype.hasOwnProperty,Co=Object.prototype.propertyIsEnumerable,Ft=(e,t,n)=>t in e?jo(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ro=(e,t)=>{for(var n in t||(t={}))Ao.call(t,n)&&Ft(e,n,t[n]);if(It)for(var n of It(t))Co.call(t,n)&&Ft(e,n,t[n]);return e};function No(e,t){if(typeof Symbol!="undefined"){const n=Ro({},e);return Object.defineProperty(n,Symbol.iterator,{enumerable:!1,value(){let r=0;return{next:()=>({value:t[r++],done:r>t.length})}}}),n}else return Object.assign([...t],e)}function st(e,t){const n=(t==null?void 0:t.computedGetter)===!1?C:P;return function(...r){return S(()=>e.apply(this,r.map(o=>n(o))))}}function Mo(e,t={}){let n=[],r;if(Array.isArray(t))n=t;else{r=t;const{includeOwnProperties:o=!0}=t;n.push(...Object.keys(e)),o&&n.push(...Object.getOwnPropertyNames(e))}return Object.fromEntries(n.map(o=>{const a=e[o];return[o,typeof a=="function"?st(a.bind(e),r):a]}))}function wr(e){if(!q(e))return B(e);const t=new Proxy({},{get(n,r,o){return C(Reflect.get(e.value,r,o))},set(n,r,o){return q(e.value[r])&&!q(o)?e.value[r].value=o:e.value[r]=o,!0},deleteProperty(n,r){return Reflect.deleteProperty(e.value,r)},has(n,r){return Reflect.has(e.value,r)},ownKeys(){return Object.keys(e.value)},getOwnPropertyDescriptor(){return{enumerable:!0,configurable:!0}}});return B(t)}function Or(e){return wr(S(e))}function ko(e,...t){const n=t.flat();return Or(()=>Object.fromEntries(Object.entries(cr(e)).filter(r=>!n.includes(r[0]))))}function Lo(e,...t){const n=t.flat();return B(Object.fromEntries(n.map(r=>[r,ro(e,r)])))}function jt(e,t=1e4){return $e((n,r)=>{let o=e,a;const s=()=>setTimeout(()=>{o=e,r()},P(t));return N(()=>{clearTimeout(a)}),{get(){return n(),o},set(u){o=u,r(),clearTimeout(a),a=s()}}})}function Xe(e,t=200,n={}){return ve(qe(t,n),e)}function Ze(e,t=200,n={}){if(t<=0)return e;const r=p(e.value),o=Xe(()=>{r.value=e.value},t,n);return D(e,()=>o()),r}function Vo(e,t){return S({get(){var n;return(n=e.value)!=null?n:t},set(n){e.value=n}})}function pt(e,t=200,n=!1,r=!0){return ve(De(t,n,r),e)}function et(e,t=200,n=!0,r=!0){if(t<=0)return e;const o=p(e.value),a=pt(()=>{o.value=e.value},t,n,r);return D(e,()=>a()),o}function br(e,t={}){let n=e,r,o;const a=$e((v,d)=>(r=v,o=d,{get(){return s()},set(m){u(m)}}));function s(v=!0){return v&&r(),n}function u(v,d=!0){var m,h;if(v===n)return;const g=n;((m=t.onBeforeChange)==null?void 0:m.call(t,v,g))!==!1&&(n=v,(h=t.onChanged)==null||h.call(t,v,g),d&&o())}return _r(a,{get:s,set:u,untrackedGet:()=>s(!1),silentSet:v=>u(v,!1),peek:()=>s(!1),lay:v=>u(v,!1)},{enumerable:!0})}const Wo=br;function re(e){return typeof e=="function"?S(e):p(e)}function Bo(...e){if(e.length===2){const[t,n]=e;t.value=n}if(e.length===3){const[t,n,r]=e;t[n]=r}}function it(e,t,n={}){var r,o;const{flush:a="sync",deep:s=!1,immediate:u=!0,direction:i="both",transform:l={}}=n;let c,f;const v=(r=l.ltr)!=null?r:m=>m,d=(o=l.rtl)!=null?o:m=>m;return(i==="both"||i==="ltr")&&(c=D(e,m=>t.value=v(m),{flush:a,deep:s,immediate:u})),(i==="both"||i==="rtl")&&(f=D(t,m=>e.value=d(m),{flush:a,deep:s,immediate:u})),()=>{c==null||c(),f==null||f()}}function Uo(e,t,n={}){const{flush:r="sync",deep:o=!1,immediate:a=!0}=n;return Array.isArray(t)||(t=[t]),D(e,s=>t.forEach(u=>u.value=s),{flush:r,deep:o,immediate:a})}var Ho=Object.defineProperty,zo=Object.defineProperties,Go=Object.getOwnPropertyDescriptors,At=Object.getOwnPropertySymbols,qo=Object.prototype.hasOwnProperty,Xo=Object.prototype.propertyIsEnumerable,Ct=(e,t,n)=>t in e?Ho(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Yo=(e,t)=>{for(var n in t||(t={}))qo.call(t,n)&&Ct(e,n,t[n]);if(At)for(var n of At(t))Xo.call(t,n)&&Ct(e,n,t[n]);return e},Ko=(e,t)=>zo(e,Go(t));function mt(e){if(!q(e))return cr(e);const t=Array.isArray(e.value)?new Array(e.value.length):{};for(const n in e.value)t[n]=$e(()=>({get(){return e.value[n]},set(r){if(Array.isArray(e.value)){const o=[...e.value];o[n]=r,e.value=o}else{const o=Ko(Yo({},e.value),{[n]:r});Object.setPrototypeOf(o,e.value),e.value=o}}}));return t}function Pr(e,t=!0){fe()?oo(e):t?e():Ee(e)}function Jo(e){fe()&&ao(e)}function Z(e,t=!0){fe()?ft(e):t?e():Ee(e)}function Sr(e){fe()&&uo(e)}function $r(e){let t=!1;function n(f,{flush:v="sync",deep:d=!1,timeout:m,throwOnTimeout:h}={}){let g=null;const y=[new Promise(w=>{g=D(e,$=>{f($)!==t&&(g==null||g(),w($))},{flush:v,deep:d,immediate:!0})})];return m!=null&&y.push(ke(m,h).then(()=>P(e)).finally(()=>g==null?void 0:g())),Promise.race(y)}function r(f,v){if(!q(f))return n($=>$===f,v);const{flush:d="sync",deep:m=!1,timeout:h,throwOnTimeout:g}=v!=null?v:{};let _=null;const w=[new Promise($=>{_=D([e,f],([b,E])=>{t!==(b===E)&&(_==null||_(),$(b))},{flush:d,deep:m,immediate:!0})})];return h!=null&&w.push(ke(h,g).then(()=>P(e)).finally(()=>(_==null||_(),P(e)))),Promise.race(w)}function o(f){return n(v=>Boolean(v),f)}function a(f){return r(null,f)}function s(f){return r(void 0,f)}function u(f){return n(Number.isNaN,f)}function i(f,v){return n(d=>{const m=Array.from(d);return m.includes(f)||m.includes(P(f))},v)}function l(f){return c(1,f)}function c(f=1,v){let d=-1;return n(()=>(d+=1,d>=f),v)}return Array.isArray(P(e))?{toMatch:n,toContains:i,changed:l,changedTimes:c,get not(){return t=!t,this}}:{toMatch:n,toBe:r,toBeTruthy:o,toBeNull:a,toBeNaN:u,toBeUndefined:s,changed:l,changedTimes:c,get not(){return t=!t,this}}}function Qo(e,t){return S(()=>P(e).every((n,r,o)=>t(P(n),r,o)))}function Zo(e,t){return S(()=>P(e).map(n=>P(n)).filter(t))}function ea(e,t){return S(()=>P(P(e).find((n,r,o)=>t(P(n),r,o))))}function ta(e,t){return S(()=>P(e).findIndex((n,r,o)=>t(P(n),r,o)))}function na(e,t){return S(()=>P(e).map(n=>P(n)).join(P(t)))}function ra(e,t){return S(()=>P(e).map(n=>P(n)).map(t))}function oa(e,t,...n){const r=(o,a,s)=>t(P(o),P(a),s);return S(()=>{const o=P(e);return n.length?o.reduce(r,P(n[0])):o.reduce(r)})}function aa(e,t){return S(()=>P(e).some((n,r,o)=>t(P(n),r,o)))}function ua(e=0,t={}){const n=p(e),{max:r=1/0,min:o=-1/0}=t,a=(c=1)=>n.value=Math.min(r,n.value+c),s=(c=1)=>n.value=Math.max(o,n.value-c),u=()=>n.value,i=c=>n.value=c;return{count:n,inc:a,dec:s,get:u,set:i,reset:(c=e)=>(e=c,i(c))}}const sa=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,ia=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,Er=(e,t,n)=>{const r=e.getFullYear(),o=e.getMonth(),a=e.getDate(),s=e.getHours(),u=e.getMinutes(),i=e.getSeconds(),l=e.getMilliseconds(),c=e.getDay(),f={YY:()=>String(r).slice(-2),YYYY:()=>r,M:()=>o+1,MM:()=>`${o+1}`.padStart(2,"0"),D:()=>String(a),DD:()=>`${a}`.padStart(2,"0"),H:()=>String(s),HH:()=>`${s}`.padStart(2,"0"),h:()=>`${s%12||12}`.padStart(1,"0"),hh:()=>`${s%12||12}`.padStart(2,"0"),m:()=>String(u),mm:()=>`${u}`.padStart(2,"0"),s:()=>String(i),ss:()=>`${i}`.padStart(2,"0"),SSS:()=>`${l}`.padStart(3,"0"),d:()=>c,dd:()=>e.toLocaleDateString(n,{weekday:"narrow"}),ddd:()=>e.toLocaleDateString(n,{weekday:"short"}),dddd:()=>e.toLocaleDateString(n,{weekday:"long"})};return t.replace(ia,(v,d)=>d||f[v]())},xr=e=>{if(e===null)return new Date(NaN);if(e===void 0)return new Date;if(e instanceof Date)return new Date(e);if(typeof e=="string"&&!/Z$/i.test(e)){const t=e.match(sa);if(t){const n=t[2]-1||0,r=(t[7]||"0").substring(0,3);return new Date(t[1],n,t[3]||1,t[4]||0,t[5]||0,t[6]||0,r)}}return new Date(e)};function la(e,t="HH:mm:ss",n={}){return S(()=>Er(xr(P(e)),P(t),n==null?void 0:n.locales))}function de(e,t=1e3,n={}){const{immediate:r=!0,immediateCallback:o=!1}=n;let a=null;const s=p(!1);function u(){a&&(clearInterval(a),a=null)}function i(){s.value=!1,u()}function l(){C(t)<=0||(s.value=!0,o&&e(),u(),a=setInterval(e,P(t)))}if(r&&Q&&l(),q(t)){const c=D(t,()=>{s.value&&Q&&l()});N(c)}return N(i),{isActive:s,pause:i,resume:l}}var ca=Object.defineProperty,Rt=Object.getOwnPropertySymbols,fa=Object.prototype.hasOwnProperty,va=Object.prototype.propertyIsEnumerable,Nt=(e,t,n)=>t in e?ca(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,da=(e,t)=>{for(var n in t||(t={}))fa.call(t,n)&&Nt(e,n,t[n]);if(Rt)for(var n of Rt(t))va.call(t,n)&&Nt(e,n,t[n]);return e};function pa(e=1e3,t={}){const{controls:n=!1,immediate:r=!0}=t,o=p(0),a=de(()=>o.value+=1,e,{immediate:r});return n?da({counter:o},a):o}function ma(e,t={}){var n;const r=p((n=t.initialValue)!=null?n:null);return D(e,()=>r.value=ce(),t),r}function we(e,t,n={}){const{immediate:r=!0}=n,o=p(!1);let a=null;function s(){a&&(clearTimeout(a),a=null)}function u(){o.value=!1,s()}function i(...l){s(),o.value=!0,a=setTimeout(()=>{o.value=!1,a=null,e(...l)},P(t))}return r&&(o.value=!0,Q&&i()),N(u),{isPending:o,start:i,stop:u}}var ha=Object.defineProperty,Mt=Object.getOwnPropertySymbols,ga=Object.prototype.hasOwnProperty,ya=Object.prototype.propertyIsEnumerable,kt=(e,t,n)=>t in e?ha(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,_a=(e,t)=>{for(var n in t||(t={}))ga.call(t,n)&&kt(e,n,t[n]);if(Mt)for(var n of Mt(t))ya.call(t,n)&&kt(e,n,t[n]);return e};function wa(e=1e3,t={}){const{controls:n=!1}=t,r=we(L,e,t),o=S(()=>!r.isPending.value);return n?_a({ready:o},r):o}function Oa(e,t={}){const{method:n="parseFloat",radix:r,nanToZero:o}=t;return S(()=>{let a=P(e);return typeof a=="string"&&(a=Number[n](a,r)),o&&isNaN(a)&&(a=0),a})}function ba(e){return S(()=>`${P(e)}`)}function Pa(e=!1,t={}){const{truthyValue:n=!0,falsyValue:r=!1}=t,o=q(e),a=p(e);function s(u){if(arguments.length)return a.value=u,a.value;{const i=P(n);return a.value=a.value===i?P(r):i,a.value}}return o?s:[a,s]}function Sa(e,t,n){let r=(n==null?void 0:n.immediate)?[]:[...e instanceof Function?e():Array.isArray(e)?e:C(e)];return D(e,(o,a,s)=>{const u=new Array(r.length),i=[];for(const c of o){let f=!1;for(let v=0;v!u[f]);t(o,r,i,l,s),r=[...o]},n)}var Lt=Object.getOwnPropertySymbols,$a=Object.prototype.hasOwnProperty,Ea=Object.prototype.propertyIsEnumerable,xa=(e,t)=>{var n={};for(var r in e)$a.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Lt)for(var r of Lt(e))t.indexOf(r)<0&&Ea.call(e,r)&&(n[r]=e[r]);return n};function Oe(e,t,n={}){const r=n,{eventFilter:o=Te}=r,a=xa(r,["eventFilter"]);return D(e,ve(o,t),a)}var Vt=Object.getOwnPropertySymbols,Ta=Object.prototype.hasOwnProperty,Da=Object.prototype.propertyIsEnumerable,Ia=(e,t)=>{var n={};for(var r in e)Ta.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Vt)for(var r of Vt(e))t.indexOf(r)<0&&Da.call(e,r)&&(n[r]=e[r]);return n};function Fa(e,t,n){const r=n,{count:o}=r,a=Ia(r,["count"]),s=p(0),u=Oe(e,(...i)=>{s.value+=1,s.value>=P(o)&&Ee(()=>u()),t(...i)},a);return{count:s,stop:u}}var ja=Object.defineProperty,Aa=Object.defineProperties,Ca=Object.getOwnPropertyDescriptors,Ve=Object.getOwnPropertySymbols,Tr=Object.prototype.hasOwnProperty,Dr=Object.prototype.propertyIsEnumerable,Wt=(e,t,n)=>t in e?ja(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ra=(e,t)=>{for(var n in t||(t={}))Tr.call(t,n)&&Wt(e,n,t[n]);if(Ve)for(var n of Ve(t))Dr.call(t,n)&&Wt(e,n,t[n]);return e},Na=(e,t)=>Aa(e,Ca(t)),Ma=(e,t)=>{var n={};for(var r in e)Tr.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Ve)for(var r of Ve(e))t.indexOf(r)<0&&Dr.call(e,r)&&(n[r]=e[r]);return n};function Bt(e,t,n={}){const r=n,{debounce:o=0,maxWait:a=void 0}=r,s=Ma(r,["debounce","maxWait"]);return Oe(e,t,Na(Ra({},s),{eventFilter:qe(o,{maxWait:a})}))}var ka=Object.defineProperty,La=Object.defineProperties,Va=Object.getOwnPropertyDescriptors,We=Object.getOwnPropertySymbols,Ir=Object.prototype.hasOwnProperty,Fr=Object.prototype.propertyIsEnumerable,Ut=(e,t,n)=>t in e?ka(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Wa=(e,t)=>{for(var n in t||(t={}))Ir.call(t,n)&&Ut(e,n,t[n]);if(We)for(var n of We(t))Fr.call(t,n)&&Ut(e,n,t[n]);return e},Ba=(e,t)=>La(e,Va(t)),Ua=(e,t)=>{var n={};for(var r in e)Ir.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&We)for(var r of We(e))t.indexOf(r)<0&&Fr.call(e,r)&&(n[r]=e[r]);return n};function _e(e,t,n={}){const r=n,{eventFilter:o=Te}=r,a=Ua(r,["eventFilter"]),s=ve(o,t);let u,i,l;if(a.flush==="sync"){const c=p(!1);i=()=>{},u=f=>{c.value=!0,f(),c.value=!1},l=D(e,(...f)=>{c.value||s(...f)},a)}else{const c=[],f=p(0),v=p(0);i=()=>{f.value=v.value},c.push(D(e,()=>{v.value++},Ba(Wa({},a),{flush:"sync"}))),u=d=>{const m=v.value;d(),f.value+=v.value-m},c.push(D(e,(...d)=>{const m=f.value>0&&f.value===v.value;f.value=0,v.value=0,!m&&s(...d)},a)),l=()=>{c.forEach(d=>d())}}return{stop:l,ignoreUpdates:u,ignorePrevAsyncUpdates:i}}function Ha(e,t,n){const r=D(e,(...o)=>(Ee(()=>r()),t(...o)),n)}var za=Object.defineProperty,Ga=Object.defineProperties,qa=Object.getOwnPropertyDescriptors,Be=Object.getOwnPropertySymbols,jr=Object.prototype.hasOwnProperty,Ar=Object.prototype.propertyIsEnumerable,Ht=(e,t,n)=>t in e?za(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Xa=(e,t)=>{for(var n in t||(t={}))jr.call(t,n)&&Ht(e,n,t[n]);if(Be)for(var n of Be(t))Ar.call(t,n)&&Ht(e,n,t[n]);return e},Ya=(e,t)=>Ga(e,qa(t)),Ka=(e,t)=>{var n={};for(var r in e)jr.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Be)for(var r of Be(e))t.indexOf(r)<0&&Ar.call(e,r)&&(n[r]=e[r]);return n};function Ue(e,t,n={}){const r=n,{eventFilter:o}=r,a=Ka(r,["eventFilter"]),{eventFilter:s,pause:u,resume:i,isActive:l}=vt(o);return{stop:Oe(e,t,Ya(Xa({},a),{eventFilter:s})),pause:u,resume:i,isActive:l}}var Ja=Object.defineProperty,Qa=Object.defineProperties,Za=Object.getOwnPropertyDescriptors,He=Object.getOwnPropertySymbols,Cr=Object.prototype.hasOwnProperty,Rr=Object.prototype.propertyIsEnumerable,zt=(e,t,n)=>t in e?Ja(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,eu=(e,t)=>{for(var n in t||(t={}))Cr.call(t,n)&&zt(e,n,t[n]);if(He)for(var n of He(t))Rr.call(t,n)&&zt(e,n,t[n]);return e},tu=(e,t)=>Qa(e,Za(t)),nu=(e,t)=>{var n={};for(var r in e)Cr.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&He)for(var r of He(e))t.indexOf(r)<0&&Rr.call(e,r)&&(n[r]=e[r]);return n};function Gt(e,t,n={}){const r=n,{throttle:o=0,trailing:a=!0,leading:s=!0}=r,u=nu(r,["throttle","trailing","leading"]);return Oe(e,t,tu(eu({},u),{eventFilter:De(o,a,s)}))}var ru=Object.defineProperty,ou=Object.defineProperties,au=Object.getOwnPropertyDescriptors,qt=Object.getOwnPropertySymbols,uu=Object.prototype.hasOwnProperty,su=Object.prototype.propertyIsEnumerable,Xt=(e,t,n)=>t in e?ru(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,iu=(e,t)=>{for(var n in t||(t={}))uu.call(t,n)&&Xt(e,n,t[n]);if(qt)for(var n of qt(t))su.call(t,n)&&Xt(e,n,t[n]);return e},lu=(e,t)=>ou(e,au(t));function cu(e,t,n={}){let r;function o(){if(!r)return;const c=r;r=void 0,c()}function a(c){r=c}const s=(c,f)=>(o(),t(c,f,a)),u=_e(e,s,n),{ignoreUpdates:i}=u,l=()=>{let c;return i(()=>{c=s(fu(e),vu(e))}),c};return lu(iu({},u),{trigger:l})}function fu(e){return io(e)?e:Array.isArray(e)?e.map(t=>Yt(t)):Yt(e)}function Yt(e){return typeof e=="function"?e():C(e)}function vu(e){return Array.isArray(e)?e.map(()=>{}):void 0}function du(e,t,n){return D(e,(r,o,a)=>{r&&t(r,o,a)},n)}function Kt(e,t,n){let r;q(n)?r={evaluating:n}:r=n||{};const{lazy:o=!1,evaluating:a=void 0,onError:s=L}=r,u=p(!o),i=p(t);let l=0;return Re(async c=>{if(!u.value)return;l++;const f=l;let v=!1;a&&Promise.resolve().then(()=>{a.value=!0});try{const d=await e(m=>{c(()=>{a&&(a.value=!1),v||m()})});f===l&&(i.value=d)}catch(d){s(d)}finally{a&&f===l&&(a.value=!1),v=!0}}),o?S(()=>(u.value=!0,i.value)):i}function pu(e,t,n,r){let o=Ce(e);return n&&(o=Ce(e,n)),r&&(o=Ce(e,n,r)),typeof t=="function"?S(a=>t(o,a)):S({get:a=>t.get(o,a),set:t.set})}const mu=e=>function(...t){return e.apply(this,t.map(n=>C(n)))};function V(e){var t;const n=P(e);return(t=n==null?void 0:n.$el)!=null?t:n}const j=Q?window:void 0,ee=Q?window.document:void 0,te=Q?window.navigator:void 0,hu=Q?window.location:void 0;function O(...e){let t,n,r,o;if(xe(e[0])?([n,r,o]=e,t=j):[t,n,r,o]=e,!t)return L;let a=L;const s=D(()=>V(t),i=>{a(),!!i&&(i.addEventListener(n,r,o),a=()=>{i.removeEventListener(n,r,o),a=L})},{immediate:!0,flush:"post"}),u=()=>{s(),a()};return N(u),u}function gu(e,t,n={}){const{window:r=j,ignore:o,capture:a=!0,detectIframe:s=!1}=n;if(!r)return;const u=p(!0);let i;const l=v=>{r.clearTimeout(i);const d=V(e),m=v.composedPath();!d||d===v.target||m.includes(d)||!u.value||o&&o.length>0&&o.some(h=>{const g=V(h);return g&&(v.target===g||m.includes(g))})||t(v)},c=[O(r,"click",l,{passive:!0,capture:a}),O(r,"pointerdown",v=>{const d=V(e);u.value=!!d&&!v.composedPath().includes(d)},{passive:!0}),O(r,"pointerup",v=>{if(v.button===0){const d=v.composedPath();v.composedPath=()=>d,i=r.setTimeout(()=>l(v),50)}},{passive:!0}),s&&O(r,"blur",v=>{var d;const m=V(e);((d=document.activeElement)==null?void 0:d.tagName)==="IFRAME"&&!(m==null?void 0:m.contains(document.activeElement))&&t(v)})].filter(Boolean);return()=>c.forEach(v=>v())}var yu=Object.defineProperty,_u=Object.defineProperties,wu=Object.getOwnPropertyDescriptors,Jt=Object.getOwnPropertySymbols,Ou=Object.prototype.hasOwnProperty,bu=Object.prototype.propertyIsEnumerable,Qt=(e,t,n)=>t in e?yu(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,ht=(e,t)=>{for(var n in t||(t={}))Ou.call(t,n)&&Qt(e,n,t[n]);if(Jt)for(var n of Jt(t))bu.call(t,n)&&Qt(e,n,t[n]);return e},gt=(e,t)=>_u(e,wu(t));const Pu=e=>typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):e?()=>!0:()=>!1;function Ye(e,t,n={}){const{target:r=j,eventName:o="keydown",passive:a=!1}=n,s=Pu(e);return O(r,o,i=>{s(i)&&t(i)},a)}function Su(e,t,n={}){return Ye(e,t,gt(ht({},n),{eventName:"keydown"}))}function $u(e,t,n={}){return Ye(e,t,gt(ht({},n),{eventName:"keypress"}))}function Eu(e,t,n={}){return Ye(e,t,gt(ht({},n),{eventName:"keyup"}))}const xu=500;function Tu(e,t,n){var r,o;const a=S(()=>V(e));let s;function u(){s&&(clearTimeout(s),s=void 0)}function i(c){var f,v,d,m;((f=n==null?void 0:n.modifiers)==null?void 0:f.self)&&c.target!==a.value||(u(),((v=n==null?void 0:n.modifiers)==null?void 0:v.prevent)&&c.preventDefault(),((d=n==null?void 0:n.modifiers)==null?void 0:d.stop)&&c.stopPropagation(),s=setTimeout(()=>t(c),(m=n==null?void 0:n.delay)!=null?m:xu))}const l={capture:(r=n==null?void 0:n.modifiers)==null?void 0:r.capture,once:(o=n==null?void 0:n.modifiers)==null?void 0:o.once};O(a,"pointerdown",i,l),O(a,"pointerup",u,l),O(a,"pointerleave",u,l)}const Du=()=>{const{activeElement:e,body:t}=document;if(!e||e===t)return!1;switch(e.tagName){case"INPUT":case"TEXTAREA":return!0}return e.hasAttribute("contenteditable")},Iu=({keyCode:e,metaKey:t,ctrlKey:n,altKey:r})=>t||n||r?!1:e>=48&&e<=57||e>=96&&e<=105||e>=65&&e<=90;function Fu(e,t={}){const{document:n=ee}=t;n&&O(n,"keydown",o=>{!Du()&&Iu(o)&&e(o)},{passive:!0})}function ju(e,t=null){const n=fe();let r=()=>{};const o=$e((a,s)=>(r=s,{get(){var u,i;return a(),(i=(u=n==null?void 0:n.proxy)==null?void 0:u.$refs[e])!=null?i:t},set(){}}));return Z(r),fr(r),o}function yt(e={}){const{window:t=j}=e,n=Le(()=>null,()=>t==null?void 0:t.document.activeElement);return t&&(O(t,"blur",n.trigger,!0),O(t,"focus",n.trigger,!0)),n}function Au(e,t={}){const{interrupt:n=!0,onError:r=L,onFinished:o=L}=t,a={pending:"pending",rejected:"rejected",fulfilled:"fulfilled"},s=Array.from(new Array(e.length),()=>({state:a.pending,data:null})),u=B(s),i=p(-1);if(!e||e.length===0)return o(),{activeIndex:i,result:u};function l(c,f){i.value++,u[i.value].data=f,u[i.value].state=c}return e.reduce((c,f)=>c.then(v=>{var d;if(((d=u[i.value])==null?void 0:d.state)===a.rejected&&n){o();return}return f(v).then(m=>(l(a.fulfilled,m),i.value===e.length-1&&o(),m))}).catch(v=>(l(a.rejected,v),r(),v)),Promise.resolve()),{activeIndex:i,result:u}}function Nr(e,t,n){const{immediate:r=!0,delay:o=0,onError:a=L,resetOnExecute:s=!0,shallow:u=!0,throwError:i}=n!=null?n:{},l=u?G(t):p(t),c=p(!1),f=p(!1),v=p(void 0);async function d(m=0,...h){s&&(l.value=t),v.value=void 0,c.value=!1,f.value=!0,m>0&&await ke(m);const g=typeof e=="function"?e(...h):e;try{const _=await g;l.value=_,c.value=!0}catch(_){if(v.value=_,a(_),i)throw v}finally{f.value=!1}return l.value}return r&&d(o),{state:l,isReady:c,isLoading:f,error:v,execute:d}}const be={array:e=>JSON.stringify(e),object:e=>JSON.stringify(e),set:e=>JSON.stringify(Array.from(e)),map:e=>JSON.stringify(Object.fromEntries(e)),null:()=>""};function Cu(e){return e?e instanceof Map?be.map:e instanceof Set?be.set:Array.isArray(e)?be.array:be.object:be.null}function Ru(e,t){const n=p(""),r=p();function o(){if(!!Q)return r.value=new Promise((a,s)=>{try{const u=P(e);if(u==null)a("");else if(typeof u=="string")a(tt(new Blob([u],{type:"text/plain"})));else if(u instanceof Blob)a(tt(u));else if(u instanceof ArrayBuffer)a(window.btoa(String.fromCharCode(...new Uint8Array(u))));else if(u instanceof HTMLCanvasElement)a(u.toDataURL(t==null?void 0:t.type,t==null?void 0:t.quality));else if(u instanceof HTMLImageElement){const i=u.cloneNode(!1);i.crossOrigin="Anonymous",Nu(i).then(()=>{const l=document.createElement("canvas"),c=l.getContext("2d");l.width=i.width,l.height=i.height,c.drawImage(i,0,0,l.width,l.height),a(l.toDataURL(t==null?void 0:t.type,t==null?void 0:t.quality))}).catch(s)}else if(typeof u=="object"){const l=((t==null?void 0:t.serializer)||Cu(u))(u);return a(tt(new Blob([l],{type:"application/json"})))}else s(new Error("target is unsupported types"))}catch(u){s(u)}}),r.value.then(a=>n.value=a),r.value}return q(e)||oe(e)?D(e,o,{immediate:!0}):o(),{base64:n,promise:r,execute:o}}function Nu(e){return new Promise((t,n)=>{e.complete?t():(e.onload=()=>{t()},e.onerror=n)})}function tt(e){return new Promise((t,n)=>{const r=new FileReader;r.onload=o=>{t(o.target.result)},r.onerror=n,r.readAsDataURL(e)})}function M(e,t=!1){const n=p(),r=()=>n.value=Boolean(e());return r(),Z(r,t),n}function Mu({navigator:e=te}={}){const t=["chargingchange","chargingtimechange","dischargingtimechange","levelchange"],n=M(()=>e&&"getBattery"in e),r=p(!1),o=p(0),a=p(0),s=p(1);let u;function i(){r.value=this.charging,o.value=this.chargingTime||0,a.value=this.dischargingTime||0,s.value=this.level}return n.value&&e.getBattery().then(l=>{u=l,i.call(u);for(const c of t)O(u,c,i,{passive:!0})}),{isSupported:n,charging:r,chargingTime:o,dischargingTime:a,level:s}}function ku(e){let{acceptAllDevices:t=!1}=e||{};const{filters:n=void 0,optionalServices:r=void 0,navigator:o=te}=e||{},a=M(()=>o&&"bluetooth"in o),s=p(void 0),u=p(null);D(s,()=>{f()});async function i(){if(!!a.value){u.value=null,n&&n.length>0&&(t=!1);try{s.value=await(o==null?void 0:o.bluetooth.requestDevice({acceptAllDevices:t,filters:n,optionalServices:r}))}catch(v){u.value=v}}}const l=p(),c=S(()=>{var v;return((v=l.value)==null?void 0:v.connected)||!1});async function f(){if(u.value=null,s.value&&s.value.gatt){s.value.addEventListener("gattserverdisconnected",()=>{});try{l.value=await s.value.gatt.connect()}catch(v){u.value=v}}}return Z(()=>{var v;s.value&&((v=s.value.gatt)==null||v.connect())}),N(()=>{var v;s.value&&((v=s.value.gatt)==null||v.disconnect())}),{isSupported:a,isConnected:c,device:s,requestDevice:i,server:l,error:u}}function K(e,t={}){const{window:n=j}=t,r=M(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let o;const a=p(!1),s=()=>{!r.value||(o||(o=n.matchMedia(e)),a.value=o.matches)};return Pr(()=>{s(),!!o&&("addEventListener"in o?o.addEventListener("change",s):o.addListener(s),N(()=>{"removeEventListener"in o?o.removeEventListener("change",s):o.removeListener(s)}))}),a}const Lu={sm:640,md:768,lg:1024,xl:1280,"2xl":1536},Vu={sm:576,md:768,lg:992,xl:1200,xxl:1400},Wu={xs:600,sm:960,md:1264,lg:1904},Bu={xs:480,sm:576,md:768,lg:992,xl:1200,xxl:1600},Uu={xs:600,sm:1024,md:1440,lg:1920},Hu={mobileS:320,mobileM:375,mobileL:425,tablet:768,laptop:1024,laptopL:1440,desktop4K:2560};var zu=Object.defineProperty,Zt=Object.getOwnPropertySymbols,Gu=Object.prototype.hasOwnProperty,qu=Object.prototype.propertyIsEnumerable,en=(e,t,n)=>t in e?zu(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Xu=(e,t)=>{for(var n in t||(t={}))Gu.call(t,n)&&en(e,n,t[n]);if(Zt)for(var n of Zt(t))qu.call(t,n)&&en(e,n,t[n]);return e};function Yu(e,t={}){function n(u,i){let l=e[u];return i!=null&&(l=gr(l,i)),typeof l=="number"&&(l=`${l}px`),l}const{window:r=j}=t;function o(u){return r?r.matchMedia(u).matches:!1}const a=u=>K(`(min-width: ${n(u)})`,t),s=Object.keys(e).reduce((u,i)=>(Object.defineProperty(u,i,{get:()=>a(i),enumerable:!0,configurable:!0}),u),{});return Xu({greater(u){return K(`(min-width: ${n(u,.1)})`,t)},greaterOrEqual:a,smaller(u){return K(`(max-width: ${n(u,-.1)})`,t)},smallerOrEqual(u){return K(`(max-width: ${n(u)})`,t)},between(u,i){return K(`(min-width: ${n(u)}) and (max-width: ${n(i,-.1)})`,t)},isGreater(u){return o(`(min-width: ${n(u,.1)})`)},isGreaterOrEqual(u){return o(`(min-width: ${n(u)})`)},isSmaller(u){return o(`(max-width: ${n(u,-.1)})`)},isSmallerOrEqual(u){return o(`(max-width: ${n(u)})`)},isInBetween(u,i){return o(`(min-width: ${n(u)}) and (max-width: ${n(i,-.1)})`)}},s)}const Ku=e=>{const{name:t,window:n=j}=e,r=M(()=>n&&"BroadcastChannel"in n),o=p(!1),a=p(),s=p(),u=p(null),i=c=>{a.value&&a.value.postMessage(c)},l=()=>{a.value&&a.value.close(),o.value=!0};return r.value&&Z(()=>{u.value=null,a.value=new BroadcastChannel(t),a.value.addEventListener("message",c=>{s.value=c.data},{passive:!0}),a.value.addEventListener("messageerror",c=>{u.value=c},{passive:!0}),a.value.addEventListener("close",()=>{o.value=!0})}),N(()=>{l()}),{isSupported:r,channel:a,data:s,post:i,close:l,error:u,isClosed:o}};function Ju({window:e=j}={}){const t=r=>{const{state:o,length:a}=(e==null?void 0:e.history)||{},{hash:s,host:u,hostname:i,href:l,origin:c,pathname:f,port:v,protocol:d,search:m}=(e==null?void 0:e.location)||{};return{trigger:r,state:o,length:a,hash:s,host:u,hostname:i,href:l,origin:c,pathname:f,port:v,protocol:d,search:m}},n=p(t("load"));return e&&(O(e,"popstate",()=>n.value=t("popstate"),{passive:!0}),O(e,"hashchange",()=>n.value=t("hashchange"),{passive:!0})),n}function Qu(e,t=(r,o)=>r===o,n){const r=p(e.value);return D(()=>e.value,o=>{t(o,r.value)||(r.value=o)},n),r}function Zu(e={}){const{navigator:t=te,read:n=!1,source:r,copiedDuring:o=1500}=e,a=["copy","cut"],s=M(()=>t&&"clipboard"in t),u=p(""),i=p(!1),l=we(()=>i.value=!1,o);function c(){t.clipboard.readText().then(v=>{u.value=v})}if(s.value&&n)for(const v of a)O(v,c);async function f(v=P(r)){s.value&&v!=null&&(await t.clipboard.writeText(v),u.value=v,i.value=!0,l.start())}return{isSupported:s,text:u,copied:i,copy:f}}var es=Object.defineProperty,ts=Object.defineProperties,ns=Object.getOwnPropertyDescriptors,tn=Object.getOwnPropertySymbols,rs=Object.prototype.hasOwnProperty,os=Object.prototype.propertyIsEnumerable,nn=(e,t,n)=>t in e?es(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,as=(e,t)=>{for(var n in t||(t={}))rs.call(t,n)&&nn(e,n,t[n]);if(tn)for(var n of tn(t))os.call(t,n)&&nn(e,n,t[n]);return e},us=(e,t)=>ts(e,ns(t));function Ie(e){return JSON.parse(JSON.stringify(e))}function ss(e,t={}){const n=p({}),{manual:r,clone:o=Ie,deep:a=!0,immediate:s=!0}=t;function u(){n.value=o(C(e))}return!r&&q(e)?D(e,u,us(as({},t),{deep:a,immediate:s})):u(),{cloned:n,sync:u}}const lt=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:typeof global!="undefined"?global:typeof self!="undefined"?self:{},ct="__vueuse_ssr_handlers__";lt[ct]=lt[ct]||{};const Mr=lt[ct];function Ke(e,t){return Mr[e]||t}function is(e,t){Mr[e]=t}function kr(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"||Array.isArray(e)?"object":Number.isNaN(e)?"any":"number"}var ls=Object.defineProperty,rn=Object.getOwnPropertySymbols,cs=Object.prototype.hasOwnProperty,fs=Object.prototype.propertyIsEnumerable,on=(e,t,n)=>t in e?ls(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,an=(e,t)=>{for(var n in t||(t={}))cs.call(t,n)&&on(e,n,t[n]);if(rn)for(var n of rn(t))fs.call(t,n)&&on(e,n,t[n]);return e};const _t={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}};function Je(e,t,n,r={}){var o;const{flush:a="pre",deep:s=!0,listenToStorageChanges:u=!0,writeDefaults:i=!0,mergeDefaults:l=!1,shallow:c,window:f=j,eventFilter:v,onError:d=x=>{console.error(x)}}=r,m=(c?G:p)(t);if(!n)try{n=Ke("getDefaultStorage",()=>{var x;return(x=j)==null?void 0:x.localStorage})()}catch(x){d(x)}if(!n)return m;const h=P(t),g=kr(h),_=(o=r.serializer)!=null?o:_t[g],{pause:y,resume:w}=Ue(m,()=>$(m.value),{flush:a,deep:s,eventFilter:v});return f&&u&&O(f,"storage",E),E(),m;function $(x){try{x==null?n.removeItem(e):n.setItem(e,_.write(x))}catch(I){d(I)}}function b(x){if(!(x&&x.key!==e)){y();try{const I=x?x.newValue:n.getItem(e);if(I==null)return i&&h!==null&&n.setItem(e,_.write(h)),h;if(!x&&l){const A=_.read(I);return oe(l)?l(A,h):g==="object"&&!Array.isArray(A)?an(an({},h),A):A}else return typeof I!="string"?I:_.read(I)}catch(I){d(I)}finally{w()}}}function E(x){x&&x.key!==e||(m.value=b(x))}}function wt(e){return K("(prefers-color-scheme: dark)",e)}var vs=Object.defineProperty,un=Object.getOwnPropertySymbols,ds=Object.prototype.hasOwnProperty,ps=Object.prototype.propertyIsEnumerable,sn=(e,t,n)=>t in e?vs(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,ms=(e,t)=>{for(var n in t||(t={}))ds.call(t,n)&&sn(e,n,t[n]);if(un)for(var n of un(t))ps.call(t,n)&&sn(e,n,t[n]);return e};function Lr(e={}){const{selector:t="html",attribute:n="class",initialValue:r="auto",window:o=j,storage:a,storageKey:s="vueuse-color-scheme",listenToStorageChanges:u=!0,storageRef:i,emitAuto:l}=e,c=ms({auto:"",light:"light",dark:"dark"},e.modes||{}),f=wt({window:o}),v=S(()=>f.value?"dark":"light"),d=i||(s==null?p(r):Je(s,r,a,{window:o,listenToStorageChanges:u})),m=S({get(){return d.value==="auto"&&!l?v.value:d.value},set(y){d.value=y}}),h=Ke("updateHTMLAttrs",(y,w,$)=>{const b=o==null?void 0:o.document.querySelector(y);if(!!b)if(w==="class"){const E=$.split(/\s/g);Object.values(c).flatMap(x=>(x||"").split(/\s/g)).filter(Boolean).forEach(x=>{E.includes(x)?b.classList.add(x):b.classList.remove(x)})}else b.setAttribute(w,$)});function g(y){var w;const $=y==="auto"?v.value:y;h(t,n,(w=c[$])!=null?w:$)}function _(y){e.onChanged?e.onChanged(y,g):g(y)}return D(m,_,{flush:"post",immediate:!0}),l&&D(v,()=>_(m.value),{flush:"post"}),Z(()=>_(m.value)),m}function hs(e=p(!1)){const t=z(),n=z(),r=z();let o=L;const a=i=>(r.trigger(i),e.value=!0,new Promise(l=>{o=l})),s=i=>{e.value=!1,t.trigger(i),o({data:i,isCanceled:!1})},u=i=>{e.value=!1,n.trigger(i),o({data:i,isCanceled:!0})};return{isRevealed:S(()=>e.value),reveal:a,confirm:s,cancel:u,onReveal:r.on,onConfirm:t.on,onCancel:n.on}}function Pe(e,t,{window:n=j,initialValue:r=""}={}){const o=p(r),a=S(()=>{var s;return V(t)||((s=n==null?void 0:n.document)==null?void 0:s.documentElement)});return D([a,()=>P(e)],([s,u])=>{var i;if(s&&n){const l=(i=n.getComputedStyle(s).getPropertyValue(u))==null?void 0:i.trim();o.value=l||r}},{immediate:!0}),D(o,s=>{var u;((u=a.value)==null?void 0:u.style)&&a.value.style.setProperty(P(e),s)}),o}function gs(){const e=fe(),t=Le(()=>null,()=>e.proxy.$el);return fr(t.trigger),ft(t.trigger),t}function ys(e,t){var n;const r=G((n=t==null?void 0:t.initialValue)!=null?n:e[0]),o=S({get(){var l;let c=(t==null?void 0:t.getIndexOf)?t.getIndexOf(r.value,e):e.indexOf(r.value);return c<0&&(c=(l=t==null?void 0:t.fallbackIndex)!=null?l:0),c},set(l){a(l)}});function a(l){const c=e.length,f=(l%c+c)%c,v=e[f];return r.value=v,v}function s(l=1){return a(o.value+l)}function u(l=1){return s(l)}function i(l=1){return s(-l)}return{state:r,index:o,next:u,prev:i}}var _s=Object.defineProperty,ws=Object.defineProperties,Os=Object.getOwnPropertyDescriptors,ln=Object.getOwnPropertySymbols,bs=Object.prototype.hasOwnProperty,Ps=Object.prototype.propertyIsEnumerable,cn=(e,t,n)=>t in e?_s(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ss=(e,t)=>{for(var n in t||(t={}))bs.call(t,n)&&cn(e,n,t[n]);if(ln)for(var n of ln(t))Ps.call(t,n)&&cn(e,n,t[n]);return e},$s=(e,t)=>ws(e,Os(t));function Es(e={}){const{valueDark:t="dark",valueLight:n="",window:r=j}=e,o=Lr($s(Ss({},e),{onChanged:(u,i)=>{var l;e.onChanged?(l=e.onChanged)==null||l.call(e,u==="dark"):i(u)},modes:{dark:t,light:n}})),a=wt({window:r});return S({get(){return o.value==="dark"},set(u){u===a.value?o.value="auto":o.value=u?"dark":"light"}})}const Vr=e=>e,xs=(e,t)=>e.value=t;function Ts(e){return e?oe(e)?e:Ie:Vr}function Ds(e){return e?oe(e)?e:Ie:Vr}function Wr(e,t={}){const{clone:n=!1,dump:r=Ts(n),parse:o=Ds(n),setSource:a=xs}=t;function s(){return lo({snapshot:r(e.value),timestamp:ce()})}const u=p(s()),i=p([]),l=p([]),c=w=>{a(e,o(w.snapshot)),u.value=w},f=()=>{i.value.unshift(u.value),u.value=s(),t.capacity&&i.value.length>t.capacity&&i.value.splice(t.capacity,1/0),l.value.length&&l.value.splice(0,l.value.length)},v=()=>{i.value.splice(0,i.value.length),l.value.splice(0,l.value.length)},d=()=>{const w=i.value.shift();w&&(l.value.unshift(u.value),c(w))},m=()=>{const w=l.value.shift();w&&(i.value.unshift(u.value),c(w))},h=()=>{c(u.value)},g=S(()=>[u.value,...i.value]),_=S(()=>i.value.length>0),y=S(()=>l.value.length>0);return{source:e,undoStack:i,redoStack:l,last:u,history:g,canUndo:_,canRedo:y,clear:v,commit:f,reset:h,undo:d,redo:m}}var Is=Object.defineProperty,Fs=Object.defineProperties,js=Object.getOwnPropertyDescriptors,fn=Object.getOwnPropertySymbols,As=Object.prototype.hasOwnProperty,Cs=Object.prototype.propertyIsEnumerable,vn=(e,t,n)=>t in e?Is(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,dn=(e,t)=>{for(var n in t||(t={}))As.call(t,n)&&vn(e,n,t[n]);if(fn)for(var n of fn(t))Cs.call(t,n)&&vn(e,n,t[n]);return e},pn=(e,t)=>Fs(e,js(t));function Ot(e,t={}){const{deep:n=!1,flush:r="pre",eventFilter:o}=t,{eventFilter:a,pause:s,resume:u,isActive:i}=vt(o),{ignoreUpdates:l,ignorePrevAsyncUpdates:c,stop:f}=_e(e,g,{deep:n,flush:r,eventFilter:a});function v($,b){c(),l(()=>{$.value=b})}const d=Wr(e,pn(dn({},t),{clone:t.clone||n,setSource:v})),{clear:m,commit:h}=d;function g(){c(),h()}function _($){u(),$&&g()}function y($){let b=!1;const E=()=>b=!0;l(()=>{$(E)}),b||g()}function w(){f(),m()}return pn(dn({},d),{isTracking:i,pause:s,resume:_,commit:g,batch:y,dispose:w})}var Rs=Object.defineProperty,Ns=Object.defineProperties,Ms=Object.getOwnPropertyDescriptors,mn=Object.getOwnPropertySymbols,ks=Object.prototype.hasOwnProperty,Ls=Object.prototype.propertyIsEnumerable,hn=(e,t,n)=>t in e?Rs(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,gn=(e,t)=>{for(var n in t||(t={}))ks.call(t,n)&&hn(e,n,t[n]);if(mn)for(var n of mn(t))Ls.call(t,n)&&hn(e,n,t[n]);return e},Vs=(e,t)=>Ns(e,Ms(t));function Ws(e,t={}){const n=t.debounce?qe(t.debounce):void 0,r=Ot(e,Vs(gn({},t),{eventFilter:n}));return gn({},r)}function Bs(e={}){const{window:t=j,eventFilter:n=Te}=e,r=p({x:null,y:null,z:null}),o=p({alpha:null,beta:null,gamma:null}),a=p(0),s=p({x:null,y:null,z:null});if(t){const u=ve(n,i=>{r.value=i.acceleration,s.value=i.accelerationIncludingGravity,o.value=i.rotationRate,a.value=i.interval});O(t,"devicemotion",u)}return{acceleration:r,accelerationIncludingGravity:s,rotationRate:o,interval:a}}function Br(e={}){const{window:t=j}=e,n=M(()=>t&&"DeviceOrientationEvent"in t),r=p(!1),o=p(null),a=p(null),s=p(null);return t&&n.value&&O(t,"deviceorientation",u=>{r.value=u.absolute,o.value=u.alpha,a.value=u.beta,s.value=u.gamma}),{isSupported:n,isAbsolute:r,alpha:o,beta:a,gamma:s}}function Us({window:e=j}={}){if(!e)return{pixelRatio:p(1)};const t=p(1),n=[],r=()=>{n.map(a=>a()),n.length=0},o=()=>{t.value=e.devicePixelRatio,r();const a=e.matchMedia(`(resolution: ${t.value}dppx)`);a.addEventListener("change",o,{once:!0}),n.push(()=>{a.removeEventListener("change",o)})};return o(),N(r),{pixelRatio:t}}function Ur(e,t={}){const{controls:n=!1,navigator:r=te}=t,o=M(()=>r&&"permissions"in r);let a;const s=typeof e=="string"?{name:e}:e,u=p(),i=()=>{a&&(u.value=a.state)},l=mr(async()=>{if(!!o.value){if(!a)try{a=await r.permissions.query(s),O(a,"change",i),i()}catch{u.value="prompt"}return a}});return l(),n?{state:u,isSupported:o,query:l}:u}function Hs(e={}){const{navigator:t=te,requestPermissions:n=!1,constraints:r={audio:!0,video:!0},onUpdated:o}=e,a=p([]),s=S(()=>a.value.filter(d=>d.kind==="videoinput")),u=S(()=>a.value.filter(d=>d.kind==="audioinput")),i=S(()=>a.value.filter(d=>d.kind==="audiooutput")),l=M(()=>t&&t.mediaDevices&&t.mediaDevices.enumerateDevices),c=p(!1);async function f(){!l.value||(a.value=await t.mediaDevices.enumerateDevices(),o==null||o(a.value))}async function v(){if(!l.value)return!1;if(c.value)return!0;const{state:d,query:m}=Ur("camera",{controls:!0});return await m(),d.value!=="granted"&&((await t.mediaDevices.getUserMedia(r)).getTracks().forEach(g=>g.stop()),f()),c.value=!0,c.value}return l.value&&(n&&v(),O(t.mediaDevices,"devicechange",f),f()),{devices:a,ensurePermissions:v,permissionGranted:c,videoInputs:s,audioInputs:u,audioOutputs:i,isSupported:l}}function zs(e={}){var t;const n=p((t=e.enabled)!=null?t:!1),r=e.video,o=e.audio,{navigator:a=te}=e,s=M(()=>{var d;return(d=a==null?void 0:a.mediaDevices)==null?void 0:d.getDisplayMedia}),u={audio:o,video:r},i=G();async function l(){if(!(!s.value||i.value))return i.value=await a.mediaDevices.getDisplayMedia(u),i.value}async function c(){var d;(d=i.value)==null||d.getTracks().forEach(m=>m.stop()),i.value=void 0}function f(){c(),n.value=!1}async function v(){return await l(),i.value&&(n.value=!0),i.value}return D(n,d=>{d?l():c()},{immediate:!0}),{isSupported:s,stream:i,start:v,stop:f,enabled:n}}function Gs({document:e=ee}={}){if(!e)return p("visible");const t=p(e.visibilityState);return O(e,"visibilitychange",()=>{t.value=e.visibilityState}),t}var qs=Object.defineProperty,Xs=Object.defineProperties,Ys=Object.getOwnPropertyDescriptors,yn=Object.getOwnPropertySymbols,Ks=Object.prototype.hasOwnProperty,Js=Object.prototype.propertyIsEnumerable,_n=(e,t,n)=>t in e?qs(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Qs=(e,t)=>{for(var n in t||(t={}))Ks.call(t,n)&&_n(e,n,t[n]);if(yn)for(var n of yn(t))Js.call(t,n)&&_n(e,n,t[n]);return e},Zs=(e,t)=>Xs(e,Ys(t));function ei(e,t={}){var n,r,o;const a=(n=t.draggingElement)!=null?n:j,s=(r=t.handle)!=null?r:e,u=p((o=P(t.initialValue))!=null?o:{x:0,y:0}),i=p(),l=m=>t.pointerTypes?t.pointerTypes.includes(m.pointerType):!0,c=m=>{P(t.preventDefault)&&m.preventDefault(),P(t.stopPropagation)&&m.stopPropagation()},f=m=>{var h;if(!l(m)||P(t.exact)&&m.target!==P(e))return;const g=P(e).getBoundingClientRect(),_={x:m.pageX-g.left,y:m.pageY-g.top};((h=t.onStart)==null?void 0:h.call(t,_,m))!==!1&&(i.value=_,c(m))},v=m=>{var h;!l(m)||!i.value||(u.value={x:m.pageX-i.value.x,y:m.pageY-i.value.y},(h=t.onMove)==null||h.call(t,u.value,m),c(m))},d=m=>{var h;!l(m)||!i.value||(i.value=void 0,(h=t.onEnd)==null||h.call(t,u.value,m),c(m))};return Q&&(O(s,"pointerdown",f,!0),O(a,"pointermove",v,!0),O(a,"pointerup",d,!0)),Zs(Qs({},mt(u)),{position:u,isDragging:S(()=>!!i.value),style:S(()=>`left:${u.value.x}px;top:${u.value.y}px;`)})}function ti(e,t){const n=p(!1);let r=0;return Q&&(O(e,"dragenter",o=>{o.preventDefault(),r+=1,n.value=!0}),O(e,"dragover",o=>{o.preventDefault()}),O(e,"dragleave",o=>{o.preventDefault(),r-=1,r===0&&(n.value=!1)}),O(e,"drop",o=>{var a,s;o.preventDefault(),r=0,n.value=!1;const u=Array.from((s=(a=o.dataTransfer)==null?void 0:a.files)!=null?s:[]);t==null||t(u.length===0?null:u)})),{isOverDropZone:n}}var wn=Object.getOwnPropertySymbols,ni=Object.prototype.hasOwnProperty,ri=Object.prototype.propertyIsEnumerable,oi=(e,t)=>{var n={};for(var r in e)ni.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&wn)for(var r of wn(e))t.indexOf(r)<0&&ri.call(e,r)&&(n[r]=e[r]);return n};function bt(e,t,n={}){const r=n,{window:o=j}=r,a=oi(r,["window"]);let s;const u=M(()=>o&&"ResizeObserver"in o),i=()=>{s&&(s.disconnect(),s=void 0)},l=D(()=>V(e),f=>{i(),u.value&&o&&f&&(s=new ResizeObserver(t),s.observe(f,a))},{immediate:!0,flush:"post"}),c=()=>{i(),l()};return N(c),{isSupported:u,stop:c}}function ai(e,t={}){const{reset:n=!0,windowResize:r=!0,windowScroll:o=!0,immediate:a=!0}=t,s=p(0),u=p(0),i=p(0),l=p(0),c=p(0),f=p(0),v=p(0),d=p(0);function m(){const h=V(e);if(!h){n&&(s.value=0,u.value=0,i.value=0,l.value=0,c.value=0,f.value=0,v.value=0,d.value=0);return}const g=h.getBoundingClientRect();s.value=g.height,u.value=g.bottom,i.value=g.left,l.value=g.right,c.value=g.top,f.value=g.width,v.value=g.x,d.value=g.y}return bt(e,m),D(()=>V(e),h=>!h&&m()),o&&O("scroll",m,{passive:!0}),r&&O("resize",m,{passive:!0}),Z(()=>{a&&m()}),{height:s,bottom:u,left:i,right:l,top:c,width:f,x:v,y:d,update:m}}function pe(e,t={}){const{immediate:n=!0,window:r=j}=t,o=p(!1);let a=null;function s(){!o.value||!r||(e(),a=r.requestAnimationFrame(s))}function u(){!o.value&&r&&(o.value=!0,s())}function i(){o.value=!1,a!=null&&r&&(r.cancelAnimationFrame(a),a=null)}return n&&u(),N(i),{isActive:o,pause:i,resume:u}}var ui=Object.defineProperty,On=Object.getOwnPropertySymbols,si=Object.prototype.hasOwnProperty,ii=Object.prototype.propertyIsEnumerable,bn=(e,t,n)=>t in e?ui(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,li=(e,t)=>{for(var n in t||(t={}))si.call(t,n)&&bn(e,n,t[n]);if(On)for(var n of On(t))ii.call(t,n)&&bn(e,n,t[n]);return e};function ci(e){const t=p(null),{x:n,y:r}=e,o=pe(()=>{t.value=document.elementFromPoint(P(n),P(r))});return li({element:t},o)}function fi(e){const t=p(!1);return O(e,"mouseenter",()=>t.value=!0),O(e,"mouseleave",()=>t.value=!1),t}function Hr(e,t={width:0,height:0},n={}){const{box:r="content-box"}=n,o=p(t.width),a=p(t.height);return bt(e,([s])=>{const u=r==="border-box"?s.borderBoxSize:r==="content-box"?s.contentBoxSize:s.devicePixelContentBoxSize;u?(o.value=u.reduce((i,{inlineSize:l})=>i+l,0),a.value=u.reduce((i,{blockSize:l})=>i+l,0)):(o.value=s.contentRect.width,a.value=s.contentRect.height)},n),D(()=>V(e),s=>{o.value=s?t.width:0,a.value=s?t.height:0}),{width:o,height:a}}function vi(e,{window:t=j,scrollTarget:n}={}){const r=p(!1),o=()=>{if(!t)return;const a=t.document,s=V(e);if(!s)r.value=!1;else{const u=s.getBoundingClientRect();r.value=u.top<=(t.innerHeight||a.documentElement.clientHeight)&&u.left<=(t.innerWidth||a.documentElement.clientWidth)&&u.bottom>=0&&u.right>=0}};return D(()=>V(e),()=>o(),{immediate:!0,flush:"post"}),t&&O(n||t,"scroll",o,{capture:!1,passive:!0}),r}const me=new Map;function di(e){const t=lr();function n(u){var i;const l=me.get(e)||[];l.push(u),me.set(e,l);const c=()=>o(u);return(i=t==null?void 0:t.cleanups)==null||i.push(c),c}function r(u){function i(...l){o(i),u(...l)}return n(i)}function o(u){const i=me.get(e);if(!i)return;const l=i.indexOf(u);l>-1&&i.splice(l,1),i.length||me.delete(e)}function a(){me.delete(e)}function s(u,i){var l;(l=me.get(e))==null||l.forEach(c=>c(u,i))}return{on:n,once:r,off:o,emit:s,reset:a}}function pi(e,t=[],n={}){const r=p(null),o=p(null),a=p("CONNECTING"),s=p(null),u=p(null),{withCredentials:i=!1}=n,l=()=>{s.value&&(s.value.close(),s.value=null,a.value="CLOSED")},c=new EventSource(e,{withCredentials:i});s.value=c,c.onopen=()=>{a.value="OPEN",u.value=null},c.onerror=f=>{a.value="CLOSED",u.value=f},c.onmessage=f=>{r.value=null,o.value=f.data};for(const f of t)O(c,f,v=>{r.value=f,o.value=v.data||null});return N(()=>{l()}),{eventSource:s,event:r,data:o,status:a,error:u,close:l}}function mi(e={}){const{initialValue:t=""}=e,n=M(()=>typeof window!="undefined"&&"EyeDropper"in window),r=p(t);async function o(a){if(!n.value)return;const u=await new window.EyeDropper().open(a);return r.value=u.sRGBHex,u}return{isSupported:n,sRGBHex:r,open:o}}function hi(e=null,t={}){const{baseUrl:n="",rel:r="icon",document:o=ee}=t,a=re(e),s=u=>{o==null||o.head.querySelectorAll(`link[rel*="${r}"]`).forEach(i=>i.href=`${n}${u}`)};return D(a,(u,i)=>{xe(u)&&u!==i&&s(u)},{immediate:!0}),a}var gi=Object.defineProperty,yi=Object.defineProperties,_i=Object.getOwnPropertyDescriptors,Pn=Object.getOwnPropertySymbols,wi=Object.prototype.hasOwnProperty,Oi=Object.prototype.propertyIsEnumerable,Sn=(e,t,n)=>t in e?gi(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,k=(e,t)=>{for(var n in t||(t={}))wi.call(t,n)&&Sn(e,n,t[n]);if(Pn)for(var n of Pn(t))Oi.call(t,n)&&Sn(e,n,t[n]);return e},ie=(e,t)=>yi(e,_i(t));const bi={json:"application/json",text:"text/plain",formData:"multipart/form-data"};function ze(e){return hr(e,"immediate","refetch","initialData","timeout","beforeFetch","afterFetch","onFetchError","fetch")}function Se(e){return typeof Headers!="undefined"&&e instanceof Headers?Object.fromEntries([...e.entries()]):e}function he(...e){return t=>(e.forEach(async n=>{n&&(t=k(k({},t),await n(t)))}),t)}function Pi(e={}){const t=e.options||{},n=e.fetchOptions||{};function r(o,...a){const s=S(()=>e.baseUrl?Si(P(e.baseUrl),P(o)):P(o));let u=t,i=n;return a.length>0&&(ze(a[0])?u=ie(k(k({},u),a[0]),{beforeFetch:he(t.beforeFetch,a[0].beforeFetch),afterFetch:he(t.afterFetch,a[0].afterFetch),onFetchError:he(t.onFetchError,a[0].onFetchError)}):i=ie(k(k({},i),a[0]),{headers:k(k({},Se(i.headers)||{}),Se(a[0].headers)||{})})),a.length>1&&ze(a[1])&&(u=ie(k(k({},u),a[1]),{beforeFetch:he(t.beforeFetch,a[1].beforeFetch),afterFetch:he(t.afterFetch,a[1].afterFetch),onFetchError:he(t.onFetchError,a[1].onFetchError)})),zr(s,i,u)}return r}function zr(e,...t){var n;const r=typeof AbortController=="function";let o={},a={immediate:!0,refetch:!1,timeout:0};const s={method:"GET",type:"text",payload:void 0};t.length>0&&(ze(t[0])?a=k(k({},a),t[0]):o=t[0]),t.length>1&&ze(t[1])&&(a=k(k({},a),t[1]));const{fetch:u=(n=j)==null?void 0:n.fetch,initialData:i,timeout:l}=a,c=z(),f=z(),v=z(),d=p(!1),m=p(!1),h=p(!1),g=p(null),_=G(null),y=G(null),w=G(i),$=S(()=>r&&m.value);let b,E;const x=()=>{r&&b&&b.abort()},I=W=>{m.value=W,d.value=!W};l&&(E=we(x,l,{immediate:!1}));const A=async(W=!1)=>{var ne;I(!0),y.value=null,g.value=null,h.value=!1,b=void 0,r&&(b=new AbortController,b.signal.onabort=()=>h.value=!0,o=ie(k({},o),{signal:b.signal}));const U={method:s.method,headers:{}};if(s.payload){const Fe=Se(U.headers);s.payloadType&&(Fe["Content-Type"]=(ne=bi[s.payloadType])!=null?ne:s.payloadType);const je=P(s.payload);U.body=s.payloadType==="json"?JSON.stringify(je):je}let Y=!1;const ue={url:P(e),options:k(k({},U),o),cancel:()=>{Y=!0}};if(a.beforeFetch&&Object.assign(ue,await a.beforeFetch(ue)),Y||!u)return I(!1),Promise.resolve(null);let se=null;return E&&E.start(),new Promise((Fe,je)=>{var St;u(ue.url,ie(k(k({},U),ue.options),{headers:k(k({},Se(U.headers)),Se((St=ue.options)==null?void 0:St.headers))})).then(async H=>{if(_.value=H,g.value=H.status,se=await H[s.type](),a.afterFetch&&g.value>=200&&g.value<300&&({data:se}=await a.afterFetch({data:se,response:H})),w.value=se,!H.ok)throw new Error(H.statusText);return c.trigger(H),Fe(H)}).catch(async H=>{let $t=H.message||H.name;return a.onFetchError&&({data:se,error:$t}=await a.onFetchError({data:se,error:H,response:_.value})),w.value=se,y.value=$t,f.trigger(H),W?je(H):Fe(null)}).finally(()=>{I(!1),E&&E.stop(),v.trigger(null)})})},T=re(a.refetch);D([T,re(e)],([W])=>W&&A(),{deep:!0});const F={isFinished:d,statusCode:g,response:_,error:y,data:w,isFetching:m,canAbort:$,aborted:h,abort:x,execute:A,onFetchResponse:c.on,onFetchError:f.on,onFetchFinally:v.on,get:R("GET"),put:R("PUT"),post:R("POST"),delete:R("DELETE"),patch:R("PATCH"),head:R("HEAD"),options:R("OPTIONS"),json:ae("json"),text:ae("text"),blob:ae("blob"),arrayBuffer:ae("arrayBuffer"),formData:ae("formData")};function R(W){return(ne,U)=>{if(!m.value){s.method=W,s.payload=ne,s.payloadType=U,q(s.payload)&&D([T,re(s.payload)],([ue])=>ue&&A(),{deep:!0});const Y=P(s.payload);return!U&&Y&&Object.getPrototypeOf(Y)===Object.prototype&&(s.payloadType="json"),ie(k({},F),{then(ue,se){return X().then(ue,se)}})}}}function X(){return new Promise((W,ne)=>{$r(d).toBe(!0).then(()=>W(F)).catch(U=>ne(U))})}function ae(W){return()=>{if(!m.value)return s.type=W,ie(k({},F),{then(ne,U){return X().then(ne,U)}})}}return a.immediate&&setTimeout(A,0),ie(k({},F),{then(W,ne){return X().then(W,ne)}})}function Si(e,t){return!e.endsWith("/")&&!t.startsWith("/")?`${e}/${t}`:`${e}${t}`}var $i=Object.defineProperty,$n=Object.getOwnPropertySymbols,Ei=Object.prototype.hasOwnProperty,xi=Object.prototype.propertyIsEnumerable,En=(e,t,n)=>t in e?$i(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,nt=(e,t)=>{for(var n in t||(t={}))Ei.call(t,n)&&En(e,n,t[n]);if($n)for(var n of $n(t))xi.call(t,n)&&En(e,n,t[n]);return e};const Ti={multiple:!0,accept:"*"};function Di(e={}){const{document:t=ee}=e,n=p(null);let r;t&&(r=t.createElement("input"),r.type="file",r.onchange=s=>{const u=s.target;n.value=u.files});const o=s=>{if(!r)return;const u=nt(nt(nt({},Ti),e),s);r.multiple=u.multiple,r.accept=u.accept,pr(u,"capture")&&(r.capture=u.capture),r.click()},a=()=>{n.value=null,r&&(r.value="")};return{files:le(n),open:o,reset:a}}var Ii=Object.defineProperty,xn=Object.getOwnPropertySymbols,Fi=Object.prototype.hasOwnProperty,ji=Object.prototype.propertyIsEnumerable,Tn=(e,t,n)=>t in e?Ii(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,ge=(e,t)=>{for(var n in t||(t={}))Fi.call(t,n)&&Tn(e,n,t[n]);if(xn)for(var n of xn(t))ji.call(t,n)&&Tn(e,n,t[n]);return e};function Ai(e={}){const{window:t=j,dataType:n="Text"}=C(e),r=t,o=M(()=>r&&"showSaveFilePicker"in r&&"showOpenFilePicker"in r),a=p(),s=p(),u=p(),i=S(()=>{var y,w;return(w=(y=u.value)==null?void 0:y.name)!=null?w:""}),l=S(()=>{var y,w;return(w=(y=u.value)==null?void 0:y.type)!=null?w:""}),c=S(()=>{var y,w;return(w=(y=u.value)==null?void 0:y.size)!=null?w:0}),f=S(()=>{var y,w;return(w=(y=u.value)==null?void 0:y.lastModified)!=null?w:0});async function v(y={}){if(!o.value)return;const[w]=await r.showOpenFilePicker(ge(ge({},C(e)),y));a.value=w,await g(),await _()}async function d(y={}){!o.value||(a.value=await r.showSaveFilePicker(ge(ge({},C(e)),y)),s.value=void 0,await g(),await _())}async function m(y={}){if(!!o.value){if(!a.value)return h(y);if(s.value){const w=await a.value.createWritable();await w.write(s.value),await w.close()}await g()}}async function h(y={}){if(!!o.value){if(a.value=await r.showSaveFilePicker(ge(ge({},C(e)),y)),s.value){const w=await a.value.createWritable();await w.write(s.value),await w.close()}await g()}}async function g(){var y;u.value=await((y=a.value)==null?void 0:y.getFile())}async function _(){var y,w;C(n)==="Text"&&(s.value=await((y=u.value)==null?void 0:y.text())),C(n)==="ArrayBuffer"&&(s.value=await((w=u.value)==null?void 0:w.arrayBuffer())),C(n)==="Blob"&&(s.value=u.value)}return D(()=>C(n),_),{isSupported:o,data:s,file:u,fileName:i,fileMIME:l,fileSize:c,fileLastModified:f,open:v,create:d,save:m,saveAs:h,updateData:_}}function Ci(e,t={}){const{initialValue:n=!1}=t,r=yt(t),o=S(()=>V(e)),a=S({get(){return Ne(r.value)&&Ne(o.value)&&r.value===o.value},set(s){var u,i;!s&&a.value&&((u=o.value)==null||u.blur()),s&&!a.value&&((i=o.value)==null||i.focus())}});return D(o,()=>{a.value=n},{immediate:!0,flush:"post"}),{focused:a}}function Ri(e,t={}){const n=yt(t),r=S(()=>V(e));return{focused:S(()=>r.value&&n.value?r.value.contains(n.value):!1)}}function Ni(e){var t;const n=p(0);if(typeof performance=="undefined")return n;const r=(t=e==null?void 0:e.every)!=null?t:10;let o=performance.now(),a=0;return pe(()=>{if(a+=1,a>=r){const s=performance.now(),u=s-o;n.value=Math.round(1e3/(u/a)),o=s,a=0}}),n}const Dn=[["requestFullscreen","exitFullscreen","fullscreenElement","fullscreenEnabled","fullscreenchange","fullscreenerror"],["webkitRequestFullscreen","webkitExitFullscreen","webkitFullscreenElement","webkitFullscreenEnabled","webkitfullscreenchange","webkitfullscreenerror"],["webkitRequestFullScreen","webkitCancelFullScreen","webkitCurrentFullScreenElement","webkitCancelFullScreen","webkitfullscreenchange","webkitfullscreenerror"],["mozRequestFullScreen","mozCancelFullScreen","mozFullScreenElement","mozFullScreenEnabled","mozfullscreenchange","mozfullscreenerror"],["msRequestFullscreen","msExitFullscreen","msFullscreenElement","msFullscreenEnabled","MSFullscreenChange","MSFullscreenError"]];function Mi(e,t={}){const{document:n=ee,autoExit:r=!1}=t,o=e||(n==null?void 0:n.querySelector("html")),a=p(!1);let s=Dn[0];const u=M(()=>{if(n){for(const h of Dn)if(h[1]in n)return s=h,!0}else return!1;return!1}),[i,l,c,,f]=s;async function v(){!u.value||((n==null?void 0:n[c])&&await n[l](),a.value=!1)}async function d(){if(!u.value)return;await v();const h=V(o);h&&(await h[i](),a.value=!0)}async function m(){a.value?await v():await d()}return n&&O(n,f,()=>{a.value=!!(n==null?void 0:n[c])},!1),r&&N(v),{isSupported:u,isFullscreen:a,enter:d,exit:v,toggle:m}}function ki(e){return S(()=>e.value?{buttons:{a:e.value.buttons[0],b:e.value.buttons[1],x:e.value.buttons[2],y:e.value.buttons[3]},bumper:{left:e.value.buttons[4],right:e.value.buttons[5]},triggers:{left:e.value.buttons[6],right:e.value.buttons[7]},stick:{left:{horizontal:e.value.axes[0],vertical:e.value.axes[1],button:e.value.buttons[10]},right:{horizontal:e.value.axes[2],vertical:e.value.axes[3],button:e.value.buttons[11]}},dpad:{up:e.value.buttons[12],down:e.value.buttons[13],left:e.value.buttons[14],right:e.value.buttons[15]},back:e.value.buttons[8],start:e.value.buttons[9]}:null)}function Li(e={}){const{navigator:t=te}=e,n=M(()=>t&&"getGamepads"in t),r=p([]),o=z(),a=z(),s=d=>{const m=[],h="vibrationActuator"in d?d.vibrationActuator:null;return h&&m.push(h),d.hapticActuators&&m.push(...d.hapticActuators),{id:d.id,hapticActuators:m,index:d.index,mapping:d.mapping,connected:d.connected,timestamp:d.timestamp,axes:d.axes.map(g=>g),buttons:d.buttons.map(g=>({pressed:g.pressed,touched:g.touched,value:g.value}))}},u=()=>{const d=(t==null?void 0:t.getGamepads())||[];for(let m=0;m_===h.index);g>-1&&(r.value[g]=s(h))}}},{isActive:i,pause:l,resume:c}=pe(u),f=d=>{r.value.some(({index:m})=>m===d.index)||(r.value.push(s(d)),o.trigger(d.index)),c()},v=d=>{r.value=r.value.filter(m=>m.index!==d.index),a.trigger(d.index)};return O("gamepadconnected",d=>f(d.gamepad)),O("gamepaddisconnected",d=>v(d.gamepad)),Z(()=>{const d=(t==null?void 0:t.getGamepads())||[];if(d)for(let m=0;mo&&"geolocation"in o),s=p(null),u=p(null),i=p({accuracy:0,latitude:1/0,longitude:1/0,altitude:null,altitudeAccuracy:null,heading:null,speed:null});function l(f){s.value=f.timestamp,i.value=f.coords,u.value=null}let c;return a.value&&(c=o.geolocation.watchPosition(l,f=>u.value=f,{enableHighAccuracy:t,maximumAge:n,timeout:r})),N(()=>{c&&o&&o.geolocation.clearWatch(c)}),{isSupported:a,coords:i,locatedAt:s,error:u}}const Wi=["mousemove","mousedown","resize","keydown","touchstart","wheel"],Bi=6e4;function Ui(e=Bi,t={}){const{initialState:n=!1,listenForVisibilityChange:r=!0,events:o=Wi,window:a=j,eventFilter:s=De(50)}=t,u=p(n),i=p(ce());let l;const c=ve(s,()=>{u.value=!1,i.value=ce(),clearTimeout(l),l=setTimeout(()=>u.value=!0,e)});if(a){const f=a.document;for(const v of o)O(a,v,c,{passive:!0});r&&O(f,"visibilitychange",()=>{f.hidden||c()})}return l=setTimeout(()=>u.value=!0,e),{idle:u,lastActive:i}}var Hi=Object.defineProperty,In=Object.getOwnPropertySymbols,zi=Object.prototype.hasOwnProperty,Gi=Object.prototype.propertyIsEnumerable,Fn=(e,t,n)=>t in e?Hi(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,qi=(e,t)=>{for(var n in t||(t={}))zi.call(t,n)&&Fn(e,n,t[n]);if(In)for(var n of In(t))Gi.call(t,n)&&Fn(e,n,t[n]);return e};async function Xi(e){return new Promise((t,n)=>{const r=new Image,{src:o,srcset:a,sizes:s}=e;r.src=o,a&&(r.srcset=a),s&&(r.sizes=s),r.onload=()=>t(r),r.onerror=n})}const Yi=(e,t={})=>{const n=Nr(()=>Xi(P(e)),void 0,qi({resetOnExecute:!0},t));return D(()=>P(e),()=>n.execute(t.delay),{deep:!0}),n},jn=1;function Gr(e,t={}){const{throttle:n=0,idle:r=200,onStop:o=L,onScroll:a=L,offset:s={left:0,right:0,top:0,bottom:0},eventListenerOptions:u={capture:!1,passive:!0}}=t,i=p(0),l=p(0),c=p(!1),f=B({left:!0,right:!1,top:!0,bottom:!1}),v=B({left:!1,right:!1,top:!1,bottom:!1}),d=Xe(h=>{c.value=!1,v.left=!1,v.right=!1,v.top=!1,v.bottom=!1,o(h)},n+r),m=h=>{const g=h.target===document?h.target.documentElement:h.target,_=g.scrollLeft;v.left=_i.value,f.left=_<=0+(s.left||0),f.right=_+g.clientWidth>=g.scrollWidth-(s.right||0)-jn,i.value=_;let y=g.scrollTop;h.target===document&&!y&&(y=document.body.scrollTop),v.top=yl.value,f.top=y<=0+(s.top||0),f.bottom=y+g.clientHeight>=g.scrollHeight-(s.bottom||0)-jn,l.value=y,c.value=!0,d(h),a(h)};return O(e,"scroll",n?pt(m,n):m,u),{x:i,y:l,isScrolling:c,arrivedState:f,directions:v}}var Ki=Object.defineProperty,Ji=Object.defineProperties,Qi=Object.getOwnPropertyDescriptors,An=Object.getOwnPropertySymbols,Zi=Object.prototype.hasOwnProperty,el=Object.prototype.propertyIsEnumerable,Cn=(e,t,n)=>t in e?Ki(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Rn=(e,t)=>{for(var n in t||(t={}))Zi.call(t,n)&&Cn(e,n,t[n]);if(An)for(var n of An(t))el.call(t,n)&&Cn(e,n,t[n]);return e},tl=(e,t)=>Ji(e,Qi(t));function nl(e,t,n={}){var r,o;const a=(r=n.direction)!=null?r:"bottom",s=B(Gr(e,tl(Rn({},n),{offset:Rn({[a]:(o=n.distance)!=null?o:0},n.offset)})));D(()=>s.arrivedState[a],async u=>{var i,l;if(u){const c=P(e),f={height:(i=c==null?void 0:c.scrollHeight)!=null?i:0,width:(l=c==null?void 0:c.scrollWidth)!=null?l:0};await t(s),n.preserveScrollPosition&&c&&Ee(()=>{c.scrollTo({top:c.scrollHeight-f.height,left:c.scrollWidth-f.width})})}})}function rl(e,t,n={}){const{root:r,rootMargin:o="0px",threshold:a=.1,window:s=j}=n,u=M(()=>s&&"IntersectionObserver"in s);let i=L;const l=u.value?D(()=>({el:V(e),root:V(r)}),({el:f,root:v})=>{if(i(),!f)return;const d=new IntersectionObserver(t,{root:v,rootMargin:o,threshold:a});d.observe(f),i=()=>{d.disconnect(),i=L}},{immediate:!0,flush:"post"}):L,c=()=>{i(),l()};return N(c),{isSupported:u,stop:c}}const ol=["mousedown","mouseup","keydown","keyup"];function al(e,t={}){const{events:n=ol,document:r=ee,initial:o=null}=t,a=p(o);return r&&n.forEach(s=>{O(r,s,u=>{typeof u.getModifierState=="function"&&(a.value=u.getModifierState(e))})}),a}function ul(e,t,n={}){const{window:r=j}=n;return Je(e,t,r==null?void 0:r.localStorage,n)}const qr={ctrl:"control",command:"meta",cmd:"meta",option:"alt",up:"arrowup",down:"arrowdown",left:"arrowleft",right:"arrowright"};function sl(e={}){const{reactive:t=!1,target:n=j,aliasMap:r=qr,passive:o=!0,onEventFired:a=L}=e,s=B(new Set),u={toJSON(){return{}},current:s},i=t?B(u):u,l=new Set,c=new Set;function f(h,g){h in i&&(t?i[h]=g:i[h].value=g)}function v(){for(const h of c)f(h,!1)}function d(h,g){var _,y;const w=(_=h.key)==null?void 0:_.toLowerCase(),b=[(y=h.code)==null?void 0:y.toLowerCase(),w].filter(Boolean);w&&(g?s.add(w):s.delete(w));for(const E of b)c.add(E),f(E,g);w==="meta"&&!g?(l.forEach(E=>{s.delete(E),f(E,!1)}),l.clear()):typeof h.getModifierState=="function"&&h.getModifierState("Meta")&&g&&[...s,...b].forEach(E=>l.add(E))}O(n,"keydown",h=>(d(h,!0),a(h)),{passive:o}),O(n,"keyup",h=>(d(h,!1),a(h)),{passive:o}),O("blur",v,{passive:!0}),O("focus",v,{passive:!0});const m=new Proxy(i,{get(h,g,_){if(typeof g!="string")return Reflect.get(h,g,_);if(g=g.toLowerCase(),g in r&&(g=r[g]),!(g in i))if(/[+_-]/.test(g)){const w=g.split(/[+_-]/g).map($=>$.trim());i[g]=S(()=>w.every($=>C(m[$])))}else i[g]=p(!1);const y=Reflect.get(h,g,_);return t?C(y):y}});return m}var il=Object.defineProperty,Nn=Object.getOwnPropertySymbols,ll=Object.prototype.hasOwnProperty,cl=Object.prototype.propertyIsEnumerable,Mn=(e,t,n)=>t in e?il(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,kn=(e,t)=>{for(var n in t||(t={}))ll.call(t,n)&&Mn(e,n,t[n]);if(Nn)for(var n of Nn(t))cl.call(t,n)&&Mn(e,n,t[n]);return e};function rt(e,t){P(e)&&t(P(e))}function fl(e){let t=[];for(let n=0;n({id:i,label:t,kind:n,language:r,mode:o,activeCues:a,cues:s,inBandMetadataTrackDispatchType:u}))}const vl={src:"",tracks:[]};function dl(e,t={}){t=kn(kn({},vl),t);const{document:n=ee}=t,r=p(0),o=p(0),a=p(!1),s=p(1),u=p(!1),i=p(!1),l=p(!1),c=p(1),f=p(!1),v=p([]),d=p([]),m=p(-1),h=p(!1),g=p(!1),_=n&&"pictureInPictureEnabled"in n,y=z(),w=T=>{rt(e,F=>{if(T){const R=ye(T)?T:T.id;F.textTracks[R].mode="disabled"}else for(let R=0;R{rt(e,R=>{const X=ye(T)?T:T.id;F&&w(),R.textTracks[X].mode="showing",m.value=X})},b=()=>new Promise((T,F)=>{rt(e,async R=>{_&&(h.value?n.exitPictureInPicture().then(T).catch(F):R.requestPictureInPicture().then(T).catch(F))})});Re(()=>{if(!n)return;const T=P(e);if(!T)return;const F=P(t.src);let R=[];!F||(xe(F)?R=[{src:F}]:Array.isArray(F)?R=F:dr(F)&&(R=[F]),T.querySelectorAll("source").forEach(X=>{X.removeEventListener("error",y.trigger),X.remove()}),R.forEach(({src:X,type:ae})=>{const W=n.createElement("source");W.setAttribute("src",X),W.setAttribute("type",ae||""),W.addEventListener("error",y.trigger),T.appendChild(W)}),T.load())}),N(()=>{const T=P(e);!T||T.querySelectorAll("source").forEach(F=>F.removeEventListener("error",y.trigger))}),D(s,T=>{const F=P(e);!F||(F.volume=T)}),D(g,T=>{const F=P(e);!F||(F.muted=T)}),D(c,T=>{const F=P(e);!F||(F.playbackRate=T)}),Re(()=>{if(!n)return;const T=P(t.tracks),F=P(e);!T||!T.length||!F||(F.querySelectorAll("track").forEach(R=>R.remove()),T.forEach(({default:R,kind:X,label:ae,src:W,srcLang:ne},U)=>{const Y=n.createElement("track");Y.default=R||!1,Y.kind=X,Y.label=ae,Y.src=W,Y.srclang=ne,Y.default&&(m.value=U),F.appendChild(Y)}))});const{ignoreUpdates:E}=_e(r,T=>{const F=P(e);!F||(F.currentTime=T)}),{ignoreUpdates:x}=_e(l,T=>{const F=P(e);!F||(T?F.play():F.pause())});O(e,"timeupdate",()=>E(()=>r.value=P(e).currentTime)),O(e,"durationchange",()=>o.value=P(e).duration),O(e,"progress",()=>v.value=fl(P(e).buffered)),O(e,"seeking",()=>a.value=!0),O(e,"seeked",()=>a.value=!1),O(e,"waiting",()=>u.value=!0),O(e,"playing",()=>u.value=!1),O(e,"ratechange",()=>c.value=P(e).playbackRate),O(e,"stalled",()=>f.value=!0),O(e,"ended",()=>i.value=!0),O(e,"pause",()=>x(()=>l.value=!1)),O(e,"play",()=>x(()=>l.value=!0)),O(e,"enterpictureinpicture",()=>h.value=!0),O(e,"leavepictureinpicture",()=>h.value=!1),O(e,"volumechange",()=>{const T=P(e);!T||(s.value=T.volume,g.value=T.muted)});const I=[],A=D([e],()=>{const T=P(e);!T||(A(),I[0]=O(T.textTracks,"addtrack",()=>d.value=ot(T.textTracks)),I[1]=O(T.textTracks,"removetrack",()=>d.value=ot(T.textTracks)),I[2]=O(T.textTracks,"change",()=>d.value=ot(T.textTracks)))});return N(()=>I.forEach(T=>T())),{currentTime:r,duration:o,waiting:u,seeking:a,ended:i,stalled:f,buffered:v,playing:l,rate:c,volume:s,muted:g,tracks:d,selectedTrack:m,enableTrack:$,disableTrack:w,supportsPictureInPicture:_,togglePictureInPicture:b,isPictureInPicture:h,onSourceError:y.on}}function pl(e,t){const r=(()=>(t==null?void 0:t.cache)?B(t.cache):B(new Map))(),o=(...c)=>(t==null?void 0:t.getKey)?t.getKey(...c):JSON.stringify(c),a=(c,...f)=>(r.set(c,e(...f)),r.get(c)),s=(...c)=>a(o(...c),...c),u=(...c)=>{r.delete(o(...c))},i=()=>{r.clear()},l=(...c)=>{const f=o(...c);return r.has(f)?r.get(f):a(f,...c)};return l.load=s,l.delete=u,l.clear=i,l.generateKey=o,l.cache=r,l}function ml(e={}){const t=p(),n=M(()=>typeof performance!="undefined"&&"memory"in performance);if(n.value){const{interval:r=1e3}=e;de(()=>{t.value=performance.memory},r,{immediate:e.immediate,immediateCallback:e.immediateCallback})}return{isSupported:n,memory:t}}function hl(){const e=p(!1);return ft(()=>{e.value=!0}),e}function Xr(e={}){const{type:t="page",touch:n=!0,resetOnTouchEnds:r=!1,initialValue:o={x:0,y:0},window:a=j,eventFilter:s}=e,u=p(o.x),i=p(o.y),l=p(null),c=h=>{t==="page"?(u.value=h.pageX,i.value=h.pageY):t==="client"&&(u.value=h.clientX,i.value=h.clientY),l.value="mouse"},f=()=>{u.value=o.x,i.value=o.y},v=h=>{if(h.touches.length>0){const g=h.touches[0];t==="page"?(u.value=g.pageX,i.value=g.pageY):t==="client"&&(u.value=g.clientX,i.value=g.clientY),l.value="touch"}},d=h=>s===void 0?c(h):s(()=>c(h),{}),m=h=>s===void 0?v(h):s(()=>v(h),{});return a&&(O(a,"mousemove",d,{passive:!0}),O(a,"dragover",d,{passive:!0}),n&&(O(a,"touchstart",m,{passive:!0}),O(a,"touchmove",m,{passive:!0}),r&&O(a,"touchend",f,{passive:!0}))),{x:u,y:i,sourceType:l}}function Yr(e,t={}){const{handleOutside:n=!0,window:r=j}=t,{x:o,y:a,sourceType:s}=Xr(t),u=p(e!=null?e:r==null?void 0:r.document.body),i=p(0),l=p(0),c=p(0),f=p(0),v=p(0),d=p(0),m=p(!0);let h=()=>{};return r&&(h=D([u,o,a],()=>{const g=V(u);if(!g)return;const{left:_,top:y,width:w,height:$}=g.getBoundingClientRect();c.value=_+r.pageXOffset,f.value=y+r.pageYOffset,v.value=$,d.value=w;const b=o.value-c.value,E=a.value-f.value;m.value=w===0||$===0||b<0||E<0||b>w||E>$,(n||!m.value)&&(i.value=b,l.value=E)},{immediate:!0})),{x:o,y:a,sourceType:s,elementX:i,elementY:l,elementPositionX:c,elementPositionY:f,elementHeight:v,elementWidth:d,isOutside:m,stop:h}}function gl(e={}){const{touch:t=!0,drag:n=!0,initialValue:r=!1,window:o=j}=e,a=p(r),s=p(null);if(!o)return{pressed:a,sourceType:s};const u=c=>()=>{a.value=!0,s.value=c},i=()=>{a.value=!1,s.value=null},l=S(()=>V(e.target)||o);return O(l,"mousedown",u("mouse"),{passive:!0}),O(o,"mouseleave",i,{passive:!0}),O(o,"mouseup",i,{passive:!0}),n&&(O(l,"dragstart",u("mouse"),{passive:!0}),O(o,"drop",i,{passive:!0}),O(o,"dragend",i,{passive:!0})),t&&(O(l,"touchstart",u("touch"),{passive:!0}),O(o,"touchend",i,{passive:!0}),O(o,"touchcancel",i,{passive:!0})),{pressed:a,sourceType:s}}var Ln=Object.getOwnPropertySymbols,yl=Object.prototype.hasOwnProperty,_l=Object.prototype.propertyIsEnumerable,wl=(e,t)=>{var n={};for(var r in e)yl.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Ln)for(var r of Ln(e))t.indexOf(r)<0&&_l.call(e,r)&&(n[r]=e[r]);return n};function Pt(e,t,n={}){const r=n,{window:o=j}=r,a=wl(r,["window"]);let s;const u=M(()=>o&&"MutationObserver"in o),i=()=>{s&&(s.disconnect(),s=void 0)},l=D(()=>V(e),f=>{i(),u.value&&o&&f&&(s=new MutationObserver(t),s.observe(f,a))},{immediate:!0}),c=()=>{i(),l()};return N(c),{isSupported:u,stop:c}}const Ol=(e={})=>{const{window:t=j}=e,n=t==null?void 0:t.navigator,r=M(()=>n&&"language"in n),o=p(n==null?void 0:n.language);return O(t,"languagechange",()=>{n&&(o.value=n.language)}),{isSupported:r,language:o}};function Kr(e={}){const{window:t=j}=e,n=t==null?void 0:t.navigator,r=M(()=>n&&"connection"in n),o=p(!0),a=p(!1),s=p(void 0),u=p(void 0),i=p(void 0),l=p(void 0),c=p(void 0),f=p(void 0),v=p("unknown"),d=r.value&&n.connection;function m(){!n||(o.value=n.onLine,s.value=o.value?void 0:Date.now(),u.value=o.value?Date.now():void 0,d&&(i.value=d.downlink,l.value=d.downlinkMax,f.value=d.effectiveType,c.value=d.rtt,a.value=d.saveData,v.value=d.type))}return t&&(O(t,"offline",()=>{o.value=!1,s.value=Date.now()}),O(t,"online",()=>{o.value=!0,u.value=Date.now()})),d&&O(d,"change",m,!1),m(),{isSupported:r,isOnline:o,saveData:a,offlineAt:s,onlineAt:u,downlink:i,downlinkMax:l,effectiveType:f,rtt:c,type:v}}var bl=Object.defineProperty,Vn=Object.getOwnPropertySymbols,Pl=Object.prototype.hasOwnProperty,Sl=Object.prototype.propertyIsEnumerable,Wn=(e,t,n)=>t in e?bl(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,$l=(e,t)=>{for(var n in t||(t={}))Pl.call(t,n)&&Wn(e,n,t[n]);if(Vn)for(var n of Vn(t))Sl.call(t,n)&&Wn(e,n,t[n]);return e};function Jr(e={}){const{controls:t=!1,interval:n="requestAnimationFrame"}=e,r=p(new Date),o=()=>r.value=new Date,a=n==="requestAnimationFrame"?pe(o,{immediate:!0}):de(o,n,{immediate:!0});return t?$l({now:r},a):r}function El(e){const t=p(),n=()=>{t.value&&URL.revokeObjectURL(t.value),t.value=void 0};return D(()=>C(e),r=>{n(),r&&(t.value=URL.createObjectURL(r))},{immediate:!0}),N(n),le(t)}function Bn(e,t,n){const r=p(e);return S({get(){return r.value=Me(r.value,P(t),P(n))},set(o){r.value=Me(o,P(t),P(n))}})}function xl(e){const{total:t=1/0,pageSize:n=10,page:r=1,onPageChange:o=L,onPageSizeChange:a=L,onPageCountChange:s=L}=e,u=Bn(n,1,1/0),i=S(()=>Math.max(1,Math.ceil(C(t)/C(u)))),l=Bn(r,1,i),c=S(()=>l.value===1),f=S(()=>l.value===i.value);q(r)&&it(r,l),q(n)&&it(n,u);function v(){l.value--}function d(){l.value++}const m={currentPage:l,currentPageSize:u,pageCount:i,isFirstPage:c,isLastPage:f,prev:v,next:d};return D(l,()=>{o(B(m))}),D(u,()=>{a(B(m))}),D(i,()=>{s(B(m))}),m}function Tl(e={}){const{isOnline:t}=Kr(e);return t}function Dl(e={}){const{window:t=j}=e,n=p(!1),r=o=>{if(!t)return;o=o||t.event;const a=o.relatedTarget||o.toElement;n.value=!a};return t&&(O(t,"mouseout",r,{passive:!0}),O(t.document,"mouseleave",r,{passive:!0}),O(t.document,"mouseenter",r,{passive:!0})),n}function Il(e,t={}){const{deviceOrientationTiltAdjust:n=h=>h,deviceOrientationRollAdjust:r=h=>h,mouseTiltAdjust:o=h=>h,mouseRollAdjust:a=h=>h,window:s=j}=t,u=B(Br({window:s})),{elementX:i,elementY:l,elementWidth:c,elementHeight:f}=Yr(e,{handleOutside:!1,window:s}),v=S(()=>u.isSupported&&(u.alpha!=null&&u.alpha!==0||u.gamma!=null&&u.gamma!==0)?"deviceOrientation":"mouse"),d=S(()=>{if(v.value==="deviceOrientation"){const h=-u.beta/90;return r(h)}else{const h=-(l.value-f.value/2)/f.value;return a(h)}}),m=S(()=>{if(v.value==="deviceOrientation"){const h=u.gamma/90;return n(h)}else{const h=(i.value-c.value/2)/c.value;return o(h)}});return{roll:d,tilt:m,source:v}}var Fl=Object.defineProperty,jl=Object.defineProperties,Al=Object.getOwnPropertyDescriptors,Un=Object.getOwnPropertySymbols,Cl=Object.prototype.hasOwnProperty,Rl=Object.prototype.propertyIsEnumerable,Hn=(e,t,n)=>t in e?Fl(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Nl=(e,t)=>{for(var n in t||(t={}))Cl.call(t,n)&&Hn(e,n,t[n]);if(Un)for(var n of Un(t))Rl.call(t,n)&&Hn(e,n,t[n]);return e},Ml=(e,t)=>jl(e,Al(t));const Qr={x:0,y:0,pointerId:0,pressure:0,tiltX:0,tiltY:0,width:0,height:0,twist:0,pointerType:null},kl=Object.keys(Qr);function Ll(e={}){const{target:t=j}=e,n=p(!1),r=p(e.initialValue||{});Object.assign(r.value,Qr,r.value);const o=a=>{n.value=!0,!(e.pointerTypes&&!e.pointerTypes.includes(a.pointerType))&&(r.value=yr(a,kl,!1))};return t&&(O(t,"pointerdown",o,{passive:!0}),O(t,"pointermove",o,{passive:!0}),O(t,"pointerleave",()=>n.value=!1,{passive:!0})),Ml(Nl({},mt(r)),{isInside:n})}var J;(function(e){e.UP="UP",e.RIGHT="RIGHT",e.DOWN="DOWN",e.LEFT="LEFT",e.NONE="NONE"})(J||(J={}));function Vl(e,t={}){const{threshold:n=50,onSwipe:r,onSwipeEnd:o,onSwipeStart:a,passive:s=!0,window:u=j}=t,i=B({x:0,y:0}),l=B({x:0,y:0}),c=S(()=>i.x-l.x),f=S(()=>i.y-l.y),{max:v,abs:d}=Math,m=S(()=>v(d(c.value),d(f.value))>=n),h=p(!1),g=S(()=>m.value?d(c.value)>d(f.value)?c.value>0?J.LEFT:J.RIGHT:f.value>0?J.UP:J.DOWN:J.NONE),_=A=>[A.touches[0].clientX,A.touches[0].clientY],y=(A,T)=>{i.x=A,i.y=T},w=(A,T)=>{l.x=A,l.y=T};let $;const b=Wl(u==null?void 0:u.document);s?$=b?{passive:!0}:{capture:!1}:$=b?{passive:!1,capture:!0}:{capture:!0};const E=A=>{h.value&&(o==null||o(A,g.value)),h.value=!1},x=[O(e,"touchstart",A=>{$.capture&&!$.passive&&A.preventDefault();const[T,F]=_(A);y(T,F),w(T,F),a==null||a(A)},$),O(e,"touchmove",A=>{const[T,F]=_(A);w(T,F),!h.value&&m.value&&(h.value=!0),h.value&&(r==null||r(A))},$),O(e,"touchend",E,$),O(e,"touchcancel",E,$)];return{isPassiveEventSupported:b,isSwiping:h,direction:g,coordsStart:i,coordsEnd:l,lengthX:c,lengthY:f,stop:()=>x.forEach(A=>A())}}function Wl(e){if(!e)return!1;let t=!1;const n={get passive(){return t=!0,!1}};return e.addEventListener("x",L,n),e.removeEventListener("x",L),t}function Bl(e,t={}){const n=re(e),{threshold:r=50,onSwipe:o,onSwipeEnd:a,onSwipeStart:s}=t,u=B({x:0,y:0}),i=(E,x)=>{u.x=E,u.y=x},l=B({x:0,y:0}),c=(E,x)=>{l.x=E,l.y=x},f=S(()=>u.x-l.x),v=S(()=>u.y-l.y),{max:d,abs:m}=Math,h=S(()=>d(m(f.value),m(v.value))>=r),g=p(!1),_=p(!1),y=S(()=>h.value?m(f.value)>m(v.value)?f.value>0?J.LEFT:J.RIGHT:v.value>0?J.UP:J.DOWN:J.NONE),w=E=>t.pointerTypes?t.pointerTypes.includes(E.pointerType):!0,$=[O(e,"pointerdown",E=>{var x,I;if(!w(E))return;_.value=!0,(I=(x=n.value)==null?void 0:x.style)==null||I.setProperty("touch-action","none");const A=E.target;A==null||A.setPointerCapture(E.pointerId);const{clientX:T,clientY:F}=E;i(T,F),c(T,F),s==null||s(E)}),O(e,"pointermove",E=>{if(!w(E)||!_.value)return;const{clientX:x,clientY:I}=E;c(x,I),!g.value&&h.value&&(g.value=!0),g.value&&(o==null||o(E))}),O(e,"pointerup",E=>{var x,I;!w(E)||(g.value&&(a==null||a(E,y.value)),_.value=!1,g.value=!1,(I=(x=n.value)==null?void 0:x.style)==null||I.setProperty("touch-action","initial"))})],b=()=>$.forEach(E=>E());return{isSwiping:le(g),direction:le(y),posStart:le(u),posEnd:le(l),distanceX:f,distanceY:v,stop:b}}function Ul(e){const t=K("(prefers-color-scheme: light)",e),n=K("(prefers-color-scheme: dark)",e);return S(()=>n.value?"dark":t.value?"light":"no-preference")}function Hl(e){const t=K("(prefers-contrast: more)",e),n=K("(prefers-contrast: less)",e),r=K("(prefers-contrast: custom)",e);return S(()=>t.value?"more":n.value?"less":r.value?"custom":"no-preference")}function zl(e={}){const{window:t=j}=e;if(!t)return p(["en"]);const n=t.navigator,r=p(n.languages);return O(t,"languagechange",()=>{r.value=n.languages}),r}function Gl(e){const t=K("(prefers-reduced-motion: reduce)",e);return S(()=>t.value?"reduce":"no-preference")}const ql=(e={})=>{const{window:t=j}=e,n=M(()=>t&&"screen"in t&&"orientation"in t.screen),r=n.value?t.screen.orientation:{},o=p(r.type),a=p(r.angle||0);return n.value&&O(t,"orientationchange",()=>{o.value=r.type,a.value=r.angle}),{isSupported:n,orientation:o,angle:a,lockOrientation:i=>n.value?r.lock(i):Promise.reject(new Error("Not supported")),unlockOrientation:()=>{n.value&&r.unlock()}}},zn="--vueuse-safe-area-top",Gn="--vueuse-safe-area-right",qn="--vueuse-safe-area-bottom",Xn="--vueuse-safe-area-left";function Xl(){const e=p(""),t=p(""),n=p(""),r=p("");if(Q){const a=Pe(zn),s=Pe(Gn),u=Pe(qn),i=Pe(Xn);a.value="env(safe-area-inset-top, 0px)",s.value="env(safe-area-inset-right, 0px)",u.value="env(safe-area-inset-bottom, 0px)",i.value="env(safe-area-inset-left, 0px)",o(),O("resize",Xe(o))}function o(){e.value=Ae(zn),t.value=Ae(Gn),n.value=Ae(qn),r.value=Ae(Xn)}return{top:e,right:t,bottom:n,left:r,update:o}}function Ae(e){return getComputedStyle(document.documentElement).getPropertyValue(e)}function Yl(e,t=L,n={}){const{immediate:r=!0,manual:o=!1,type:a="text/javascript",async:s=!0,crossOrigin:u,referrerPolicy:i,noModule:l,defer:c,document:f=ee,attrs:v={}}=n,d=p(null);let m=null;const h=y=>new Promise((w,$)=>{const b=I=>(d.value=I,w(I),I);if(!f){w(!1);return}let E=!1,x=f.querySelector(`script[src="${P(e)}"]`);x?x.hasAttribute("data-loaded")&&b(x):(x=f.createElement("script"),x.type=a,x.async=s,x.src=P(e),c&&(x.defer=c),u&&(x.crossOrigin=u),l&&(x.noModule=l),i&&(x.referrerPolicy=i),Object.entries(v).forEach(([I,A])=>x==null?void 0:x.setAttribute(I,A)),E=!0),x.addEventListener("error",I=>$(I)),x.addEventListener("abort",I=>$(I)),x.addEventListener("load",()=>{x.setAttribute("data-loaded","true"),t(x),b(x)}),E&&(x=f.head.appendChild(x)),y||b(x)}),g=(y=!0)=>(m||(m=h(y)),m),_=()=>{if(!f)return;m=null,d.value&&(d.value=null);const y=f.querySelector(`script[src="${P(e)}"]`);y&&f.head.removeChild(y)};return r&&!o&&Z(g),o||Sr(_),{scriptTag:d,load:g,unload:_}}function Kl(e){const t=e||window.event;return t.touches.length>1?!0:(t.preventDefault&&t.preventDefault(),!1)}function Jl(e,t=!1){const n=p(t);let r=null,o;D(re(e),u=>{if(u){const i=u;o=i.style.overflow,n.value&&(i.style.overflow="hidden")}},{immediate:!0});const a=()=>{const u=P(e);!u||n.value||(ut&&(r=O(u,"touchmove",Kl,{passive:!1})),u.style.overflow="hidden",n.value=!0)},s=()=>{const u=P(e);!u||!n.value||(ut&&(r==null||r()),u.style.overflow=o,n.value=!1)};return N(s),S({get(){return n.value},set(u){u?a():s()}})}function Ql(e,t,n={}){const{window:r=j}=n;return Je(e,t,r==null?void 0:r.sessionStorage,n)}var Zl=Object.defineProperty,Yn=Object.getOwnPropertySymbols,ec=Object.prototype.hasOwnProperty,tc=Object.prototype.propertyIsEnumerable,Kn=(e,t,n)=>t in e?Zl(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Jn=(e,t)=>{for(var n in t||(t={}))ec.call(t,n)&&Kn(e,n,t[n]);if(Yn)for(var n of Yn(t))tc.call(t,n)&&Kn(e,n,t[n]);return e};function nc(e={},t={}){const{navigator:n=te}=t,r=n,o=M(()=>r&&"canShare"in r);return{isSupported:o,share:async(s={})=>{if(o.value){const u=Jn(Jn({},P(e)),P(s));let i=!0;if(u.files&&r.canShare&&(i=r.canShare({files:u.files})),i)return r.share(u)}}}}function rc(e={}){const{interimResults:t=!0,continuous:n=!0,window:r=j}=e,o=re(e.lang||"en-US"),a=p(!1),s=p(!1),u=p(""),i=G(void 0),l=(h=!a.value)=>{a.value=h},c=()=>{a.value=!0},f=()=>{a.value=!1},v=r&&(r.SpeechRecognition||r.webkitSpeechRecognition),d=M(()=>v);let m;return d.value&&(m=new v,m.continuous=n,m.interimResults=t,m.lang=C(o),m.onstart=()=>{s.value=!1},D(o,h=>{m&&!a.value&&(m.lang=h)}),m.onresult=h=>{const g=Array.from(h.results).map(_=>(s.value=_.isFinal,_[0])).map(_=>_.transcript).join("");u.value=g,i.value=void 0},m.onerror=h=>{i.value=h},m.onend=()=>{a.value=!1,m.lang=C(o)},D(a,()=>{a.value?m.start():m.stop()})),N(()=>{a.value=!1}),{isSupported:d,isListening:a,isFinal:s,recognition:m,result:u,error:i,toggle:l,start:c,stop:f}}function oc(e,t={}){const{pitch:n=1,rate:r=1,volume:o=1,window:a=j}=t,s=a&&a.speechSynthesis,u=M(()=>s),i=p(!1),l=p("init"),c=re(e||""),f=re(t.lang||"en-US"),v=G(void 0),d=(_=!i.value)=>{i.value=_},m=_=>{_.lang=C(f),_.voice=C(t.voice)||null,_.pitch=n,_.rate=r,_.volume=o,_.onstart=()=>{i.value=!0,l.value="play"},_.onpause=()=>{i.value=!1,l.value="pause"},_.onresume=()=>{i.value=!0,l.value="play"},_.onend=()=>{i.value=!1,l.value="end"},_.onerror=y=>{v.value=y}},h=S(()=>{i.value=!1,l.value="init";const _=new SpeechSynthesisUtterance(c.value);return m(_),_}),g=()=>{s.cancel(),h&&s.speak(h.value)};return u.value&&(m(h.value),D(f,_=>{h.value&&!i.value&&(h.value.lang=_)}),t.voice&&D(t.voice,()=>{s.cancel()}),D(i,()=>{i.value?s.resume():s.pause()})),N(()=>{i.value=!1}),{isSupported:u,isPlaying:i,status:l,utterance:h,error:v,toggle:d,speak:g}}function ac(e,t){const n=p(e),r=S(()=>Array.isArray(n.value)?n.value:Object.keys(n.value)),o=p(r.value.indexOf(t!=null?t:r.value[0])),a=S(()=>c(o.value)),s=S(()=>o.value===0),u=S(()=>o.value===r.value.length-1),i=S(()=>r.value[o.value+1]),l=S(()=>r.value[o.value-1]);function c(b){return Array.isArray(n.value)?n.value[b]:n.value[r.value[b]]}function f(b){if(!!r.value.includes(b))return c(r.value.indexOf(b))}function v(b){r.value.includes(b)&&(o.value=r.value.indexOf(b))}function d(){u.value||o.value++}function m(){s.value||o.value--}function h(b){$(b)&&v(b)}function g(b){return r.value.indexOf(b)===o.value+1}function _(b){return r.value.indexOf(b)===o.value-1}function y(b){return r.value.indexOf(b)===o.value}function w(b){return o.valuer.value.indexOf(b)}return{steps:n,stepNames:r,index:o,current:a,next:i,previous:l,isFirst:s,isLast:u,at:c,get:f,goTo:v,goToNext:d,goToPrevious:m,goBackTo:h,isNext:g,isPrevious:_,isCurrent:y,isBefore:w,isAfter:$}}function uc(e,t,n,r={}){var o;const{flush:a="pre",deep:s=!0,listenToStorageChanges:u=!0,writeDefaults:i=!0,shallow:l,window:c=j,eventFilter:f,onError:v=y=>{console.error(y)}}=r,d=P(t),m=kr(d),h=(l?G:p)(t),g=(o=r.serializer)!=null?o:_t[m];if(!n)try{n=Ke("getDefaultStorage",()=>{var y;return(y=j)==null?void 0:y.localStorage})()}catch(y){v(y)}async function _(y){if(!(!n||y&&y.key!==e))try{const w=y?y.newValue:await n.getItem(e);w==null?(h.value=d,i&&d!==null&&await n.setItem(e,await g.write(d))):h.value=await g.read(w)}catch(w){v(w)}}return _(),c&&u&&O(c,"storage",y=>setTimeout(()=>_(y),0)),n&&Oe(h,async()=>{try{h.value==null?await n.removeItem(e):await n.setItem(e,await g.write(h.value))}catch(y){v(y)}},{flush:a,deep:s,eventFilter:f}),h}let sc=0;function ic(e,t={}){const n=p(!1),{document:r=ee,immediate:o=!0,manual:a=!1,id:s=`vueuse_styletag_${++sc}`}=t,u=p(e);let i=()=>{};const l=()=>{if(!r)return;const f=r.getElementById(s)||r.createElement("style");f.type="text/css",f.id=s,t.media&&(f.media=t.media),r.head.appendChild(f),!n.value&&(i=D(u,v=>{f.innerText=v},{immediate:!0}),n.value=!0)},c=()=>{!r||!n.value||(i(),r.head.removeChild(r.getElementById(s)),n.value=!1)};return o&&!a&&Z(l),a||N(c),{id:s,css:u,unload:c,load:l,isLoaded:le(n)}}function lc(){const e=p([]);return e.value.set=t=>{t&&e.value.push(t)},co(()=>{e.value.length=0}),e}function cc(e={}){const{document:t=ee,selector:n="html",observe:r=!1,initialValue:o="ltr"}=e;function a(){var u,i;return(i=(u=t==null?void 0:t.querySelector(n))==null?void 0:u.getAttribute("dir"))!=null?i:o}const s=p(a());return Z(()=>s.value=a()),r&&t&&Pt(t.querySelector(n),()=>s.value=a(),{attributes:!0}),S({get(){return s.value},set(u){var i,l;s.value=u,!!t&&(s.value?(i=t.querySelector(n))==null||i.setAttribute("dir",s.value):(l=t.querySelector(n))==null||l.removeAttribute("dir"))}})}function fc(e){var t;const n=(t=e.rangeCount)!=null?t:0,r=new Array(n);for(let o=0;o{var u,i;return(i=(u=n.value)==null?void 0:u.toString())!=null?i:""}),o=S(()=>n.value?fc(n.value):[]),a=S(()=>o.value.map(u=>u.getBoundingClientRect()));function s(){n.value=null,t&&(n.value=t.getSelection())}return t&&O(t.document,"selectionchange",s),{text:r,rects:a,ranges:o,selection:n}}function dc(e){const t=p(e==null?void 0:e.element),n=p(e==null?void 0:e.input);function r(){var o,a;!t.value||(t.value.style.height="1px",t.value.style.height=`${(o=t.value)==null?void 0:o.scrollHeight}px`,(a=e==null?void 0:e.onResize)==null||a.call(e))}return D([n,t],r,{immediate:!0}),(e==null?void 0:e.watch)&&D(e.watch,r,{immediate:!0,deep:!0}),{textarea:t,input:n,triggerResize:r}}var pc=Object.defineProperty,mc=Object.defineProperties,hc=Object.getOwnPropertyDescriptors,Qn=Object.getOwnPropertySymbols,gc=Object.prototype.hasOwnProperty,yc=Object.prototype.propertyIsEnumerable,Zn=(e,t,n)=>t in e?pc(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,er=(e,t)=>{for(var n in t||(t={}))gc.call(t,n)&&Zn(e,n,t[n]);if(Qn)for(var n of Qn(t))yc.call(t,n)&&Zn(e,n,t[n]);return e},_c=(e,t)=>mc(e,hc(t));function wc(e,t={}){const{throttle:n=200,trailing:r=!0}=t,o=De(n,r),a=Ot(e,_c(er({},t),{eventFilter:o}));return er({},a)}var Oc=Object.defineProperty,Ge=Object.getOwnPropertySymbols,Zr=Object.prototype.hasOwnProperty,eo=Object.prototype.propertyIsEnumerable,tr=(e,t,n)=>t in e?Oc(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,bc=(e,t)=>{for(var n in t||(t={}))Zr.call(t,n)&&tr(e,n,t[n]);if(Ge)for(var n of Ge(t))eo.call(t,n)&&tr(e,n,t[n]);return e},Pc=(e,t)=>{var n={};for(var r in e)Zr.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Ge)for(var r of Ge(e))t.indexOf(r)<0&&eo.call(e,r)&&(n[r]=e[r]);return n};const nr=[{max:6e4,value:1e3,name:"second"},{max:276e4,value:6e4,name:"minute"},{max:72e6,value:36e5,name:"hour"},{max:5184e5,value:864e5,name:"day"},{max:24192e5,value:6048e5,name:"week"},{max:28512e6,value:2592e6,name:"month"},{max:1/0,value:31536e6,name:"year"}],Sc={justNow:"just now",past:e=>e.match(/\d/)?`${e} ago`:e,future:e=>e.match(/\d/)?`in ${e}`:e,month:(e,t)=>e===1?t?"last month":"next month":`${e} month${e>1?"s":""}`,year:(e,t)=>e===1?t?"last year":"next year":`${e} year${e>1?"s":""}`,day:(e,t)=>e===1?t?"yesterday":"tomorrow":`${e} day${e>1?"s":""}`,week:(e,t)=>e===1?t?"last week":"next week":`${e} week${e>1?"s":""}`,hour:e=>`${e} hour${e>1?"s":""}`,minute:e=>`${e} minute${e>1?"s":""}`,second:e=>`${e} second${e>1?"s":""}`},$c=e=>e.toISOString().slice(0,10);function Ec(e,t={}){const{controls:n=!1,max:r,updateInterval:o=3e4,messages:a=Sc,fullDateFormatter:s=$c}=t,{abs:u,round:i}=Math,l=Jr({interval:o,controls:!0}),{now:c}=l,f=Pc(l,["now"]);function v(g,_){var y;const w=+_-+g,$=u(w);if($<6e4)return a.justNow;if(typeof r=="number"&&$>r)return s(new Date(g));if(typeof r=="string"){const b=(y=nr.find(E=>E.name===r))==null?void 0:y.max;if(b&&$>b)return s(new Date(g))}for(const b of nr)if($0,$=d(_.name,y,w);return d(w?"past":"future",$,w)}const h=S(()=>v(new Date(P(e)),C(c.value)));return n?bc({timeAgo:h},f):h}function xc(e,t,n){const{start:r}=we(a,t),o=p(!1);async function a(){!o.value||(await e(),r())}function s(){o.value||(o.value=!0,a())}function u(){o.value=!1}return(n==null?void 0:n.immediate)&&s(),N(u),{isActive:o,pause:u,resume:s}}var Tc=Object.defineProperty,rr=Object.getOwnPropertySymbols,Dc=Object.prototype.hasOwnProperty,Ic=Object.prototype.propertyIsEnumerable,or=(e,t,n)=>t in e?Tc(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Fc=(e,t)=>{for(var n in t||(t={}))Dc.call(t,n)&&or(e,n,t[n]);if(rr)for(var n of rr(t))Ic.call(t,n)&&or(e,n,t[n]);return e};function jc(e={}){const{controls:t=!1,offset:n=0,immediate:r=!0,interval:o="requestAnimationFrame"}=e,a=p(ce()+n),s=()=>a.value=ce()+n,u=o==="requestAnimationFrame"?pe(s,{immediate:r}):de(s,o,{immediate:r});return t?Fc({timestamp:a},u):a}function Ac(e=null,t={}){var n,r;const{document:o=ee,observe:a=!1,titleTemplate:s="%s"}=t,u=re((n=e!=null?e:o==null?void 0:o.title)!=null?n:null),i=e&&oe(e);function l(c){return oe(s)?s(c):C(s).replace("%s",c)}return D(u,(c,f)=>{xe(c)&&c!==f&&o&&(o.title=l(c))},{immediate:!0}),a&&o&&!i&&Pt((r=o.head)==null?void 0:r.querySelector("title"),()=>{o&&o.title!==u.value&&(u.value=l(o.title))},{childList:!0}),u}var Cc=Object.defineProperty,ar=Object.getOwnPropertySymbols,Rc=Object.prototype.hasOwnProperty,Nc=Object.prototype.propertyIsEnumerable,ur=(e,t,n)=>t in e?Cc(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Mc=(e,t)=>{for(var n in t||(t={}))Rc.call(t,n)&&ur(e,n,t[n]);if(ar)for(var n of ar(t))Nc.call(t,n)&&ur(e,n,t[n]);return e};const kc={easeInSine:[.12,0,.39,0],easeOutSine:[.61,1,.88,1],easeInOutSine:[.37,0,.63,1],easeInQuad:[.11,0,.5,0],easeOutQuad:[.5,1,.89,1],easeInOutQuad:[.45,0,.55,1],easeInCubic:[.32,0,.67,0],easeOutCubic:[.33,1,.68,1],easeInOutCubic:[.65,0,.35,1],easeInQuart:[.5,0,.75,0],easeOutQuart:[.25,1,.5,1],easeInOutQuart:[.76,0,.24,1],easeInQuint:[.64,0,.78,0],easeOutQuint:[.22,1,.36,1],easeInOutQuint:[.83,0,.17,1],easeInExpo:[.7,0,.84,0],easeOutExpo:[.16,1,.3,1],easeInOutExpo:[.87,0,.13,1],easeInCirc:[.55,0,1,.45],easeOutCirc:[0,.55,.45,1],easeInOutCirc:[.85,0,.15,1],easeInBack:[.36,0,.66,-.56],easeOutBack:[.34,1.56,.64,1],easeInOutBack:[.68,-.6,.32,1.6]},Lc=Mc({linear:dt},kc);function Vc([e,t,n,r]){const o=(c,f)=>1-3*f+3*c,a=(c,f)=>3*f-6*c,s=c=>3*c,u=(c,f,v)=>((o(f,v)*c+a(f,v))*c+s(f))*c,i=(c,f,v)=>3*o(f,v)*c*c+2*a(f,v)*c+s(f),l=c=>{let f=c;for(let v=0;v<4;++v){const d=i(f,e,n);if(d===0)return f;f-=(u(f,e,n)-c)/d}return f};return c=>e===t&&n===r?c:u(l(c),t,r)}function Wc(e,t={}){const{delay:n=0,disabled:r=!1,duration:o=1e3,onFinished:a=L,onStarted:s=L,transition:u=dt}=t,i=S(()=>{const b=C(u);return oe(b)?b:Vc(b)}),l=S(()=>{const b=C(e);return ye(b)?b:b.map(C)}),c=S(()=>ye(l.value)?[l.value]:l.value),f=p(c.value.slice(0));let v,d,m,h,g;const{resume:_,pause:y}=pe(()=>{const b=Date.now(),E=Me(1-(m-b)/v,0,1);f.value=g.map((x,I)=>{var A;return x+((A=d[I])!=null?A:0)*i.value(E)}),E>=1&&(y(),a())},{immediate:!1}),w=()=>{y(),v=C(o),d=f.value.map((b,E)=>{var x,I;return((x=c.value[E])!=null?x:0)-((I=f.value[E])!=null?I:0)}),g=f.value.slice(0),h=Date.now(),m=h+v,_(),s()},$=we(w,n,{immediate:!1});return D(c,()=>{C(r)?f.value=c.value.slice(0):C(n)<=0?w():$.start()},{deep:!0}),S(()=>{const b=C(r)?c:f;return ye(l.value)?b.value[0]:b.value})}function Bc(e="history",t={}){const{initialValue:n={},removeNullishValues:r=!0,removeFalsyValues:o=!1,write:a=!0,window:s=j}=t;if(!s)return B(n);const u=B({});function i(){if(e==="history")return s.location.search||"";if(e==="hash"){const _=s.location.hash||"",y=_.indexOf("?");return y>0?_.slice(y):""}else return(s.location.hash||"").replace(/^#/,"")}function l(_){const y=_.toString();if(e==="history")return`${y?`?${y}`:""}${s.location.hash||""}`;if(e==="hash-params")return`${s.location.search||""}${y?`#${y}`:""}`;const w=s.location.hash||"#",$=w.indexOf("?");return $>0?`${w.slice(0,$)}${y?`?${y}`:""}`:`${w}${y?`?${y}`:""}`}function c(){return new URLSearchParams(i())}function f(_){const y=new Set(Object.keys(u));for(const w of _.keys()){const $=_.getAll(w);u[w]=$.length>1?$:_.get(w)||"",y.delete(w)}Array.from(y).forEach(w=>delete u[w])}const{pause:v,resume:d}=Ue(u,()=>{const _=new URLSearchParams("");Object.keys(u).forEach(y=>{const w=u[y];Array.isArray(w)?w.forEach($=>_.append(y,$)):r&&w==null||o&&!w?_.delete(y):_.set(y,w)}),m(_)},{deep:!0});function m(_,y){v(),y&&f(_),s.history.replaceState(s.history.state,s.document.title,s.location.pathname+l(_)),d()}function h(){!a||m(c(),!0)}O(s,"popstate",h,!1),e!=="history"&&O(s,"hashchange",h,!1);const g=c();return g.keys().next().value?f(g):Object.assign(u,n),u}function Uc(e={}){var t,n;const r=p((t=e.enabled)!=null?t:!1),o=p((n=e.autoSwitch)!=null?n:!0),a=p(e.videoDeviceId),s=p(e.audioDeviceId),{navigator:u=te}=e,i=M(()=>{var g;return(g=u==null?void 0:u.mediaDevices)==null?void 0:g.getUserMedia}),l=G();function c(g){return g.value==="none"||g.value===!1?!1:g.value==null?!0:{deviceId:g.value}}async function f(){if(!(!i.value||l.value))return l.value=await u.mediaDevices.getUserMedia({video:c(a),audio:c(s)}),l.value}async function v(){var g;(g=l.value)==null||g.getTracks().forEach(_=>_.stop()),l.value=void 0}function d(){v(),r.value=!1}async function m(){return await f(),l.value&&(r.value=!0),l.value}async function h(){return v(),await m()}return D(r,g=>{g?f():v()},{immediate:!0}),D([a,s],()=>{o.value&&l.value&&h()},{immediate:!0}),{isSupported:i,stream:l,start:m,stop:d,restart:h,videoDeviceId:a,audioDeviceId:s,enabled:r,autoSwitch:o}}function to(e,t,n,r={}){var o,a,s;const{clone:u=!1,passive:i=!1,eventName:l,deep:c=!1,defaultValue:f}=r,v=fe(),d=n||(v==null?void 0:v.emit)||((o=v==null?void 0:v.$emit)==null?void 0:o.bind(v))||((s=(a=v==null?void 0:v.proxy)==null?void 0:a.$emit)==null?void 0:s.bind(v==null?void 0:v.proxy));let m=l;t||(t="modelValue"),m=l||m||`update:${t.toString()}`;const h=_=>u?oe(u)?u(_):Ie(_):_,g=()=>Ne(e[t])?h(e[t]):f;if(i){const _=g(),y=p(_);return D(()=>e[t],w=>y.value=h(w)),D(y,w=>{(w!==e[t]||c)&&d(m,w)},{deep:c}),y}else return S({get(){return g()},set(_){d(m,_)}})}function Hc(e,t,n={}){const r={};for(const o in e)r[o]=to(e,o,t,n);return r}function zc(e){const{pattern:t=[],interval:n=0,navigator:r=te}=e||{},o=M(()=>typeof r!="undefined"&&"vibrate"in r),a=re(t);let s;const u=(l=a.value)=>{o.value&&r.vibrate(l)},i=()=>{o.value&&r.vibrate(0),s==null||s.pause()};return n>0&&(s=de(u,n,{immediate:!1,immediateCallback:!1})),{isSupported:o,pattern:t,intervalControls:s,vibrate:u,stop:i}}function Gc(e,t){const n=p(),r=Hr(n),o=p([]),a=G(e),s=p({start:0,end:10}),{itemHeight:u,overscan:i=5}=t,l=y=>{if(typeof u=="number")return Math.ceil(y/u);const{start:w=0}=s.value;let $=0,b=0;for(let E=w;E=y){b=E;break}return b-w},c=y=>{if(typeof u=="number")return Math.floor(y/u)+1;let w=0,$=0;for(let b=0;b=y){$=b;break}return $+1},f=()=>{const y=n.value;if(y){const w=c(y.scrollTop),$=l(y.clientHeight),b=w-i,E=w+$+i;s.value={start:b<0?0:b,end:E>a.value.length?a.value.length:E},o.value=a.value.slice(s.value.start,s.value.end).map((x,I)=>({data:x,index:I+s.value.start}))}};D([r.width,r.height,e],()=>{f()});const v=S(()=>typeof u=="number"?a.value.length*u:a.value.reduce((y,w,$)=>y+u($),0)),d=y=>typeof u=="number"?y*u:a.value.slice(0,y).reduce(($,b,E)=>$+u(E),0),m=y=>{n.value&&(n.value.scrollTop=d(y),f())},h=S(()=>d(s.value.start)),g=S(()=>({style:{width:"100%",height:`${v.value-h.value}px`,marginTop:`${h.value}px`}}));return{list:o,scrollTo:m,containerProps:{ref:n,onScroll:()=>{f()},style:{overflowY:"auto"}},wrapperProps:g}}const qc=(e={})=>{const{navigator:t=te,document:n=ee}=e;let r;const o=M(()=>t&&"wakeLock"in t),a=p(!1);async function s(){!o.value||!r||(n&&n.visibilityState==="visible"&&(r=await t.wakeLock.request("screen")),a.value=!r.released)}n&&O(n,"visibilitychange",s,{passive:!0});async function u(l){!o.value||(r=await t.wakeLock.request(l),a.value=!r.released)}async function i(){!o.value||!r||(await r.release(),a.value=!r.released,r=null)}return{isSupported:o,isActive:a,request:u,release:i}},Xc=(e={})=>{const{window:t=j}=e,n=M(()=>!!t&&"Notification"in t),r=p(null),o=async()=>{!n.value||"permission"in Notification&&Notification.permission!=="denied"&&await Notification.requestPermission()},a=z(),s=z(),u=z(),i=z(),l=async f=>{if(!n.value)return;await o();const v=Object.assign({},e,f);return r.value=new Notification(v.title||"",v),r.value.onclick=d=>a.trigger(d),r.value.onshow=d=>s.trigger(d),r.value.onerror=d=>u.trigger(d),r.value.onclose=d=>i.trigger(d),r.value},c=()=>{r.value&&r.value.close(),r.value=null};if(Z(async()=>{n.value&&await o()}),N(c),n.value&&t){const f=t.document;O(f,"visibilitychange",v=>{v.preventDefault(),f.visibilityState==="visible"&&c()})}return{isSupported:n,notification:r,show:l,close:c,onClick:a,onShow:s,onError:u,onClose:i}},sr="ping";function at(e){return e===!0?{}:e}function Yc(e,t={}){const{onConnected:n,onDisconnected:r,onError:o,onMessage:a,immediate:s=!0,autoClose:u=!0,protocols:i=[]}=t,l=p(null),c=p("CLOSED"),f=p();let v,d,m=!1,h=0,g=[],_;const y=(I=1e3,A)=>{!f.value||(m=!0,v==null||v(),f.value.close(I,A))},w=()=>{if(g.length&&f.value&&c.value==="OPEN"){for(const I of g)f.value.send(I);g=[]}},$=()=>{clearTimeout(_)},b=(I,A=!0)=>!f.value||c.value!=="OPEN"?(A&&g.push(I),!1):(w(),f.value.send(I),!0),E=()=>{const I=new WebSocket(e,i);f.value=I,c.value="CONNECTING",m=!1,I.onopen=()=>{c.value="OPEN",n==null||n(I),d==null||d(),w()},I.onclose=A=>{if(c.value="CLOSED",f.value=void 0,r==null||r(I,A),!m&&t.autoReconnect){const{retries:T=-1,delay:F=1e3,onFailed:R}=at(t.autoReconnect);h+=1,typeof T=="number"&&(T<0||h{o==null||o(I,A)},I.onmessage=A=>{if($(),t.heartbeat){const{message:T=sr}=at(t.heartbeat);if(A.data===T)return}l.value=A.data,a==null||a(I,A)}};if(t.heartbeat){const{message:I=sr,interval:A=1e3,pongTimeout:T=1e3}=at(t.heartbeat),{pause:F,resume:R}=de(()=>{b(I,!1),_=setTimeout(()=>{y()},T)},A,{immediate:!1});v=F,d=R}return s&&E(),u&&(O(window,"beforeunload",()=>y()),N(y)),{data:l,status:c,close:y,send:b,open:()=>{y(),h=0,E()},ws:f}}function Kc(e,t,n={}){const{window:r=j}=n,o=p(null),a=G(),s=function(l){!a.value||a.value.postMessage(l)},u=function(){!a.value||a.value.terminate()};return r&&(a.value=new Worker(e,t),a.value.onmessage=i=>{o.value=i.data},N(()=>{a.value&&a.value.terminate()})),{data:o,post:s,terminate:u,worker:a}}const Jc=e=>t=>{const n=t.data[0];return Promise.resolve(e.apply(void 0,n)).then(r=>{postMessage(["SUCCESS",r])}).catch(r=>{postMessage(["ERROR",r])})},Qc=e=>e.length===0?"":`importScripts(${e.map(n=>`'${n}'`).toString()})`,Zc=(e,t)=>{const n=`${Qc(t)}; onmessage=(${Jc})(${e})`,r=new Blob([n],{type:"text/javascript"});return URL.createObjectURL(r)},ef=(e,t={})=>{const{dependencies:n=[],timeout:r,window:o=j}=t,a=p(),s=p("PENDING"),u=p({}),i=p(),l=(d="PENDING")=>{a.value&&a.value._url&&o&&(a.value.terminate(),URL.revokeObjectURL(a.value._url),u.value={},a.value=void 0,o.clearTimeout(i.value),s.value=d)};l(),N(l);const c=()=>{const d=Zc(e,n),m=new Worker(d);return m._url=d,m.onmessage=h=>{const{resolve:g=()=>{},reject:_=()=>{}}=u.value,[y,w]=h.data;switch(y){case"SUCCESS":g(w),l(y);break;default:_(w),l("ERROR");break}},m.onerror=h=>{const{reject:g=()=>{}}=u.value;g(h),l("ERROR")},r&&(i.value=setTimeout(()=>l("TIMEOUT_EXPIRED"),r)),m},f=(...d)=>new Promise((m,h)=>{u.value={resolve:m,reject:h},a.value&&a.value.postMessage([[...d]]),s.value="RUNNING"});return{workerFn:(...d)=>s.value==="RUNNING"?(console.error("[useWebWorkerFn] You can only run one instance of the worker at a time."),Promise.reject()):(a.value=c(),f(...d)),workerStatus:s,workerTerminate:l}};function tf({window:e=j}={}){if(!e)return p(!1);const t=p(e.document.hasFocus());return O(e,"blur",()=>{t.value=!1}),O(e,"focus",()=>{t.value=!0}),t}function nf({window:e=j}={}){if(!e)return{x:p(0),y:p(0)};const t=p(e.pageXOffset),n=p(e.pageYOffset);return O("scroll",()=>{t.value=e.pageXOffset,n.value=e.pageYOffset},{capture:!1,passive:!0}),{x:t,y:n}}function rf(e={}){const{window:t=j,initialWidth:n=1/0,initialHeight:r=1/0,listenOrientation:o=!0,includeScrollbar:a=!0}=e,s=p(n),u=p(r),i=()=>{t&&(a?(s.value=t.innerWidth,u.value=t.innerHeight):(s.value=t.document.documentElement.clientWidth,u.value=t.document.documentElement.clientHeight))};return i(),Z(i),O("resize",i,{passive:!0}),o&&O("orientationchange",i,{passive:!0}),{width:s,height:u}}var sf=Object.freeze({__proto__:null,[Symbol.toStringTag]:"Module",DefaultMagicKeysAliasMap:qr,StorageSerializers:_t,get SwipeDirection(){return J},TransitionPresets:Lc,asyncComputed:Kt,breakpointsAntDesign:Bu,breakpointsBootstrapV5:Vu,breakpointsQuasar:Uu,breakpointsSematic:Hu,breakpointsTailwind:Lu,breakpointsVuetify:Wu,cloneFnJSON:Ie,computedAsync:Kt,computedInject:pu,createFetch:Pi,createUnrefFn:mu,defaultDocument:ee,defaultLocation:hu,defaultNavigator:te,defaultWindow:j,getSSRHandler:Ke,mapGamepadToXbox360Controller:ki,onClickOutside:gu,onKeyDown:Su,onKeyPressed:$u,onKeyStroke:Ye,onKeyUp:Eu,onLongPress:Tu,onStartTyping:Fu,setSSRHandler:is,templateRef:ju,unrefElement:V,useActiveElement:yt,useAsyncQueue:Au,useAsyncState:Nr,useBase64:Ru,useBattery:Mu,useBluetooth:ku,useBreakpoints:Yu,useBroadcastChannel:Ku,useBrowserLocation:Ju,useCached:Qu,useClipboard:Zu,useCloned:ss,useColorMode:Lr,useConfirmDialog:hs,useCssVar:Pe,useCurrentElement:gs,useCycleList:ys,useDark:Es,useDebouncedRefHistory:Ws,useDeviceMotion:Bs,useDeviceOrientation:Br,useDevicePixelRatio:Us,useDevicesList:Hs,useDisplayMedia:zs,useDocumentVisibility:Gs,useDraggable:ei,useDropZone:ti,useElementBounding:ai,useElementByPoint:ci,useElementHover:fi,useElementSize:Hr,useElementVisibility:vi,useEventBus:di,useEventListener:O,useEventSource:pi,useEyeDropper:mi,useFavicon:hi,useFetch:zr,useFileDialog:Di,useFileSystemAccess:Ai,useFocus:Ci,useFocusWithin:Ri,useFps:Ni,useFullscreen:Mi,useGamepad:Li,useGeolocation:Vi,useIdle:Ui,useImage:Yi,useInfiniteScroll:nl,useIntersectionObserver:rl,useKeyModifier:al,useLocalStorage:ul,useMagicKeys:sl,useManualRefHistory:Wr,useMediaControls:dl,useMediaQuery:K,useMemoize:pl,useMemory:ml,useMounted:hl,useMouse:Xr,useMouseInElement:Yr,useMousePressed:gl,useMutationObserver:Pt,useNavigatorLanguage:Ol,useNetwork:Kr,useNow:Jr,useObjectUrl:El,useOffsetPagination:xl,useOnline:Tl,usePageLeave:Dl,useParallax:Il,usePermission:Ur,usePointer:Ll,usePointerSwipe:Bl,usePreferredColorScheme:Ul,usePreferredContrast:Hl,usePreferredDark:wt,usePreferredLanguages:zl,usePreferredReducedMotion:Gl,useRafFn:pe,useRefHistory:Ot,useResizeObserver:bt,useScreenOrientation:ql,useScreenSafeArea:Xl,useScriptTag:Yl,useScroll:Gr,useScrollLock:Jl,useSessionStorage:Ql,useShare:nc,useSpeechRecognition:rc,useSpeechSynthesis:oc,useStepper:ac,useStorage:Je,useStorageAsync:uc,useStyleTag:ic,useSupported:M,useSwipe:Vl,useTemplateRefsList:lc,useTextDirection:cc,useTextSelection:vc,useTextareaAutosize:dc,useThrottledRefHistory:wc,useTimeAgo:Ec,useTimeoutPoll:xc,useTimestamp:jc,useTitle:Ac,useTransition:Wc,useUrlSearchParams:Bc,useUserMedia:Uc,useVModel:to,useVModels:Hc,useVibrate:zc,useVirtualList:Gc,useWakeLock:qc,useWebNotification:Xc,useWebSocket:Yc,useWebWorker:Kc,useWebWorkerFn:ef,useWindowFocus:tf,useWindowScroll:nf,useWindowSize:rf,__onlyVue3:So,assert:_o,autoResetRef:jt,bypassFilter:Te,clamp:Me,computedEager:Tt,computedWithControl:Le,containsProp:hr,controlledComputed:Le,controlledRef:Wo,createEventHook:z,createFilterWrapper:ve,createGlobalState:xo,createInjectionState:To,createReactiveFn:st,createSharedComposable:Do,createSingletonPromise:mr,debounceFilter:qe,debouncedRef:Ze,debouncedWatch:Bt,directiveHooks:$o,eagerComputed:Tt,extendRef:_r,formatDate:Er,get:Io,hasOwn:pr,identity:dt,ignorableWatch:_e,increaseWithUnit:gr,invoke:Eo,isBoolean:wo,isClient:Q,isDef:Ne,isDefined:Fo,isFunction:oe,isIOS:ut,isNumber:ye,isObject:dr,isString:xe,isWindow:Oo,makeDestructurable:No,noop:L,normalizeDate:xr,now:bo,objectPick:yr,pausableFilter:vt,pausableWatch:Ue,promiseTimeout:ke,rand:Po,reactify:st,reactifyObject:Mo,reactiveComputed:Or,reactiveOmit:ko,reactivePick:Lo,refAutoReset:jt,refDebounced:Ze,refDefault:Vo,refThrottled:et,refWithControl:br,resolveRef:re,resolveUnref:P,set:Bo,syncRef:it,syncRefs:Uo,throttleFilter:De,throttledRef:et,throttledWatch:Gt,timestamp:ce,toReactive:wr,toRefs:mt,tryOnBeforeMount:Pr,tryOnBeforeUnmount:Jo,tryOnMounted:Z,tryOnScopeDispose:N,tryOnUnmounted:Sr,until:$r,useArrayEvery:Qo,useArrayFilter:Zo,useArrayFind:ea,useArrayFindIndex:ta,useArrayJoin:na,useArrayMap:ra,useArrayReduce:oa,useArraySome:aa,useCounter:ua,useDateFormat:la,useDebounce:Ze,useDebounceFn:Xe,useInterval:pa,useIntervalFn:de,useLastChanged:ma,useThrottle:et,useThrottleFn:pt,useTimeout:wa,useTimeoutFn:we,useToNumber:Oa,useToString:ba,useToggle:Pa,watchArray:Sa,watchAtMost:Fa,watchDebounced:Bt,watchIgnorable:_e,watchOnce:Ha,watchPausable:Ue,watchThrottled:Gt,watchTriggerable:cu,watchWithFilter:Oe,whenever:du});export{sf as V,ic as a,O as b,to as c,Hr as d,Hc as e,Jo as t,Yl as u,Bt as w}; diff --git a/public/exadmin/assets/a-color-picker.7e391635.js b/public/exadmin/assets/a-color-picker.7e391635.js new file mode 100644 index 0000000..5ac373f --- /dev/null +++ b/public/exadmin/assets/a-color-picker.7e391635.js @@ -0,0 +1,30 @@ +import{c as ae}from"./@babel.6cd0804c.js";var se={exports:{}};/*! + * a-color-picker (https://github.com/narsenico/a-color-picker) + * + * Copyright (c) 2017-2018, Gianfranco Caldi. + * Released under the MIT License. + */(function(Q,le){(function(H,o){Q.exports=o()})(typeof self!="undefined"?self:ae,function(){return function(H){var o={};function A(b){if(o[b])return o[b].exports;var g=o[b]={i:b,l:!1,exports:{}};return H[b].call(g.exports,g,g.exports,A),g.l=!0,g.exports}return A.m=H,A.c=o,A.d=function(b,g,n){A.o(b,g)||Object.defineProperty(b,g,{enumerable:!0,get:n})},A.r=function(b){typeof Symbol!="undefined"&&Symbol.toStringTag&&Object.defineProperty(b,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(b,"__esModule",{value:!0})},A.t=function(b,g){if(1&g&&(b=A(b)),8&g||4&g&&typeof b=="object"&&b&&b.__esModule)return b;var n=Object.create(null);if(A.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:b}),2&g&&typeof b!="string")for(var B in b)A.d(n,B,function(f){return b[f]}.bind(null,B));return n},A.n=function(b){var g=b&&b.__esModule?function(){return b.default}:function(){return b};return A.d(g,"a",g),g},A.o=function(b,g){return Object.prototype.hasOwnProperty.call(b,g)},A.p="",A(A.s=1)}([function(H,o,A){/*! +* is-plain-object +* +* Copyright (c) 2014-2017, Jon Schlinkert. +* Released under the MIT License. +*/var b=A(3);function g(n){return b(n)===!0&&Object.prototype.toString.call(n)==="[object Object]"}H.exports=function(n){var B,f;return g(n)!==!1&&typeof(B=n.constructor)=="function"&&g(f=B.prototype)!==!1&&f.hasOwnProperty("isPrototypeOf")!==!1}},function(H,o,A){Object.defineProperty(o,"__esModule",{value:!0}),o.VERSION=o.PALETTE_MATERIAL_CHROME=o.PALETTE_MATERIAL_500=o.COLOR_NAMES=o.getLuminance=o.intToRgb=o.rgbToInt=o.rgbToHsv=o.rgbToHsl=o.hslToRgb=o.rgbToHex=o.parseColor=o.parseColorToHsla=o.parseColorToHsl=o.parseColorToRgba=o.parseColorToRgb=o.from=o.createPicker=void 0;var b=function(){function l(t,e){for(var r=0;r-1,T=typeof window!="undefined"&&window.navigator.userAgent.indexOf("rv:")>-1,C={id:null,attachTo:"body",showHSL:!0,showRGB:!0,showHEX:!0,showAlpha:!1,color:"#ff0000",palette:null,paletteEditable:!1,useAlphaInPalette:"auto",slBarSize:[232,150],hueBarSize:[150,11],alphaBarSize:[150,11]},w="COLOR",I="RGBA_USER",P="HSLA_USER";function D(l,t,e){return l?l instanceof HTMLElement?l:l instanceof NodeList?l[0]:typeof l=="string"?document.querySelector(l):l.jquery?l.get(0):e?t:null:t}function M(l){var t=l.getContext("2d"),e=+l.width,r=+l.height,p=t.createLinearGradient(1,1,1,r-1);return p.addColorStop(0,"white"),p.addColorStop(1,"black"),{setHue:function(c){var d=t.createLinearGradient(1,0,e-1,0);d.addColorStop(0,"hsla("+c+", 100%, 50%, 0)"),d.addColorStop(1,"hsla("+c+", 100%, 50%, 1)"),t.fillStyle=p,t.fillRect(0,0,e,r),t.fillStyle=d,t.globalCompositeOperation="multiply",t.fillRect(0,0,e,r),t.globalCompositeOperation="source-over"},grabColor:function(c,d){return t.getImageData(c,d,1,1).data},findColor:function(c,d,s){var a=(0,n.rgbToHsv)(c,d,s),m=g(a,3),y=m[1],k=m[2];return[y*e,r-k*r]}}}function x(l,t,e){return l===null?t:/^\s*$/.test(l)?e:!!/true|yes|1/i.test(l)||!/false|no|0/i.test(l)&&t}function _(l,t,e){if(l===null)return t;if(/^\s*$/.test(l))return e;var r=l.split(",").map(Number);return r.length===2&&r[0]&&r[1]?r:t}var O=function(){function l(t,e){if(F(this,l),e?(t=D(t),this.options=Object.assign({},C,e)):t&&(0,B.default)(t)?(this.options=Object.assign({},C,t),t=D(this.options.attachTo)):(this.options=Object.assign({},C),t=D((0,n.nvl)(t,this.options.attachTo))),!t)throw new Error("Container not found: "+this.options.attachTo);(function(c,d){var s=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"acp-";if(d.hasAttribute(s+"show-hsl")&&(c.showHSL=x(d.getAttribute(s+"show-hsl"),C.showHSL,!0)),d.hasAttribute(s+"show-rgb")&&(c.showRGB=x(d.getAttribute(s+"show-rgb"),C.showRGB,!0)),d.hasAttribute(s+"show-hex")&&(c.showHEX=x(d.getAttribute(s+"show-hex"),C.showHEX,!0)),d.hasAttribute(s+"show-alpha")&&(c.showAlpha=x(d.getAttribute(s+"show-alpha"),C.showAlpha,!0)),d.hasAttribute(s+"palette-editable")&&(c.paletteEditable=x(d.getAttribute(s+"palette-editable"),C.paletteEditable,!0)),d.hasAttribute(s+"sl-bar-size")&&(c.slBarSize=_(d.getAttribute(s+"sl-bar-size"),C.slBarSize,[232,150])),d.hasAttribute(s+"hue-bar-size")&&(c.hueBarSize=_(d.getAttribute(s+"hue-bar-size"),C.hueBarSize,[150,11]),c.alphaBarSize=c.hueBarSize),d.hasAttribute(s+"palette")){var a=d.getAttribute(s+"palette");switch(a){case"PALETTE_MATERIAL_500":c.palette=n.PALETTE_MATERIAL_500;break;case"PALETTE_MATERIAL_CHROME":case"":c.palette=n.PALETTE_MATERIAL_CHROME;break;default:c.palette=a.split(/[;|]/)}}d.hasAttribute(s+"color")&&(c.color=d.getAttribute(s+"color"))})(this.options,t),this.H=0,this.S=0,this.L=0,this.R=0,this.G=0,this.B=0,this.A=1,this.palette={},this.element=document.createElement("div"),this.options.id&&(this.element.id=this.options.id),this.element.className="a-color-picker",this.element.innerHTML=f.default,t.appendChild(this.element);var r=this.element.querySelector(".a-color-picker-h");this.setupHueCanvas(r),this.hueBarHelper=M(r),this.huePointer=this.element.querySelector(".a-color-picker-h+.a-color-picker-dot");var p=this.element.querySelector(".a-color-picker-sl");this.setupSlCanvas(p),this.slBarHelper=M(p),this.slPointer=this.element.querySelector(".a-color-picker-sl+.a-color-picker-dot"),this.preview=this.element.querySelector(".a-color-picker-preview"),this.setupClipboard(this.preview.querySelector(".a-color-picker-clipbaord")),this.options.showHSL?(this.setupInput(this.inputH=this.element.querySelector(".a-color-picker-hsl>input[nameref=H]")),this.setupInput(this.inputS=this.element.querySelector(".a-color-picker-hsl>input[nameref=S]")),this.setupInput(this.inputL=this.element.querySelector(".a-color-picker-hsl>input[nameref=L]"))):this.element.querySelector(".a-color-picker-hsl").remove(),this.options.showRGB?(this.setupInput(this.inputR=this.element.querySelector(".a-color-picker-rgb>input[nameref=R]")),this.setupInput(this.inputG=this.element.querySelector(".a-color-picker-rgb>input[nameref=G]")),this.setupInput(this.inputB=this.element.querySelector(".a-color-picker-rgb>input[nameref=B]"))):this.element.querySelector(".a-color-picker-rgb").remove(),this.options.showHEX?this.setupInput(this.inputRGBHEX=this.element.querySelector("input[nameref=RGBHEX]")):this.element.querySelector(".a-color-picker-rgbhex").remove(),this.options.paletteEditable||this.options.palette&&this.options.palette.length>0?this.setPalette(this.paletteRow=this.element.querySelector(".a-color-picker-palette")):(this.paletteRow=this.element.querySelector(".a-color-picker-palette"),this.paletteRow.remove()),this.options.showAlpha?(this.setupAlphaCanvas(this.element.querySelector(".a-color-picker-a")),this.alphaPointer=this.element.querySelector(".a-color-picker-a+.a-color-picker-dot")):this.element.querySelector(".a-color-picker-alpha").remove(),this.element.style.width=this.options.slBarSize[0]+"px",this.onValueChanged(w,this.options.color)}return b(l,[{key:"setupHueCanvas",value:function(t){var e=this;t.width=this.options.hueBarSize[0],t.height=this.options.hueBarSize[1];for(var r=t.getContext("2d"),p=r.createLinearGradient(0,0,this.options.hueBarSize[0],0),c=0;c<=1;c+=1/360)p.addColorStop(c,"hsl("+360*c+", 100%, 50%)");r.fillStyle=p,r.fillRect(0,0,this.options.hueBarSize[0],this.options.hueBarSize[1]);var d=function(a){var m=(0,n.limit)(a.clientX-t.getBoundingClientRect().left,0,e.options.hueBarSize[0]),y=Math.round(360*m/e.options.hueBarSize[0]);e.huePointer.style.left=m-7+"px",e.onValueChanged("H",y)},s=function a(){document.removeEventListener("mousemove",d),document.removeEventListener("mouseup",a)};t.addEventListener("mousedown",function(a){d(a),document.addEventListener("mousemove",d),document.addEventListener("mouseup",s)})}},{key:"setupSlCanvas",value:function(t){var e=this;t.width=this.options.slBarSize[0],t.height=this.options.slBarSize[1];var r=function(c){var d=(0,n.limit)(c.clientX-t.getBoundingClientRect().left,0,e.options.slBarSize[0]-1),s=(0,n.limit)(c.clientY-t.getBoundingClientRect().top,0,e.options.slBarSize[1]-1),a=e.slBarHelper.grabColor(d,s);e.slPointer.style.left=d-7+"px",e.slPointer.style.top=s-7+"px",e.onValueChanged("RGB",a)},p=function c(){document.removeEventListener("mousemove",r),document.removeEventListener("mouseup",c)};t.addEventListener("mousedown",function(c){r(c),document.addEventListener("mousemove",r),document.addEventListener("mouseup",p)})}},{key:"setupAlphaCanvas",value:function(t){var e=this;t.width=this.options.alphaBarSize[0],t.height=this.options.alphaBarSize[1];var r=t.getContext("2d"),p=r.createLinearGradient(0,0,t.width-1,0);p.addColorStop(0,"hsla(0, 0%, 50%, 0)"),p.addColorStop(1,"hsla(0, 0%, 50%, 1)"),r.fillStyle=p,r.fillRect(0,0,this.options.alphaBarSize[0],this.options.alphaBarSize[1]);var c=function(s){var a=(0,n.limit)(s.clientX-t.getBoundingClientRect().left,0,e.options.alphaBarSize[0]),m=+(a/e.options.alphaBarSize[0]).toFixed(2);e.alphaPointer.style.left=a-7+"px",e.onValueChanged("ALPHA",m)},d=function s(){document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",s)};t.addEventListener("mousedown",function(s){c(s),document.addEventListener("mousemove",c),document.addEventListener("mouseup",d)})}},{key:"setupInput",value:function(t){var e=this,r=+t.min,p=+t.max,c=t.getAttribute("nameref");t.hasAttribute("select-on-focus")&&t.addEventListener("focus",function(){t.select()}),t.type==="text"?t.addEventListener("change",function(){e.onValueChanged(c,t.value)}):((L||T)&&t.addEventListener("keydown",function(d){d.key==="Up"?(t.value=(0,n.limit)(+t.value+1,r,p),e.onValueChanged(c,t.value),d.returnValue=!1):d.key==="Down"&&(t.value=(0,n.limit)(+t.value-1,r,p),e.onValueChanged(c,t.value),d.returnValue=!1)}),t.addEventListener("change",function(){var d=+t.value;e.onValueChanged(c,(0,n.limit)(d,r,p))}))}},{key:"setupClipboard",value:function(t){var e=this;t.title="click to copy",t.addEventListener("click",function(){t.value=(0,n.parseColor)([e.R,e.G,e.B,e.A],"hexcss4"),t.select(),document.execCommand("copy")})}},{key:"setPalette",value:function(t){var e=this,r=this.options.useAlphaInPalette==="auto"?this.options.showAlpha:this.options.useAlphaInPalette,p=null;switch(this.options.palette){case"PALETTE_MATERIAL_500":p=n.PALETTE_MATERIAL_500;break;case"PALETTE_MATERIAL_CHROME":p=n.PALETTE_MATERIAL_CHROME;break;default:p=(0,n.ensureArray)(this.options.palette)}if(this.options.paletteEditable||p.length>0){var c=function(a,m,y){var k=t.querySelector('.a-color-picker-palette-color[data-color="'+a+'"]')||document.createElement("div");k.className="a-color-picker-palette-color",k.style.backgroundColor=a,k.setAttribute("data-color",a),k.title=a,t.insertBefore(k,m),e.palette[a]=!0,y&&e.onPaletteColorAdd(a)},d=function(a,m){a?(t.removeChild(a),e.palette[a.getAttribute("data-color")]=!1,m&&e.onPaletteColorRemove(a.getAttribute("data-color"))):(t.querySelectorAll(".a-color-picker-palette-color[data-color]").forEach(function(y){t.removeChild(y)}),Object.keys(e.palette).forEach(function(y){e.palette[y]=!1}),m&&e.onPaletteColorRemove())};if(p.map(function(a){return(0,n.parseColor)(a,r?"rgbcss4":"hex")}).filter(function(a){return!!a}).forEach(function(a){return c(a)}),this.options.paletteEditable){var s=document.createElement("div");s.className="a-color-picker-palette-color a-color-picker-palette-add",s.innerHTML="+",t.appendChild(s),t.addEventListener("click",function(a){/a-color-picker-palette-add/.test(a.target.className)?a.shiftKey?d(null,!0):c(r?(0,n.parseColor)([e.R,e.G,e.B,e.A],"rgbcss4"):(0,n.rgbToHex)(e.R,e.G,e.B),a.target,!0):/a-color-picker-palette-color/.test(a.target.className)&&(a.shiftKey?d(a.target,!0):e.onValueChanged(w,a.target.getAttribute("data-color")))})}else t.addEventListener("click",function(a){/a-color-picker-palette-color/.test(a.target.className)&&e.onValueChanged(w,a.target.getAttribute("data-color"))})}else t.style.display="none"}},{key:"updatePalette",value:function(t){this.paletteRow.innerHTML="",this.palette={},this.paletteRow.parentElement||this.element.appendChild(this.paletteRow),this.options.palette=t,this.setPalette(this.paletteRow)}},{key:"onValueChanged",value:function(t,e){var r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{silent:!1};switch(t){case"H":this.H=e;var p=(0,n.hslToRgb)(this.H,this.S,this.L),c=g(p,3);this.R=c[0],this.G=c[1],this.B=c[2],this.slBarHelper.setHue(e),this.updatePointerH(this.H),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B);break;case"S":this.S=e;var d=(0,n.hslToRgb)(this.H,this.S,this.L),s=g(d,3);this.R=s[0],this.G=s[1],this.B=s[2],this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B);break;case"L":this.L=e;var a=(0,n.hslToRgb)(this.H,this.S,this.L),m=g(a,3);this.R=m[0],this.G=m[1],this.B=m[2],this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B);break;case"R":this.R=e;var y=(0,n.rgbToHsl)(this.R,this.G,this.B),k=g(y,3);this.H=k[0],this.S=k[1],this.L=k[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGBHEX(this.R,this.G,this.B);break;case"G":this.G=e;var E=(0,n.rgbToHsl)(this.R,this.G,this.B),S=g(E,3);this.H=S[0],this.S=S[1],this.L=S[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGBHEX(this.R,this.G,this.B);break;case"B":this.B=e;var W=(0,n.rgbToHsl)(this.R,this.G,this.B),X=g(W,3);this.H=X[0],this.S=X[1],this.L=X[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGBHEX(this.R,this.G,this.B);break;case"RGB":var V=g(e,3);this.R=V[0],this.G=V[1],this.B=V[2];var Z=(0,n.rgbToHsl)(this.R,this.G,this.B),N=g(Z,3);this.H=N[0],this.S=N[1],this.L=N[2],this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B);break;case I:var z=g(e,4);this.R=z[0],this.G=z[1],this.B=z[2],this.A=z[3];var ee=(0,n.rgbToHsl)(this.R,this.G,this.B),U=g(ee,3);this.H=U[0],this.S=U[1],this.L=U[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B),this.updatePointerA(this.A);break;case P:var q=g(e,4);this.H=q[0],this.S=q[1],this.L=q[2],this.A=q[3];var te=(0,n.hslToRgb)(this.H,this.S,this.L),$=g(te,3);this.R=$[0],this.G=$[1],this.B=$[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B),this.updatePointerA(this.A);break;case"RGBHEX":var ie=(0,n.cssColorToRgb)(e)||[this.R,this.G,this.B],K=g(ie,3);this.R=K[0],this.G=K[1],this.B=K[2];var re=(0,n.rgbToHsl)(this.R,this.G,this.B),J=g(re,3);this.H=J[0],this.S=J[1],this.L=J[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B);break;case w:var oe=(0,n.parseColor)(e,"rgba")||[0,0,0,1],j=g(oe,4);this.R=j[0],this.G=j[1],this.B=j[2],this.A=j[3];var ne=(0,n.rgbToHsl)(this.R,this.G,this.B),Y=g(ne,3);this.H=Y[0],this.S=Y[1],this.L=Y[2],this.slBarHelper.setHue(this.H),this.updatePointerH(this.H),this.updatePointerSL(this.H,this.S,this.L),this.updateInputHSL(this.H,this.S,this.L),this.updateInputRGB(this.R,this.G,this.B),this.updateInputRGBHEX(this.R,this.G,this.B),this.updatePointerA(this.A);break;case"ALPHA":this.A=e}this.A===1?this.preview.style.backgroundColor="rgb("+this.R+","+this.G+","+this.B+")":this.preview.style.backgroundColor="rgba("+this.R+","+this.G+","+this.B+","+this.A+")",r&&r.silent||this.onchange&&this.onchange(this.preview.style.backgroundColor)}},{key:"onPaletteColorAdd",value:function(t){this.oncoloradd&&this.oncoloradd(t)}},{key:"onPaletteColorRemove",value:function(t){this.oncolorremove&&this.oncolorremove(t)}},{key:"updateInputHSL",value:function(t,e,r){this.options.showHSL&&(this.inputH.value=t,this.inputS.value=e,this.inputL.value=r)}},{key:"updateInputRGB",value:function(t,e,r){this.options.showRGB&&(this.inputR.value=t,this.inputG.value=e,this.inputB.value=r)}},{key:"updateInputRGBHEX",value:function(t,e,r){this.options.showHEX&&(this.inputRGBHEX.value=(0,n.rgbToHex)(t,e,r))}},{key:"updatePointerH",value:function(t){var e=this.options.hueBarSize[0]*t/360;this.huePointer.style.left=e-7+"px"}},{key:"updatePointerSL",value:function(t,e,r){var p=(0,n.hslToRgb)(t,e,r),c=g(p,3),d=c[0],s=c[1],a=c[2],m=this.slBarHelper.findColor(d,s,a),y=g(m,2),k=y[0],E=y[1];k>=0&&(this.slPointer.style.left=k-7+"px",this.slPointer.style.top=E-7+"px")}},{key:"updatePointerA",value:function(t){if(this.options.showAlpha){var e=this.options.alphaBarSize[0]*t;this.alphaPointer.style.left=e-7+"px"}}}]),l}(),i=function(){function l(t){F(this,l),this.name=t,this.listeners=[]}return b(l,[{key:"on",value:function(t){t&&this.listeners.push(t)}},{key:"off",value:function(t){this.listeners=t?this.listeners.filter(function(e){return e!==t}):[]}},{key:"emit",value:function(t,e){for(var r=this.listeners.slice(0),p=0;p1&&arguments[1]!==void 0&&arguments[1];e.onValueChanged(w,s,{silent:a})},get all(){if(p){var s=[e.R,e.G,e.B,e.A],a=e.A<1?"rgba("+e.R+","+e.G+","+e.B+","+e.A+")":n.rgbToHex.apply(void 0,s);(c=(0,n.parseColor)(s,c)).toString=function(){return a},p=!1}return Object.assign({},c)},get onchange(){return r.change&&r.change.listeners[0]},set onchange(s){this.off("change").on("change",s)},get oncoloradd(){return r.coloradd&&r.coloradd.listeners[0]},set oncoloradd(s){this.off("coloradd").on("coloradd",s)},get oncolorremove(){return r.colorremove&&r.colorremove.listeners[0]},set oncolorremove(s){this.off("colorremove").on("colorremove",s)},get palette(){return Object.keys(e.palette).filter(function(s){return e.palette[s]})},set palette(s){e.updatePalette(s)},show:function(){e.element.classList.remove("hidden")},hide:function(){e.element.classList.add("hidden")},toggle:function(){e.element.classList.toggle("hidden")},on:function(s,a){return s&&r[s]&&r[s].on(a),this},off:function(s,a){return s&&r[s]&&r[s].off(a),this},destroy:function(){r.change.off(),r.coloradd.off(),r.colorremove.off(),e.element.remove(),r=null,e=null}};return e.onchange=function(){for(var s=arguments.length,a=Array(s),m=0;mstyle[data-source="a-color-picker"]')){var u=A(5).toString(),v=document.createElement("style");v.setAttribute("type","text/css"),v.setAttribute("data-source","a-color-picker"),v.innerHTML=u,document.querySelector("head").appendChild(v)}o.createPicker=h,o.from=function(l,t){var e=function(r){return r?Array.isArray(r)?r:r instanceof HTMLElement?[r]:r instanceof NodeList?[].concat(G(r)):typeof r=="string"?[].concat(G(document.querySelectorAll(r))):r.jquery?r.get():[]:[]}(l).map(function(r,p){var c=h(r,t);return c.index=p,c});return e.on=function(r,p){return e.forEach(function(c){return c.on(r,p)}),this},e.off=function(r){return e.forEach(function(p){return p.off(r)}),this},e},o.parseColorToRgb=n.parseColorToRgb,o.parseColorToRgba=n.parseColorToRgba,o.parseColorToHsl=n.parseColorToHsl,o.parseColorToHsla=n.parseColorToHsla,o.parseColor=n.parseColor,o.rgbToHex=n.rgbToHex,o.hslToRgb=n.hslToRgb,o.rgbToHsl=n.rgbToHsl,o.rgbToHsv=n.rgbToHsv,o.rgbToInt=n.rgbToInt,o.intToRgb=n.intToRgb,o.getLuminance=n.getLuminance,o.COLOR_NAMES=n.COLOR_NAMES,o.PALETTE_MATERIAL_500=n.PALETTE_MATERIAL_500,o.PALETTE_MATERIAL_CHROME=n.PALETTE_MATERIAL_CHROME,o.VERSION="1.2.1"},function(H,o,A){Object.defineProperty(o,"__esModule",{value:!0}),o.nvl=o.ensureArray=o.limit=o.getLuminance=o.parseColor=o.parseColorToHsla=o.parseColorToHsl=o.cssHslaToHsla=o.cssHslToHsl=o.parseColorToRgba=o.parseColorToRgb=o.cssRgbaToRgba=o.cssRgbToRgb=o.cssColorToRgba=o.cssColorToRgb=o.intToRgb=o.rgbToInt=o.rgbToHsv=o.rgbToHsl=o.hslToRgb=o.rgbToHex=o.PALETTE_MATERIAL_CHROME=o.PALETTE_MATERIAL_500=o.COLOR_NAMES=void 0;var b=function(i,h){if(Array.isArray(i))return i;if(Symbol.iterator in Object(i))return function(u,v){var l=[],t=!0,e=!1,r=void 0;try{for(var p,c=u[Symbol.iterator]();!(t=(p=c.next()).done)&&(l.push(p.value),!v||l.length!==v);t=!0);}catch(d){e=!0,r=d}finally{try{!t&&c.return&&c.return()}finally{if(e)throw r}}return l}(i,h);throw new TypeError("Invalid attempt to destructure non-iterable instance")},g=function(i){return i&&i.__esModule?i:{default:i}}(A(0));function n(i){if(Array.isArray(i)){for(var h=0,u=Array(i.length);hu?u:i}function R(i,h){return i==null?h:i}function F(i,h,u){var v=[f(i,0,255),f(h,0,255),f(u,0,255)];return"#"+("000000"+((i=v[0])<<16|(h=v[1])<<8|(u=v[2])).toString(16)).slice(-6)}function G(i,h,u){var v=void 0,l=void 0,t=void 0,e=[f(i,0,360)/360,f(h,0,100)/100,f(u,0,100)/100];if(i=e[0],u=e[2],(h=e[1])==0)v=l=t=u;else{var r=function(d,s,a){return a<0&&(a+=1),a>1&&(a-=1),a<.16666666666666666?d+6*(s-d)*a:a<.5?s:a<.6666666666666666?d+(s-d)*(.6666666666666666-a)*6:d},p=u<.5?u*(1+h):u+h-u*h,c=2*u-p;v=r(c,p,i+1/3),l=r(c,p,i),t=r(c,p,i-1/3)}return[255*v,255*l,255*t].map(Math.round)}function L(i,h,u){var v=[f(i,0,255)/255,f(h,0,255)/255,f(u,0,255)/255];i=v[0],h=v[1],u=v[2];var l=Math.max(i,h,u),t=Math.min(i,h,u),e=void 0,r=void 0,p=(l+t)/2;if(l==t)e=r=0;else{var c=l-t;switch(r=p>.5?c/(2-l-t):c/(l+t),l){case i:e=(h-u)/c+(h>16&255,i>>8&255,255&i]},o.cssColorToRgb=C,o.cssColorToRgba=w,o.cssRgbToRgb=I,o.cssRgbaToRgba=P,o.parseColorToRgb=function(i){return Array.isArray(i)?i=[f(i[0],0,255),f(i[1],0,255),f(i[2],0,255)]:C(i)||I(i)},o.parseColorToRgba=D,o.cssHslToHsl=M,o.cssHslaToHsla=x,o.parseColorToHsl=function(i){return Array.isArray(i)?i=[f(i[0],0,360),f(i[1],0,100),f(i[2],0,100)]:M(i)},o.parseColorToHsla=_,o.parseColor=function(i,h){if(h=h||"rgb",i!=null){var u=void 0;if((u=D(i))||(u=_(i))&&(u=[].concat(n(G.apply(void 0,n(u))),[u[3]])))return(0,g.default)(h)?["rgb","rgbcss","rgbcss4","rgba","rgbacss","hsl","hslcss","hslcss4","hsla","hslacss","hex","hexcss4","int"].reduce(function(v,l){return v[l]=O(u,l),v},h||{}):O(u,h.toString().toLowerCase())}},o.getLuminance=function(i,h,u){return .2126*(i=(i/=255)<.03928?i/12.92:Math.pow((i+.055)/1.055,2.4))+.7152*(h=(h/=255)<.03928?h/12.92:Math.pow((h+.055)/1.055,2.4))+.0722*((u/=255)<.03928?u/12.92:Math.pow((u+.055)/1.055,2.4))},o.limit=f,o.ensureArray=function(i){return i?Array.from(i):[]},o.nvl=R},function(H,o,A){/*! +* isobject +* +* Copyright (c) 2014-2017, Jon Schlinkert. +* Released under the MIT License. +*/H.exports=function(b){return b!=null&&typeof b=="object"&&Array.isArray(b)===!1}},function(H,o){H.exports='
    '},function(H,o,A){var b=A(6);H.exports=typeof b=="string"?b:b.toString()},function(H,o,A){(H.exports=A(7)(!1)).push([H.i,`/*! + * a-color-picker + * https://github.com/narsenico/a-color-picker + * + * Copyright (c) 2017-2018, Gianfranco Caldi. + * Released under the MIT License. + */.a-color-picker{background-color:#fff;padding:0;display:inline-flex;flex-direction:column;user-select:none;width:232px;font:400 10px Helvetica,Arial,sans-serif;border-radius:3px;box-shadow:0 0 0 1px rgba(0,0,0,.05),0 2px 4px rgba(0,0,0,.25)}.a-color-picker,.a-color-picker-row,.a-color-picker input{box-sizing:border-box}.a-color-picker-row{padding:15px;display:flex;flex-direction:row;align-items:center;justify-content:space-between;user-select:none}.a-color-picker-row-top{padding:0}.a-color-picker-row:not(:first-child){border-top:1px solid #f5f5f5}.a-color-picker-column{display:flex;flex-direction:column}.a-color-picker-cell{flex:1 1 auto;margin-bottom:4px}.a-color-picker-cell:last-child{margin-bottom:0}.a-color-picker-stack{position:relative}.a-color-picker-dot{position:absolute;width:14px;height:14px;top:0;left:0;background:#fff;pointer-events:none;border-radius:50px;z-index:1000;box-shadow:0 1px 2px rgba(0,0,0,.75)}.a-color-picker-a,.a-color-picker-h,.a-color-picker-sl{cursor:cell}.a-color-picker-a+.a-color-picker-dot,.a-color-picker-h+.a-color-picker-dot{top:-2px}.a-color-picker-a,.a-color-picker-h{border-radius:2px}.a-color-picker-preview{box-sizing:border-box;width:30px;height:30px;user-select:none;border-radius:15px}.a-color-picker-circle{border-radius:50px;border:1px solid #eee}.a-color-picker-hsl,.a-color-picker-rgb,.a-color-picker-single-input{justify-content:space-evenly}.a-color-picker-hsl>label,.a-color-picker-rgb>label,.a-color-picker-single-input>label{padding:0 8px;flex:0 0 auto;color:#969696}.a-color-picker-hsl>input,.a-color-picker-rgb>input,.a-color-picker-single-input>input{text-align:center;padding:2px 0;width:0;flex:1 1 auto;border:1px solid #e0e0e0;line-height:20px}.a-color-picker-hsl>input::-webkit-inner-spin-button,.a-color-picker-rgb>input::-webkit-inner-spin-button,.a-color-picker-single-input>input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.a-color-picker-hsl>input:focus,.a-color-picker-rgb>input:focus,.a-color-picker-single-input>input:focus{border-color:#04a9f4;outline:none}.a-color-picker-transparent{background-image:linear-gradient(-45deg,#cdcdcd 25%,transparent 0),linear-gradient(45deg,#cdcdcd 25%,transparent 0),linear-gradient(-45deg,transparent 75%,#cdcdcd 0),linear-gradient(45deg,transparent 75%,#cdcdcd 0);background-size:11px 11px;background-position:0 0,0 -5.5px,-5.5px 5.5px,5.5px 0}.a-color-picker-sl{border-radius:3px 3px 0 0}.a-color-picker.hide-alpha [show-on-alpha],.a-color-picker.hide-hsl [show-on-hsl],.a-color-picker.hide-rgb [show-on-rgb],.a-color-picker.hide-single-input [show-on-single-input]{display:none}.a-color-picker-clipbaord{width:100%;height:100%;opacity:0;cursor:pointer}.a-color-picker-palette{flex-flow:wrap;flex-direction:row;justify-content:flex-start;padding:10px}.a-color-picker-palette-color{width:15px;height:15px;flex:0 1 15px;margin:3px;box-sizing:border-box;cursor:pointer;border-radius:3px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.1)}.a-color-picker-palette-add{text-align:center;line-height:13px;color:#607d8b}.a-color-picker.hidden{display:none}`,""])},function(H,o){H.exports=function(A){var b=[];return b.toString=function(){return this.map(function(g){var n=function(B,f){var R=B[1]||"",F=B[3];if(!F)return R;if(f&&typeof btoa=="function"){var G=function(T){return"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(T))))+" */"}(F),L=F.sources.map(function(T){return"/*# sourceURL="+F.sourceRoot+T+" */"});return[R].concat(L).concat([G]).join(` +`)}return[R].join(` +`)}(g,A);return g[2]?"@media "+g[2]+"{"+n+"}":n}).join("")},b.i=function(g,n){typeof g=="string"&&(g=[[null,g,""]]);for(var B={},f=0;f + + +`).concat(d,` +`),m&&(S+="".concat(m,` +`)),S+=` +`,b.content=S,b.mime="xml",b.successStatuses=[200],y.next=9,this.request(b);case 9:return v=y.sent,y.abrupt("return",{res:v.res});case 11:case"end":return y.stop()}},f,this)}));function p(f,d,m){return o.apply(this,arguments)}return p}(),t.getBucketLogging=function(){var o=(0,u.default)(r.default.mark(function f(d,m){var h,b,S;return r.default.wrap(function(j){for(;;)switch(j.prev=j.next){case 0:return h=this._bucketRequestParams("GET",d,"logging",m),h.successStatuses=[200],h.xmlResponse=!0,j.next=5,this.request(h);case 5:return b=j.sent,S=b.data.LoggingEnabled,j.abrupt("return",{enable:!!S,prefix:S&&S.TargetPrefix||null,res:b.res});case 8:case"end":return j.stop()}},f,this)}));function p(f,d){return o.apply(this,arguments)}return p}(),t.deleteBucketLogging=function(){var o=(0,u.default)(r.default.mark(function f(d,m){var h,b;return r.default.wrap(function(v){for(;;)switch(v.prev=v.next){case 0:return h=this._bucketRequestParams("DELETE",d,"logging",m),h.successStatuses=[204,200],v.next=4,this.request(h);case 4:return b=v.sent,v.abrupt("return",{res:b.res});case 6:case"end":return v.stop()}},f,this)}));function p(f,d){return o.apply(this,arguments)}return p}(),t.putBucketCORS=function(){var o=(0,u.default)(r.default.mark(function f(d,m,h){var b,S,v,j,y,x,O,A,E,_;return r.default.wrap(function(k){for(;;)switch(k.prev=k.next){case 0:for(m=m||[],l(m.length,"rules is required"),m.forEach(function(F){l(F.allowedOrigin,"allowedOrigin is required"),l(F.allowedMethod,"allowedMethod is required")}),b=this._bucketRequestParams("PUT",d,"cors",h),S=` +`,v=function(W){S+="".concat(W,"")},j=function(W){S+="".concat(W,"")},y=function(W){S+="".concat(W,"")},x=function(W){S+="".concat(W,"")},O=0,A=m.length;O",n(E.allowedOrigin).forEach(v),n(E.allowedMethod).forEach(j),n(E.allowedHeader).forEach(y),n(E.exposeHeader).forEach(x),E.maxAgeSeconds&&(S+="".concat(E.maxAgeSeconds,"")),S+="";return S+="",b.content=S,b.mime="xml",b.successStatuses=[200],k.next=16,this.request(b);case 16:return _=k.sent,k.abrupt("return",{res:_.res});case 18:case"end":return k.stop()}},f,this)}));function p(f,d,m){return o.apply(this,arguments)}return p}(),t.getBucketCORS=function(){var o=(0,u.default)(r.default.mark(function f(d,m){var h,b,S,v;return r.default.wrap(function(y){for(;;)switch(y.prev=y.next){case 0:return h=this._bucketRequestParams("GET",d,"cors",m),h.successStatuses=[200],h.xmlResponse=!0,y.next=5,this.request(h);case 5:return b=y.sent,S=[],b.data&&b.data.CORSRule&&(v=b.data.CORSRule,i(v)||(v=[v]),v.forEach(function(x){var O={};Object.keys(x).forEach(function(A){O[A.slice(0,1).toLowerCase()+A.slice(1,A.length)]=x[A]}),S.push(O)})),y.abrupt("return",{rules:S,res:b.res});case 9:case"end":return y.stop()}},f,this)}));function p(f,d){return o.apply(this,arguments)}return p}(),t.deleteBucketCORS=function(){var o=(0,u.default)(r.default.mark(function f(d,m){var h,b;return r.default.wrap(function(v){for(;;)switch(v.prev=v.next){case 0:return h=this._bucketRequestParams("DELETE",d,"cors",m),h.successStatuses=[204],v.next=4,this.request(h);case 4:return b=v.sent,v.abrupt("return",{res:b.res});case 6:case"end":return v.stop()}},f,this)}));function p(f,d){return o.apply(this,arguments)}return p}(),t.putBucketReferer=function(){var o=(0,u.default)(r.default.mark(function f(d,m,h,b){var S,v,j,y;return r.default.wrap(function(O){for(;;)switch(O.prev=O.next){case 0:if(S=this._bucketRequestParams("PUT",d,"referer",b),v=` + +`,v+=" ".concat(m?"true":"false",` +`),h&&h.length>0){for(v+=` +`,j=0;j".concat(h[j],` +`);v+=` +`}else v+=` +`;return v+="",S.content=v,S.mime="xml",S.successStatuses=[200],O.next=10,this.request(S);case 10:return y=O.sent,O.abrupt("return",{res:y.res});case 12:case"end":return O.stop()}},f,this)}));function p(f,d,m,h){return o.apply(this,arguments)}return p}(),t.getBucketReferer=function(){var o=(0,u.default)(r.default.mark(function f(d,m){var h,b,S;return r.default.wrap(function(j){for(;;)switch(j.prev=j.next){case 0:return h=this._bucketRequestParams("GET",d,"referer",m),h.successStatuses=[200],h.xmlResponse=!0,j.next=5,this.request(h);case 5:return b=j.sent,S=b.data.RefererList.Referer||null,S&&(i(S)||(S=[S])),j.abrupt("return",{allowEmpty:b.data.AllowEmptyReferer==="true",referers:S,res:b.res});case 9:case"end":return j.stop()}},f,this)}));function p(f,d){return o.apply(this,arguments)}return p}(),t.deleteBucketReferer=function(){var o=(0,u.default)(r.default.mark(function f(d,m){return r.default.wrap(function(b){for(;;)switch(b.prev=b.next){case 0:return b.next=2,this.putBucketReferer(d,!0,null,m);case 2:return b.abrupt("return",b.sent);case 3:case"end":return b.stop()}},f,this)}));function p(f,d){return o.apply(this,arguments)}return p}(),t._bucketRequestParams=function(p,f,d,m){return{method:p,bucket:f,subres:d,timeout:m&&m.timeout,ctx:m&&m.ctx}}},{"../common/utils/checkBucketName":50,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,assert:78,"core-js/modules/es.array.slice.js":250,"core-js/modules/es.object.keys.js":257,"core-js/modules/es.object.to-string.js":258,"core-js/modules/web.dom-collections.for-each.js":296}],3:[function(e,w,g){(function(a,r){(function(){var u=e("@babel/runtime/helpers/interopRequireDefault"),l=u(e("@babel/runtime/regenerator")),c=u(e("@babel/runtime/helpers/asyncToGenerator"));e("core-js/modules/es.function.name.js"),e("core-js/modules/es.regexp.exec.js"),e("core-js/modules/es.string.split.js"),e("core-js/modules/es.object.assign.js"),e("core-js/modules/es.array.includes.js"),e("core-js/modules/es.string.replace.js"),e("core-js/modules/es.array.concat.js"),e("core-js/modules/es.symbol.js"),e("core-js/modules/es.symbol.description.js"),e("core-js/modules/es.array.slice.js"),e("core-js/modules/es.object.to-string.js"),e("core-js/modules/es.promise.js"),e("core-js/modules/es.regexp.to-string.js");var s=e("debug")("ali-oss"),t=e("xml2js"),i=e("agentkeepalive"),n=e("merge-descriptors"),o=e("platform"),p=e("utility"),f=e("urllib"),d=e("./version"),m=e("bowser"),h=e("../common/signUtils"),b=e("../common/client/initOptions"),S=e("../common/utils/createRequest"),v=S.createRequest,j=e("../common/utils/encoder"),y=j.encoder,x=e("../common/client/getReqUrl"),O=x.getReqUrl,A=e("../common/utils/setSTSToken"),E=A.setSTSToken,_=e("../common/utils/retry"),T=_.retry,k=e("../common/utils/isFunction"),F=k.isFunction,W=new i;function V(){var U=o.name,P=o.version;U&&U.toLowerCase&&U.toLowerCase()==="ie"&&P.split(".")[0]<10&&console.warn("ali-oss does not support the current browser")}function L(){return location&&location.protocol==="https:"}function Y(U,P){if(V(),!(this instanceof Y))return new Y(U,P);U&&U.inited?this.options=U:this.options=Y.initOptions(U),this.options.cancelFlag=!1,this.options.urllib?this.urllib=this.options.urllib:(this.urllib=f,this.agent=this.options.agent||W),this.ctx=P,this.userAgent=this._getUserAgent(),this.stsTokenFreshTime=new Date,this.options.amendTimeSkewed=0}w.exports=Y,Y.initOptions=function(P){P.stsToken||console.warn("Please use STS Token for safety, see more details at https://help.aliyun.com/document_detail/32077.html");var B=Object.assign({secure:L(),useFetch:!1},P);return b(B)};var re=Y.prototype;re.debug=s,n(re,e("./object")),n(re,e("./bucket")),n(re,e("../common/bucket/getBucketWebsite")),n(re,e("../common/bucket/putBucketWebsite")),n(re,e("../common/bucket/deleteBucketWebsite")),n(re,e("../common/bucket/getBucketLifecycle")),n(re,e("../common/bucket/putBucketLifecycle")),n(re,e("../common/bucket/deleteBucketLifecycle")),n(re,e("../common/bucket/putBucketVersioning")),n(re,e("../common/bucket/getBucketVersioning")),n(re,e("../common/bucket/getBucketInventory")),n(re,e("../common/bucket/deleteBucketInventory")),n(re,e("../common/bucket/listBucketInventory")),n(re,e("../common/bucket/putBucketInventory")),n(re,e("../common/bucket/abortBucketWorm")),n(re,e("../common/bucket/completeBucketWorm")),n(re,e("../common/bucket/extendBucketWorm")),n(re,e("../common/bucket/getBucketWorm")),n(re,e("../common/bucket/initiateBucketWorm")),n(re,e("./managed-upload")),n(re,e("../common/multipart-copy")),n(re,e("../common/multipart")),n(re,e("../common/parallel")),re.signature=function(P){return this.debug("authorization stringToSign: %s",P,"info"),h.computeSignature(this.options.accessKeySecret,P,this.options.headerEncoding)},re._getReqUrl=O,re.authorization=function(P,B,K,J){var q=h.buildCanonicalString(P.toUpperCase(),B,{headers:J,parameters:K});return h.authorization(this.options.accessKeyId,this.options.accessKeySecret,q,this.options.headerEncoding)},re.request=function(){var U=(0,c.default)(l.default.mark(function P(B){var K=this;return l.default.wrap(function(q){for(;;)switch(q.prev=q.next){case 0:if(!this.options.retryMax){q.next=6;break}return q.next=3,T(z.bind(this),this.options.retryMax,{errorHandler:function(ae){var M=function(N){if(B.stream)return!1;var I=[-1,-2].includes(N.status),te=K.options.requestErrorRetryHandle||function(){return!0};return I&&te(N)};return!!M(ae)}})(B);case 3:return q.abrupt("return",q.sent);case 6:return q.abrupt("return",z.call(this,B));case 7:case"end":return q.stop()}},P,this)}));return function(P){return U.apply(this,arguments)}}();function z(U){return G.apply(this,arguments)}function G(){return G=(0,c.default)(l.default.mark(function U(P){var B,K,J,q,X,ae;return l.default.wrap(function(D){for(;;)switch(D.prev=D.next){case 0:if(!(this.options.stsToken&&F(this.options.refreshSTSToken))){D.next=3;break}return D.next=3,E.call(this);case 3:return B=v.call(this,P),this.options.useFetch||(B.params.mode="disable-fetch"),q=!!P.stream,D.prev=6,D.next=9,this.urllib.request(B.url,B.params);case 9:K=D.sent,this.debug("response %s %s, got %s, headers: %j",P.method,B.url,K.status,K.headers,"info"),D.next=16;break;case 13:D.prev=13,D.t0=D.catch(6),J=D.t0;case 16:if(!(K&&P.successStatuses&&P.successStatuses.indexOf(K.status)===-1)){D.next=28;break}return D.next=19,this.requestError(K);case 19:if(X=D.sent,!(X.code==="RequestTimeTooSkewed"&&!q)){D.next=25;break}return this.options.amendTimeSkewed=+new Date(X.serverTime)-new Date,D.next=24,this.request(P);case 24:return D.abrupt("return",D.sent);case 25:X.params=P,D.next=32;break;case 28:if(!J){D.next=32;break}return D.next=31,this.requestError(J);case 31:X=D.sent;case 32:if(!X){D.next=34;break}throw X;case 34:if(!P.xmlResponse){D.next=39;break}return D.next=37,this.parseXML(K.data);case 37:ae=D.sent,K.data=ae;case 39:return D.abrupt("return",K);case 40:case"end":return D.stop()}},U,this,[[6,13]])})),G.apply(this,arguments)}re._getResource=function(P){var B="/";return P.bucket&&(B+="".concat(P.bucket,"/")),P.object&&(B+=y(P.object,this.options.headerEncoding)),B},re._escape=function(P){return p.encodeURIComponent(P).replace(/%2F/g,"/")},re._getUserAgent=function(){var P=r&&r.browser?"js":"nodejs",B="aliyun-sdk-".concat(P,"/").concat(d.version),K=o.description;return!K&&r&&(K="Node.js ".concat(r.version.slice(1)," on ").concat(r.platform," ").concat(r.arch)),this._checkUserAgent("".concat(B," ").concat(K))},re._checkUserAgent=function(P){var B=P.replace(/\u03b1/,"alpha").replace(/\u03b2/,"beta");return B},re.checkBrowserAndVersion=function(P,B){return m.name===P&&m.version.split(".")[0]===B},re.parseXML=function(P){return new Promise(function(B,K){a.isBuffer(P)&&(P=P.toString()),t.parseString(P,{explicitRoot:!1,explicitArray:!1},function(J,q){J?K(J):B(q)})})},re.requestError=function(){var U=(0,c.default)(l.default.mark(function B(K){var J,q,X,ae;return l.default.wrap(function(D){for(;;)switch(D.prev=D.next){case 0:if(J=null,!(!K.data||!K.data.length)){D.next=5;break}K.status===-1||K.status===-2?(J=new Error(K.message),J.name=K.name,J.status=K.status,J.code=K.name):(K.status===404?(J=new Error("Object not exists"),J.name="NoSuchKeyError",J.status=404,J.code="NoSuchKey"):K.status===412?(J=new Error("Pre condition failed"),J.name="PreconditionFailedError",J.status=412,J.code="PreconditionFailed"):(J=new Error("Unknow error, status: ".concat(K.status)),J.name="UnknowError",J.status=K.status),J.requestId=K.headers["x-oss-request-id"],J.host=""),D.next=32;break;case 5:return q=String(K.data),this.debug("request response error data: %s",q,"error"),D.prev=7,D.next=10,this.parseXML(q);case 10:if(D.t0=D.sent,D.t0){D.next=13;break}D.t0={};case 13:X=D.t0,D.next=23;break;case 16:return D.prev=16,D.t1=D.catch(7),this.debug(q,"error"),D.t1.message+=` +raw xml: `.concat(q),D.t1.status=K.status,D.t1.requestId=K.headers["x-oss-request-id"],D.abrupt("return",D.t1);case 23:ae=X.Message||"unknow request error, status: ".concat(K.status),X.Condition&&(ae+=" (condition: ".concat(X.Condition,")")),J=new Error(ae),J.name=X.Code?"".concat(X.Code,"Error"):"UnknowError",J.status=K.status,J.code=X.Code,J.requestId=X.RequestId,J.hostId=X.HostId,J.serverTime=X.ServerTime;case 32:return this.debug("generate error %j",J,"error"),D.abrupt("return",J);case 34:case"end":return D.stop()}},B,this,[[7,16]])}));function P(B){return U.apply(this,arguments)}return P}()}).call(this)}).call(this,{isBuffer:e("../../node_modules/is-buffer/index.js")},e("_process"))},{"../../node_modules/is-buffer/index.js":312,"../common/bucket/abortBucketWorm":7,"../common/bucket/completeBucketWorm":8,"../common/bucket/deleteBucketInventory":9,"../common/bucket/deleteBucketLifecycle":10,"../common/bucket/deleteBucketWebsite":11,"../common/bucket/extendBucketWorm":12,"../common/bucket/getBucketInventory":13,"../common/bucket/getBucketLifecycle":14,"../common/bucket/getBucketVersioning":15,"../common/bucket/getBucketWebsite":16,"../common/bucket/getBucketWorm":17,"../common/bucket/initiateBucketWorm":18,"../common/bucket/listBucketInventory":19,"../common/bucket/putBucketInventory":20,"../common/bucket/putBucketLifecycle":21,"../common/bucket/putBucketVersioning":22,"../common/bucket/putBucketWebsite":23,"../common/client/getReqUrl":25,"../common/client/initOptions":26,"../common/multipart":30,"../common/multipart-copy":29,"../common/parallel":48,"../common/signUtils":49,"../common/utils/createRequest":54,"../common/utils/encoder":57,"../common/utils/isFunction":65,"../common/utils/retry":70,"../common/utils/setSTSToken":72,"./bucket":2,"./managed-upload":4,"./object":5,"./version":6,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,_process:399,agentkeepalive:77,bowser:83,"core-js/modules/es.array.concat.js":241,"core-js/modules/es.array.includes.js":246,"core-js/modules/es.array.slice.js":250,"core-js/modules/es.function.name.js":253,"core-js/modules/es.object.assign.js":255,"core-js/modules/es.object.to-string.js":258,"core-js/modules/es.promise.js":259,"core-js/modules/es.regexp.exec.js":261,"core-js/modules/es.regexp.to-string.js":262,"core-js/modules/es.string.replace.js":266,"core-js/modules/es.string.split.js":268,"core-js/modules/es.symbol.description.js":270,"core-js/modules/es.symbol.js":271,debug:397,"merge-descriptors":315,platform:322,urllib:407,utility:406,xml2js:358}],4:[function(e,w,g){(function(a){(function(){var r=e("@babel/runtime/helpers/interopRequireDefault"),u=r(e("@babel/runtime/regenerator"));e("core-js/modules/es.function.name.js"),e("core-js/modules/es.object.to-string.js"),e("core-js/modules/es.promise.js"),e("core-js/modules/es.array.from.js"),e("core-js/modules/es.string.iterator.js"),e("core-js/modules/es.array.map.js"),e("core-js/modules/es.array.filter.js"),e("core-js/modules/es.array.find.js"),e("core-js/modules/es.array.concat.js"),e("core-js/modules/es.regexp.to-string.js"),e("core-js/modules/es.array.slice.js"),e("core-js/modules/es.array.iterator.js"),e("core-js/modules/es.array-buffer.slice.js"),e("core-js/modules/es.typed-array.uint8-array.js"),e("core-js/modules/es.typed-array.copy-within.js"),e("core-js/modules/es.typed-array.every.js"),e("core-js/modules/es.typed-array.fill.js"),e("core-js/modules/es.typed-array.filter.js"),e("core-js/modules/es.typed-array.find.js"),e("core-js/modules/es.typed-array.find-index.js"),e("core-js/modules/es.typed-array.for-each.js"),e("core-js/modules/es.typed-array.includes.js"),e("core-js/modules/es.typed-array.index-of.js"),e("core-js/modules/es.typed-array.iterator.js"),e("core-js/modules/es.typed-array.join.js"),e("core-js/modules/es.typed-array.last-index-of.js"),e("core-js/modules/es.typed-array.map.js"),e("core-js/modules/es.typed-array.reduce.js"),e("core-js/modules/es.typed-array.reduce-right.js"),e("core-js/modules/es.typed-array.reverse.js"),e("core-js/modules/es.typed-array.set.js"),e("core-js/modules/es.typed-array.slice.js"),e("core-js/modules/es.typed-array.some.js"),e("core-js/modules/es.typed-array.sort.js"),e("core-js/modules/es.typed-array.subarray.js"),e("core-js/modules/es.typed-array.to-locale-string.js"),e("core-js/modules/es.typed-array.to-string.js");var l=r(e("@babel/runtime/helpers/asyncToGenerator")),c=e("util"),s=e("path"),t=e("mime"),i=e("copy-to"),n=e("../common/utils/isBlob"),o=n.isBlob,p=e("../common/utils/isFile"),f=p.isFile,d=e("../common/utils/isArray");d.isArray;var m=e("../common/utils/isBuffer"),h=m.isBuffer,b=e("../common/utils/retry");b.retry;var S=g;S.multipartUpload=function(){var O=(0,l.default)(u.default.mark(function E(_,T){var k,F,W,V,L,Y,re,z,G,U=arguments;return u.default.wrap(function(B){for(;;)switch(B.prev=B.next){case 0:if(k=U.length>2&&U[2]!==void 0?U[2]:{},this.resetCancelFlag(),k.disabledMD5=k.disabledMD5===void 0?!0:!!k.disabledMD5,!(k.checkpoint&&k.checkpoint.uploadId)){B.next=8;break}return T&&f(T)&&(k.checkpoint.file=T),B.next=7,this._resumeMultipart(k.checkpoint,k);case 7:return B.abrupt("return",B.sent);case 8:return F=102400,k.mime||(f(T)?k.mime=t.getType(s.extname(T.name)):o(T)?k.mime=T.type:h(T)?k.mime="":k.mime=t.getType(s.extname(T))),k.headers=k.headers||{},this._convertMetaToHeaders(k.meta,k.headers),B.next=14,this._getFileSize(T);case 14:if(W=B.sent,!(W0&&i(Y).to(z),G=this._divideParts(W,V),U=G.length,P=!1,B=function(Q,Z){return new Promise(function(){var ie=(0,l.default)(u.default.mark(function ce(oe,me){var ge,$,R,C,H;return u.default.wrap(function(ne){for(;;)switch(ne.prev=ne.next){case 0:if(ne.prev=0,Q.isCancel()){ne.next=29;break}return ge=G[Z-1],ne.next=5,Q._createBuffer(F,ge.start,ge.end);case 5:return $=ne.sent,R={content:$,size:ge.end-ge.start},ne.prev=7,ne.next=10,Q._uploadPart(re,L,Z,R,{timeout:T.timeout,disabledMD5:T.disabledMD5});case 10:C=ne.sent,ne.next=18;break;case 13:if(ne.prev=13,ne.t0=ne.catch(7),ne.t0.status!==404){ne.next=17;break}throw Q._makeAbortEvent();case 17:throw ne.t0;case 18:if(!(!Q.isCancel()&&!P)){ne.next=26;break}if(_.doneParts.push({number:Z,etag:C.res.headers.etag}),!T.progress){ne.next=23;break}return ne.next=23,T.progress(Y.length/U,_,C.res);case 23:oe({number:Z,etag:C.res.headers.etag}),ne.next=27;break;case 26:oe();case 27:ne.next=30;break;case 29:oe();case 30:ne.next=41;break;case 32:ne.prev=32,ne.t1=ne.catch(0),H=new Error,H.name=ne.t1.name,H.message=ne.t1.message,H.stack=ne.t1.stack,H.partNum=Z,i(ne.t1).to(H),me(H);case 41:case"end":return ne.stop()}},ce,null,[[0,32],[7,13]])}));return function(ce,oe){return ie.apply(this,arguments)}}())},K=Array.from(new Array(U),function(te,Q){return Q+1}),J=z.map(function(te){return te.number}),q=K.filter(function(te){return J.indexOf(te)<0}),X=5,ae=T.parallel||X,I.next=17,this._parallel(q,ae,function(te){return new Promise(function(Q,Z){B(k,te).then(function(ie){ie&&z.push(ie),Q()}).catch(function(ie){Z(ie)})})});case 17:if(M=I.sent,P=!0,D=M.find(function(te){return te.name==="abort"}),!D){I.next=22;break}throw D;case 22:if(!this.isCancel()){I.next=25;break}throw B=null,this._makeCancelEvent();case 25:if(!(M&&M.length>0)){I.next=28;break}throw M[0].message="Failed to upload some parts with error: ".concat(M[0].toString()," part_num: ").concat(M[0].partNum),M[0];case 28:return I.next=30,this.completeMultipartUpload(re,L,z,T);case 30:return I.abrupt("return",I.sent);case 31:case"end":return I.stop()}},E,this)}));function A(E,_){return O.apply(this,arguments)}return A}(),S._getFileSize=function(){var O=(0,l.default)(u.default.mark(function E(_){return u.default.wrap(function(k){for(;;)switch(k.prev=k.next){case 0:if(!h(_)){k.next=4;break}return k.abrupt("return",_.length);case 4:if(!(o(_)||f(_))){k.next=6;break}return k.abrupt("return",_.size);case 6:throw new Error("_getFileSize requires Buffer/File/Blob.");case 7:case"end":return k.stop()}},E)}));function A(E){return O.apply(this,arguments)}return A}();var v=e("stream"),j=v.Readable;function y(O,A){if(!(this instanceof y))return new y(O,A);j.call(this,A),this.file=O,this.reader=new FileReader,this.start=0,this.finish=!1,this.fileBuffer=null}c.inherits(y,j),y.prototype.readFileAndPush=function(A){if(this.fileBuffer)for(var E=!0;E&&this.fileBuffer&&this.startthis.fileBuffer.length?this.fileBuffer.length:T,this.start=T,E=this.push(this.fileBuffer.slice(_,T))}},y.prototype._read=function(A){if(this.file&&this.start>=this.file.size||this.fileBuffer&&this.start>=this.fileBuffer.length||this.finish||this.start===0&&!this.file){this.finish||(this.fileBuffer=null,this.finish=!0),this.push(null);return}var E=16*1024;A=A||E;var _=this;this.reader.onload=function(k){_.fileBuffer=a.from(new Uint8Array(k.target.result)),_.file=null,_.readFileAndPush(A)},this.start===0?this.reader.readAsArrayBuffer(this.file):this.readFileAndPush(A)};function x(O){return O.arrayBuffer?O.arrayBuffer():new Promise(function(A,E){var _=new FileReader;_.onload=function(T){A(T.target.result)},_.onerror=function(T){E(T)},_.readAsArrayBuffer(O)})}S._createBuffer=function(){var O=(0,l.default)(u.default.mark(function E(_,T,k){var F,W;return u.default.wrap(function(L){for(;;)switch(L.prev=L.next){case 0:if(!(o(_)||f(_))){L.next=8;break}return F=_.slice(T,k),L.next=4,x(F);case 4:return W=L.sent,L.abrupt("return",a.from(W));case 8:if(!h(_)){L.next=12;break}return L.abrupt("return",_.subarray(T,k));case 12:throw new Error("_createBuffer requires File/Blob/Buffer.");case 13:case"end":return L.stop()}},E)}));function A(E,_,T){return O.apply(this,arguments)}return A}(),S._getPartSize=function(A,E){var _=1e4,T=1*1024*1024;E||(E=T);var k=Math.ceil(A/_);return E1&&V[1]!==void 0?V[1]:{},E=O["continuation-token"]||O.continuationToken,E&&(A.subres=Object.assign({"continuation-token":E},A.subres)),_=this._objectRequestParams("GET","",A),_.query=Object.assign({"list-type":2},O),delete _.query["continuation-token"],delete _.query.continuationToken,_.xmlResponse=!0,_.successStatuses=[200],Y.next=11,this.request(_);case 11:return T=Y.sent,k=T.data.Contents||[],F=this,k&&(Array.isArray(k)||(k=[k]),k=k.map(function(re){return{name:re.Key,url:F._objectUrl(re.Key),lastModified:re.LastModified,etag:re.ETag,type:re.Type,size:Number(re.Size),storageClass:re.StorageClass,owner:re.Owner?{id:re.Owner.ID,displayName:re.Owner.DisplayName}:null}})),W=T.data.CommonPrefixes||null,W&&(Array.isArray(W)||(W=[W]),W=W.map(function(re){return re.Prefix})),Y.abrupt("return",{res:T.res,objects:k,prefixes:W,isTruncated:T.data.IsTruncated==="true",keyCount:+T.data.KeyCount,continuationToken:T.data.ContinuationToken||null,nextContinuationToken:T.data.NextContinuationToken||null});case 18:case"end":return Y.stop()}},x,this)}));function y(x){return j.apply(this,arguments)}return y}(),v.restore=function(){var j=(0,u.default)(r.default.mark(function x(O){var A,E,_,T,k=arguments;return r.default.wrap(function(W){for(;;)switch(W.prev=W.next){case 0:return A=k.length>1&&k[1]!==void 0?k[1]:{type:"Archive"},A=A||{},A.subres=Object.assign({restore:""},A.subres),A.versionId&&(A.subres.versionId=A.versionId),E=this._objectRequestParams("POST",O,A),A.type==="ColdArchive"&&(_={RestoreRequest:{Days:A.Days?A.Days:2,JobParameters:{Tier:A.JobParameters?A.JobParameters:"Standard"}}},E.content=S(_,{headers:!0}),E.mime="xml"),E.successStatuses=[202],W.next=9,this.request(E);case 9:return T=W.sent,W.abrupt("return",{res:T.res});case 11:case"end":return W.stop()}},x,this)}));function y(x){return j.apply(this,arguments)}return y}(),v._objectUrl=function(y){return this._getReqUrl({bucket:this.options.bucket,object:y})},v._objectRequestParams=function(y,x,O){if(!this.options.bucket&&!this.options.cname)throw new Error("Please create a bucket first");O=O||{},x=this._objectName(x);var A={object:x,bucket:this.options.bucket,method:y,subres:O&&O.subres,timeout:O&&O.timeout,ctx:O&&O.ctx};return O.headers&&(A.headers={},c(O.headers).to(A.headers)),A},v._objectName=function(y){return y.replace(/^\/+/,"")},v._convertMetaToHeaders=function(y,x){!y||Object.keys(y).forEach(function(O){x["x-oss-meta-".concat(O)]=y[O]})},v._deleteFileSafe=function(y){var x=this;return new Promise(function(O){l.exists(y,function(A){A?l.unlink(y,function(E){E&&x.debug("unlink %j error: %s",y,E,"error"),O()}):O()})})}},{"../common/callback":24,"../common/image":27,"../common/object/copyObject":31,"../common/object/delete":32,"../common/object/deleteMulti":33,"../common/object/deleteObjectTagging":34,"../common/object/generateObjectUrl":35,"../common/object/get":36,"../common/object/getACL":37,"../common/object/getBucketVersions":38,"../common/object/getObjectMeta":39,"../common/object/getObjectTagging":40,"../common/object/getObjectUrl":41,"../common/object/getSymlink":42,"../common/object/head":43,"../common/object/putACL":44,"../common/object/putObjectTagging":45,"../common/object/putSymlink":46,"../common/object/signatureUrl":47,"../common/utils/isBlob":62,"../common/utils/isBuffer":63,"../common/utils/isFile":64,"../common/utils/obj2xml":69,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"copy-to":88,"core-js/modules/es.array.map.js":249,"core-js/modules/es.function.name.js":253,"core-js/modules/es.number.constructor.js":254,"core-js/modules/es.object.assign.js":255,"core-js/modules/es.object.keys.js":257,"core-js/modules/es.object.to-string.js":258,"core-js/modules/es.promise.js":259,"core-js/modules/es.regexp.exec.js":261,"core-js/modules/es.regexp.to-string.js":262,"core-js/modules/es.string.replace.js":266,"core-js/modules/web.dom-collections.for-each.js":296,fs:84,"merge-descriptors":315,mime:317,path:321}],6:[function(e,w,g){g.version="6.17.1"},{}],7:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator")),u=a(e("@babel/runtime/helpers/asyncToGenerator"));Object.defineProperty(g,"__esModule",{value:!0}),g.abortBucketWorm=void 0;var l=e("../utils/checkBucketName");function c(t,i){return s.apply(this,arguments)}function s(){return s=(0,u.default)(r.default.mark(function t(i,n){var o,p;return r.default.wrap(function(d){for(;;)switch(d.prev=d.next){case 0:return l.checkBucketName(i),o=this._bucketRequestParams("DELETE",i,"worm",n),d.next=4,this.request(o);case 4:return p=d.sent,d.abrupt("return",{res:p.res,status:p.status});case 6:case"end":return d.stop()}},t,this)})),s.apply(this,arguments)}g.abortBucketWorm=c},{"../utils/checkBucketName":50,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76}],8:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator")),u=a(e("@babel/runtime/helpers/asyncToGenerator"));Object.defineProperty(g,"__esModule",{value:!0}),g.completeBucketWorm=void 0;var l=e("../utils/checkBucketName");function c(t,i,n){return s.apply(this,arguments)}function s(){return s=(0,u.default)(r.default.mark(function t(i,n,o){var p,f;return r.default.wrap(function(m){for(;;)switch(m.prev=m.next){case 0:return l.checkBucketName(i),p=this._bucketRequestParams("POST",i,{wormId:n},o),m.next=4,this.request(p);case 4:return f=m.sent,m.abrupt("return",{res:f.res,status:f.status});case 6:case"end":return m.stop()}},t,this)})),s.apply(this,arguments)}g.completeBucketWorm=c},{"../utils/checkBucketName":50,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76}],9:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.object.assign.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator"));Object.defineProperty(g,"__esModule",{value:!0}),g.deleteBucketInventory=void 0;var l=e("../utils/checkBucketName");function c(t,i){return s.apply(this,arguments)}function s(){return s=(0,u.default)(r.default.mark(function t(i,n){var o,p,f,d,m=arguments;return r.default.wrap(function(b){for(;;)switch(b.prev=b.next){case 0:return o=m.length>2&&m[2]!==void 0?m[2]:{},p=Object.assign({inventory:"",inventoryId:n},o.subres),l.checkBucketName(i),f=this._bucketRequestParams("DELETE",i,p,o),f.successStatuses=[204],b.next=7,this.request(f);case 7:return d=b.sent,b.abrupt("return",{status:d.status,res:d.res});case 9:case"end":return b.stop()}},t,this)})),s.apply(this,arguments)}g.deleteBucketInventory=c},{"../utils/checkBucketName":50,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.object.assign.js":255}],10:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator")),u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=e("../utils/checkBucketName"),c=l.checkBucketName,s=g;s.deleteBucketLifecycle=function(){var t=(0,u.default)(r.default.mark(function n(o,p){var f,d;return r.default.wrap(function(h){for(;;)switch(h.prev=h.next){case 0:return c(o),f=this._bucketRequestParams("DELETE",o,"lifecycle",p),f.successStatuses=[204],h.next=5,this.request(f);case 5:return d=h.sent,h.abrupt("return",{res:d.res});case 7:case"end":return h.stop()}},n,this)}));function i(n,o){return t.apply(this,arguments)}return i}()},{"../utils/checkBucketName":50,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76}],11:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator")),u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=e("../utils/checkBucketName"),c=l.checkBucketName,s=g;s.deleteBucketWebsite=function(){var t=(0,u.default)(r.default.mark(function n(o,p){var f,d;return r.default.wrap(function(h){for(;;)switch(h.prev=h.next){case 0:return c(o),f=this._bucketRequestParams("DELETE",o,"website",p),f.successStatuses=[204],h.next=5,this.request(f);case 5:return d=h.sent,h.abrupt("return",{res:d.res});case 7:case"end":return h.stop()}},n,this)}));function i(n,o){return t.apply(this,arguments)}return i}()},{"../utils/checkBucketName":50,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76}],12:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator")),u=a(e("@babel/runtime/helpers/asyncToGenerator"));Object.defineProperty(g,"__esModule",{value:!0}),g.extendBucketWorm=void 0;var l=e("../utils/checkBucketName"),c=e("../utils/obj2xml");function s(i,n,o,p){return t.apply(this,arguments)}function t(){return t=(0,u.default)(r.default.mark(function i(n,o,p,f){var d,m,h;return r.default.wrap(function(S){for(;;)switch(S.prev=S.next){case 0:return l.checkBucketName(n),d=this._bucketRequestParams("POST",n,{wormExtend:"",wormId:o},f),m={ExtendWormConfiguration:{RetentionPeriodInDays:p}},d.mime="xml",d.content=c.obj2xml(m,{headers:!0}),d.successStatuses=[200],S.next=8,this.request(d);case 8:return h=S.sent,S.abrupt("return",{res:h.res,status:h.status});case 10:case"end":return S.stop()}},i,this)})),t.apply(this,arguments)}g.extendBucketWorm=s},{"../utils/checkBucketName":50,"../utils/obj2xml":69,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76}],13:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.object.assign.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator"));Object.defineProperty(g,"__esModule",{value:!0}),g.getBucketInventory=void 0;var l=e("../utils/checkBucketName"),c=e("../utils/formatInventoryConfig");function s(i,n){return t.apply(this,arguments)}function t(){return t=(0,u.default)(r.default.mark(function i(n,o){var p,f,d,m,h=arguments;return r.default.wrap(function(S){for(;;)switch(S.prev=S.next){case 0:return p=h.length>2&&h[2]!==void 0?h[2]:{},f=Object.assign({inventory:"",inventoryId:o},p.subres),l.checkBucketName(n),d=this._bucketRequestParams("GET",n,f,p),d.successStatuses=[200],d.xmlResponse=!0,S.next=8,this.request(d);case 8:return m=S.sent,S.abrupt("return",{status:m.status,res:m.res,inventory:c.formatInventoryConfig(m.data)});case 10:case"end":return S.stop()}},i,this)})),t.apply(this,arguments)}g.getBucketInventory=s},{"../utils/checkBucketName":50,"../utils/formatInventoryConfig":58,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.object.assign.js":255}],14:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.array.map.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=e("../utils/checkBucketName"),c=l.checkBucketName,s=e("../utils/isArray"),t=s.isArray,i=e("../utils/formatObjKey"),n=i.formatObjKey,o=g;o.getBucketLifecycle=function(){var p=(0,u.default)(r.default.mark(function d(m,h){var b,S,v;return r.default.wrap(function(y){for(;;)switch(y.prev=y.next){case 0:return c(m),b=this._bucketRequestParams("GET",m,"lifecycle",h),b.successStatuses=[200],b.xmlResponse=!0,y.next=6,this.request(b);case 6:return S=y.sent,v=S.data.Rule||null,v&&(t(v)||(v=[v]),v=v.map(function(x){return x.ID&&(x.id=x.ID,delete x.ID),x.Tag&&!t(x.Tag)&&(x.Tag=[x.Tag]),n(x,"firstLowerCase")})),y.abrupt("return",{rules:v,res:S.res});case 10:case"end":return y.stop()}},d,this)}));function f(d,m){return p.apply(this,arguments)}return f}()},{"../utils/checkBucketName":50,"../utils/formatObjKey":59,"../utils/isArray":61,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.array.map.js":249}],15:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator")),u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=e("../utils/checkBucketName"),c=l.checkBucketName,s=g;s.getBucketVersioning=function(){var t=(0,u.default)(r.default.mark(function n(o,p){var f,d,m;return r.default.wrap(function(b){for(;;)switch(b.prev=b.next){case 0:return c(o),f=this._bucketRequestParams("GET",o,"versioning",p),f.xmlResponse=!0,f.successStatuses=[200],b.next=6,this.request(f);case 6:return d=b.sent,m=d.data.Status,b.abrupt("return",{status:d.status,versionStatus:m,res:d.res});case 9:case"end":return b.stop()}},n,this)}));function i(n,o){return t.apply(this,arguments)}return i}()},{"../utils/checkBucketName":50,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76}],16:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator")),u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=e("../utils/checkBucketName"),c=l.checkBucketName,s=e("../utils/isObject"),t=s.isObject,i=g;i.getBucketWebsite=function(){var n=(0,u.default)(r.default.mark(function p(f,d){var m,h,b;return r.default.wrap(function(v){for(;;)switch(v.prev=v.next){case 0:return c(f),m=this._bucketRequestParams("GET",f,"website",d),m.successStatuses=[200],m.xmlResponse=!0,v.next=6,this.request(m);case 6:return h=v.sent,b=[],h.data.RoutingRules&&h.data.RoutingRules.RoutingRule&&(t(h.data.RoutingRules.RoutingRule)?b=[h.data.RoutingRules.RoutingRule]:b=h.data.RoutingRules.RoutingRule),v.abrupt("return",{index:h.data.IndexDocument&&h.data.IndexDocument.Suffix||"",supportSubDir:h.data.IndexDocument&&h.data.IndexDocument.SupportSubDir||"false",type:h.data.IndexDocument&&h.data.IndexDocument.Type,routingRules:b,error:h.data.ErrorDocument&&h.data.ErrorDocument.Key||null,res:h.res});case 10:case"end":return v.stop()}},p,this)}));function o(p,f){return n.apply(this,arguments)}return o}()},{"../utils/checkBucketName":50,"../utils/isObject":67,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76}],17:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.object.assign.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator"));Object.defineProperty(g,"__esModule",{value:!0}),g.getBucketWorm=void 0;var l=e("../utils/checkBucketName"),c=e("../utils/dataFix");function s(i,n){return t.apply(this,arguments)}function t(){return t=(0,u.default)(r.default.mark(function i(n,o){var p,f;return r.default.wrap(function(m){for(;;)switch(m.prev=m.next){case 0:return l.checkBucketName(n),p=this._bucketRequestParams("GET",n,"worm",o),p.successStatuses=[200],p.xmlResponse=!0,m.next=6,this.request(p);case 6:return f=m.sent,c.dataFix(f.data,{lowerFirst:!0,rename:{RetentionPeriodInDays:"days"}}),m.abrupt("return",Object.assign(Object.assign({},f.data),{res:f.res,status:f.status}));case 9:case"end":return m.stop()}},i,this)})),t.apply(this,arguments)}g.getBucketWorm=s},{"../utils/checkBucketName":50,"../utils/dataFix":55,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.object.assign.js":255}],18:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator")),u=a(e("@babel/runtime/helpers/asyncToGenerator"));Object.defineProperty(g,"__esModule",{value:!0}),g.initiateBucketWorm=void 0;var l=e("../utils/obj2xml"),c=e("../utils/checkBucketName");function s(i,n,o){return t.apply(this,arguments)}function t(){return t=(0,u.default)(r.default.mark(function i(n,o,p){var f,d,m;return r.default.wrap(function(b){for(;;)switch(b.prev=b.next){case 0:return c.checkBucketName(n),f=this._bucketRequestParams("POST",n,"worm",p),d={InitiateWormConfiguration:{RetentionPeriodInDays:o}},f.mime="xml",f.content=l.obj2xml(d,{headers:!0}),f.successStatuses=[200],b.next=8,this.request(f);case 8:return m=b.sent,b.abrupt("return",{res:m.res,wormId:m.res.headers["x-oss-worm-id"],status:m.status});case 10:case"end":return b.stop()}},i,this)})),t.apply(this,arguments)}g.initiateBucketWorm=s},{"../utils/checkBucketName":50,"../utils/obj2xml":69,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76}],19:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.object.assign.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator"));Object.defineProperty(g,"__esModule",{value:!0}),g.listBucketInventory=void 0;var l=e("../utils/checkBucketName"),c=e("../utils/formatInventoryConfig");function s(i){return t.apply(this,arguments)}function t(){return t=(0,u.default)(r.default.mark(function i(n){var o,p,f,d,m,h,b,S,v=arguments;return r.default.wrap(function(y){for(;;)switch(y.prev=y.next){case 0:return o=v.length>1&&v[1]!==void 0?v[1]:{},p=o.continuationToken,f=Object.assign({inventory:""},p&&{"continuation-token":p},o.subres),l.checkBucketName(n),d=this._bucketRequestParams("GET",n,f,o),d.successStatuses=[200],d.xmlResponse=!0,y.next=9,this.request(d);case 9:return m=y.sent,h=m.data,b=m.res,S=m.status,y.abrupt("return",{isTruncated:h.IsTruncated==="true",nextContinuationToken:h.NextContinuationToken,inventoryList:c.formatInventoryConfig(h.InventoryConfiguration,!0),status:S,res:b});case 12:case"end":return y.stop()}},i,this)})),t.apply(this,arguments)}g.listBucketInventory=s},{"../utils/checkBucketName":50,"../utils/formatInventoryConfig":58,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.object.assign.js":255}],20:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.object.assign.js"),e("core-js/modules/es.array.concat.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator"));Object.defineProperty(g,"__esModule",{value:!0}),g.putBucketInventory=void 0;var l=e("../utils/checkBucketName"),c=e("../utils/obj2xml");function s(i,n){return t.apply(this,arguments)}function t(){return t=(0,u.default)(r.default.mark(function i(n,o){var p,f,d,m,h,b,S,v,j,y,x,O=arguments;return r.default.wrap(function(E){for(;;)switch(E.prev=E.next){case 0:return p=O.length>2&&O[2]!==void 0?O[2]:{},f=Object.assign({inventory:"",inventoryId:o.id},p.subres),l.checkBucketName(n),d=o.OSSBucketDestination,m=o.optionalFields,h=o.includedObjectVersions,b="acs:oss:::",S="acs:ram::".concat(d.accountId,":role/"),v={InventoryConfiguration:{Id:o.id,IsEnabled:o.isEnabled,Filter:{Prefix:o.prefix||""},Destination:{OSSBucketDestination:{Format:d.format,AccountId:d.accountId,RoleArn:"".concat(S).concat(d.rolename),Bucket:"".concat(b).concat(d.bucket),Prefix:d.prefix||"",Encryption:d.encryption||""}},Schedule:{Frequency:o.frequency},IncludedObjectVersions:h,OptionalFields:{Field:(m==null?void 0:m.field)||[]}}},j=c.obj2xml(v,{headers:!0,firstUpperCase:!0}),y=this._bucketRequestParams("PUT",n,f,p),y.successStatuses=[200],y.mime="xml",y.content=j,E.next=14,this.request(y);case 14:return x=E.sent,E.abrupt("return",{status:x.status,res:x.res});case 16:case"end":return E.stop()}},i,this)})),t.apply(this,arguments)}g.putBucketInventory=s},{"../utils/checkBucketName":50,"../utils/obj2xml":69,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.array.concat.js":241,"core-js/modules/es.object.assign.js":255}],21:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/web.dom-collections.for-each.js"),e("core-js/modules/es.array.includes.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=e("../utils/checkBucketName"),c=l.checkBucketName,s=e("../utils/isArray"),t=s.isArray,i=e("../utils/deepCopy"),n=i.deepCopy,o=e("../utils/isObject"),p=o.isObject,f=e("../utils/obj2xml"),d=f.obj2xml,m=e("../utils/checkObjectTag"),h=m.checkObjectTag,b=e("../utils/getStrBytesCount"),S=b.getStrBytesCount,v=g;v.putBucketLifecycle=function(){var A=(0,u.default)(r.default.mark(function _(T,k,F){var W,V,L,Y,re;return r.default.wrap(function(G){for(;;)switch(G.prev=G.next){case 0:if(c(T),t(k)){G.next=3;break}throw new Error("rules must be Array");case 3:return W=this._bucketRequestParams("PUT",T,"lifecycle",F),V=[],L={LifecycleConfiguration:{Rule:V}},k.forEach(function(U){j(U),O(U),U.id&&(U.ID=U.id,delete U.id),V.push(U)}),Y=d(L,{headers:!0,firstUpperCase:!0}),W.content=Y,W.mime="xml",W.successStatuses=[200],G.next=13,this.request(W);case 13:return re=G.sent,G.abrupt("return",{res:re.res});case 15:case"end":return G.stop()}},_,this)}));function E(_,T,k){return A.apply(this,arguments)}return E}();function j(A){A.days&&(A.expiration={days:A.days}),A.date&&(A.expiration={createdBeforeDate:A.date})}function y(A,E){var _=A.days,T=A.createdBeforeDate;if(!_&&!T)throw new Error("".concat(E," must includes days or createdBeforeDate"));if(_&&!/^[1-9][0-9]*$/.test(_))throw new Error("days must be a positive integer");if(T&&!/\d{4}-\d{2}-\d{2}T00:00:00.000Z/.test(T))throw new Error("createdBeforeDate must be date and conform to iso8601 format")}function x(A){if(!t(A)&&!p(A))throw new Error("tag must be Object or Array");A=p(A)?[A]:A;var E={},_=n(A);_.forEach(function(T){E[T.key]=T.value}),h(E)}function O(A){if(A.id&&S(A.id)>255)throw new Error("ID is composed of 255 bytes at most");if(A.prefix===void 0)throw new Error("Rule must includes prefix");if(!["Enabled","Disabled"].includes(A.status))throw new Error("Status must be Enabled or Disabled");if(A.transition){if(!["IA","Archive"].includes(A.transition.storageClass))throw new Error("StorageClass must be IA or Archive");y(A.transition,"Transition")}if(A.expiration){if(!A.expiration.expiredObjectDeleteMarker)y(A.expiration,"Expiration");else if(A.expiration.days||A.expiration.createdBeforeDate)throw new Error("expiredObjectDeleteMarker cannot be used with days or createdBeforeDate")}if(A.abortMultipartUpload&&y(A.abortMultipartUpload,"AbortMultipartUpload"),!A.expiration&&!A.abortMultipartUpload&&!A.transition&&!A.noncurrentVersionTransition)throw new Error("Rule must includes expiration or abortMultipartUpload or transition or noncurrentVersionTransition");if(A.tag){if(A.abortMultipartUpload)throw new Error("Tag cannot be used with abortMultipartUpload");x(A.tag)}}},{"../utils/checkBucketName":50,"../utils/checkObjectTag":52,"../utils/deepCopy":56,"../utils/getStrBytesCount":60,"../utils/isArray":61,"../utils/isObject":67,"../utils/obj2xml":69,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.array.includes.js":246,"core-js/modules/web.dom-collections.for-each.js":296}],22:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.array.includes.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=e("../utils/checkBucketName"),c=l.checkBucketName,s=e("../utils/obj2xml"),t=s.obj2xml,i=g;i.putBucketVersioning=function(){var n=(0,u.default)(r.default.mark(function p(f,d){var m,h,b,S,v=arguments;return r.default.wrap(function(y){for(;;)switch(y.prev=y.next){case 0:if(m=v.length>2&&v[2]!==void 0?v[2]:{},c(f),["Enabled","Suspended"].includes(d)){y.next=4;break}throw new Error("status must be Enabled or Suspended");case 4:return h=this._bucketRequestParams("PUT",f,"versioning",m),b={VersioningConfiguration:{Status:d}},h.mime="xml",h.content=t(b,{headers:!0}),y.next=10,this.request(h);case 10:return S=y.sent,y.abrupt("return",{res:S.res,status:S.status});case 12:case"end":return y.stop()}},p,this)}));function o(p,f){return n.apply(this,arguments)}return o}()},{"../utils/checkBucketName":50,"../utils/obj2xml":69,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.array.includes.js":246}],23:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator")),u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=e("../utils/checkBucketName"),c=l.checkBucketName,s=e("../utils/obj2xml"),t=s.obj2xml,i=e("../utils/isArray"),n=i.isArray,o=g;o.putBucketWebsite=function(){var p=(0,u.default)(r.default.mark(function d(m){var h,b,S,v,j,y,x,O=arguments;return r.default.wrap(function(E){for(;;)switch(E.prev=E.next){case 0:if(h=O.length>1&&O[1]!==void 0?O[1]:{},b=O.length>2?O[2]:void 0,c(m),S=this._bucketRequestParams("PUT",m,"website",b),v={Suffix:h.index||"index.html"},j={IndexDocument:v},y={WebsiteConfiguration:j},h.supportSubDir&&(v.SupportSubDir=h.supportSubDir),h.type&&(v.Type=h.type),h.error&&(j.ErrorDocument={Key:h.error}),h.routingRules===void 0){E.next=14;break}if(n(h.routingRules)){E.next=13;break}throw new Error("RoutingRules must be Array");case 13:j.RoutingRules={RoutingRule:h.routingRules};case 14:return y=t(y),S.content=y,S.mime="xml",S.successStatuses=[200],E.next=20,this.request(S);case 20:return x=E.sent,E.abrupt("return",{res:x.res});case 22:case"end":return E.stop()}},d,this)}));function f(d){return p.apply(this,arguments)}return f}()},{"../utils/checkBucketName":50,"../utils/isArray":61,"../utils/obj2xml":69,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76}],24:[function(e,w,g){(function(a){(function(){e("core-js/modules/es.object.to-string.js"),e("core-js/modules/es.regexp.to-string.js"),e("core-js/modules/web.dom-collections.for-each.js"),e("core-js/modules/es.object.keys.js"),g.encodeCallback=function(u,l){if(u.headers=u.headers||{},!Object.prototype.hasOwnProperty.call(u.headers,"x-oss-callback")&&l.callback){var c={callbackUrl:encodeURI(l.callback.url),callbackBody:l.callback.body};l.callback.host&&(c.callbackHost=l.callback.host),l.callback.contentType&&(c.callbackBodyType=l.callback.contentType);var s=a.from(JSON.stringify(c)).toString("base64");if(u.headers["x-oss-callback"]=s,l.callback.customValue){var t={};Object.keys(l.callback.customValue).forEach(function(i){t["x:".concat(i)]=l.callback.customValue[i]}),u.headers["x-oss-callback-var"]=a.from(JSON.stringify(t)).toString("base64")}}}}).call(this)}).call(this,e("buffer").Buffer)},{buffer:85,"core-js/modules/es.object.keys.js":257,"core-js/modules/es.object.to-string.js":258,"core-js/modules/es.regexp.to-string.js":262,"core-js/modules/web.dom-collections.for-each.js":296}],25:[function(e,w,g){e("core-js/modules/es.array.concat.js"),e("core-js/modules/es.regexp.exec.js"),e("core-js/modules/es.string.replace.js"),e("core-js/modules/web.dom-collections.for-each.js");var a=function(n){return n&&n.__esModule?n:{default:n}};Object.defineProperty(g,"__esModule",{value:!0}),g.getReqUrl=void 0;var r=a(e("copy-to")),u=a(e("url")),l=a(e("merge-descriptors")),c=a(e("is-type-of")),s=e("../utils/isIP"),t=e("../utils/checkConfigValid");function i(n){var o={},p=this.options.cname;t.checkConfigValid(this.options.endpoint,"endpoint"),r.default(this.options.endpoint,!1).to(o),n.bucket&&!p&&!s.isIP(o.hostname)&&!this.options.sldEnable&&(o.host="".concat(n.bucket,".").concat(o.host));var f="/";n.bucket&&this.options.sldEnable&&(f+="".concat(n.bucket,"/")),n.object&&(f+=this._escape(n.object).replace(/\+/g,"%2B")),o.pathname=f;var d={};if(n.query&&l.default(d,n.query),n.subres){var m={};c.default.string(n.subres)?m[n.subres]="":c.default.array(n.subres)?n.subres.forEach(function(h){m[h]=""}):m=n.subres,l.default(d,m)}return o.query=d,u.default.format(o)}g.getReqUrl=i},{"../utils/checkConfigValid":51,"../utils/isIP":66,"copy-to":88,"core-js/modules/es.array.concat.js":241,"core-js/modules/es.regexp.exec.js":261,"core-js/modules/es.string.replace.js":266,"core-js/modules/web.dom-collections.for-each.js":296,"is-type-of":398,"merge-descriptors":315,url:404}],26:[function(e,w,g){e("core-js/modules/es.array.concat.js"),e("core-js/modules/es.object.assign.js"),e("core-js/modules/es.string.trim.js");var a=e("humanize-ms"),r=e("url"),u=e("../utils/checkBucketName"),l=u.checkBucketName,c=e("../utils/setRegion"),s=c.setRegion,t=e("../utils/checkConfigValid"),i=t.checkConfigValid;function n(o,p){i(o,"endpoint");var f=r.parse(o);if(f.protocol||(f=r.parse("http".concat(p?"s":"","://").concat(o))),f.protocol!=="http:"&&f.protocol!=="https:")throw new Error("Endpoint protocol must be http or https.");return f}w.exports=function(o){if(!o||!o.accessKeyId||!o.accessKeySecret)throw new Error("require accessKeyId, accessKeySecret");o.stsToken&&!o.refreshSTSToken&&!o.refreshSTSTokenInterval&&console.warn("It's recommended to set 'refreshSTSToken' and 'refreshSTSTokenInterval' to refresh stsToken\u3001accessKeyId\u3001accessKeySecret automatically when sts token has expired"),o.bucket&&l(o.bucket);var p=Object.assign({region:"oss-cn-hangzhou",internal:!1,secure:!1,timeout:6e4,bucket:null,endpoint:null,cname:!1,isRequestPay:!1,sldEnable:!1,headerEncoding:"utf-8",refreshSTSToken:null,refreshSTSTokenInterval:6e4*5,retryMax:0},o);if(p.accessKeyId=p.accessKeyId.trim(),p.accessKeySecret=p.accessKeySecret.trim(),p.timeout&&(p.timeout=a(p.timeout)),p.endpoint)p.endpoint=n(p.endpoint,p.secure);else if(p.region)p.endpoint=s(p.region,p.internal,p.secure);else throw new Error("require options.endpoint or options.region");return p.inited=!0,p}},{"../utils/checkBucketName":50,"../utils/checkConfigValid":51,"../utils/setRegion":71,"core-js/modules/es.array.concat.js":241,"core-js/modules/es.object.assign.js":255,"core-js/modules/es.string.trim.js":269,"humanize-ms":303,url:404}],27:[function(e,w,g){var a=e("merge-descriptors"),r=g;a(r,e("./processObjectSave"))},{"./processObjectSave":28,"merge-descriptors":315}],28:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.array.concat.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=e("../utils/checkBucketName"),c=l.checkBucketName,s=e("querystring"),t=e("js-base64"),i=t.Base64.encode,n=g;n.processObjectSave=function(){var p=(0,u.default)(r.default.mark(function d(m,h,b,S){var v,j,y,x;return r.default.wrap(function(A){for(;;)switch(A.prev=A.next){case 0:return o(m,"sourceObject"),o(h,"targetObject"),o(b,"process"),h=this._objectName(h),S&&c(S),v=this._objectRequestParams("POST",m,{subres:"x-oss-process"}),j=S?",b_".concat(i(S)):"",h=i(h),y={"x-oss-process":"".concat(b,"|sys/saveas,o_").concat(h).concat(j)},v.content=s.stringify(y),A.next=12,this.request(v);case 12:return x=A.sent,A.abrupt("return",{res:x.res,status:x.res.status});case 14:case"end":return A.stop()}},d,this)}));function f(d,m,h,b){return p.apply(this,arguments)}return f}();function o(p,f){if(!p)throw new Error("".concat(f," is required"));if(typeof p!="string")throw new Error("".concat(f," must be String"))}},{"../utils/checkBucketName":50,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.array.concat.js":241,"js-base64":314,querystring:328}],29:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.array.concat.js"),e("core-js/modules/es.function.name.js"),e("core-js/modules/es.object.to-string.js"),e("core-js/modules/es.promise.js"),e("core-js/modules/es.array.from.js"),e("core-js/modules/es.string.iterator.js"),e("core-js/modules/es.array.map.js"),e("core-js/modules/es.array.filter.js"),e("core-js/modules/es.array.find.js"),e("core-js/modules/es.regexp.to-string.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=e("debug")("ali-oss:multipart-copy"),c=e("copy-to"),s=g;s.uploadPartCopy=function(){var t=(0,u.default)(r.default.mark(function n(o,p,f,d,m){var h,b,S,v,j,y=arguments;return r.default.wrap(function(O){for(;;)switch(O.prev=O.next){case 0:return h=y.length>5&&y[5]!==void 0?y[5]:{},h.headers=h.headers||{},b=h.versionId||h.subres&&h.subres.versionId||null,b?S="/".concat(m.sourceBucketName,"/").concat(encodeURIComponent(m.sourceKey),"?versionId=").concat(b):S="/".concat(m.sourceBucketName,"/").concat(encodeURIComponent(m.sourceKey)),h.headers["x-oss-copy-source"]=S,d&&(h.headers["x-oss-copy-source-range"]="bytes=".concat(d)),h.subres={partNumber:f,uploadId:p},v=this._objectRequestParams("PUT",o,h),v.mime=h.mime,v.successStatuses=[200],O.next=12,this.request(v);case 12:return j=O.sent,O.abrupt("return",{name:o,etag:j.res.headers.etag,res:j.res});case 14:case"end":return O.stop()}},n,this)}));function i(n,o,p,f,d){return t.apply(this,arguments)}return i}(),s.multipartUploadCopy=function(){var t=(0,u.default)(r.default.mark(function n(o,p){var f,d,m,h,b,S,v,j,y,x,O,A,E=arguments;return r.default.wrap(function(T){for(;;)switch(T.prev=T.next){case 0:return f=E.length>2&&E[2]!==void 0?E[2]:{},this.resetCancelFlag(),d=f.versionId,m=d===void 0?null:d,h={versionId:m},T.next=6,this._getObjectMeta(p.sourceBucketName,p.sourceKey,h);case 6:if(b=T.sent,S=b.res.headers["content-length"],p.startOffset=p.startOffset||0,p.endOffset=p.endOffset||S,!(f.checkpoint&&f.checkpoint.uploadId)){T.next=14;break}return T.next=13,this._resumeMultipartCopy(f.checkpoint,p,f);case 13:return T.abrupt("return",T.sent);case 14:if(v=102400,j=p.endOffset-p.startOffset,!(j0)){G.next=40;break}throw re=L[0],re.message="Failed to copy some parts with error: ".concat(re.toString()," part_num: ").concat(re.partNum),re;case 40:return G.next=42,this.completeMultipartUpload(y,v,j,f);case 42:return G.abrupt("return",G.sent);case 43:case"end":return G.stop()}},n,this)}));function i(n,o,p){return t.apply(this,arguments)}return i}(),s._divideMultipartCopyParts=function(i,n,o){for(var p=Math.ceil(i/n),f=[],d=0;d + +`,x=0;x +`,y+="".concat(O.number,` +`),y+="".concat(O.etag,` +`),y+=` +`;return y+="",v=v||{},A={},A=i(v,function(W){if(o(W))return null}),A.headers&&delete A.headers["x-oss-server-side-encryption"],A.subres={uploadId:b},E=this._objectRequestParams("POST",h,A),s.encodeCallback(E,A),E.mime="xml",E.content=y,E.headers&&E.headers["x-oss-callback"]||(E.xmlResponse=!0),E.successStatuses=[200],F.next=17,this.request(E);case 17:return _=F.sent,T={res:_.res,bucket:E.bucket,name:h,etag:_.res.headers.etag},E.headers&&E.headers["x-oss-callback"]&&(T.data=JSON.parse(_.data.toString())),F.abrupt("return",T);case 21:case"end":return F.stop()}},m,this)}));function d(m,h,b,S){return f.apply(this,arguments)}return d}(),p._uploadPart=function(){var f=(0,l.default)(u.default.mark(function m(h,b,S,v,j){var y,x,O,A;return u.default.wrap(function(_){for(;;)switch(_.prev=_.next){case 0:return j=j||{},y={},c(j).to(y),y.headers={"Content-Length":v.size},y.subres={partNumber:S,uploadId:b},x=this._objectRequestParams("PUT",h,y),x.mime=y.mime,O=a&&a.browser,O?x.content=v.content:x.stream=v.stream,x.successStatuses=[200],x.disabledMD5=j.disabledMD5,_.next=13,this.request(x);case 13:if(A=_.sent,A.res.headers.etag){_.next=16;break}throw new Error(`Please set the etag of expose-headers in OSS + https://help.aliyun.com/document_detail/32069.html`);case 16:return v.stream&&(v.stream=null,x.stream=null),_.abrupt("return",{name:h,etag:A.res.headers.etag,res:A.res});case 18:case"end":return _.stop()}},m,this)}));function d(m,h,b,S,v){return f.apply(this,arguments)}return d}()}).call(this)}).call(this,e("_process"))},{"./callback":24,"./utils/deepCopy":56,"./utils/isBuffer":63,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,_process:399,"copy-to":88,"core-js/modules/es.array.concat.js":241,"core-js/modules/es.array.filter.js":243,"core-js/modules/es.array.map.js":249,"core-js/modules/es.array.sort.js":251,"core-js/modules/es.object.to-string.js":258,"core-js/modules/es.regexp.to-string.js":262}],31:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/web.dom-collections.for-each.js"),e("core-js/modules/es.object.keys.js"),e("core-js/modules/es.array.find.js"),e("core-js/modules/es.array.includes.js"),e("core-js/modules/es.array.concat.js"),e("core-js/modules/es.regexp.exec.js"),e("core-js/modules/es.string.replace.js");var u=a(e("@babel/runtime/helpers/typeof")),l=a(e("@babel/runtime/helpers/asyncToGenerator")),c=e("../utils/checkBucketName"),s=c.checkBucketName,t=g,i=["content-type","content-encoding","content-language","content-disposition","cache-control","expires"];t.copy=function(){var n=(0,l.default)(r.default.mark(function p(f,d,m,h){var b,S,v;return r.default.wrap(function(y){for(;;)switch(y.prev=y.next){case 0:return(0,u.default)(m)==="object"&&(h=m),h=h||{},h.headers=h.headers||{},Object.keys(h.headers).forEach(function(x){h.headers["x-oss-copy-source-".concat(x.toLowerCase())]=h.headers[x]}),(h.meta||Object.keys(h.headers).find(function(x){return i.includes(x.toLowerCase())}))&&(h.headers["x-oss-metadata-directive"]="REPLACE"),this._convertMetaToHeaders(h.meta,h.headers),d=this._getSourceName(d,m),h.versionId&&(d="".concat(d,"?versionId=").concat(h.versionId)),h.headers["x-oss-copy-source"]=d,b=this._objectRequestParams("PUT",f,h),b.xmlResponse=!0,b.successStatuses=[200,304],y.next=14,this.request(b);case 14:return S=y.sent,v=S.data,v&&(v={etag:v.ETag,lastModified:v.LastModified}),y.abrupt("return",{data:v,res:S.res});case 18:case"end":return y.stop()}},p,this)}));function o(p,f,d,m){return n.apply(this,arguments)}return o}(),t._getSourceName=function(o,p){return typeof p=="string"?o=this._objectName(o):o[0]!=="/"?p=this.options.bucket:(p=o.replace(/\/(.+?)(\/.*)/,"$1"),o=o.replace(/(\/.+?\/)(.*)/,"$2")),s(p),o=encodeURIComponent(o),o="/".concat(p,"/").concat(o),o}},{"../utils/checkBucketName":50,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/helpers/typeof":75,"@babel/runtime/regenerator":76,"core-js/modules/es.array.concat.js":241,"core-js/modules/es.array.find.js":244,"core-js/modules/es.array.includes.js":246,"core-js/modules/es.object.keys.js":257,"core-js/modules/es.regexp.exec.js":261,"core-js/modules/es.string.replace.js":266,"core-js/modules/web.dom-collections.for-each.js":296}],32:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.object.assign.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=g;l.delete=function(){var c=(0,u.default)(r.default.mark(function t(i){var n,o,p,f=arguments;return r.default.wrap(function(m){for(;;)switch(m.prev=m.next){case 0:return n=f.length>1&&f[1]!==void 0?f[1]:{},n.subres=Object.assign({},n.subres),n.versionId&&(n.subres.versionId=n.versionId),o=this._objectRequestParams("DELETE",i,n),o.successStatuses=[204],m.next=7,this.request(o);case 7:return p=m.sent,m.abrupt("return",{res:p.res});case 9:case"end":return m.stop()}},t,this)}));function s(t){return c.apply(this,arguments)}return s}()},{"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.object.assign.js":255}],33:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.object.assign.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=e("utility"),c=e("../utils/obj2xml"),s=c.obj2xml,t=g;t.deleteMulti=function(){var i=(0,u.default)(r.default.mark(function o(p){var f,d,m,h,b,S,v,j,y,x,O,A,E,_=arguments;return r.default.wrap(function(k){for(;;)switch(k.prev=k.next){case 0:if(f=_.length>1&&_[1]!==void 0?_[1]:{},d=[],!(!p||!p.length)){k.next=4;break}throw new Error("names is required");case 4:for(m=0;m1&&f[1]!==void 0?f[1]:{},n.subres=Object.assign({tagging:""},n.subres),n.versionId&&(n.subres.versionId=n.versionId),i=this._objectName(i),o=this._objectRequestParams("DELETE",i,n),o.successStatuses=[204],m.next=8,this.request(o);case 8:return p=m.sent,m.abrupt("return",{status:p.status,res:p.res});case 10:case"end":return m.stop()}},t,this)}));function s(t){return c.apply(this,arguments)}return s}()},{"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.object.assign.js":255}],35:[function(e,w,g){e("core-js/modules/es.array.concat.js");var a=e("url"),r=e("../utils/isIP"),u=r.isIP,l=g;l.generateObjectUrl=function(s,t){if(u(this.options.endpoint.hostname))throw new Error("can not get the object URL when endpoint is IP");if(t)t[t.length-1]!=="/"&&(t+="/");else{t=this.options.endpoint.format();var i=a.parse(t),n=this.options.bucket;i.hostname="".concat(n,".").concat(i.hostname),i.host="".concat(n,".").concat(i.host),t=i.format()}return t+this._escape(this._objectName(s))}},{"../utils/isIP":66,"core-js/modules/es.array.concat.js":241,url:404}],36:[function(e,w,g){(function(a){(function(){var r=e("@babel/runtime/helpers/interopRequireDefault"),u=r(e("@babel/runtime/regenerator"));e("core-js/modules/es.object.assign.js");var l=r(e("@babel/runtime/helpers/asyncToGenerator")),c=e("fs"),s=e("is-type-of"),t=g;t.get=function(){var i=(0,l.default)(u.default.mark(function o(p,f){var d,m,h,b,S,v,j,y,x=arguments;return u.default.wrap(function(A){for(;;)switch(A.prev=A.next){case 0:return d=x.length>2&&x[2]!==void 0?x[2]:{},m=null,h=!1,s.writableStream(f)?m=f:s.string(f)?(m=c.createWriteStream(f),h=!0):d=f,d=d||{},b=a&&a.browser,S=d.responseCacheControl===null?"":"no-cache",v=b&&S?{"response-cache-control":S}:{},d.subres=Object.assign(v,d.subres),d.versionId&&(d.subres.versionId=d.versionId),d.process&&(d.subres["x-oss-process"]=d.process),A.prev=11,y=this._objectRequestParams("GET",p,d),y.writeStream=m,y.successStatuses=[200,206,304],A.next=17,this.request(y);case 17:j=A.sent,h&&m.destroy(),A.next=28;break;case 21:if(A.prev=21,A.t0=A.catch(11),!h){A.next=27;break}return m.destroy(),A.next=27,this._deleteFileSafe(f);case 27:throw A.t0;case 28:return A.abrupt("return",{res:j.res,content:j.data});case 29:case"end":return A.stop()}},o,this,[[11,21]])}));function n(o,p){return i.apply(this,arguments)}return n}()}).call(this)}).call(this,e("_process"))},{"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,_process:399,"core-js/modules/es.object.assign.js":255,fs:84,"is-type-of":398}],37:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.object.assign.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=g;l.getACL=function(){var c=(0,u.default)(r.default.mark(function t(i){var n,o,p,f=arguments;return r.default.wrap(function(m){for(;;)switch(m.prev=m.next){case 0:return n=f.length>1&&f[1]!==void 0?f[1]:{},n.subres=Object.assign({acl:""},n.subres),n.versionId&&(n.subres.versionId=n.versionId),i=this._objectName(i),o=this._objectRequestParams("GET",i,n),o.successStatuses=[200],o.xmlResponse=!0,m.next=9,this.request(o);case 9:return p=m.sent,m.abrupt("return",{acl:p.data.AccessControlList.Grant,owner:{id:p.data.Owner.ID,displayName:p.data.Owner.DisplayName},res:p.res});case 11:case"end":return m.stop()}},t,this)}));function s(t){return c.apply(this,arguments)}return s}()},{"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.object.assign.js":255}],38:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.regexp.exec.js"),e("core-js/modules/es.string.replace.js"),e("core-js/modules/web.dom-collections.for-each.js"),e("core-js/modules/es.object.keys.js"),e("core-js/modules/es.object.assign.js"),e("core-js/modules/es.array.map.js"),e("core-js/modules/es.number.constructor.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=g,c=e("../utils/isObject"),s=c.isObject,t=e("../utils/isArray"),i=t.isArray;l.getBucketVersions=n,l.listObjectVersions=n;function n(){return o.apply(this,arguments)}function o(){return o=(0,u.default)(r.default.mark(function d(){var m,h,b,S,v,j,y,x,O=arguments;return r.default.wrap(function(E){for(;;)switch(E.prev=E.next){case 0:if(m=O.length>0&&O[0]!==void 0?O[0]:{},h=O.length>1&&O[1]!==void 0?O[1]:{},!(m.versionIdMarker&&m.keyMarker===void 0)){E.next=4;break}throw new Error("A version-id marker cannot be specified without a key marker");case 4:return h.subres=Object.assign({versions:""},h.subres),h.versionId&&(h.subres.versionId=h.versionId),b=this._objectRequestParams("GET","",h),b.xmlResponse=!0,b.successStatuses=[200],b.query=f(m),E.next=12,this.request(b);case 12:return S=E.sent,v=S.data.Version||[],j=S.data.DeleteMarker||[],y=this,v&&(Array.isArray(v)||(v=[v]),v=v.map(function(_){return{name:_.Key,url:y._objectUrl(_.Key),lastModified:_.LastModified,isLatest:_.IsLatest==="true",versionId:_.VersionId,etag:_.ETag,type:_.Type,size:Number(_.Size),storageClass:_.StorageClass,owner:{id:_.Owner.ID,displayName:_.Owner.DisplayName}}})),j&&(i(j)||(j=[j]),j=j.map(function(_){return{name:_.Key,lastModified:_.LastModified,versionId:_.VersionId,owner:{id:_.Owner.ID,displayName:_.Owner.DisplayName}}})),x=S.data.CommonPrefixes||null,x&&(i(x)||(x=[x]),x=x.map(function(_){return _.Prefix})),E.abrupt("return",{res:S.res,objects:v,deleteMarker:j,prefixes:x,nextMarker:S.data.NextKeyMarker||null,NextVersionIdMarker:S.data.NextVersionIdMarker||null,nextKeyMarker:S.data.NextKeyMarker||null,nextVersionIdMarker:S.data.NextVersionIdMarker||null,isTruncated:S.data.IsTruncated==="true"});case 21:case"end":return E.stop()}},d,this)})),o.apply(this,arguments)}function p(d){return d.replace(/([A-Z])/g,"-$1").toLowerCase()}function f(){var d=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},m={};return s(d)&&Object.keys(d).forEach(function(h){m[p(h)]=d[h]}),m}},{"../utils/isArray":61,"../utils/isObject":67,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.array.map.js":249,"core-js/modules/es.number.constructor.js":254,"core-js/modules/es.object.assign.js":255,"core-js/modules/es.object.keys.js":257,"core-js/modules/es.regexp.exec.js":261,"core-js/modules/es.string.replace.js":266,"core-js/modules/web.dom-collections.for-each.js":296}],39:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.object.assign.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=g;l.getObjectMeta=function(){var c=(0,u.default)(r.default.mark(function t(i,n){var o,p;return r.default.wrap(function(d){for(;;)switch(d.prev=d.next){case 0:return n=n||{},i=this._objectName(i),n.subres=Object.assign({objectMeta:""},n.subres),n.versionId&&(n.subres.versionId=n.versionId),o=this._objectRequestParams("HEAD",i,n),o.successStatuses=[200],d.next=8,this.request(o);case 8:return p=d.sent,d.abrupt("return",{status:p.status,res:p.res});case 10:case"end":return d.stop()}},t,this)}));function s(t,i){return c.apply(this,arguments)}return s}()},{"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.object.assign.js":255}],40:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.object.assign.js"),e("core-js/modules/web.dom-collections.for-each.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=g,c=e("../utils/isObject"),s=c.isObject;l.getObjectTagging=function(){var t=(0,u.default)(r.default.mark(function n(o){var p,f,d,m,h,b,S=arguments;return r.default.wrap(function(j){for(;;)switch(j.prev=j.next){case 0:return p=S.length>1&&S[1]!==void 0?S[1]:{},p.subres=Object.assign({tagging:""},p.subres),p.versionId&&(p.subres.versionId=p.versionId),o=this._objectName(o),f=this._objectRequestParams("GET",o,p),f.successStatuses=[200],j.next=8,this.request(f);case 8:return d=j.sent,j.next=11,this.parseXML(d.data);case 11:return m=j.sent,h=m.TagSet.Tag,h=h&&s(h)?[h]:h||[],b={},h.forEach(function(y){b[y.Key]=y.Value}),j.abrupt("return",{status:d.status,res:d.res,tag:b});case 17:case"end":return j.stop()}},n,this)}));function i(n){return t.apply(this,arguments)}return i}()},{"../utils/isObject":67,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.object.assign.js":255,"core-js/modules/web.dom-collections.for-each.js":296}],41:[function(e,w,g){var a=e("../utils/isIP"),r=a.isIP,u=g;u.getObjectUrl=function(c,s){if(r(this.options.endpoint.hostname))throw new Error("can not get the object URL when endpoint is IP");return s?s[s.length-1]!=="/"&&(s+="/"):s=this.options.endpoint.format(),s+this._escape(this._objectName(c))}},{"../utils/isIP":66}],42:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.object.assign.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=g;l.getSymlink=function(){var c=(0,u.default)(r.default.mark(function t(i){var n,o,p,f,d=arguments;return r.default.wrap(function(h){for(;;)switch(h.prev=h.next){case 0:return n=d.length>1&&d[1]!==void 0?d[1]:{},n.subres=Object.assign({symlink:""},n.subres),n.versionId&&(n.subres.versionId=n.versionId),i=this._objectName(i),o=this._objectRequestParams("GET",i,n),o.successStatuses=[200],h.next=8,this.request(o);case 8:return p=h.sent,f=p.res.headers["x-oss-symlink-target"],h.abrupt("return",{targetName:decodeURIComponent(f),res:p.res});case 11:case"end":return h.stop()}},t,this)}));function s(t){return c.apply(this,arguments)}return s}()},{"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.object.assign.js":255}],43:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.object.assign.js"),e("core-js/modules/web.dom-collections.for-each.js"),e("core-js/modules/es.object.keys.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=g;l.head=function(){var c=(0,u.default)(r.default.mark(function t(i){var n,o,p,f,d=arguments;return r.default.wrap(function(h){for(;;)switch(h.prev=h.next){case 0:return n=d.length>1&&d[1]!==void 0?d[1]:{},n.subres=Object.assign({},n.subres),n.versionId&&(n.subres.versionId=n.versionId),o=this._objectRequestParams("HEAD",i,n),o.successStatuses=[200,304],h.next=7,this.request(o);case 7:return p=h.sent,f={meta:null,res:p.res,status:p.status},p.status===200&&Object.keys(p.headers).forEach(function(b){b.indexOf("x-oss-meta-")===0&&(f.meta||(f.meta={}),f.meta[b.substring(11)]=p.headers[b])}),h.abrupt("return",f);case 11:case"end":return h.stop()}},t,this)}));function s(t){return c.apply(this,arguments)}return s}()},{"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.object.assign.js":255,"core-js/modules/es.object.keys.js":257,"core-js/modules/web.dom-collections.for-each.js":296}],44:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.object.assign.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=g;l.putACL=function(){var c=(0,u.default)(r.default.mark(function t(i,n,o){var p,f;return r.default.wrap(function(m){for(;;)switch(m.prev=m.next){case 0:return o=o||{},o.subres=Object.assign({acl:""},o.subres),o.versionId&&(o.subres.versionId=o.versionId),o.headers=o.headers||{},o.headers["x-oss-object-acl"]=n,i=this._objectName(i),p=this._objectRequestParams("PUT",i,o),p.successStatuses=[200],m.next=10,this.request(p);case 10:return f=m.sent,m.abrupt("return",{res:f.res});case 12:case"end":return m.stop()}},t,this)}));function s(t,i,n){return c.apply(this,arguments)}return s}()},{"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.object.assign.js":255}],45:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.object.assign.js"),e("core-js/modules/es.array.map.js"),e("core-js/modules/es.object.keys.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=e("../utils/obj2xml"),c=l.obj2xml,s=e("../utils/checkObjectTag"),t=s.checkObjectTag,i=g;i.putObjectTagging=function(){var n=(0,u.default)(r.default.mark(function p(f,d){var m,h,b,S,v=arguments;return r.default.wrap(function(y){for(;;)switch(y.prev=y.next){case 0:return m=v.length>2&&v[2]!==void 0?v[2]:{},t(d),m.subres=Object.assign({tagging:""},m.subres),m.versionId&&(m.subres.versionId=m.versionId),f=this._objectName(f),h=this._objectRequestParams("PUT",f,m),h.successStatuses=[200],d=Object.keys(d).map(function(x){return{Key:x,Value:d[x]}}),b={Tagging:{TagSet:{Tag:d}}},h.mime="xml",h.content=c(b),y.next=13,this.request(h);case 13:return S=y.sent,y.abrupt("return",{res:S.res,status:S.status});case 15:case"end":return y.stop()}},p,this)}));function o(p,f){return n.apply(this,arguments)}return o}()},{"../utils/checkObjectTag":52,"../utils/obj2xml":69,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.array.map.js":249,"core-js/modules/es.object.assign.js":255,"core-js/modules/es.object.keys.js":257}],46:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.object.assign.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=g;l.putSymlink=function(){var c=(0,u.default)(r.default.mark(function t(i,n,o){var p,f;return r.default.wrap(function(m){for(;;)switch(m.prev=m.next){case 0:return o=o||{},o.headers=o.headers||{},n=this._escape(this._objectName(n)),this._convertMetaToHeaders(o.meta,o.headers),o.headers["x-oss-symlink-target"]=n,o.subres=Object.assign({symlink:""},o.subres),o.versionId&&(o.subres.versionId=o.versionId),o.storageClass&&(o.headers["x-oss-storage-class"]=o.storageClass),i=this._objectName(i),p=this._objectRequestParams("PUT",i,o),p.successStatuses=[200],m.next=13,this.request(p);case 13:return f=m.sent,m.abrupt("return",{res:f.res});case 15:case"end":return m.stop()}},t,this)}));function s(t,i,n){return c.apply(this,arguments)}return s}()},{"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.object.assign.js":255}],47:[function(e,w,g){e("core-js/modules/es.object.assign.js");var a=e("url"),r=e("utility"),u=e("copy-to"),l=e("../../common/signUtils"),c=e("../utils/isIP"),s=c.isIP,t=e("../../common/utils/isFunction"),i=t.isFunction,n=e("../utils/setSTSToken"),o=n.checkCredentials,p=e("../utils/formatObjKey"),f=p.formatObjKey,d=g;d.signatureUrl=function(h,b){var S=this;if(s(this.options.endpoint.hostname))throw new Error("can not get the object URL when endpoint is IP");b=b||{},h=this._objectName(h),b.method=b.method||"GET";var v=r.timestamp()+(b.expires||1800),j={bucket:this.options.bucket,object:h},y=this._getResource(j);if(this.options.stsToken&&i(this.options.refreshSTSToken)){var x=new Date;this.stsTokenFreshTime>=this.options.refreshSTSTokenInterval?(this.stsTokenFreshTime=x,this.options.refreshSTSToken().then(function(E){var _=f(E,"firstLowerCase");_.securityToken&&(_.stsToken=_.securityToken),o(_),Object.assign(S.options,_)})):this.stsTokenFreshTime=x}this.options.stsToken&&(b["security-token"]=this.options.stsToken);var O=l._signatureForURL(this.options.accessKeySecret,b,y,v),A=a.parse(this._getReqUrl(j));return A.query={OSSAccessKeyId:this.options.accessKeyId,Expires:v,Signature:O.Signature},u(O.subResource).to(A.query),A.format()}},{"../../common/signUtils":49,"../../common/utils/isFunction":65,"../utils/formatObjKey":59,"../utils/isIP":66,"../utils/setSTSToken":72,"copy-to":88,"core-js/modules/es.object.assign.js":255,url:404,utility:406}],48:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.array.iterator.js"),e("core-js/modules/es.object.to-string.js"),e("core-js/modules/es.promise.js"),e("core-js/modules/es.string.iterator.js"),e("core-js/modules/web.dom-collections.iterator.js"),e("core-js/modules/web.dom-collections.for-each.js"),e("core-js/modules/es.function.name.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator")),l=e("./utils/isArray"),c=l.isArray,s=g;s._parallelNode=function(){var t=(0,u.default)(r.default.mark(function n(o,p,f,d){var m,h,b,S,v,j,y,x;return r.default.wrap(function(A){for(;;)switch(A.prev=A.next){case 0:m=this,h=[],b=[],S=o.length/p,v=o.length%p,j=v===0?S:(o.length-v)/p+1,y=1,x=0;case 8:if(!(x0){S=!0,v<=0&&f(d);return}v+=1,x(A.value,m(y))}j=!1}O()})},s.cancel=function(i){this.options.cancelFlag=!0,c(this.multipartUploadStreams)&&this.multipartUploadStreams.forEach(function(n){if(n.destroyed===!1){var o={name:"cancel",message:"cancel"};n.destroy(o)}}),this.multipartUploadStreams=[],i&&this.abortMultipartUpload(i.name,i.uploadId,i.options)},s.isCancel=function(){return this.options.cancelFlag},s.resetCancelFlag=function(){this.options.cancelFlag=!1},s._stop=function(){this.options.cancelFlag=!0},s._makeCancelEvent=function(){var i={status:0,name:"cancel"};return i},s._makeAbortEvent=function(){var i={status:0,name:"abort",message:"upload task has been abort"};return i}},{"./utils/isArray":61,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.array.iterator.js":247,"core-js/modules/es.function.name.js":253,"core-js/modules/es.object.to-string.js":258,"core-js/modules/es.promise.js":259,"core-js/modules/es.string.iterator.js":264,"core-js/modules/web.dom-collections.for-each.js":296,"core-js/modules/web.dom-collections.iterator.js":297}],49:[function(e,w,g){(function(a){(function(){e("core-js/modules/es.string.trim.js"),e("core-js/modules/es.array.sort.js"),e("core-js/modules/es.array.join.js"),e("core-js/modules/web.dom-collections.for-each.js"),e("core-js/modules/es.object.keys.js"),e("core-js/modules/es.array.concat.js"),e("core-js/modules/es.object.to-string.js"),e("core-js/modules/es.regexp.to-string.js");var r=e("./../../shims/crypto/crypto.js"),u=e("is-type-of"),l=e("./utils/lowercaseKeyHeader"),c=l.lowercaseKeyHeader;g.buildCanonicalizedResource=function(t,i){var n="".concat(t),o="?";if(u.string(i)&&i.trim()!=="")n+=o+i;else if(u.array(i))i.sort(),n+=o+i.join("&");else if(i){var p=function(m,h){return m[0]>h[0]?1:m[0]2&&arguments[2]!==void 0?arguments[2]:"utf-8",o=r.createHmac("sha1",t);return o.update(a.from(i,n)).digest("base64")},g.authorization=function(t,i,n,o){return"OSS ".concat(t,":").concat(this.computeSignature(i,n,o))},g._signatureForURL=function(t){var i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,o=arguments.length>3?arguments[3]:void 0,p=arguments.length>4?arguments[4]:void 0,f={},d=i.subResource,m=d===void 0?{}:d;if(i.process){var h="x-oss-process";m[h]=i.process}if(i.trafficLimit){var b="x-oss-traffic-limit";m[b]=i.trafficLimit}if(i.response&&Object.keys(i.response).forEach(function(y){var x="response-".concat(y.toLowerCase());m[x]=i.response[y]}),Object.keys(i).forEach(function(y){var x=y.toLowerCase(),O=i[y];x.indexOf("x-oss-")===0?f[x]=O:(x.indexOf("content-md5")===0||x.indexOf("content-type")===0)&&(f[y]=O)}),Object.prototype.hasOwnProperty.call(i,"security-token")&&(m["security-token"]=i["security-token"]),Object.prototype.hasOwnProperty.call(i,"callback")){var S={callbackUrl:encodeURI(i.callback.url),callbackBody:i.callback.body};if(i.callback.host&&(S.callbackHost=i.callback.host),i.callback.contentType&&(S.callbackBodyType=i.callback.contentType),m.callback=a.from(JSON.stringify(S)).toString("base64"),i.callback.customValue){var v={};Object.keys(i.callback.customValue).forEach(function(y){v["x:".concat(y)]=i.callback.customValue[y]}),m["callback-var"]=a.from(JSON.stringify(v)).toString("base64")}}var j=this.buildCanonicalString(i.method,n,{headers:f,parameters:m},o.toString());return{Signature:this.computeSignature(t,j,p),subResource:m}}}).call(this)}).call(this,e("buffer").Buffer)},{"./../../shims/crypto/crypto.js":393,"./utils/lowercaseKeyHeader":68,buffer:85,"core-js/modules/es.array.concat.js":241,"core-js/modules/es.array.join.js":248,"core-js/modules/es.array.sort.js":251,"core-js/modules/es.object.keys.js":257,"core-js/modules/es.object.to-string.js":258,"core-js/modules/es.regexp.to-string.js":262,"core-js/modules/es.string.trim.js":269,"core-js/modules/web.dom-collections.for-each.js":296,"is-type-of":398}],50:[function(e,w,g){Object.defineProperty(g,"__esModule",{value:!0}),g.checkBucketName=void 0,g.checkBucketName=function(a){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,u=r?/^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$/:/^[a-z0-9_][a-z0-9-_]{1,61}[a-z0-9_]$/;if(!u.test(a))throw new Error("The bucket must be conform to the specifications")}},{}],51:[function(e,w,g){Object.defineProperty(g,"__esModule",{value:!0}),g.checkConfigValid=void 0;var a={endpoint:r,region:/^[a-zA-Z0-9\-_]+$/};function r(u){return typeof u=="string"?/^[a-zA-Z0-9._:/-]+$/.test(u):u.host?/^[a-zA-Z0-9._:/-]+$/.test(u.host):!1}g.checkConfigValid=function(u,l){if(a[l]){var c=!0;if(a[l]instanceof Function?c=a[l](u):c=a[l].test(u),!c)throw new Error("The ".concat(l," must be conform to the specifications"))}}},{}],52:[function(e,w,g){e("core-js/modules/es.array.concat.js"),e("core-js/modules/es.object.entries.js"),e("core-js/modules/web.dom-collections.for-each.js"),Object.defineProperty(g,"__esModule",{value:!0}),g.checkObjectTag=void 0;var a=e("./checkValid"),r=a.checkValid,u=e("./isObject"),l=u.isObject,c=[{validator:function(n){if(typeof n!="string")throw new Error("the key and value of the tag must be String")}},{pattern:/^[a-zA-Z0-9 +-=._:/]+$/,msg:"tag can contain letters, numbers, spaces, and the following symbols: plus sign (+), hyphen (-), equal sign (=), period (.), underscore (_), colon (:), and forward slash (/)"}],s={key:[].concat(c,[{pattern:/^.{1,128}$/,msg:"tag key can be a maximum of 128 bytes in length"}]),value:[].concat(c,[{pattern:/^.{0,256}$/,msg:"tag value can be a maximum of 256 bytes in length"}])};function t(i){if(!l(i))throw new Error("tag must be Object");var n=Object.entries(i);if(n.length>10)throw new Error("maximum of 10 tags for a object");var o=["key","value"];n.forEach(function(p){p.forEach(function(f,d){r(f,s[o[d]])})})}g.checkObjectTag=t},{"./checkValid":53,"./isObject":67,"core-js/modules/es.array.concat.js":241,"core-js/modules/es.object.entries.js":256,"core-js/modules/web.dom-collections.for-each.js":296}],53:[function(e,w,g){e("core-js/modules/web.dom-collections.for-each.js"),Object.defineProperty(g,"__esModule",{value:!0}),g.checkValid=void 0;function a(r,u){u.forEach(function(l){if(l.validator)l.validator(r);else if(l.pattern&&!l.pattern.test(r))throw new Error(l.msg)})}g.checkValid=a},{"core-js/modules/web.dom-collections.for-each.js":296}],54:[function(e,w,g){(function(a){(function(){e("core-js/modules/es.array.includes.js"),e("core-js/modules/es.string.includes.js"),e("core-js/modules/es.object.assign.js"),e("core-js/modules/es.array.concat.js"),Object.defineProperty(g,"__esModule",{value:!0}),g.createRequest=void 0;var r=e("./../../../shims/crypto/crypto.js"),u=e("debug")("ali-oss"),l=e("mime"),c=e("dateformat"),s=e("copy-to"),t=e("path"),i=e("./encoder"),n=i.encoder,o=e("./isIP"),p=o.isIP,f=e("./setRegion"),d=f.setRegion,m=e("../client/getReqUrl"),h=m.getReqUrl;function b(j,y){return j[y]||j[y.toLowerCase()]}function S(j,y){delete j[y],delete j[y.toLowerCase()]}function v(j){var y=new Date;this.options.amendTimeSkewed&&(y=+new Date+this.options.amendTimeSkewed);var x={"x-oss-date":c(y,"UTC:ddd, dd mmm yyyy HH:MM:ss 'GMT'")};typeof window!="undefined"&&(x["x-oss-user-agent"]=this.userAgent),this.userAgent.includes("nodejs")&&(x["User-Agent"]=this.userAgent),this.options.isRequestPay&&Object.assign(x,{"x-oss-request-payer":"requester"}),this.options.stsToken&&(x["x-oss-security-token"]=this.options.stsToken),s(j.headers).to(x),b(x,"Content-Type")||(j.mime&&j.mime.indexOf("/")>0?x["Content-Type"]=j.mime:x["Content-Type"]=l.getType(j.mime||t.extname(j.object||""))),b(x,"Content-Type")||S(x,"Content-Type"),j.content&&(j.disabledMD5||(x["Content-MD5"]=r.createHash("md5").update(a.from(j.content,"utf8")).digest("base64")),x["Content-Length"]||(x["Content-Length"]=j.content.length));var O=Object.prototype.hasOwnProperty;for(var A in x)x[A]&&O.call(x,A)&&(x[A]=n(String(x[A]),this.options.headerEncoding));var E=this._getResource(j);if(x.authorization=this.authorization(j.method,E,j.subres,x,this.options.headerEncoding),p(this.options.endpoint.hostname)){var _=this.options,T=_.region,k=_.internal,F=_.secure,W=d(T,k,F);x.host="".concat(j.bucket,".").concat(W.host)}var V=h.bind(this)(j);u("request %s %s, with headers %j, !!stream: %s",j.method,V,x,!!j.stream);var L=j.timeout||this.options.timeout,Y={method:j.method,content:j.content,stream:j.stream,headers:x,timeout:L,writeStream:j.writeStream,customResponse:j.customResponse,ctx:j.ctx||this.ctx};return this.agent&&(Y.agent=this.agent),this.httpsAgent&&(Y.httpsAgent=this.httpsAgent),Y.enableProxy=!!this.options.enableProxy,Y.proxy=this.options.proxy?this.options.proxy:null,{url:V,params:Y}}g.createRequest=v}).call(this)}).call(this,e("buffer").Buffer)},{"../client/getReqUrl":25,"./../../../shims/crypto/crypto.js":393,"./encoder":57,"./isIP":66,"./setRegion":71,buffer:85,"copy-to":88,"core-js/modules/es.array.concat.js":241,"core-js/modules/es.array.includes.js":246,"core-js/modules/es.object.assign.js":255,"core-js/modules/es.string.includes.js":263,dateformat:299,debug:397,mime:317,path:321}],55:[function(e,w,g){e("core-js/modules/web.dom-collections.for-each.js"),e("core-js/modules/es.object.entries.js"),e("core-js/modules/es.regexp.exec.js"),e("core-js/modules/es.string.replace.js"),e("core-js/modules/es.array.includes.js"),e("core-js/modules/es.object.keys.js"),Object.defineProperty(g,"__esModule",{value:!0}),g.dataFix=void 0;var a=e("./isObject"),r=["true","TRUE","1",1],u=["false","FALSE","0",0];function l(t,i,n){if(!!a.isObject(t)){var o=i.remove,p=o===void 0?[]:o,f=i.rename,d=f===void 0?{}:f,m=i.camel,h=m===void 0?[]:m,b=i.bool,S=b===void 0?[]:b,v=i.lowerFirst,j=v===void 0?!1:v;return p.forEach(function(y){return delete t[y]}),Object.entries(d).forEach(function(y){!t[y[0]]||t[y[1]]||(t[y[1]]=t[y[0]],delete t[y[0]])}),h.forEach(function(y){if(!!t[y]){var x=y.replace(/^(.)/,function(O){return O.toLowerCase()}).replace(/-(\w)/g,function(O,A){return A.toUpperCase()});t[x]||(t[x]=t[y])}}),S.forEach(function(y){t[y]=c(t[y])}),typeof n=="function"&&n(t),s(t,j),l}}g.dataFix=l;function c(t){return t?r.includes(t)?!0:u.includes(t)?!1:t:!1}function s(t,i){i&&Object.keys(t).forEach(function(n){var o=n.replace(/^\w/,function(p){return p.toLowerCase()});typeof t[o]=="undefined"&&(t[o]=t[n],delete t[n])})}},{"./isObject":67,"core-js/modules/es.array.includes.js":246,"core-js/modules/es.object.entries.js":256,"core-js/modules/es.object.keys.js":257,"core-js/modules/es.regexp.exec.js":261,"core-js/modules/es.string.replace.js":266,"core-js/modules/web.dom-collections.for-each.js":296}],56:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault");e("core-js/modules/es.array.slice.js"),e("core-js/modules/web.dom-collections.for-each.js"),e("core-js/modules/es.object.keys.js");var r=a(e("@babel/runtime/helpers/typeof"));Object.defineProperty(g,"__esModule",{value:!0}),g.deepCopyWith=g.deepCopy=void 0;var u=e("./isBuffer");g.deepCopy=function(l){if(l===null||(0,r.default)(l)!=="object")return l;if(u.isBuffer(l))return l.slice();var c=Array.isArray(l)?[]:{};return Object.keys(l).forEach(function(s){c[s]=g.deepCopy(l[s])}),c},g.deepCopyWith=function(l,c){function s(t,i,n){var o=c(t,i,n);if(o!==void 0)return o;if(t===null||(0,r.default)(t)!=="object")return t;if(u.isBuffer(t))return t.slice();var p=Array.isArray(t)?[]:{};return Object.keys(t).forEach(function(f){p[f]=s(t[f],f,t)}),p}return c?s(l,"",null):g.deepCopy(l)}},{"./isBuffer":63,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/helpers/typeof":75,"core-js/modules/es.array.slice.js":250,"core-js/modules/es.object.keys.js":257,"core-js/modules/web.dom-collections.for-each.js":296}],57:[function(e,w,g){(function(a){(function(){e("core-js/modules/es.object.to-string.js"),e("core-js/modules/es.regexp.to-string.js"),Object.defineProperty(g,"__esModule",{value:!0}),g.encoder=void 0;function r(u){var l=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"utf-8";return l==="utf-8"?u:a.from(u).toString("latin1")}g.encoder=r}).call(this)}).call(this,e("buffer").Buffer)},{buffer:85,"core-js/modules/es.object.to-string.js":258,"core-js/modules/es.regexp.to-string.js":262}],58:[function(e,w,g){e("core-js/modules/es.array.map.js"),e("core-js/modules/es.regexp.exec.js"),e("core-js/modules/es.string.replace.js"),Object.defineProperty(g,"__esModule",{value:!0}),g.formatInventoryConfig=void 0;var a=e("../utils/dataFix"),r=e("../utils/isObject"),u=e("../utils/isArray"),l=e("../utils/formatObjKey");function c(t){var i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;return i&&r.isObject(t)&&(t=[t]),u.isArray(t)?t=t.map(s):t=s(t),t}g.formatInventoryConfig=c;function s(t){return a.dataFix(t,{bool:["IsEnabled"]},function(i){var n,o;i.prefix=i.Filter.Prefix,delete i.Filter,i.OSSBucketDestination=i.Destination.OSSBucketDestination,i.OSSBucketDestination.rolename=i.OSSBucketDestination.RoleArn.replace(/.*\//,""),delete i.OSSBucketDestination.RoleArn,i.OSSBucketDestination.bucket=i.OSSBucketDestination.Bucket.replace(/.*:::/,""),delete i.OSSBucketDestination.Bucket,delete i.Destination,i.frequency=i.Schedule.Frequency,delete i.Schedule.Frequency,((n=i==null?void 0:i.OptionalFields)===null||n===void 0?void 0:n.Field)&&!u.isArray((o=i.OptionalFields)===null||o===void 0?void 0:o.Field)&&(i.OptionalFields.Field=[i.OptionalFields.Field])}),t=l.formatObjKey(t,"firstLowerCase",{exclude:["OSSBucketDestination","SSE-OSS","SSE-KMS"]}),t}},{"../utils/dataFix":55,"../utils/formatObjKey":59,"../utils/isArray":61,"../utils/isObject":67,"core-js/modules/es.array.map.js":249,"core-js/modules/es.regexp.exec.js":261,"core-js/modules/es.string.replace.js":266}],59:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault");e("core-js/modules/web.dom-collections.for-each.js"),e("core-js/modules/es.object.keys.js"),e("core-js/modules/es.array.includes.js"),e("core-js/modules/es.string.includes.js"),e("core-js/modules/es.regexp.exec.js"),e("core-js/modules/es.string.replace.js");var r=a(e("@babel/runtime/helpers/typeof"));Object.defineProperty(g,"__esModule",{value:!0}),g.formatObjKey=void 0;function u(c,s,t){if(c===null||(0,r.default)(c)!=="object")return c;var i;if(Array.isArray(c)){i=[];for(var n=0;n +`),c&&c.firstUpperCase&&(l=a.formatObjKey(l,"firstUpperCase")),r(l)==="object"?Object.keys(l).forEach(function(t){r(l[t])!=="undefined"&&r(l[t])!=="null"&&(r(l[t])==="string"||r(l[t])==="number"?s+="<".concat(t,">").concat(l[t],""):r(l[t])==="object"?s+="<".concat(t,">").concat(u(l[t]),""):r(l[t])==="array"?s+=l[t].map(function(i){return"<".concat(t,">").concat(u(i),"")}).join(""):s+="<".concat(t,">").concat(l[t].toString(),""))}):s+=l.toString(),s}g.obj2xml=u},{"./formatObjKey":59,"core-js/modules/es.array.concat.js":241,"core-js/modules/es.array.join.js":248,"core-js/modules/es.array.map.js":249,"core-js/modules/es.object.keys.js":257,"core-js/modules/es.object.to-string.js":258,"core-js/modules/es.regexp.exec.js":261,"core-js/modules/es.regexp.to-string.js":262,"core-js/modules/es.string.replace.js":266,"core-js/modules/web.dom-collections.for-each.js":296}],70:[function(e,w,g){e("core-js/modules/es.object.to-string.js"),e("core-js/modules/es.promise.js"),Object.defineProperty(g,"__esModule",{value:!0}),g.retry=void 0;function a(r,u){var l=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},c=0,s=l.retryDelay,t=s===void 0?500:s,i=l.errorHandler,n=i===void 0?function(){return!0}:i,o=function p(){for(var f=arguments.length,d=new Array(f),m=0;m1&&arguments[1]!==void 0?arguments[1]:!1,t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1;u.checkConfigValid(c,"region");var i=t?"https://":"http://",n=s?"-internal.aliyuncs.com":".aliyuncs.com",o="vpc100-oss-cn-";return c.substr(0,o.length)===o&&(n=".aliyuncs.com"),r.default.parse(i+c+n)}g.setRegion=l},{"./checkConfigValid":51,url:404}],72:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/regenerator"));e("core-js/modules/es.object.keys.js"),e("core-js/modules/es.array.find.js"),e("core-js/modules/es.object.assign.js");var u=a(e("@babel/runtime/helpers/asyncToGenerator"));Object.defineProperty(g,"__esModule",{value:!0}),g.checkCredentials=g.setSTSToken=void 0;var l=e("./formatObjKey");function c(){return s.apply(this,arguments)}function s(){return s=(0,u.default)(r.default.mark(function i(){var n,o;return r.default.wrap(function(f){for(;;)switch(f.prev=f.next){case 0:if(this.options||(this.options={}),n=new Date,!this.stsTokenFreshTime){f.next=14;break}if(!(+n-this.stsTokenFreshTime>=this.options.refreshSTSTokenInterval)){f.next=12;break}return this.stsTokenFreshTime=n,f.next=7,this.options.refreshSTSToken();case 7:o=f.sent,o=l.formatObjKey(o,"firstLowerCase"),o.securityToken&&(o.stsToken=o.securityToken),t(o),Object.assign(this.options,o);case 12:f.next=15;break;case 14:this.stsTokenFreshTime=n;case 15:return f.abrupt("return",null);case 16:case"end":return f.stop()}},i,this)})),s.apply(this,arguments)}g.setSTSToken=c;function t(i){var n=["accessKeySecret","accessKeyId","stsToken"],o=Object.keys(i);n.forEach(function(p){if(!o.find(function(f){return f===p}))throw Error("refreshSTSToken must return contains ".concat(p))})}g.checkCredentials=t},{"./formatObjKey":59,"@babel/runtime/helpers/asyncToGenerator":73,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/regenerator":76,"core-js/modules/es.array.find.js":244,"core-js/modules/es.object.assign.js":255,"core-js/modules/es.object.keys.js":257}],73:[function(e,w,g){function a(u,l,c,s,t,i,n){try{var o=u[i](n),p=o.value}catch(f){c(f);return}o.done?l(p):Promise.resolve(p).then(s,t)}function r(u){return function(){var l=this,c=arguments;return new Promise(function(s,t){var i=u.apply(l,c);function n(p){a(i,s,t,n,o,"next",p)}function o(p){a(i,s,t,n,o,"throw",p)}n(void 0)})}}w.exports=r,w.exports.default=w.exports,w.exports.__esModule=!0},{}],74:[function(e,w,g){function a(r){return r&&r.__esModule?r:{default:r}}w.exports=a,w.exports.default=w.exports,w.exports.__esModule=!0},{}],75:[function(e,w,g){function a(r){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?(w.exports=a=function(l){return typeof l},w.exports.default=w.exports,w.exports.__esModule=!0):(w.exports=a=function(l){return l&&typeof Symbol=="function"&&l.constructor===Symbol&&l!==Symbol.prototype?"symbol":typeof l},w.exports.default=w.exports,w.exports.__esModule=!0),a(r)}w.exports=a,w.exports.default=w.exports,w.exports.__esModule=!0},{}],76:[function(e,w,g){w.exports=e("regenerator-runtime")},{"regenerator-runtime":342}],77:[function(e,w,g){w.exports=a,w.exports.HttpsAgent=a;function a(){}},{}],78:[function(e,w,g){(function(a){(function(){var r=e("object-assign");/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */function u(F,W){if(F===W)return 0;for(var V=F.length,L=W.length,Y=0,re=Math.min(V,L);Y=0){var G=Y.indexOf(` +`,z+1);Y=Y.substring(G+1)}this.stack=Y}}},c.inherits(p.AssertionError,Error);function m(F,W){return typeof F=="string"?F.length=0;P--)if(z[P]!==G[P])return!1;for(P=z.length-1;P>=0;P--)if(U=z[P],!j(F[U],W[U],V,L))return!1;return!0}p.notDeepEqual=function(W,V,L){j(W,V,!1)&&S(W,V,L,"notDeepEqual",p.notDeepEqual)},p.notDeepStrictEqual=O;function O(F,W,V){j(F,W,!0)&&S(F,W,V,"notDeepStrictEqual",O)}p.strictEqual=function(W,V,L){W!==V&&S(W,V,L,"===",p.strictEqual)},p.notStrictEqual=function(W,V,L){W===V&&S(W,V,L,"!==",p.notStrictEqual)};function A(F,W){if(!F||!W)return!1;if(Object.prototype.toString.call(W)=="[object RegExp]")return W.test(F);try{if(F instanceof W)return!0}catch{}return Error.isPrototypeOf(W)?!1:W.call({},F)===!0}function E(F){var W;try{F()}catch(V){W=V}return W}function _(F,W,V,L){var Y;if(typeof W!="function")throw new TypeError('"block" argument must be a function');typeof V=="string"&&(L=V,V=null),Y=E(W),L=(V&&V.name?" ("+V.name+").":".")+(L?" "+L:"."),F&&!Y&&S(Y,V,"Missing expected exception"+L);var re=typeof L=="string",z=!F&&c.isError(Y),G=!F&&Y&&!V;if((z&&re&&A(Y,V)||G)&&S(Y,V,"Got unwanted exception"+L),F&&Y&&V&&!A(Y,V)||!F&&Y)throw Y}p.throws=function(F,W,V){_(!0,F,W,V)},p.doesNotThrow=function(F,W,V){_(!1,F,W,V)},p.ifError=function(F){if(F)throw F};function T(F,W){F||S(F,!0,W,"==",T)}p.strict=r(T,p,{equal:p.strictEqual,deepEqual:p.deepStrictEqual,notEqual:p.notStrictEqual,notDeepEqual:p.notDeepStrictEqual}),p.strict.strict=p.strict;var k=Object.keys||function(F){var W=[];for(var V in F)s.call(F,V)&&W.push(V);return W}}).call(this)}).call(this,typeof xe!="undefined"?xe:typeof self!="undefined"?self:typeof window!="undefined"?window:{})},{"object-assign":320,"util/":81}],79:[function(e,w,g){typeof Object.create=="function"?w.exports=function(r,u){r.super_=u,r.prototype=Object.create(u.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}})}:w.exports=function(r,u){r.super_=u;var l=function(){};l.prototype=u.prototype,r.prototype=new l,r.prototype.constructor=r}},{}],80:[function(e,w,g){w.exports=function(r){return r&&typeof r=="object"&&typeof r.copy=="function"&&typeof r.fill=="function"&&typeof r.readUInt8=="function"}},{}],81:[function(e,w,g){(function(a,r){(function(){var u=/%[sdj%]/g;g.format=function(G){if(!x(G)){for(var U=[],P=0;P=K)return X;switch(X){case"%s":return String(B[P++]);case"%d":return Number(B[P++]);case"%j":try{return JSON.stringify(B[P++])}catch{return"[Circular]"}default:return X}}),q=B[P];P=3&&(P.depth=arguments[2]),arguments.length>=4&&(P.colors=arguments[3]),S(U)?P.showHidden=U:U&&g._extend(P,U),A(P.showHidden)&&(P.showHidden=!1),A(P.depth)&&(P.depth=2),A(P.colors)&&(P.colors=!1),A(P.customInspect)&&(P.customInspect=!0),P.colors&&(P.stylize=t),o(P,G,P.depth)}g.inspect=s,s.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},s.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"};function t(G,U){var P=s.styles[U];return P?"\x1B["+s.colors[P][0]+"m"+G+"\x1B["+s.colors[P][1]+"m":G}function i(G,U){return G}function n(G){var U={};return G.forEach(function(P,B){U[P]=!0}),U}function o(G,U,P){if(G.customInspect&&U&&F(U.inspect)&&U.inspect!==g.inspect&&!(U.constructor&&U.constructor.prototype===U)){var B=U.inspect(P,G);return x(B)||(B=o(G,B,P)),B}var K=p(G,U);if(K)return K;var J=Object.keys(U),q=n(J);if(G.showHidden&&(J=Object.getOwnPropertyNames(U)),k(U)&&(J.indexOf("message")>=0||J.indexOf("description")>=0))return f(U);if(J.length===0){if(F(U)){var X=U.name?": "+U.name:"";return G.stylize("[Function"+X+"]","special")}if(E(U))return G.stylize(RegExp.prototype.toString.call(U),"regexp");if(T(U))return G.stylize(Date.prototype.toString.call(U),"date");if(k(U))return f(U)}var ae="",M=!1,D=["{","}"];if(b(U)&&(M=!0,D=["[","]"]),F(U)){var N=U.name?": "+U.name:"";ae=" [Function"+N+"]"}if(E(U)&&(ae=" "+RegExp.prototype.toString.call(U)),T(U)&&(ae=" "+Date.prototype.toUTCString.call(U)),k(U)&&(ae=" "+f(U)),J.length===0&&(!M||U.length==0))return D[0]+ae+D[1];if(P<0)return E(U)?G.stylize(RegExp.prototype.toString.call(U),"regexp"):G.stylize("[Object]","special");G.seen.push(U);var I;return M?I=d(G,U,P,q,J):I=J.map(function(te){return m(G,U,P,q,te,M)}),G.seen.pop(),h(I,ae,D)}function p(G,U){if(A(U))return G.stylize("undefined","undefined");if(x(U)){var P="'"+JSON.stringify(U).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return G.stylize(P,"string")}if(y(U))return G.stylize(""+U,"number");if(S(U))return G.stylize(""+U,"boolean");if(v(U))return G.stylize("null","null")}function f(G){return"["+Error.prototype.toString.call(G)+"]"}function d(G,U,P,B,K){for(var J=[],q=0,X=U.length;q-1&&(J?X=X.split(` +`).map(function(M){return" "+M}).join(` +`).substr(2):X=` +`+X.split(` +`).map(function(M){return" "+M}).join(` +`))):X=G.stylize("[Circular]","special")),A(q)){if(J&&K.match(/^\d+$/))return X;q=JSON.stringify(""+K),q.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(q=q.substr(1,q.length-2),q=G.stylize(q,"name")):(q=q.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),q=G.stylize(q,"string"))}return q+": "+X}function h(G,U,P){var B=G.reduce(function(K,J){return J.indexOf(` +`)>=0,K+J.replace(/\u001b\[\d\d?m/g,"").length+1},0);return B>60?P[0]+(U===""?"":U+` + `)+" "+G.join(`, + `)+" "+P[1]:P[0]+U+" "+G.join(", ")+" "+P[1]}function b(G){return Array.isArray(G)}g.isArray=b;function S(G){return typeof G=="boolean"}g.isBoolean=S;function v(G){return G===null}g.isNull=v;function j(G){return G==null}g.isNullOrUndefined=j;function y(G){return typeof G=="number"}g.isNumber=y;function x(G){return typeof G=="string"}g.isString=x;function O(G){return typeof G=="symbol"}g.isSymbol=O;function A(G){return G===void 0}g.isUndefined=A;function E(G){return _(G)&&V(G)==="[object RegExp]"}g.isRegExp=E;function _(G){return typeof G=="object"&&G!==null}g.isObject=_;function T(G){return _(G)&&V(G)==="[object Date]"}g.isDate=T;function k(G){return _(G)&&(V(G)==="[object Error]"||G instanceof Error)}g.isError=k;function F(G){return typeof G=="function"}g.isFunction=F;function W(G){return G===null||typeof G=="boolean"||typeof G=="number"||typeof G=="string"||typeof G=="symbol"||typeof G=="undefined"}g.isPrimitive=W,g.isBuffer=e("./support/isBuffer");function V(G){return Object.prototype.toString.call(G)}function L(G){return G<10?"0"+G.toString(10):G.toString(10)}var Y=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function re(){var G=new Date,U=[L(G.getHours()),L(G.getMinutes()),L(G.getSeconds())].join(":");return[G.getDate(),Y[G.getMonth()],U].join(" ")}g.log=function(){console.log("%s - %s",re(),g.format.apply(g,arguments))},g.inherits=e("inherits"),g._extend=function(G,U){if(!U||!_(U))return G;for(var P=Object.keys(U),B=P.length;B--;)G[P[B]]=U[P[B]];return G};function z(G,U){return Object.prototype.hasOwnProperty.call(G,U)}}).call(this)}).call(this,e("_process"),typeof xe!="undefined"?xe:typeof self!="undefined"?self:typeof window!="undefined"?window:{})},{"./support/isBuffer":80,_process:399,inherits:79}],82:[function(e,w,g){g.byteLength=i,g.toByteArray=o,g.fromByteArray=d;for(var a=[],r=[],u=typeof Uint8Array!="undefined"?Uint8Array:Array,l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",c=0,s=l.length;c0)throw new Error("Invalid string. Length must be a multiple of 4");var b=m.indexOf("=");b===-1&&(b=h);var S=b===h?0:4-b%4;return[b,S]}function i(m){var h=t(m),b=h[0],S=h[1];return(b+S)*3/4-S}function n(m,h,b){return(h+b)*3/4-b}function o(m){var h,b=t(m),S=b[0],v=b[1],j=new u(n(m,S,v)),y=0,x=v>0?S-4:S,O;for(O=0;O>16&255,j[y++]=h>>8&255,j[y++]=h&255;return v===2&&(h=r[m.charCodeAt(O)]<<2|r[m.charCodeAt(O+1)]>>4,j[y++]=h&255),v===1&&(h=r[m.charCodeAt(O)]<<10|r[m.charCodeAt(O+1)]<<4|r[m.charCodeAt(O+2)]>>2,j[y++]=h>>8&255,j[y++]=h&255),j}function p(m){return a[m>>18&63]+a[m>>12&63]+a[m>>6&63]+a[m&63]}function f(m,h,b){for(var S,v=[],j=h;jx?x:y+j));return S===1?(h=m[b-1],v.push(a[h>>2]+a[h<<4&63]+"==")):S===2&&(h=(m[b-2]<<8)+m[b-1],v.push(a[h>>10]+a[h>>4&63]+a[h<<2&63]+"=")),v.join("")}},{}],83:[function(e,w,g){/*! + * Bowser - a browser detector + * https://github.com/ded/bowser + * MIT License | (c) Dustin Diaz 2015 + */(function(a,r,u){typeof w!="undefined"&&w.exports?w.exports=u():a[r]=u()})(this,"bowser",function(){var a=!0;function r(n){function o(G){var U=n.match(G);return U&&U.length>1&&U[1]||""}function p(G){var U=n.match(G);return U&&U.length>1&&U[2]||""}var f=o(/(ipod|iphone|ipad)/i).toLowerCase(),d=/like android/i.test(n),m=!d&&/android/i.test(n),h=/nexus\s*[0-6]\s*/i.test(n),b=!h&&/nexus\s*[0-9]+/i.test(n),S=/CrOS/.test(n),v=/silk/i.test(n),j=/sailfish/i.test(n),y=/tizen/i.test(n),x=/(web|hpw)(o|0)s/i.test(n),O=/windows phone/i.test(n);/SamsungBrowser/i.test(n);var A=!O&&/windows/i.test(n),E=!f&&!v&&/macintosh/i.test(n),_=!m&&!j&&!y&&!x&&/linux/i.test(n),T=p(/edg([ea]|ios)\/(\d+(\.\d+)?)/i),k=o(/version\/(\d+(\.\d+)?)/i),F=/tablet/i.test(n)&&!/tablet pc/i.test(n),W=!F&&/[^-]mobi/i.test(n),V=/xbox/i.test(n),L;/opera/i.test(n)?L={name:"Opera",opera:a,version:k||o(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i)}:/opr\/|opios/i.test(n)?L={name:"Opera",opera:a,version:o(/(?:opr|opios)[\s\/](\d+(\.\d+)?)/i)||k}:/SamsungBrowser/i.test(n)?L={name:"Samsung Internet for Android",samsungBrowser:a,version:k||o(/(?:SamsungBrowser)[\s\/](\d+(\.\d+)?)/i)}:/Whale/i.test(n)?L={name:"NAVER Whale browser",whale:a,version:o(/(?:whale)[\s\/](\d+(?:\.\d+)+)/i)}:/MZBrowser/i.test(n)?L={name:"MZ Browser",mzbrowser:a,version:o(/(?:MZBrowser)[\s\/](\d+(?:\.\d+)+)/i)}:/coast/i.test(n)?L={name:"Opera Coast",coast:a,version:k||o(/(?:coast)[\s\/](\d+(\.\d+)?)/i)}:/focus/i.test(n)?L={name:"Focus",focus:a,version:o(/(?:focus)[\s\/](\d+(?:\.\d+)+)/i)}:/yabrowser/i.test(n)?L={name:"Yandex Browser",yandexbrowser:a,version:k||o(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i)}:/ucbrowser/i.test(n)?L={name:"UC Browser",ucbrowser:a,version:o(/(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i)}:/mxios/i.test(n)?L={name:"Maxthon",maxthon:a,version:o(/(?:mxios)[\s\/](\d+(?:\.\d+)+)/i)}:/epiphany/i.test(n)?L={name:"Epiphany",epiphany:a,version:o(/(?:epiphany)[\s\/](\d+(?:\.\d+)+)/i)}:/puffin/i.test(n)?L={name:"Puffin",puffin:a,version:o(/(?:puffin)[\s\/](\d+(?:\.\d+)?)/i)}:/sleipnir/i.test(n)?L={name:"Sleipnir",sleipnir:a,version:o(/(?:sleipnir)[\s\/](\d+(?:\.\d+)+)/i)}:/k-meleon/i.test(n)?L={name:"K-Meleon",kMeleon:a,version:o(/(?:k-meleon)[\s\/](\d+(?:\.\d+)+)/i)}:O?(L={name:"Windows Phone",osname:"Windows Phone",windowsphone:a},T?(L.msedge=a,L.version=T):(L.msie=a,L.version=o(/iemobile\/(\d+(\.\d+)?)/i))):/msie|trident/i.test(n)?L={name:"Internet Explorer",msie:a,version:o(/(?:msie |rv:)(\d+(\.\d+)?)/i)}:S?L={name:"Chrome",osname:"Chrome OS",chromeos:a,chromeBook:a,chrome:a,version:o(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)}:/edg([ea]|ios)/i.test(n)?L={name:"Microsoft Edge",msedge:a,version:T}:/vivaldi/i.test(n)?L={name:"Vivaldi",vivaldi:a,version:o(/vivaldi\/(\d+(\.\d+)?)/i)||k}:j?L={name:"Sailfish",osname:"Sailfish OS",sailfish:a,version:o(/sailfish\s?browser\/(\d+(\.\d+)?)/i)}:/seamonkey\//i.test(n)?L={name:"SeaMonkey",seamonkey:a,version:o(/seamonkey\/(\d+(\.\d+)?)/i)}:/firefox|iceweasel|fxios/i.test(n)?(L={name:"Firefox",firefox:a,version:o(/(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i)},/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(n)&&(L.firefoxos=a,L.osname="Firefox OS")):v?L={name:"Amazon Silk",silk:a,version:o(/silk\/(\d+(\.\d+)?)/i)}:/phantom/i.test(n)?L={name:"PhantomJS",phantom:a,version:o(/phantomjs\/(\d+(\.\d+)?)/i)}:/slimerjs/i.test(n)?L={name:"SlimerJS",slimer:a,version:o(/slimerjs\/(\d+(\.\d+)?)/i)}:/blackberry|\bbb\d+/i.test(n)||/rim\stablet/i.test(n)?L={name:"BlackBerry",osname:"BlackBerry OS",blackberry:a,version:k||o(/blackberry[\d]+\/(\d+(\.\d+)?)/i)}:x?(L={name:"WebOS",osname:"WebOS",webos:a,version:k||o(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i)},/touchpad\//i.test(n)&&(L.touchpad=a)):/bada/i.test(n)?L={name:"Bada",osname:"Bada",bada:a,version:o(/dolfin\/(\d+(\.\d+)?)/i)}:y?L={name:"Tizen",osname:"Tizen",tizen:a,version:o(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i)||k}:/qupzilla/i.test(n)?L={name:"QupZilla",qupzilla:a,version:o(/(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i)||k}:/chromium/i.test(n)?L={name:"Chromium",chromium:a,version:o(/(?:chromium)[\s\/](\d+(?:\.\d+)?)/i)||k}:/chrome|crios|crmo/i.test(n)?L={name:"Chrome",chrome:a,version:o(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)}:m?L={name:"Android",version:k}:/safari|applewebkit/i.test(n)?(L={name:"Safari",safari:a},k&&(L.version=k)):f?(L={name:f=="iphone"?"iPhone":f=="ipad"?"iPad":"iPod"},k&&(L.version=k)):/googlebot/i.test(n)?L={name:"Googlebot",googlebot:a,version:o(/googlebot\/(\d+(\.\d+))/i)||k}:L={name:o(/^(.*)\/(.*) /),version:p(/^(.*)\/(.*) /)},!L.msedge&&/(apple)?webkit/i.test(n)?(/(apple)?webkit\/537\.36/i.test(n)?(L.name=L.name||"Blink",L.blink=a):(L.name=L.name||"Webkit",L.webkit=a),!L.version&&k&&(L.version=k)):!L.opera&&/gecko\//i.test(n)&&(L.name=L.name||"Gecko",L.gecko=a,L.version=L.version||o(/gecko\/(\d+(\.\d+)?)/i)),!L.windowsphone&&(m||L.silk)?(L.android=a,L.osname="Android"):!L.windowsphone&&f?(L[f]=a,L.ios=a,L.osname="iOS"):E?(L.mac=a,L.osname="macOS"):V?(L.xbox=a,L.osname="Xbox"):A?(L.windows=a,L.osname="Windows"):_&&(L.linux=a,L.osname="Linux");function Y(G){switch(G){case"NT":return"NT";case"XP":return"XP";case"NT 5.0":return"2000";case"NT 5.1":return"XP";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return}}var re="";L.windows?re=Y(o(/Windows ((NT|XP)( \d\d?.\d)?)/i)):L.windowsphone?re=o(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i):L.mac?(re=o(/Mac OS X (\d+([_\.\s]\d+)*)/i),re=re.replace(/[_\s]/g,".")):f?(re=o(/os (\d+([_\s]\d+)*) like mac os x/i),re=re.replace(/[_\s]/g,".")):m?re=o(/android[ \/-](\d+(\.\d+)*)/i):L.webos?re=o(/(?:web|hpw)os\/(\d+(\.\d+)*)/i):L.blackberry?re=o(/rim\stablet\sos\s(\d+(\.\d+)*)/i):L.bada?re=o(/bada\/(\d+(\.\d+)*)/i):L.tizen&&(re=o(/tizen[\/\s](\d+(\.\d+)*)/i)),re&&(L.osversion=re);var z=!L.windows&&re.split(".")[0];return F||b||f=="ipad"||m&&(z==3||z>=4&&!W)||L.silk?L.tablet=a:(W||f=="iphone"||f=="ipod"||m||h||L.blackberry||L.webos||L.bada)&&(L.mobile=a),L.msedge||L.msie&&L.version>=10||L.yandexbrowser&&L.version>=15||L.vivaldi&&L.version>=1||L.chrome&&L.version>=20||L.samsungBrowser&&L.version>=4||L.whale&&s([L.version,"1.0"])===1||L.mzbrowser&&s([L.version,"6.0"])===1||L.focus&&s([L.version,"1.0"])===1||L.firefox&&L.version>=20||L.safari&&L.version>=6||L.opera&&L.version>=10||L.ios&&L.osversion&&L.osversion.split(".")[0]>=6||L.blackberry&&L.version>=10.1||L.chromium&&L.version>=20?L.a=a:L.msie&&L.version<10||L.chrome&&L.version<20||L.firefox&&L.version<20||L.safari&&L.version<6||L.opera&&L.version<10||L.ios&&L.osversion&&L.osversion.split(".")[0]<6||L.chromium&&L.version<20?L.c=a:L.x=a,L}var u=r(typeof navigator!="undefined"&&navigator.userAgent||"");u.test=function(n){for(var o=0;o=0;){if(p[0][o]>p[1][o])return 1;if(p[0][o]===p[1][o]){if(o===0)return 0}else return-1}}function t(n,o,p){var f=u;typeof o=="string"&&(p=o,o=void 0),o===void 0&&(o=!1),p&&(f=r(p));var d=""+f.version;for(var m in n)if(n.hasOwnProperty(m)&&f[m]){if(typeof n[m]!="string")throw new Error("Browser version in the minVersion map should be a string: "+m+": "+String(n));return s([d,n[m]])<0}return o}function i(n,o,p){return!t(n,o,p)}return u.isUnsupportedBrowser=t,u.compareVersions=s,u.check=i,u._detect=r,u.detect=r,u})},{}],84:[function(e,w,g){},{}],85:[function(e,w,g){(function(a,r){(function(){var u=e("base64-js"),l=e("ieee754"),c=e("isarray");g.Buffer=n,g.SlowBuffer=j,g.INSPECT_MAX_BYTES=50,n.TYPED_ARRAY_SUPPORT=a.TYPED_ARRAY_SUPPORT!==void 0?a.TYPED_ARRAY_SUPPORT:s(),g.kMaxLength=t();function s(){try{var $=new Uint8Array(1);return $.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},$.foo()===42&&typeof $.subarray=="function"&&$.subarray(1,1).byteLength===0}catch{return!1}}function t(){return n.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function i($,R){if(t()=t())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+t().toString(16)+" bytes");return $|0}function j($){return+$!=$&&($=0),n.alloc(+$)}n.isBuffer=function(R){return!!(R!=null&&R._isBuffer)},n.compare=function(R,C){if(!n.isBuffer(R)||!n.isBuffer(C))throw new TypeError("Arguments must be Buffers");if(R===C)return 0;for(var H=R.length,ee=C.length,ne=0,ue=Math.min(H,ee);ne>>1;case"base64":return oe($).length;default:if(H)return Z($).length;R=(""+R).toLowerCase(),H=!0}}n.byteLength=y;function x($,R,C){var H=!1;if((R===void 0||R<0)&&(R=0),R>this.length||((C===void 0||C>this.length)&&(C=this.length),C<=0)||(C>>>=0,R>>>=0,C<=R))return"";for($||($="utf8");;)switch($){case"hex":return P(this,R,C);case"utf8":case"utf-8":return Y(this,R,C);case"ascii":return G(this,R,C);case"latin1":case"binary":return U(this,R,C);case"base64":return L(this,R,C);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return B(this,R,C);default:if(H)throw new TypeError("Unknown encoding: "+$);$=($+"").toLowerCase(),H=!0}}n.prototype._isBuffer=!0;function O($,R,C){var H=$[R];$[R]=$[C],$[C]=H}n.prototype.swap16=function(){var R=this.length;if(R%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var C=0;C0&&(R=this.toString("hex",0,C).match(/.{2}/g).join(" "),this.length>C&&(R+=" ... ")),""},n.prototype.compare=function(R,C,H,ee,ne){if(!n.isBuffer(R))throw new TypeError("Argument must be a Buffer");if(C===void 0&&(C=0),H===void 0&&(H=R?R.length:0),ee===void 0&&(ee=0),ne===void 0&&(ne=this.length),C<0||H>R.length||ee<0||ne>this.length)throw new RangeError("out of range index");if(ee>=ne&&C>=H)return 0;if(ee>=ne)return-1;if(C>=H)return 1;if(C>>>=0,H>>>=0,ee>>>=0,ne>>>=0,this===R)return 0;for(var ue=ne-ee,se=H-C,de=Math.min(ue,se),be=this.slice(ee,ne),we=R.slice(C,H),ye=0;ye2147483647?C=2147483647:C<-2147483648&&(C=-2147483648),C=+C,isNaN(C)&&(C=ee?0:$.length-1),C<0&&(C=$.length+C),C>=$.length){if(ee)return-1;C=$.length-1}else if(C<0)if(ee)C=0;else return-1;if(typeof R=="string"&&(R=n.from(R,H)),n.isBuffer(R))return R.length===0?-1:E($,R,C,H,ee);if(typeof R=="number")return R=R&255,n.TYPED_ARRAY_SUPPORT&&typeof Uint8Array.prototype.indexOf=="function"?ee?Uint8Array.prototype.indexOf.call($,R,C):Uint8Array.prototype.lastIndexOf.call($,R,C):E($,[R],C,H,ee);throw new TypeError("val must be string, number or Buffer")}function E($,R,C,H,ee){var ne=1,ue=$.length,se=R.length;if(H!==void 0&&(H=String(H).toLowerCase(),H==="ucs2"||H==="ucs-2"||H==="utf16le"||H==="utf-16le")){if($.length<2||R.length<2)return-1;ne=2,ue/=2,se/=2,C/=2}function de(fe,pe){return ne===1?fe[pe]:fe.readUInt16BE(pe*ne)}var be;if(ee){var we=-1;for(be=C;beue&&(C=ue-se),be=C;be>=0;be--){for(var ye=!0,le=0;leee&&(H=ee)):H=ee;var ne=R.length;if(ne%2!==0)throw new TypeError("Invalid hex string");H>ne/2&&(H=ne/2);for(var ue=0;uene)&&(H=ne),R.length>0&&(H<0||C<0)||C>this.length)throw new RangeError("Attempt to write outside buffer bounds");ee||(ee="utf8");for(var ue=!1;;)switch(ee){case"hex":return _(this,R,C,H);case"utf8":case"utf-8":return T(this,R,C,H);case"ascii":return k(this,R,C,H);case"latin1":case"binary":return F(this,R,C,H);case"base64":return W(this,R,C,H);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return V(this,R,C,H);default:if(ue)throw new TypeError("Unknown encoding: "+ee);ee=(""+ee).toLowerCase(),ue=!0}},n.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function L($,R,C){return R===0&&C===$.length?u.fromByteArray($):u.fromByteArray($.slice(R,C))}function Y($,R,C){C=Math.min($.length,C);for(var H=[],ee=R;ee239?4:ne>223?3:ne>191?2:1;if(ee+se<=C){var de,be,we,ye;switch(se){case 1:ne<128&&(ue=ne);break;case 2:de=$[ee+1],(de&192)===128&&(ye=(ne&31)<<6|de&63,ye>127&&(ue=ye));break;case 3:de=$[ee+1],be=$[ee+2],(de&192)===128&&(be&192)===128&&(ye=(ne&15)<<12|(de&63)<<6|be&63,ye>2047&&(ye<55296||ye>57343)&&(ue=ye));break;case 4:de=$[ee+1],be=$[ee+2],we=$[ee+3],(de&192)===128&&(be&192)===128&&(we&192)===128&&(ye=(ne&15)<<18|(de&63)<<12|(be&63)<<6|we&63,ye>65535&&ye<1114112&&(ue=ye))}}ue===null?(ue=65533,se=1):ue>65535&&(ue-=65536,H.push(ue>>>10&1023|55296),ue=56320|ue&1023),H.push(ue),ee+=se}return z(H)}var re=4096;function z($){var R=$.length;if(R<=re)return String.fromCharCode.apply(String,$);for(var C="",H=0;HH)&&(C=H);for(var ee="",ne=R;neH&&(R=H),C<0?(C+=H,C<0&&(C=0)):C>H&&(C=H),CC)throw new RangeError("Trying to access beyond buffer length")}n.prototype.readUIntLE=function(R,C,H){R=R|0,C=C|0,H||K(R,C,this.length);for(var ee=this[R],ne=1,ue=0;++ue0&&(ne*=256);)ee+=this[R+--C]*ne;return ee},n.prototype.readUInt8=function(R,C){return C||K(R,1,this.length),this[R]},n.prototype.readUInt16LE=function(R,C){return C||K(R,2,this.length),this[R]|this[R+1]<<8},n.prototype.readUInt16BE=function(R,C){return C||K(R,2,this.length),this[R]<<8|this[R+1]},n.prototype.readUInt32LE=function(R,C){return C||K(R,4,this.length),(this[R]|this[R+1]<<8|this[R+2]<<16)+this[R+3]*16777216},n.prototype.readUInt32BE=function(R,C){return C||K(R,4,this.length),this[R]*16777216+(this[R+1]<<16|this[R+2]<<8|this[R+3])},n.prototype.readIntLE=function(R,C,H){R=R|0,C=C|0,H||K(R,C,this.length);for(var ee=this[R],ne=1,ue=0;++ue=ne&&(ee-=Math.pow(2,8*C)),ee},n.prototype.readIntBE=function(R,C,H){R=R|0,C=C|0,H||K(R,C,this.length);for(var ee=C,ne=1,ue=this[R+--ee];ee>0&&(ne*=256);)ue+=this[R+--ee]*ne;return ne*=128,ue>=ne&&(ue-=Math.pow(2,8*C)),ue},n.prototype.readInt8=function(R,C){return C||K(R,1,this.length),this[R]&128?(255-this[R]+1)*-1:this[R]},n.prototype.readInt16LE=function(R,C){C||K(R,2,this.length);var H=this[R]|this[R+1]<<8;return H&32768?H|4294901760:H},n.prototype.readInt16BE=function(R,C){C||K(R,2,this.length);var H=this[R+1]|this[R]<<8;return H&32768?H|4294901760:H},n.prototype.readInt32LE=function(R,C){return C||K(R,4,this.length),this[R]|this[R+1]<<8|this[R+2]<<16|this[R+3]<<24},n.prototype.readInt32BE=function(R,C){return C||K(R,4,this.length),this[R]<<24|this[R+1]<<16|this[R+2]<<8|this[R+3]},n.prototype.readFloatLE=function(R,C){return C||K(R,4,this.length),l.read(this,R,!0,23,4)},n.prototype.readFloatBE=function(R,C){return C||K(R,4,this.length),l.read(this,R,!1,23,4)},n.prototype.readDoubleLE=function(R,C){return C||K(R,8,this.length),l.read(this,R,!0,52,8)},n.prototype.readDoubleBE=function(R,C){return C||K(R,8,this.length),l.read(this,R,!1,52,8)};function J($,R,C,H,ee,ne){if(!n.isBuffer($))throw new TypeError('"buffer" argument must be a Buffer instance');if(R>ee||R$.length)throw new RangeError("Index out of range")}n.prototype.writeUIntLE=function(R,C,H,ee){if(R=+R,C=C|0,H=H|0,!ee){var ne=Math.pow(2,8*H)-1;J(this,R,C,H,ne,0)}var ue=1,se=0;for(this[C]=R&255;++se=0&&(se*=256);)this[C+ue]=R/se&255;return C+H},n.prototype.writeUInt8=function(R,C,H){return R=+R,C=C|0,H||J(this,R,C,1,255,0),n.TYPED_ARRAY_SUPPORT||(R=Math.floor(R)),this[C]=R&255,C+1};function q($,R,C,H){R<0&&(R=65535+R+1);for(var ee=0,ne=Math.min($.length-C,2);ee>>(H?ee:1-ee)*8}n.prototype.writeUInt16LE=function(R,C,H){return R=+R,C=C|0,H||J(this,R,C,2,65535,0),n.TYPED_ARRAY_SUPPORT?(this[C]=R&255,this[C+1]=R>>>8):q(this,R,C,!0),C+2},n.prototype.writeUInt16BE=function(R,C,H){return R=+R,C=C|0,H||J(this,R,C,2,65535,0),n.TYPED_ARRAY_SUPPORT?(this[C]=R>>>8,this[C+1]=R&255):q(this,R,C,!1),C+2};function X($,R,C,H){R<0&&(R=4294967295+R+1);for(var ee=0,ne=Math.min($.length-C,4);ee>>(H?ee:3-ee)*8&255}n.prototype.writeUInt32LE=function(R,C,H){return R=+R,C=C|0,H||J(this,R,C,4,4294967295,0),n.TYPED_ARRAY_SUPPORT?(this[C+3]=R>>>24,this[C+2]=R>>>16,this[C+1]=R>>>8,this[C]=R&255):X(this,R,C,!0),C+4},n.prototype.writeUInt32BE=function(R,C,H){return R=+R,C=C|0,H||J(this,R,C,4,4294967295,0),n.TYPED_ARRAY_SUPPORT?(this[C]=R>>>24,this[C+1]=R>>>16,this[C+2]=R>>>8,this[C+3]=R&255):X(this,R,C,!1),C+4},n.prototype.writeIntLE=function(R,C,H,ee){if(R=+R,C=C|0,!ee){var ne=Math.pow(2,8*H-1);J(this,R,C,H,ne-1,-ne)}var ue=0,se=1,de=0;for(this[C]=R&255;++ue>0)-de&255;return C+H},n.prototype.writeIntBE=function(R,C,H,ee){if(R=+R,C=C|0,!ee){var ne=Math.pow(2,8*H-1);J(this,R,C,H,ne-1,-ne)}var ue=H-1,se=1,de=0;for(this[C+ue]=R&255;--ue>=0&&(se*=256);)R<0&&de===0&&this[C+ue+1]!==0&&(de=1),this[C+ue]=(R/se>>0)-de&255;return C+H},n.prototype.writeInt8=function(R,C,H){return R=+R,C=C|0,H||J(this,R,C,1,127,-128),n.TYPED_ARRAY_SUPPORT||(R=Math.floor(R)),R<0&&(R=255+R+1),this[C]=R&255,C+1},n.prototype.writeInt16LE=function(R,C,H){return R=+R,C=C|0,H||J(this,R,C,2,32767,-32768),n.TYPED_ARRAY_SUPPORT?(this[C]=R&255,this[C+1]=R>>>8):q(this,R,C,!0),C+2},n.prototype.writeInt16BE=function(R,C,H){return R=+R,C=C|0,H||J(this,R,C,2,32767,-32768),n.TYPED_ARRAY_SUPPORT?(this[C]=R>>>8,this[C+1]=R&255):q(this,R,C,!1),C+2},n.prototype.writeInt32LE=function(R,C,H){return R=+R,C=C|0,H||J(this,R,C,4,2147483647,-2147483648),n.TYPED_ARRAY_SUPPORT?(this[C]=R&255,this[C+1]=R>>>8,this[C+2]=R>>>16,this[C+3]=R>>>24):X(this,R,C,!0),C+4},n.prototype.writeInt32BE=function(R,C,H){return R=+R,C=C|0,H||J(this,R,C,4,2147483647,-2147483648),R<0&&(R=4294967295+R+1),n.TYPED_ARRAY_SUPPORT?(this[C]=R>>>24,this[C+1]=R>>>16,this[C+2]=R>>>8,this[C+3]=R&255):X(this,R,C,!1),C+4};function ae($,R,C,H,ee,ne){if(C+H>$.length)throw new RangeError("Index out of range");if(C<0)throw new RangeError("Index out of range")}function M($,R,C,H,ee){return ee||ae($,R,C,4),l.write($,R,C,H,23,4),C+4}n.prototype.writeFloatLE=function(R,C,H){return M(this,R,C,!0,H)},n.prototype.writeFloatBE=function(R,C,H){return M(this,R,C,!1,H)};function D($,R,C,H,ee){return ee||ae($,R,C,8),l.write($,R,C,H,52,8),C+8}n.prototype.writeDoubleLE=function(R,C,H){return D(this,R,C,!0,H)},n.prototype.writeDoubleBE=function(R,C,H){return D(this,R,C,!1,H)},n.prototype.copy=function(R,C,H,ee){if(H||(H=0),!ee&&ee!==0&&(ee=this.length),C>=R.length&&(C=R.length),C||(C=0),ee>0&&ee=this.length)throw new RangeError("sourceStart out of bounds");if(ee<0)throw new RangeError("sourceEnd out of bounds");ee>this.length&&(ee=this.length),R.length-C=0;--ue)R[ue+C]=this[ue+H];else if(ne<1e3||!n.TYPED_ARRAY_SUPPORT)for(ue=0;ue>>0,H=H===void 0?this.length:H>>>0,R||(R=0);var ue;if(typeof R=="number")for(ue=C;ue55295&&C<57344){if(!ee){if(C>56319){(R-=3)>-1&&ne.push(239,191,189);continue}else if(ue+1===H){(R-=3)>-1&&ne.push(239,191,189);continue}ee=C;continue}if(C<56320){(R-=3)>-1&&ne.push(239,191,189),ee=C;continue}C=(ee-55296<<10|C-56320)+65536}else ee&&(R-=3)>-1&&ne.push(239,191,189);if(ee=null,C<128){if((R-=1)<0)break;ne.push(C)}else if(C<2048){if((R-=2)<0)break;ne.push(C>>6|192,C&63|128)}else if(C<65536){if((R-=3)<0)break;ne.push(C>>12|224,C>>6&63|128,C&63|128)}else if(C<1114112){if((R-=4)<0)break;ne.push(C>>18|240,C>>12&63|128,C>>6&63|128,C&63|128)}else throw new Error("Invalid code point")}return ne}function ie($){for(var R=[],C=0;C<$.length;++C)R.push($.charCodeAt(C)&255);return R}function ce($,R){for(var C,H,ee,ne=[],ue=0;ue<$.length&&!((R-=2)<0);++ue)C=$.charCodeAt(ue),H=C>>8,ee=C%256,ne.push(ee),ne.push(H);return ne}function oe($){return u.toByteArray(I($))}function me($,R,C,H){for(var ee=0;ee=R.length||ee>=$.length);++ee)R[ee+C]=$[ee];return ee}function ge($){return $!==$}}).call(this)}).call(this,typeof xe!="undefined"?xe:typeof self!="undefined"?self:typeof window!="undefined"?window:{},e("buffer").Buffer)},{"base64-js":82,buffer:85,ieee754:304,isarray:313}],86:[function(e,w,g){var a=e("buffer").Buffer,r=a.isEncoding||function(i){switch(i&&i.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function u(i){if(i&&!r(i))throw new Error("Unknown encoding: "+i)}var l=g.StringDecoder=function(i){switch(this.encoding=(i||"utf8").toLowerCase().replace(/[-_]/,""),u(i),this.encoding){case"utf8":this.surrogateSize=3;break;case"ucs2":case"utf16le":this.surrogateSize=2,this.detectIncompleteChar=s;break;case"base64":this.surrogateSize=3,this.detectIncompleteChar=t;break;default:this.write=c;return}this.charBuffer=new a(6),this.charReceived=0,this.charLength=0};l.prototype.write=function(i){for(var n="";this.charLength;){var o=i.length>=this.charLength-this.charReceived?this.charLength-this.charReceived:i.length;if(i.copy(this.charBuffer,this.charReceived,0,o),this.charReceived+=o,this.charReceived=55296&&f<=56319){this.charLength+=this.surrogateSize,n="";continue}if(this.charReceived=this.charLength=0,i.length===0)return n;break}this.detectIncompleteChar(i);var p=i.length;this.charLength&&(i.copy(this.charBuffer,0,i.length-this.charReceived,p),p-=this.charReceived),n+=i.toString(this.encoding,0,p);var p=n.length-1,f=n.charCodeAt(p);if(f>=55296&&f<=56319){var d=this.surrogateSize;return this.charLength+=d,this.charReceived+=d,this.charBuffer.copy(this.charBuffer,d,0,d),i.copy(this.charBuffer,0,0,d),n.substring(0,p)}return n},l.prototype.detectIncompleteChar=function(i){for(var n=i.length>=3?3:i.length;n>0;n--){var o=i[i.length-n];if(n==1&&o>>5==6){this.charLength=2;break}if(n<=2&&o>>4==14){this.charLength=3;break}if(n<=3&&o>>3==30){this.charLength=4;break}}this.charReceived=n},l.prototype.end=function(i){var n="";if(i&&i.length&&(n=this.write(i)),this.charReceived){var o=this.charReceived,p=this.charBuffer,f=this.encoding;n+=p.slice(0,o).toString(f)}return n};function c(i){return i.toString(this.encoding)}function s(i){this.charReceived=i.length%2,this.charLength=this.charReceived?2:0}function t(i){this.charReceived=i.length%3,this.charLength=this.charReceived?3:0}},{buffer:85}],87:[function(e,w,g){w.exports={"100":"Continue","101":"Switching Protocols","102":"Processing","200":"OK","201":"Created","202":"Accepted","203":"Non-Authoritative Information","204":"No Content","205":"Reset Content","206":"Partial Content","207":"Multi-Status","208":"Already Reported","226":"IM Used","300":"Multiple Choices","301":"Moved Permanently","302":"Found","303":"See Other","304":"Not Modified","305":"Use Proxy","307":"Temporary Redirect","308":"Permanent Redirect","400":"Bad Request","401":"Unauthorized","402":"Payment Required","403":"Forbidden","404":"Not Found","405":"Method Not Allowed","406":"Not Acceptable","407":"Proxy Authentication Required","408":"Request Timeout","409":"Conflict","410":"Gone","411":"Length Required","412":"Precondition Failed","413":"Payload Too Large","414":"URI Too Long","415":"Unsupported Media Type","416":"Range Not Satisfiable","417":"Expectation Failed","418":"I'm a teapot","421":"Misdirected Request","422":"Unprocessable Entity","423":"Locked","424":"Failed Dependency","425":"Unordered Collection","426":"Upgrade Required","428":"Precondition Required","429":"Too Many Requests","431":"Request Header Fields Too Large","451":"Unavailable For Legal Reasons","500":"Internal Server Error","501":"Not Implemented","502":"Bad Gateway","503":"Service Unavailable","504":"Gateway Timeout","505":"HTTP Version Not Supported","506":"Variant Also Negotiates","507":"Insufficient Storage","508":"Loop Detected","509":"Bandwidth Limit Exceeded","510":"Not Extended","511":"Network Authentication Required"}},{}],88:[function(e,w,g){var a=Array.prototype.slice;w.exports=r;function r(l,c){if(!(this instanceof r))return new r(l,c);this.src=l,this._withAccess=c}r.prototype.withAccess=function(l){return this._withAccess=l!==!1,this},r.prototype.pick=function(l){return Array.isArray(l)||(l=a.call(arguments)),l.length&&(this.keys=l),this},r.prototype.to=function(l){if(l=l||{},!this.src)return l;var c=this.keys||Object.keys(this.src);if(!this._withAccess){for(var s=0;s>8&255]},U=function(Q){return[Q&255,Q>>8&255,Q>>16&255,Q>>24&255]},P=function(Q){return Q[3]<<24|Q[2]<<16|Q[1]<<8|Q[0]},B=function(Q){return Y(Q,23,4)},K=function(Q){return Y(Q,52,8)},J=function(Q,Z){h(Q[A],Z,{get:function(){return j(this)[Z]}})},q=function(Q,Z,ie,ce){var oe=o(ie),me=j(Q);if(oe+Z>me.byteLength)throw L(_);var ge=j(me.buffer).bytes,$=oe+me.byteOffset,R=ge.slice($,$+Z);return ce?R:R.reverse()},X=function(Q,Z,ie,ce,oe,me){var ge=o(ie),$=j(Q);if(ge+Z>$.byteLength)throw L(_);for(var R=j($.buffer).bytes,C=ge+$.byteOffset,H=ce(+oe),ee=0;eeoe)throw L("Wrong offset");if(ce=ce===void 0?oe-me:n(ce),me+ce>oe)throw L(E);y(this,{buffer:Z,byteLength:ce,byteOffset:me}),r||(this.buffer=Z,this.byteLength=ce,this.byteOffset=me)},r&&(J(k,"byteLength"),J(F,"buffer"),J(F,"byteLength"),J(F,"byteOffset")),c(F[A],{getInt8:function(Z){return q(this,1,Z)[0]<<24>>24},getUint8:function(Z){return q(this,1,Z)[0]},getInt16:function(Z){var ie=q(this,2,Z,arguments.length>1?arguments[1]:void 0);return(ie[1]<<8|ie[0])<<16>>16},getUint16:function(Z){var ie=q(this,2,Z,arguments.length>1?arguments[1]:void 0);return ie[1]<<8|ie[0]},getInt32:function(Z){return P(q(this,4,Z,arguments.length>1?arguments[1]:void 0))},getUint32:function(Z){return P(q(this,4,Z,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(Z){return re(q(this,4,Z,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(Z){return re(q(this,8,Z,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(Z,ie){X(this,1,Z,z,ie)},setUint8:function(Z,ie){X(this,1,Z,z,ie)},setInt16:function(Z,ie){X(this,2,Z,G,ie,arguments.length>2?arguments[2]:void 0)},setUint16:function(Z,ie){X(this,2,Z,G,ie,arguments.length>2?arguments[2]:void 0)},setInt32:function(Z,ie){X(this,4,Z,U,ie,arguments.length>2?arguments[2]:void 0)},setUint32:function(Z,ie){X(this,4,Z,U,ie,arguments.length>2?arguments[2]:void 0)},setFloat32:function(Z,ie){X(this,4,Z,B,ie,arguments.length>2?arguments[2]:void 0)},setFloat64:function(Z,ie){X(this,8,Z,K,ie,arguments.length>2?arguments[2]:void 0)}});else{if(!s(function(){T(1)})||!s(function(){new T(-1)})||s(function(){return new T,new T(1.5),new T(NaN),T.name!=x})){k=function(Z){return t(this,k),new T(o(Z))};for(var ae=k[A]=T[A],M=m(T),D=0,N;M.length>D;)(N=M[D++])in k||l(k,N,T[N]);ae.constructor=k}d&&f(W)!==V&&d(W,V);var I=new F(new k(2)),te=W.setInt8;I.setInt8(0,2147483648),I.setInt8(1,2147483649),(I.getInt8(0)||!I.getInt8(1))&&c(W,{setInt8:function(Z,ie){te.call(this,Z,ie<<24>>24)},setUint8:function(Z,ie){te.call(this,Z,ie<<24>>24)}},{unsafe:!0})}S(k,x),S(F,O),w.exports={ArrayBuffer:k,DataView:F}},{"../internals/an-instance":93,"../internals/array-buffer-native":95,"../internals/array-fill":99,"../internals/create-non-enumerable-property":120,"../internals/descriptors":125,"../internals/fails":140,"../internals/global":147,"../internals/ieee754":153,"../internals/internal-state":157,"../internals/object-define-property":179,"../internals/object-get-own-property-names":182,"../internals/object-get-prototype-of":184,"../internals/object-set-prototype-of":188,"../internals/redefine-all":196,"../internals/set-to-string-tag":208,"../internals/to-index":218,"../internals/to-integer":220,"../internals/to-length":221}],98:[function(e,w,g){var a=e("../internals/to-object"),r=e("../internals/to-absolute-index"),u=e("../internals/to-length"),l=Math.min;w.exports=[].copyWithin||function(s,t){var i=a(this),n=u(i.length),o=r(s,n),p=r(t,n),f=arguments.length>2?arguments[2]:void 0,d=l((f===void 0?n:r(f,n))-p,n-o),m=1;for(p0;)p in i?i[o]=i[p]:delete i[o],o+=m,p+=m;return i}},{"../internals/to-absolute-index":217,"../internals/to-length":221,"../internals/to-object":222}],99:[function(e,w,g){var a=e("../internals/to-object"),r=e("../internals/to-absolute-index"),u=e("../internals/to-length");w.exports=function(c){for(var s=a(this),t=u(s.length),i=arguments.length,n=r(i>1?arguments[1]:void 0,t),o=i>2?arguments[2]:void 0,p=o===void 0?t:r(o,t);p>n;)s[n++]=c;return s}},{"../internals/to-absolute-index":217,"../internals/to-length":221,"../internals/to-object":222}],100:[function(e,w,g){var a=e("../internals/array-iteration").forEach,r=e("../internals/array-method-is-strict"),u=r("forEach");w.exports=u?[].forEach:function(c){return a(this,c,arguments.length>1?arguments[1]:void 0)}},{"../internals/array-iteration":104,"../internals/array-method-is-strict":107}],101:[function(e,w,g){w.exports=function(a,r){for(var u=0,l=r.length,c=new a(l);l>u;)c[u]=r[u++];return c}},{}],102:[function(e,w,g){var a=e("../internals/function-bind-context"),r=e("../internals/to-object"),u=e("../internals/call-with-safe-iteration-closing"),l=e("../internals/is-array-iterator-method"),c=e("../internals/to-length"),s=e("../internals/create-property"),t=e("../internals/get-iterator"),i=e("../internals/get-iterator-method");w.exports=function(o){var p=r(o),f=typeof this=="function"?this:Array,d=arguments.length,m=d>1?arguments[1]:void 0,h=m!==void 0,b=i(p),S=0,v,j,y,x,O,A;if(h&&(m=a(m,d>2?arguments[2]:void 0,2)),b!=null&&!(f==Array&&l(b)))for(x=t(p,b),O=x.next,j=new f;!(y=O.call(x)).done;S++)A=h?u(x,m,[y.value,S],!0):y.value,s(j,S,A);else for(v=c(p.length),j=new f(v);v>S;S++)A=h?m(p[S],S):p[S],s(j,S,A);return j.length=S,j}},{"../internals/call-with-safe-iteration-closing":112,"../internals/create-property":122,"../internals/function-bind-context":142,"../internals/get-iterator":145,"../internals/get-iterator-method":144,"../internals/is-array-iterator-method":158,"../internals/to-length":221,"../internals/to-object":222}],103:[function(e,w,g){var a=e("../internals/to-indexed-object"),r=e("../internals/to-length"),u=e("../internals/to-absolute-index"),l=function(c){return function(s,t,i){var n=a(s),o=r(n.length),p=u(i,o),f;if(c&&t!=t){for(;o>p;)if(f=n[p++],f!=f)return!0}else for(;o>p;p++)if((c||p in n)&&n[p]===t)return c||p||0;return!c&&-1}};w.exports={includes:l(!0),indexOf:l(!1)}},{"../internals/to-absolute-index":217,"../internals/to-indexed-object":219,"../internals/to-length":221}],104:[function(e,w,g){var a=e("../internals/function-bind-context"),r=e("../internals/indexed-object"),u=e("../internals/to-object"),l=e("../internals/to-length"),c=e("../internals/array-species-create"),s=[].push,t=function(i){var n=i==1,o=i==2,p=i==3,f=i==4,d=i==6,m=i==7,h=i==5||d;return function(b,S,v,j){for(var y=u(b),x=r(y),O=a(S,v,3),A=l(x.length),E=0,_=j||c,T=n?_(b,A):o||m?_(b,0):void 0,k,F;A>E;E++)if((h||E in x)&&(k=x[E],F=O(k,E,y),i))if(n)T[E]=F;else if(F)switch(i){case 3:return!0;case 5:return k;case 6:return E;case 2:s.call(T,k)}else switch(i){case 4:return!1;case 7:s.call(T,k)}return d?-1:p||f?f:T}};w.exports={forEach:t(0),map:t(1),filter:t(2),some:t(3),every:t(4),find:t(5),findIndex:t(6),filterReject:t(7)}},{"../internals/array-species-create":111,"../internals/function-bind-context":142,"../internals/indexed-object":154,"../internals/to-length":221,"../internals/to-object":222}],105:[function(e,w,g){var a=e("../internals/to-indexed-object"),r=e("../internals/to-integer"),u=e("../internals/to-length"),l=e("../internals/array-method-is-strict"),c=Math.min,s=[].lastIndexOf,t=!!s&&1/[1].lastIndexOf(1,-0)<0,i=l("lastIndexOf"),n=t||!i;w.exports=n?function(p){if(t)return s.apply(this,arguments)||0;var f=a(this),d=u(f.length),m=d-1;for(arguments.length>1&&(m=c(m,r(arguments[1]))),m<0&&(m=d+m);m>=0;m--)if(m in f&&f[m]===p)return m||0;return-1}:s},{"../internals/array-method-is-strict":107,"../internals/to-indexed-object":219,"../internals/to-integer":220,"../internals/to-length":221}],106:[function(e,w,g){var a=e("../internals/fails"),r=e("../internals/well-known-symbol"),u=e("../internals/engine-v8-version"),l=r("species");w.exports=function(c){return u>=51||!a(function(){var s=[],t=s.constructor={};return t[l]=function(){return{foo:1}},s[c](Boolean).foo!==1})}},{"../internals/engine-v8-version":136,"../internals/fails":140,"../internals/well-known-symbol":237}],107:[function(e,w,g){var a=e("../internals/fails");w.exports=function(r,u){var l=[][r];return!!l&&a(function(){l.call(null,u||function(){throw 1},1)})}},{"../internals/fails":140}],108:[function(e,w,g){var a=e("../internals/a-function"),r=e("../internals/to-object"),u=e("../internals/indexed-object"),l=e("../internals/to-length"),c=function(s){return function(t,i,n,o){a(i);var p=r(t),f=u(p),d=l(p.length),m=s?d-1:0,h=s?-1:1;if(n<2)for(;;){if(m in f){o=f[m],m+=h;break}if(m+=h,s?m<0:d<=m)throw TypeError("Reduce of empty array with no initial value")}for(;s?m>=0:d>m;m+=h)m in f&&(o=i(o,f[m],m,p));return o}};w.exports={left:c(!1),right:c(!0)}},{"../internals/a-function":89,"../internals/indexed-object":154,"../internals/to-length":221,"../internals/to-object":222}],109:[function(e,w,g){var a=Math.floor,r=function(c,s){var t=c.length,i=a(t/2);return t<8?u(c,s):l(r(c.slice(0,i),s),r(c.slice(i),s),s)},u=function(c,s){for(var t=c.length,i=1,n,o;i0;)c[o]=c[--o];o!==i++&&(c[o]=n)}return c},l=function(c,s,t){for(var i=c.length,n=s.length,o=0,p=0,f=[];o=74)&&(t=r.match(/Chrome\/(\d+)/),t&&(i=t[1]))),w.exports=i&&+i},{"../internals/engine-user-agent":135,"../internals/global":147}],137:[function(e,w,g){var a=e("../internals/engine-user-agent"),r=a.match(/AppleWebKit\/(\d+)\./);w.exports=!!r&&+r[1]},{"../internals/engine-user-agent":135}],138:[function(e,w,g){w.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},{}],139:[function(e,w,g){var a=e("../internals/global"),r=e("../internals/object-get-own-property-descriptor").f,u=e("../internals/create-non-enumerable-property"),l=e("../internals/redefine"),c=e("../internals/set-global"),s=e("../internals/copy-constructor-properties"),t=e("../internals/is-forced");w.exports=function(i,n){var o=i.target,p=i.global,f=i.stat,d,m,h,b,S,v;if(p?m=a:f?m=a[o]||c(o,{}):m=(a[o]||{}).prototype,m)for(h in n){if(S=n[h],i.noTargetGet?(v=r(m,h),b=v&&v.value):b=m[h],d=t(p?h:o+(f?".":"#")+h,i.forced),!d&&b!==void 0){if(typeof S==typeof b)continue;s(S,b)}(i.sham||b&&b.sham)&&u(S,"sham",!0),l(m,h,S,i)}}},{"../internals/copy-constructor-properties":116,"../internals/create-non-enumerable-property":120,"../internals/global":147,"../internals/is-forced":160,"../internals/object-get-own-property-descriptor":180,"../internals/redefine":197,"../internals/set-global":206}],140:[function(e,w,g){w.exports=function(a){try{return!!a()}catch{return!0}}},{}],141:[function(e,w,g){e("../modules/es.regexp.exec");var a=e("../internals/redefine"),r=e("../internals/regexp-exec"),u=e("../internals/fails"),l=e("../internals/well-known-symbol"),c=e("../internals/create-non-enumerable-property"),s=l("species"),t=RegExp.prototype;w.exports=function(i,n,o,p){var f=l(i),d=!u(function(){var S={};return S[f]=function(){return 7},""[i](S)!=7}),m=d&&!u(function(){var S=!1,v=/a/;return i==="split"&&(v={},v.constructor={},v.constructor[s]=function(){return v},v.flags="",v[f]=/./[f]),v.exec=function(){return S=!0,null},v[f](""),!S});if(!d||!m||o){var h=/./[f],b=n(f,""[i],function(S,v,j,y,x){var O=v.exec;return O===r||O===t.exec?d&&!x?{done:!0,value:h.call(v,j,y)}:{done:!0,value:S.call(j,v,y)}:{done:!1}});a(String.prototype,i,b[0]),a(t,f,b[1])}p&&c(t[f],"sham",!0)}},{"../internals/create-non-enumerable-property":120,"../internals/fails":140,"../internals/redefine":197,"../internals/regexp-exec":199,"../internals/well-known-symbol":237,"../modules/es.regexp.exec":261}],142:[function(e,w,g){var a=e("../internals/a-function");w.exports=function(r,u,l){if(a(r),u===void 0)return r;switch(l){case 0:return function(){return r.call(u)};case 1:return function(c){return r.call(u,c)};case 2:return function(c,s){return r.call(u,c,s)};case 3:return function(c,s,t){return r.call(u,c,s,t)}}return function(){return r.apply(u,arguments)}}},{"../internals/a-function":89}],143:[function(e,w,g){var a=e("../internals/global"),r=function(u){return typeof u=="function"?u:void 0};w.exports=function(u,l){return arguments.length<2?r(a[u]):a[u]&&a[u][l]}},{"../internals/global":147}],144:[function(e,w,g){var a=e("../internals/classof"),r=e("../internals/iterators"),u=e("../internals/well-known-symbol"),l=u("iterator");w.exports=function(c){if(c!=null)return c[l]||c["@@iterator"]||r[a(c)]}},{"../internals/classof":115,"../internals/iterators":169,"../internals/well-known-symbol":237}],145:[function(e,w,g){var a=e("../internals/an-object"),r=e("../internals/get-iterator-method");w.exports=function(u,l){var c=arguments.length<2?r(u):l;if(typeof c!="function")throw TypeError(String(u)+" is not iterable");return a(c.call(u))}},{"../internals/an-object":94,"../internals/get-iterator-method":144}],146:[function(e,w,g){var a=e("../internals/to-object"),r=Math.floor,u="".replace,l=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,c=/\$([$&'`]|\d{1,2})/g;w.exports=function(s,t,i,n,o,p){var f=i+s.length,d=n.length,m=c;return o!==void 0&&(o=a(o),m=l),u.call(p,m,function(h,b){var S;switch(b.charAt(0)){case"$":return"$";case"&":return s;case"`":return t.slice(0,i);case"'":return t.slice(f);case"<":S=o[b.slice(1,-1)];break;default:var v=+b;if(v===0)return h;if(v>d){var j=r(v/10);return j===0?h:j<=d?n[j-1]===void 0?b.charAt(1):n[j-1]+b.charAt(1):h}S=n[v-1]}return S===void 0?"":S})}},{"../internals/to-object":222}],147:[function(e,w,g){(function(a){(function(){var r=function(u){return u&&u.Math==Math&&u};w.exports=r(typeof globalThis=="object"&&globalThis)||r(typeof window=="object"&&window)||r(typeof self=="object"&&self)||r(typeof a=="object"&&a)||function(){return this}()||Function("return this")()}).call(this)}).call(this,typeof xe!="undefined"?xe:typeof self!="undefined"?self:typeof window!="undefined"?window:{})},{}],148:[function(e,w,g){var a=e("../internals/to-object"),r={}.hasOwnProperty;w.exports=Object.hasOwn||function(l,c){return r.call(a(l),c)}},{"../internals/to-object":222}],149:[function(e,w,g){w.exports={}},{}],150:[function(e,w,g){var a=e("../internals/global");w.exports=function(r,u){var l=a.console;l&&l.error&&(arguments.length===1?l.error(r):l.error(r,u))}},{"../internals/global":147}],151:[function(e,w,g){var a=e("../internals/get-built-in");w.exports=a("document","documentElement")},{"../internals/get-built-in":143}],152:[function(e,w,g){var a=e("../internals/descriptors"),r=e("../internals/fails"),u=e("../internals/document-create-element");w.exports=!a&&!r(function(){return Object.defineProperty(u("div"),"a",{get:function(){return 7}}).a!=7})},{"../internals/descriptors":125,"../internals/document-create-element":126,"../internals/fails":140}],153:[function(e,w,g){var a=Math.abs,r=Math.pow,u=Math.floor,l=Math.log,c=Math.LN2,s=function(i,n,o){var p=new Array(o),f=o*8-n-1,d=(1<>1,h=n===23?r(2,-24)-r(2,-77):0,b=i<0||i===0&&1/i<0?1:0,S=0,v,j,y;for(i=a(i),i!=i||i===1/0?(j=i!=i?1:0,v=d):(v=u(l(i)/c),i*(y=r(2,-v))<1&&(v--,y*=2),v+m>=1?i+=h/y:i+=h*r(2,1-m),i*y>=2&&(v++,y/=2),v+m>=d?(j=0,v=d):v+m>=1?(j=(i*y-1)*r(2,n),v=v+m):(j=i*r(2,m-1)*r(2,n),v=0));n>=8;p[S++]=j&255,j/=256,n-=8);for(v=v<0;p[S++]=v&255,v/=256,f-=8);return p[--S]|=b*128,p},t=function(i,n){var o=i.length,p=o*8-n-1,f=(1<>1,m=p-7,h=o-1,b=i[h--],S=b&127,v;for(b>>=7;m>0;S=S*256+i[h],h--,m-=8);for(v=S&(1<<-m)-1,S>>=-m,m+=n;m>0;v=v*256+i[h],h--,m-=8);if(S===0)S=1-d;else{if(S===f)return v?NaN:b?-1/0:1/0;v=v+r(2,n),S=S-d}return(b?-1:1)*v*r(2,S-n)};w.exports={pack:s,unpack:t}},{}],154:[function(e,w,g){var a=e("../internals/fails"),r=e("../internals/classof-raw"),u="".split;w.exports=a(function(){return!Object("z").propertyIsEnumerable(0)})?function(l){return r(l)=="String"?u.call(l,""):Object(l)}:Object},{"../internals/classof-raw":114,"../internals/fails":140}],155:[function(e,w,g){var a=e("../internals/is-object"),r=e("../internals/object-set-prototype-of");w.exports=function(u,l,c){var s,t;return r&&typeof(s=l.constructor)=="function"&&s!==c&&a(t=s.prototype)&&t!==c.prototype&&r(u,t),u}},{"../internals/is-object":162,"../internals/object-set-prototype-of":188}],156:[function(e,w,g){var a=e("../internals/shared-store"),r=Function.toString;typeof a.inspectSource!="function"&&(a.inspectSource=function(u){return r.call(u)}),w.exports=a.inspectSource},{"../internals/shared-store":210}],157:[function(e,w,g){var a=e("../internals/native-weak-map"),r=e("../internals/global"),u=e("../internals/is-object"),l=e("../internals/create-non-enumerable-property"),c=e("../internals/has"),s=e("../internals/shared-store"),t=e("../internals/shared-key"),i=e("../internals/hidden-keys"),n="Object already initialized",o=r.WeakMap,p,f,d,m=function(x){return d(x)?f(x):p(x,{})},h=function(x){return function(O){var A;if(!u(O)||(A=f(O)).type!==x)throw TypeError("Incompatible receiver, "+x+" required");return A}};if(a||s.state){var b=s.state||(s.state=new o),S=b.get,v=b.has,j=b.set;p=function(x,O){if(v.call(b,x))throw new TypeError(n);return O.facade=x,j.call(b,x,O),O},f=function(x){return S.call(b,x)||{}},d=function(x){return v.call(b,x)}}else{var y=t("state");i[y]=!0,p=function(x,O){if(c(x,y))throw new TypeError(n);return O.facade=x,l(x,y,O),O},f=function(x){return c(x,y)?x[y]:{}},d=function(x){return c(x,y)}}w.exports={set:p,get:f,has:d,enforce:m,getterFor:h}},{"../internals/create-non-enumerable-property":120,"../internals/global":147,"../internals/has":148,"../internals/hidden-keys":149,"../internals/is-object":162,"../internals/native-weak-map":173,"../internals/shared-key":209,"../internals/shared-store":210}],158:[function(e,w,g){var a=e("../internals/well-known-symbol"),r=e("../internals/iterators"),u=a("iterator"),l=Array.prototype;w.exports=function(c){return c!==void 0&&(r.Array===c||l[u]===c)}},{"../internals/iterators":169,"../internals/well-known-symbol":237}],159:[function(e,w,g){var a=e("../internals/classof-raw");w.exports=Array.isArray||function(u){return a(u)=="Array"}},{"../internals/classof-raw":114}],160:[function(e,w,g){var a=e("../internals/fails"),r=/#|\.prototype\./,u=function(i,n){var o=c[l(i)];return o==t?!0:o==s?!1:typeof n=="function"?a(n):!!n},l=u.normalize=function(i){return String(i).replace(r,".").toLowerCase()},c=u.data={},s=u.NATIVE="N",t=u.POLYFILL="P";w.exports=u},{"../internals/fails":140}],161:[function(e,w,g){var a=e("../internals/is-object"),r=Math.floor;w.exports=function(l){return!a(l)&&isFinite(l)&&r(l)===l}},{"../internals/is-object":162}],162:[function(e,w,g){w.exports=function(a){return typeof a=="object"?a!==null:typeof a=="function"}},{}],163:[function(e,w,g){w.exports=!1},{}],164:[function(e,w,g){var a=e("../internals/is-object"),r=e("../internals/classof-raw"),u=e("../internals/well-known-symbol"),l=u("match");w.exports=function(c){var s;return a(c)&&((s=c[l])!==void 0?!!s:r(c)=="RegExp")}},{"../internals/classof-raw":114,"../internals/is-object":162,"../internals/well-known-symbol":237}],165:[function(e,w,g){var a=e("../internals/get-built-in"),r=e("../internals/use-symbol-as-uid");w.exports=r?function(u){return typeof u=="symbol"}:function(u){var l=a("Symbol");return typeof l=="function"&&Object(u)instanceof l}},{"../internals/get-built-in":143,"../internals/use-symbol-as-uid":235}],166:[function(e,w,g){var a=e("../internals/an-object"),r=e("../internals/is-array-iterator-method"),u=e("../internals/to-length"),l=e("../internals/function-bind-context"),c=e("../internals/get-iterator"),s=e("../internals/get-iterator-method"),t=e("../internals/iterator-close"),i=function(n,o){this.stopped=n,this.result=o};w.exports=function(n,o,p){var f=p&&p.that,d=!!(p&&p.AS_ENTRIES),m=!!(p&&p.IS_ITERATOR),h=!!(p&&p.INTERRUPTED),b=l(o,f,1+d+h),S,v,j,y,x,O,A,E=function(T){return S&&t(S,"normal",T),new i(!0,T)},_=function(T){return d?(a(T),h?b(T[0],T[1],E):b(T[0],T[1])):h?b(T,E):b(T)};if(m)S=n;else{if(v=s(n),typeof v!="function")throw TypeError("Target is not iterable");if(r(v)){for(j=0,y=u(n.length);y>j;j++)if(x=_(n[j]),x&&x instanceof i)return x;return new i(!1)}S=c(n,v)}for(O=S.next;!(A=O.call(S)).done;){try{x=_(A.value)}catch(T){t(S,"throw",T)}if(typeof x=="object"&&x&&x instanceof i)return x}return new i(!1)}},{"../internals/an-object":94,"../internals/function-bind-context":142,"../internals/get-iterator":145,"../internals/get-iterator-method":144,"../internals/is-array-iterator-method":158,"../internals/iterator-close":167,"../internals/to-length":221}],167:[function(e,w,g){var a=e("../internals/an-object");w.exports=function(r,u,l){var c,s;a(r);try{if(c=r.return,c===void 0){if(u==="throw")throw l;return l}c=c.call(r)}catch(t){s=!0,c=t}if(u==="throw")throw l;if(s)throw c;return a(c),l}},{"../internals/an-object":94}],168:[function(e,w,g){var a=e("../internals/fails"),r=e("../internals/object-get-prototype-of"),u=e("../internals/create-non-enumerable-property"),l=e("../internals/has"),c=e("../internals/well-known-symbol"),s=e("../internals/is-pure"),t=c("iterator"),i=!1,n=function(){return this},o,p,f;[].keys&&(f=[].keys(),"next"in f?(p=r(r(f)),p!==Object.prototype&&(o=p)):i=!0);var d=o==null||a(function(){var m={};return o[t].call(m)!==m});d&&(o={}),(!s||d)&&!l(o,t)&&u(o,t,n),w.exports={IteratorPrototype:o,BUGGY_SAFARI_ITERATORS:i}},{"../internals/create-non-enumerable-property":120,"../internals/fails":140,"../internals/has":148,"../internals/is-pure":163,"../internals/object-get-prototype-of":184,"../internals/well-known-symbol":237}],169:[function(e,w,g){arguments[4][149][0].apply(g,arguments)},{dup:149}],170:[function(e,w,g){var a=e("../internals/global"),r=e("../internals/object-get-own-property-descriptor").f,u=e("../internals/task").set,l=e("../internals/engine-is-ios"),c=e("../internals/engine-is-ios-pebble"),s=e("../internals/engine-is-webos-webkit"),t=e("../internals/engine-is-node"),i=a.MutationObserver||a.WebKitMutationObserver,n=a.document,o=a.process,p=a.Promise,f=r(a,"queueMicrotask"),d=f&&f.value,m,h,b,S,v,j,y,x;d||(m=function(){var O,A;for(t&&(O=o.domain)&&O.exit();h;){A=h.fn,h=h.next;try{A()}catch(E){throw h?S():b=void 0,E}}b=void 0,O&&O.enter()},!l&&!t&&!s&&i&&n?(v=!0,j=n.createTextNode(""),new i(m).observe(j,{characterData:!0}),S=function(){j.data=v=!v}):!c&&p&&p.resolve?(y=p.resolve(void 0),y.constructor=p,x=y.then,S=function(){x.call(y,m)}):t?S=function(){o.nextTick(m)}:S=function(){u.call(a,m)}),w.exports=d||function(O){var A={fn:O,next:void 0};b&&(b.next=A),h||(h=A,S()),b=A}},{"../internals/engine-is-ios":132,"../internals/engine-is-ios-pebble":131,"../internals/engine-is-node":133,"../internals/engine-is-webos-webkit":134,"../internals/global":147,"../internals/object-get-own-property-descriptor":180,"../internals/task":216}],171:[function(e,w,g){var a=e("../internals/global");w.exports=a.Promise},{"../internals/global":147}],172:[function(e,w,g){var a=e("../internals/engine-v8-version"),r=e("../internals/fails");w.exports=!!Object.getOwnPropertySymbols&&!r(function(){var u=Symbol();return!String(u)||!(Object(u)instanceof Symbol)||!Symbol.sham&&a&&a<41})},{"../internals/engine-v8-version":136,"../internals/fails":140}],173:[function(e,w,g){var a=e("../internals/global"),r=e("../internals/inspect-source"),u=a.WeakMap;w.exports=typeof u=="function"&&/native code/.test(r(u))},{"../internals/global":147,"../internals/inspect-source":156}],174:[function(e,w,g){var a=e("../internals/a-function"),r=function(u){var l,c;this.promise=new u(function(s,t){if(l!==void 0||c!==void 0)throw TypeError("Bad Promise constructor");l=s,c=t}),this.resolve=a(l),this.reject=a(c)};w.exports.f=function(u){return new r(u)}},{"../internals/a-function":89}],175:[function(e,w,g){var a=e("../internals/is-regexp");w.exports=function(r){if(a(r))throw TypeError("The method doesn't accept regular expressions");return r}},{"../internals/is-regexp":164}],176:[function(e,w,g){var a=e("../internals/descriptors"),r=e("../internals/fails"),u=e("../internals/object-keys"),l=e("../internals/object-get-own-property-symbols"),c=e("../internals/object-property-is-enumerable"),s=e("../internals/to-object"),t=e("../internals/indexed-object"),i=Object.assign,n=Object.defineProperty;w.exports=!i||r(function(){if(a&&i({b:1},i(n({},"a",{enumerable:!0,get:function(){n(this,"b",{value:3,enumerable:!1})}}),{b:2})).b!==1)return!0;var o={},p={},f=Symbol(),d="abcdefghijklmnopqrst";return o[f]=7,d.split("").forEach(function(m){p[m]=m}),i({},o)[f]!=7||u(i({},p)).join("")!=d})?function(p,f){for(var d=s(p),m=arguments.length,h=1,b=l.f,S=c.f;m>h;)for(var v=t(arguments[h++]),j=b?u(v).concat(b(v)):u(v),y=j.length,x=0,O;y>x;)O=j[x++],(!a||S.call(v,O))&&(d[O]=v[O]);return d}:i},{"../internals/descriptors":125,"../internals/fails":140,"../internals/indexed-object":154,"../internals/object-get-own-property-symbols":183,"../internals/object-keys":186,"../internals/object-property-is-enumerable":187,"../internals/to-object":222}],177:[function(e,w,g){var a=e("../internals/an-object"),r=e("../internals/object-define-properties"),u=e("../internals/enum-bug-keys"),l=e("../internals/hidden-keys"),c=e("../internals/html"),s=e("../internals/document-create-element"),t=e("../internals/shared-key"),i=">",n="<",o="prototype",p="script",f=t("IE_PROTO"),d=function(){},m=function(j){return n+p+i+j+n+"/"+p+i},h=function(j){j.write(m("")),j.close();var y=j.parentWindow.Object;return j=null,y},b=function(){var j=s("iframe"),y="java"+p+":",x;return j.style.display="none",c.appendChild(j),j.src=String(y),x=j.contentWindow.document,x.open(),x.write(m("document.F=Object")),x.close(),x.F},S,v=function(){try{S=new ActiveXObject("htmlfile")}catch{}v=typeof document!="undefined"?document.domain&&S?h(S):b():h(S);for(var j=u.length;j--;)delete v[o][u[j]];return v()};l[f]=!0,w.exports=Object.create||function(y,x){var O;return y!==null?(d[o]=a(y),O=new d,d[o]=null,O[f]=y):O=v(),x===void 0?O:r(O,x)}},{"../internals/an-object":94,"../internals/document-create-element":126,"../internals/enum-bug-keys":138,"../internals/hidden-keys":149,"../internals/html":151,"../internals/object-define-properties":178,"../internals/shared-key":209}],178:[function(e,w,g){var a=e("../internals/descriptors"),r=e("../internals/object-define-property"),u=e("../internals/an-object"),l=e("../internals/object-keys");w.exports=a?Object.defineProperties:function(s,t){u(s);for(var i=l(t),n=i.length,o=0,p;n>o;)r.f(s,p=i[o++],t[p]);return s}},{"../internals/an-object":94,"../internals/descriptors":125,"../internals/object-define-property":179,"../internals/object-keys":186}],179:[function(e,w,g){var a=e("../internals/descriptors"),r=e("../internals/ie8-dom-define"),u=e("../internals/an-object"),l=e("../internals/to-property-key"),c=Object.defineProperty;g.f=a?c:function(t,i,n){if(u(t),i=l(i),u(n),r)try{return c(t,i,n)}catch{}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[i]=n.value),t}},{"../internals/an-object":94,"../internals/descriptors":125,"../internals/ie8-dom-define":152,"../internals/to-property-key":226}],180:[function(e,w,g){var a=e("../internals/descriptors"),r=e("../internals/object-property-is-enumerable"),u=e("../internals/create-property-descriptor"),l=e("../internals/to-indexed-object"),c=e("../internals/to-property-key"),s=e("../internals/has"),t=e("../internals/ie8-dom-define"),i=Object.getOwnPropertyDescriptor;g.f=a?i:function(o,p){if(o=l(o),p=c(p),t)try{return i(o,p)}catch{}if(s(o,p))return u(!r.f.call(o,p),o[p])}},{"../internals/create-property-descriptor":121,"../internals/descriptors":125,"../internals/has":148,"../internals/ie8-dom-define":152,"../internals/object-property-is-enumerable":187,"../internals/to-indexed-object":219,"../internals/to-property-key":226}],181:[function(e,w,g){var a=e("../internals/to-indexed-object"),r=e("../internals/object-get-own-property-names").f,u={}.toString,l=typeof window=="object"&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],c=function(s){try{return r(s)}catch{return l.slice()}};w.exports.f=function(t){return l&&u.call(t)=="[object Window]"?c(t):r(a(t))}},{"../internals/object-get-own-property-names":182,"../internals/to-indexed-object":219}],182:[function(e,w,g){var a=e("../internals/object-keys-internal"),r=e("../internals/enum-bug-keys"),u=r.concat("length","prototype");g.f=Object.getOwnPropertyNames||function(c){return a(c,u)}},{"../internals/enum-bug-keys":138,"../internals/object-keys-internal":185}],183:[function(e,w,g){g.f=Object.getOwnPropertySymbols},{}],184:[function(e,w,g){var a=e("../internals/has"),r=e("../internals/to-object"),u=e("../internals/shared-key"),l=e("../internals/correct-prototype-getter"),c=u("IE_PROTO"),s=Object.prototype;w.exports=l?Object.getPrototypeOf:function(t){return t=r(t),a(t,c)?t[c]:typeof t.constructor=="function"&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?s:null}},{"../internals/correct-prototype-getter":118,"../internals/has":148,"../internals/shared-key":209,"../internals/to-object":222}],185:[function(e,w,g){var a=e("../internals/has"),r=e("../internals/to-indexed-object"),u=e("../internals/array-includes").indexOf,l=e("../internals/hidden-keys");w.exports=function(c,s){var t=r(c),i=0,n=[],o;for(o in t)!a(l,o)&&a(t,o)&&n.push(o);for(;s.length>i;)a(t,o=s[i++])&&(~u(n,o)||n.push(o));return n}},{"../internals/array-includes":103,"../internals/has":148,"../internals/hidden-keys":149,"../internals/to-indexed-object":219}],186:[function(e,w,g){var a=e("../internals/object-keys-internal"),r=e("../internals/enum-bug-keys");w.exports=Object.keys||function(l){return a(l,r)}},{"../internals/enum-bug-keys":138,"../internals/object-keys-internal":185}],187:[function(e,w,g){var a={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,u=r&&!a.call({1:2},1);g.f=u?function(c){var s=r(this,c);return!!s&&s.enumerable}:a},{}],188:[function(e,w,g){var a=e("../internals/an-object"),r=e("../internals/a-possible-prototype");w.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var u=!1,l={},c;try{c=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set,c.call(l,[]),u=l instanceof Array}catch{}return function(t,i){return a(t),r(i),u?c.call(t,i):t.__proto__=i,t}}():void 0)},{"../internals/a-possible-prototype":90,"../internals/an-object":94}],189:[function(e,w,g){var a=e("../internals/descriptors"),r=e("../internals/object-keys"),u=e("../internals/to-indexed-object"),l=e("../internals/object-property-is-enumerable").f,c=function(s){return function(t){for(var i=u(t),n=r(i),o=n.length,p=0,f=[],d;o>p;)d=n[p++],(!a||l.call(i,d))&&f.push(s?[d,i[d]]:i[d]);return f}};w.exports={entries:c(!0),values:c(!1)}},{"../internals/descriptors":125,"../internals/object-keys":186,"../internals/object-property-is-enumerable":187,"../internals/to-indexed-object":219}],190:[function(e,w,g){var a=e("../internals/to-string-tag-support"),r=e("../internals/classof");w.exports=a?{}.toString:function(){return"[object "+r(this)+"]"}},{"../internals/classof":115,"../internals/to-string-tag-support":227}],191:[function(e,w,g){var a=e("../internals/is-object");w.exports=function(r,u){var l,c;if(u==="string"&&typeof(l=r.toString)=="function"&&!a(c=l.call(r))||typeof(l=r.valueOf)=="function"&&!a(c=l.call(r))||u!=="string"&&typeof(l=r.toString)=="function"&&!a(c=l.call(r)))return c;throw TypeError("Can't convert object to primitive value")}},{"../internals/is-object":162}],192:[function(e,w,g){var a=e("../internals/get-built-in"),r=e("../internals/object-get-own-property-names"),u=e("../internals/object-get-own-property-symbols"),l=e("../internals/an-object");w.exports=a("Reflect","ownKeys")||function(s){var t=r.f(l(s)),i=u.f;return i?t.concat(i(s)):t}},{"../internals/an-object":94,"../internals/get-built-in":143,"../internals/object-get-own-property-names":182,"../internals/object-get-own-property-symbols":183}],193:[function(e,w,g){var a=e("../internals/global");w.exports=a},{"../internals/global":147}],194:[function(e,w,g){w.exports=function(a){try{return{error:!1,value:a()}}catch(r){return{error:!0,value:r}}}},{}],195:[function(e,w,g){var a=e("../internals/an-object"),r=e("../internals/is-object"),u=e("../internals/new-promise-capability");w.exports=function(l,c){if(a(l),r(c)&&c.constructor===l)return c;var s=u.f(l),t=s.resolve;return t(c),s.promise}},{"../internals/an-object":94,"../internals/is-object":162,"../internals/new-promise-capability":174}],196:[function(e,w,g){var a=e("../internals/redefine");w.exports=function(r,u,l){for(var c in u)a(r,c,u[c],l);return r}},{"../internals/redefine":197}],197:[function(e,w,g){var a=e("../internals/global"),r=e("../internals/create-non-enumerable-property"),u=e("../internals/has"),l=e("../internals/set-global"),c=e("../internals/inspect-source"),s=e("../internals/internal-state"),t=s.get,i=s.enforce,n=String(String).split("String");(w.exports=function(o,p,f,d){var m=d?!!d.unsafe:!1,h=d?!!d.enumerable:!1,b=d?!!d.noTargetGet:!1,S;if(typeof f=="function"&&(typeof p=="string"&&!u(f,"name")&&r(f,"name",p),S=i(f),S.source||(S.source=n.join(typeof p=="string"?p:""))),o===a){h?o[p]=f:l(p,f);return}else m?!b&&o[p]&&(h=!0):delete o[p];h?o[p]=f:r(o,p,f)})(Function.prototype,"toString",function(){return typeof this=="function"&&t(this).source||c(this)})},{"../internals/create-non-enumerable-property":120,"../internals/global":147,"../internals/has":148,"../internals/inspect-source":156,"../internals/internal-state":157,"../internals/set-global":206}],198:[function(e,w,g){var a=e("./classof-raw"),r=e("./regexp-exec");w.exports=function(u,l){var c=u.exec;if(typeof c=="function"){var s=c.call(u,l);if(typeof s!="object")throw TypeError("RegExp exec method returned something other than an Object or null");return s}if(a(u)!=="RegExp")throw TypeError("RegExp#exec called on incompatible receiver");return r.call(u,l)}},{"./classof-raw":114,"./regexp-exec":199}],199:[function(e,w,g){var a=e("../internals/to-string"),r=e("../internals/regexp-flags"),u=e("../internals/regexp-sticky-helpers"),l=e("../internals/shared"),c=e("../internals/object-create"),s=e("../internals/internal-state").get,t=e("../internals/regexp-unsupported-dot-all"),i=e("../internals/regexp-unsupported-ncg"),n=RegExp.prototype.exec,o=l("native-string-replace",String.prototype.replace),p=n,f=function(){var b=/a/,S=/b*/g;return n.call(b,"a"),n.call(S,"a"),b.lastIndex!==0||S.lastIndex!==0}(),d=u.UNSUPPORTED_Y||u.BROKEN_CARET,m=/()??/.exec("")[1]!==void 0,h=f||m||d||t||i;h&&(p=function(S){var v=this,j=s(v),y=a(S),x=j.raw,O,A,E,_,T,k,F;if(x)return x.lastIndex=v.lastIndex,O=p.call(x,y),v.lastIndex=x.lastIndex,O;var W=j.groups,V=d&&v.sticky,L=r.call(v),Y=v.source,re=0,z=y;if(V&&(L=L.replace("y",""),L.indexOf("g")===-1&&(L+="g"),z=y.slice(v.lastIndex),v.lastIndex>0&&(!v.multiline||v.multiline&&y.charAt(v.lastIndex-1)!==` +`)&&(Y="(?: "+Y+")",z=" "+z,re++),A=new RegExp("^(?:"+Y+")",L)),m&&(A=new RegExp("^"+Y+"$(?!\\s)",L)),f&&(E=v.lastIndex),_=n.call(V?A:v,z),V?_?(_.input=_.input.slice(re),_[0]=_[0].slice(re),_.index=v.lastIndex,v.lastIndex+=_[0].length):v.lastIndex=0:f&&_&&(v.lastIndex=v.global?_.index+_[0].length:E),m&&_&&_.length>1&&o.call(_[0],A,function(){for(T=1;Tb)","g");return l.exec("b").groups.a!=="b"||"b".replace(l,"$c")!=="bc"})},{"../internals/global":147,"./fails":140}],204:[function(e,w,g){w.exports=function(a){if(a==null)throw TypeError("Can't call method on "+a);return a}},{}],205:[function(e,w,g){w.exports=Object.is||function(r,u){return r===u?r!==0||1/r===1/u:r!=r&&u!=u}},{}],206:[function(e,w,g){var a=e("../internals/global");w.exports=function(r,u){try{Object.defineProperty(a,r,{value:u,configurable:!0,writable:!0})}catch{a[r]=u}return u}},{"../internals/global":147}],207:[function(e,w,g){var a=e("../internals/get-built-in"),r=e("../internals/object-define-property"),u=e("../internals/well-known-symbol"),l=e("../internals/descriptors"),c=u("species");w.exports=function(s){var t=a(s),i=r.f;l&&t&&!t[c]&&i(t,c,{configurable:!0,get:function(){return this}})}},{"../internals/descriptors":125,"../internals/get-built-in":143,"../internals/object-define-property":179,"../internals/well-known-symbol":237}],208:[function(e,w,g){var a=e("../internals/object-define-property").f,r=e("../internals/has"),u=e("../internals/well-known-symbol"),l=u("toStringTag");w.exports=function(c,s,t){c&&!r(c=t?c:c.prototype,l)&&a(c,l,{configurable:!0,value:s})}},{"../internals/has":148,"../internals/object-define-property":179,"../internals/well-known-symbol":237}],209:[function(e,w,g){var a=e("../internals/shared"),r=e("../internals/uid"),u=a("keys");w.exports=function(l){return u[l]||(u[l]=r(l))}},{"../internals/shared":211,"../internals/uid":234}],210:[function(e,w,g){var a=e("../internals/global"),r=e("../internals/set-global"),u="__core-js_shared__",l=a[u]||r(u,{});w.exports=l},{"../internals/global":147,"../internals/set-global":206}],211:[function(e,w,g){var a=e("../internals/is-pure"),r=e("../internals/shared-store");(w.exports=function(u,l){return r[u]||(r[u]=l!==void 0?l:{})})("versions",[]).push({version:"3.17.2",mode:a?"pure":"global",copyright:"\xA9 2021 Denis Pushkarev (zloirock.ru)"})},{"../internals/is-pure":163,"../internals/shared-store":210}],212:[function(e,w,g){var a=e("../internals/an-object"),r=e("../internals/a-function"),u=e("../internals/well-known-symbol"),l=u("species");w.exports=function(c,s){var t=a(c).constructor,i;return t===void 0||(i=a(t)[l])==null?s:r(i)}},{"../internals/a-function":89,"../internals/an-object":94,"../internals/well-known-symbol":237}],213:[function(e,w,g){var a=e("../internals/to-integer"),r=e("../internals/to-string"),u=e("../internals/require-object-coercible"),l=function(c){return function(s,t){var i=r(u(s)),n=a(t),o=i.length,p,f;return n<0||n>=o?c?"":void 0:(p=i.charCodeAt(n),p<55296||p>56319||n+1===o||(f=i.charCodeAt(n+1))<56320||f>57343?c?i.charAt(n):p:c?i.slice(n,n+2):(p-55296<<10)+(f-56320)+65536)}};w.exports={codeAt:l(!1),charAt:l(!0)}},{"../internals/require-object-coercible":204,"../internals/to-integer":220,"../internals/to-string":228}],214:[function(e,w,g){var a=e("../internals/fails"),r=e("../internals/whitespaces"),u="\u200B\x85\u180E";w.exports=function(l){return a(function(){return!!r[l]()||u[l]()!=u||r[l].name!==l})}},{"../internals/fails":140,"../internals/whitespaces":238}],215:[function(e,w,g){var a=e("../internals/require-object-coercible"),r=e("../internals/to-string"),u=e("../internals/whitespaces"),l="["+u+"]",c=RegExp("^"+l+l+"*"),s=RegExp(l+l+"*$"),t=function(i){return function(n){var o=r(a(n));return i&1&&(o=o.replace(c,"")),i&2&&(o=o.replace(s,"")),o}};w.exports={start:t(1),end:t(2),trim:t(3)}},{"../internals/require-object-coercible":204,"../internals/to-string":228,"../internals/whitespaces":238}],216:[function(e,w,g){var a=e("../internals/global"),r=e("../internals/fails"),u=e("../internals/function-bind-context"),l=e("../internals/html"),c=e("../internals/document-create-element"),s=e("../internals/engine-is-ios"),t=e("../internals/engine-is-node"),i=a.setImmediate,n=a.clearImmediate,o=a.process,p=a.MessageChannel,f=a.Dispatch,d=0,m={},h="onreadystatechange",b,S,v,j;try{b=a.location}catch{}var y=function(E){if(m.hasOwnProperty(E)){var _=m[E];delete m[E],_()}},x=function(E){return function(){y(E)}},O=function(E){y(E.data)},A=function(E){a.postMessage(String(E),b.protocol+"//"+b.host)};(!i||!n)&&(i=function(_){for(var T=[],k=arguments.length,F=1;k>F;)T.push(arguments[F++]);return m[++d]=function(){(typeof _=="function"?_:Function(_)).apply(void 0,T)},S(d),d},n=function(_){delete m[_]},t?S=function(E){o.nextTick(x(E))}:f&&f.now?S=function(E){f.now(x(E))}:p&&!s?(v=new p,j=v.port2,v.port1.onmessage=O,S=u(j.postMessage,j,1)):a.addEventListener&&typeof postMessage=="function"&&!a.importScripts&&b&&b.protocol!=="file:"&&!r(A)?(S=A,a.addEventListener("message",O,!1)):h in c("script")?S=function(E){l.appendChild(c("script"))[h]=function(){l.removeChild(this),y(E)}}:S=function(E){setTimeout(x(E),0)}),w.exports={set:i,clear:n}},{"../internals/document-create-element":126,"../internals/engine-is-ios":132,"../internals/engine-is-node":133,"../internals/fails":140,"../internals/function-bind-context":142,"../internals/global":147,"../internals/html":151}],217:[function(e,w,g){var a=e("../internals/to-integer"),r=Math.max,u=Math.min;w.exports=function(l,c){var s=a(l);return s<0?r(s+c,0):u(s,c)}},{"../internals/to-integer":220}],218:[function(e,w,g){var a=e("../internals/to-integer"),r=e("../internals/to-length");w.exports=function(u){if(u===void 0)return 0;var l=a(u),c=r(l);if(l!==c)throw RangeError("Wrong length or index");return c}},{"../internals/to-integer":220,"../internals/to-length":221}],219:[function(e,w,g){var a=e("../internals/indexed-object"),r=e("../internals/require-object-coercible");w.exports=function(u){return a(r(u))}},{"../internals/indexed-object":154,"../internals/require-object-coercible":204}],220:[function(e,w,g){var a=Math.ceil,r=Math.floor;w.exports=function(u){return isNaN(u=+u)?0:(u>0?r:a)(u)}},{}],221:[function(e,w,g){var a=e("../internals/to-integer"),r=Math.min;w.exports=function(u){return u>0?r(a(u),9007199254740991):0}},{"../internals/to-integer":220}],222:[function(e,w,g){var a=e("../internals/require-object-coercible");w.exports=function(r){return Object(a(r))}},{"../internals/require-object-coercible":204}],223:[function(e,w,g){var a=e("../internals/to-positive-integer");w.exports=function(r,u){var l=a(r);if(l%u)throw RangeError("Wrong offset");return l}},{"../internals/to-positive-integer":224}],224:[function(e,w,g){var a=e("../internals/to-integer");w.exports=function(r){var u=a(r);if(u<0)throw RangeError("The argument can't be less than 0");return u}},{"../internals/to-integer":220}],225:[function(e,w,g){var a=e("../internals/is-object"),r=e("../internals/is-symbol"),u=e("../internals/ordinary-to-primitive"),l=e("../internals/well-known-symbol"),c=l("toPrimitive");w.exports=function(s,t){if(!a(s)||r(s))return s;var i=s[c],n;if(i!==void 0){if(t===void 0&&(t="default"),n=i.call(s,t),!a(n)||r(n))return n;throw TypeError("Can't convert object to primitive value")}return t===void 0&&(t="number"),u(s,t)}},{"../internals/is-object":162,"../internals/is-symbol":165,"../internals/ordinary-to-primitive":191,"../internals/well-known-symbol":237}],226:[function(e,w,g){var a=e("../internals/to-primitive"),r=e("../internals/is-symbol");w.exports=function(u){var l=a(u,"string");return r(l)?l:String(l)}},{"../internals/is-symbol":165,"../internals/to-primitive":225}],227:[function(e,w,g){var a=e("../internals/well-known-symbol"),r=a("toStringTag"),u={};u[r]="z",w.exports=String(u)==="[object z]"},{"../internals/well-known-symbol":237}],228:[function(e,w,g){var a=e("../internals/is-symbol");w.exports=function(r){if(a(r))throw TypeError("Cannot convert a Symbol value to a string");return String(r)}},{"../internals/is-symbol":165}],229:[function(e,w,g){var a=e("../internals/export"),r=e("../internals/global"),u=e("../internals/descriptors"),l=e("../internals/typed-array-constructors-require-wrappers"),c=e("../internals/array-buffer-view-core"),s=e("../internals/array-buffer"),t=e("../internals/an-instance"),i=e("../internals/create-property-descriptor"),n=e("../internals/create-non-enumerable-property"),o=e("../internals/is-integer"),p=e("../internals/to-length"),f=e("../internals/to-index"),d=e("../internals/to-offset"),m=e("../internals/to-property-key"),h=e("../internals/has"),b=e("../internals/classof"),S=e("../internals/is-object"),v=e("../internals/is-symbol"),j=e("../internals/object-create"),y=e("../internals/object-set-prototype-of"),x=e("../internals/object-get-own-property-names").f,O=e("../internals/typed-array-from"),A=e("../internals/array-iteration").forEach,E=e("../internals/set-species"),_=e("../internals/object-define-property"),T=e("../internals/object-get-own-property-descriptor"),k=e("../internals/internal-state"),F=e("../internals/inherit-if-required"),W=k.get,V=k.set,L=_.f,Y=T.f,re=Math.round,z=r.RangeError,G=s.ArrayBuffer,U=s.DataView,P=c.NATIVE_ARRAY_BUFFER_VIEWS,B=c.TYPED_ARRAY_CONSTRUCTOR,K=c.TYPED_ARRAY_TAG,J=c.TypedArray,q=c.TypedArrayPrototype,X=c.aTypedArrayConstructor,ae=c.isTypedArray,M="BYTES_PER_ELEMENT",D="Wrong length",N=function(ce,oe){for(var me=0,ge=oe.length,$=new(X(ce))(ge);ge>me;)$[me]=oe[me++];return $},I=function(ce,oe){L(ce,oe,{get:function(){return W(this)[oe]}})},te=function(ce){var oe;return ce instanceof G||(oe=b(ce))=="ArrayBuffer"||oe=="SharedArrayBuffer"},Q=function(ce,oe){return ae(ce)&&!v(oe)&&oe in ce&&o(+oe)&&oe>=0},Z=function(oe,me){return me=m(me),Q(oe,me)?i(2,oe[me]):Y(oe,me)},ie=function(oe,me,ge){return me=m(me),Q(oe,me)&&S(ge)&&h(ge,"value")&&!h(ge,"get")&&!h(ge,"set")&&!ge.configurable&&(!h(ge,"writable")||ge.writable)&&(!h(ge,"enumerable")||ge.enumerable)?(oe[me]=ge.value,oe):L(oe,me,ge)};u?(P||(T.f=Z,_.f=ie,I(q,"buffer"),I(q,"byteOffset"),I(q,"byteLength"),I(q,"length")),a({target:"Object",stat:!0,forced:!P},{getOwnPropertyDescriptor:Z,defineProperty:ie}),w.exports=function(ce,oe,me){var ge=ce.match(/\d+$/)[0]/8,$=ce+(me?"Clamped":"")+"Array",R="get"+ce,C="set"+ce,H=r[$],ee=H,ne=ee&&ee.prototype,ue={},se=function(we,ye){var le=W(we);return le.view[R](ye*ge+le.byteOffset,!0)},de=function(we,ye,le){var fe=W(we);me&&(le=(le=re(le))<0?0:le>255?255:le&255),fe.view[C](ye*ge+fe.byteOffset,le,!0)},be=function(we,ye){L(we,ye,{get:function(){return se(this,ye)},set:function(le){return de(this,ye,le)},enumerable:!0})};P?l&&(ee=oe(function(we,ye,le,fe){return t(we,ee,$),F(function(){return S(ye)?te(ye)?fe!==void 0?new H(ye,d(le,ge),fe):le!==void 0?new H(ye,d(le,ge)):new H(ye):ae(ye)?N(ee,ye):O.call(ee,ye):new H(f(ye))}(),we,ee)}),y&&y(ee,J),A(x(H),function(we){we in ee||n(ee,we,H[we])}),ee.prototype=ne):(ee=oe(function(we,ye,le,fe){t(we,ee,$);var pe=0,he=0,ve,je,Te;if(!S(ye))Te=f(ye),je=Te*ge,ve=new G(je);else if(te(ye)){ve=ye,he=d(le,ge);var Ee=ye.byteLength;if(fe===void 0){if(Ee%ge||(je=Ee-he,je<0))throw z(D)}else if(je=p(fe)*ge,je+he>Ee)throw z(D);Te=je/ge}else return ae(ye)?N(ee,ye):O.call(ee,ye);for(V(we,{buffer:ve,byteOffset:he,byteLength:je,length:Te,view:new U(ve)});pe1?arguments[1]:void 0,d=f!==void 0,m=l(o),h,b,S,v,j,y;if(m!=null&&!c(m))for(j=u(o,m),y=j.next,o=[];!(v=y.call(j)).done;)o.push(v.value);for(d&&p>2&&(f=s(f,arguments[2],2)),b=r(o.length),S=new(t(this))(b),h=0;b>h;h++)S[h]=d?f(o[h],h):o[h];return S}},{"../internals/array-buffer-view-core":96,"../internals/function-bind-context":142,"../internals/get-iterator":145,"../internals/get-iterator-method":144,"../internals/is-array-iterator-method":158,"../internals/to-length":221,"../internals/to-object":222}],233:[function(e,w,g){var a=e("../internals/array-buffer-view-core"),r=e("../internals/species-constructor"),u=a.TYPED_ARRAY_CONSTRUCTOR,l=a.aTypedArrayConstructor;w.exports=function(c){return l(r(c,c[u]))}},{"../internals/array-buffer-view-core":96,"../internals/species-constructor":212}],234:[function(e,w,g){var a=0,r=Math.random();w.exports=function(u){return"Symbol("+String(u===void 0?"":u)+")_"+(++a+r).toString(36)}},{}],235:[function(e,w,g){var a=e("../internals/native-symbol");w.exports=a&&!Symbol.sham&&typeof Symbol.iterator=="symbol"},{"../internals/native-symbol":172}],236:[function(e,w,g){var a=e("../internals/well-known-symbol");g.f=a},{"../internals/well-known-symbol":237}],237:[function(e,w,g){var a=e("../internals/global"),r=e("../internals/shared"),u=e("../internals/has"),l=e("../internals/uid"),c=e("../internals/native-symbol"),s=e("../internals/use-symbol-as-uid"),t=r("wks"),i=a.Symbol,n=s?i:i&&i.withoutSetter||l;w.exports=function(o){return(!u(t,o)||!(c||typeof t[o]=="string"))&&(c&&u(i,o)?t[o]=i[o]:t[o]=n("Symbol."+o)),t[o]}},{"../internals/global":147,"../internals/has":148,"../internals/native-symbol":172,"../internals/shared":211,"../internals/uid":234,"../internals/use-symbol-as-uid":235}],238:[function(e,w,g){w.exports=` +\v\f\r \xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF`},{}],239:[function(e,w,g){var a=e("../internals/export"),r=e("../internals/global"),u=e("../internals/array-buffer"),l=e("../internals/set-species"),c="ArrayBuffer",s=u[c],t=r[c];a({global:!0,forced:t!==s},{ArrayBuffer:s}),l(c)},{"../internals/array-buffer":97,"../internals/export":139,"../internals/global":147,"../internals/set-species":207}],240:[function(e,w,g){var a=e("../internals/export"),r=e("../internals/fails"),u=e("../internals/array-buffer"),l=e("../internals/an-object"),c=e("../internals/to-absolute-index"),s=e("../internals/to-length"),t=e("../internals/species-constructor"),i=u.ArrayBuffer,n=u.DataView,o=i.prototype.slice,p=r(function(){return!new i(2).slice(1,void 0).byteLength});a({target:"ArrayBuffer",proto:!0,unsafe:!0,forced:p},{slice:function(d,m){if(o!==void 0&&m===void 0)return o.call(l(this),d);for(var h=l(this).byteLength,b=c(d,h),S=c(m===void 0?h:m,h),v=new(t(this,i))(s(S-b)),j=new n(this),y=new n(v),x=0;b=51||!r(function(){var j=[];return j[f]=!1,j.concat()[0]!==j}),b=n("concat"),S=function(j){if(!l(j))return!1;var y=j[f];return y!==void 0?!!y:u(j)},v=!h||!b;a({target:"Array",proto:!0,forced:v},{concat:function(y){var x=c(this),O=i(x,0),A=0,E,_,T,k,F;for(E=-1,T=arguments.length;Ed)throw TypeError(m);for(_=0;_=d)throw TypeError(m);t(O,A++,F)}return O.length=A,O}})},{"../internals/array-method-has-species-support":106,"../internals/array-species-create":111,"../internals/create-property":122,"../internals/engine-v8-version":136,"../internals/export":139,"../internals/fails":140,"../internals/is-array":159,"../internals/is-object":162,"../internals/to-length":221,"../internals/to-object":222,"../internals/well-known-symbol":237}],242:[function(e,w,g){var a=e("../internals/export"),r=e("../internals/array-fill"),u=e("../internals/add-to-unscopables");a({target:"Array",proto:!0},{fill:r}),u("fill")},{"../internals/add-to-unscopables":91,"../internals/array-fill":99,"../internals/export":139}],243:[function(e,w,g){var a=e("../internals/export"),r=e("../internals/array-iteration").filter,u=e("../internals/array-method-has-species-support"),l=u("filter");a({target:"Array",proto:!0,forced:!l},{filter:function(s){return r(this,s,arguments.length>1?arguments[1]:void 0)}})},{"../internals/array-iteration":104,"../internals/array-method-has-species-support":106,"../internals/export":139}],244:[function(e,w,g){var a=e("../internals/export"),r=e("../internals/array-iteration").find,u=e("../internals/add-to-unscopables"),l="find",c=!0;l in[]&&Array(1)[l](function(){c=!1}),a({target:"Array",proto:!0,forced:c},{find:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),u(l)},{"../internals/add-to-unscopables":91,"../internals/array-iteration":104,"../internals/export":139}],245:[function(e,w,g){var a=e("../internals/export"),r=e("../internals/array-from"),u=e("../internals/check-correctness-of-iteration"),l=!u(function(c){Array.from(c)});a({target:"Array",stat:!0,forced:l},{from:r})},{"../internals/array-from":102,"../internals/check-correctness-of-iteration":113,"../internals/export":139}],246:[function(e,w,g){var a=e("../internals/export"),r=e("../internals/array-includes").includes,u=e("../internals/add-to-unscopables");a({target:"Array",proto:!0},{includes:function(c){return r(this,c,arguments.length>1?arguments[1]:void 0)}}),u("includes")},{"../internals/add-to-unscopables":91,"../internals/array-includes":103,"../internals/export":139}],247:[function(e,w,g){var a=e("../internals/to-indexed-object"),r=e("../internals/add-to-unscopables"),u=e("../internals/iterators"),l=e("../internals/internal-state"),c=e("../internals/define-iterator"),s="Array Iterator",t=l.set,i=l.getterFor(s);w.exports=c(Array,"Array",function(n,o){t(this,{type:s,target:a(n),index:0,kind:o})},function(){var n=i(this),o=n.target,p=n.kind,f=n.index++;return!o||f>=o.length?(n.target=void 0,{value:void 0,done:!0}):p=="keys"?{value:f,done:!1}:p=="values"?{value:o[f],done:!1}:{value:[f,o[f]],done:!1}},"values"),u.Arguments=u.Array,r("keys"),r("values"),r("entries")},{"../internals/add-to-unscopables":91,"../internals/define-iterator":123,"../internals/internal-state":157,"../internals/iterators":169,"../internals/to-indexed-object":219}],248:[function(e,w,g){var a=e("../internals/export"),r=e("../internals/indexed-object"),u=e("../internals/to-indexed-object"),l=e("../internals/array-method-is-strict"),c=[].join,s=r!=Object,t=l("join",",");a({target:"Array",proto:!0,forced:s||!t},{join:function(n){return c.call(u(this),n===void 0?",":n)}})},{"../internals/array-method-is-strict":107,"../internals/export":139,"../internals/indexed-object":154,"../internals/to-indexed-object":219}],249:[function(e,w,g){var a=e("../internals/export"),r=e("../internals/array-iteration").map,u=e("../internals/array-method-has-species-support"),l=u("map");a({target:"Array",proto:!0,forced:!l},{map:function(s){return r(this,s,arguments.length>1?arguments[1]:void 0)}})},{"../internals/array-iteration":104,"../internals/array-method-has-species-support":106,"../internals/export":139}],250:[function(e,w,g){var a=e("../internals/export"),r=e("../internals/is-object"),u=e("../internals/is-array"),l=e("../internals/to-absolute-index"),c=e("../internals/to-length"),s=e("../internals/to-indexed-object"),t=e("../internals/create-property"),i=e("../internals/well-known-symbol"),n=e("../internals/array-method-has-species-support"),o=n("slice"),p=i("species"),f=[].slice,d=Math.max;a({target:"Array",proto:!0,forced:!o},{slice:function(h,b){var S=s(this),v=c(S.length),j=l(h,v),y=l(b===void 0?v:b,v),x,O,A;if(u(S)&&(x=S.constructor,typeof x=="function"&&(x===Array||u(x.prototype))?x=void 0:r(x)&&(x=x[p],x===null&&(x=void 0)),x===Array||x===void 0))return f.call(S,j,y);for(O=new(x===void 0?Array:x)(d(y-j,0)),A=0;j3)){if(o)return!0;if(f)return f<603;var x="",O,A,E,_;for(O=65;O<76;O++){switch(A=String.fromCharCode(O),O){case 66:case 69:case 70:case 72:E=3;break;case 68:case 71:E=4;break;default:E=2}for(_=0;_<47;_++)d.push({k:A+_,v:E})}for(d.sort(function(T,k){return k.v-T.v}),_=0;_c(A)?1:-1}};a({target:"Array",proto:!0,forced:j},{sort:function(O){O!==void 0&&r(O);var A=u(this);if(v)return O===void 0?m.call(A):m.call(A,O);var E=[],_=l(A.length),T,k;for(k=0;k<_;k++)k in A&&E.push(A[k]);for(E=t(E,y(O)),T=E.length,k=0;kf)throw TypeError(d);for(A=s(S,O),E=0;Ev-O+x;E--)delete S[E-1]}else if(x>O)for(E=v-O;E>j;E--)_=E+O-1,T=E+x-1,_ in S?S[T]=S[_]:delete S[T];for(E=0;E2){if(T=h(T),k=T.charCodeAt(0),k===43||k===45){if(F=T.charCodeAt(2),F===88||F===120)return NaN}else if(k===48){switch(T.charCodeAt(1)){case 66:case 98:W=2,V=49;break;case 79:case 111:W=8,V=55;break;default:return+T}for(L=T.slice(2),Y=L.length,re=0;reV)return NaN;return parseInt(L,W)}}return+T};if(u(b,!S(" 0o1")||!S("0b1")||S("+0x1"))){for(var x=function(T){var k=arguments.length<1?0:T,F=this;return F instanceof x&&(j?o(function(){v.valueOf.call(F)}):s(F)!=b)?t(new S(y(k)),F,x):y(k)},O=a?f(S):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger,fromString,range".split(","),A=0,E;O.length>A;A++)c(S,E=O[A])&&!c(x,E)&&m(x,E,d(S,E));x.prototype=v,v.constructor=x,l(r,b,x)}},{"../internals/classof-raw":114,"../internals/descriptors":125,"../internals/fails":140,"../internals/global":147,"../internals/has":148,"../internals/inherit-if-required":155,"../internals/is-forced":160,"../internals/is-symbol":165,"../internals/object-create":177,"../internals/object-define-property":179,"../internals/object-get-own-property-descriptor":180,"../internals/object-get-own-property-names":182,"../internals/redefine":197,"../internals/string-trim":215,"../internals/to-primitive":225}],255:[function(e,w,g){var a=e("../internals/export"),r=e("../internals/object-assign");a({target:"Object",stat:!0,forced:Object.assign!==r},{assign:r})},{"../internals/export":139,"../internals/object-assign":176}],256:[function(e,w,g){var a=e("../internals/export"),r=e("../internals/object-to-array").entries;a({target:"Object",stat:!0},{entries:function(l){return r(l)}})},{"../internals/export":139,"../internals/object-to-array":189}],257:[function(e,w,g){var a=e("../internals/export"),r=e("../internals/to-object"),u=e("../internals/object-keys"),l=e("../internals/fails"),c=l(function(){u(1)});a({target:"Object",stat:!0,forced:c},{keys:function(t){return u(r(t))}})},{"../internals/export":139,"../internals/fails":140,"../internals/object-keys":186,"../internals/to-object":222}],258:[function(e,w,g){var a=e("../internals/to-string-tag-support"),r=e("../internals/redefine"),u=e("../internals/object-to-string");a||r(Object.prototype,"toString",u,{unsafe:!0})},{"../internals/object-to-string":190,"../internals/redefine":197,"../internals/to-string-tag-support":227}],259:[function(e,w,g){var a=e("../internals/export"),r=e("../internals/is-pure"),u=e("../internals/global"),l=e("../internals/get-built-in"),c=e("../internals/native-promise-constructor"),s=e("../internals/redefine"),t=e("../internals/redefine-all"),i=e("../internals/object-set-prototype-of"),n=e("../internals/set-to-string-tag"),o=e("../internals/set-species"),p=e("../internals/is-object"),f=e("../internals/a-function"),d=e("../internals/an-instance"),m=e("../internals/inspect-source"),h=e("../internals/iterate"),b=e("../internals/check-correctness-of-iteration"),S=e("../internals/species-constructor"),v=e("../internals/task").set,j=e("../internals/microtask"),y=e("../internals/promise-resolve"),x=e("../internals/host-report-errors"),O=e("../internals/new-promise-capability"),A=e("../internals/perform"),E=e("../internals/internal-state"),_=e("../internals/is-forced"),T=e("../internals/well-known-symbol"),k=e("../internals/engine-is-browser"),F=e("../internals/engine-is-node"),W=e("../internals/engine-v8-version"),V=T("species"),L="Promise",Y=E.get,re=E.set,z=E.getterFor(L),G=c&&c.prototype,U=c,P=G,B=u.TypeError,K=u.document,J=u.process,q=O.f,X=q,ae=!!(K&&K.createEvent&&u.dispatchEvent),M=typeof PromiseRejectionEvent=="function",D="unhandledrejection",N="rejectionhandled",I=0,te=1,Q=2,Z=1,ie=2,ce=!1,oe,me,ge,$,R=_(L,function(){var le=m(U),fe=le!==String(U);if(!fe&&W===66||r&&!P.finally)return!0;if(W>=51&&/native code/.test(le))return!1;var pe=new U(function(je){je(1)}),he=function(je){je(function(){},function(){})},ve=pe.constructor={};return ve[V]=he,ce=pe.then(function(){})instanceof he,ce?!fe&&k&&!M:!0}),C=R||!b(function(le){U.all(le).catch(function(){})}),H=function(le){var fe;return p(le)&&typeof(fe=le.then)=="function"?fe:!1},ee=function(le,fe){if(!le.notified){le.notified=!0;var pe=le.reactions;j(function(){for(var he=le.value,ve=le.state==te,je=0;pe.length>je;){var Te=pe[je++],Ee=ve?Te.ok:Te.fail,Se=Te.resolve,Ae=Te.reject,_e=Te.domain,Oe,Ie,ke;try{Ee?(ve||(le.rejection===ie&&de(le),le.rejection=Z),Ee===!0?Oe=he:(_e&&_e.enter(),Oe=Ee(he),_e&&(_e.exit(),ke=!0)),Oe===Te.promise?Ae(B("Promise-chain cycle")):(Ie=H(Oe))?Ie.call(Oe,Se,Ae):Se(Oe)):Ae(he)}catch(Ce){_e&&!ke&&_e.exit(),Ae(Ce)}}le.reactions=[],le.notified=!1,fe&&!le.rejection&&ue(le)})}},ne=function(le,fe,pe){var he,ve;ae?(he=K.createEvent("Event"),he.promise=fe,he.reason=pe,he.initEvent(le,!1,!0),u.dispatchEvent(he)):he={promise:fe,reason:pe},!M&&(ve=u["on"+le])?ve(he):le===D&&x("Unhandled promise rejection",pe)},ue=function(le){v.call(u,function(){var fe=le.facade,pe=le.value,he=se(le),ve;if(he&&(ve=A(function(){F?J.emit("unhandledRejection",pe,fe):ne(D,fe,pe)}),le.rejection=F||se(le)?ie:Z,ve.error))throw ve.value})},se=function(le){return le.rejection!==Z&&!le.parent},de=function(le){v.call(u,function(){var fe=le.facade;F?J.emit("rejectionHandled",fe):ne(N,fe,le.value)})},be=function(le,fe,pe){return function(he){le(fe,he,pe)}},we=function(le,fe,pe){le.done||(le.done=!0,pe&&(le=pe),le.value=fe,le.state=Q,ee(le,!0))},ye=function(le,fe,pe){if(!le.done){le.done=!0,pe&&(le=pe);try{if(le.facade===fe)throw B("Promise can't be resolved itself");var he=H(fe);he?j(function(){var ve={done:!1};try{he.call(fe,be(ye,ve,le),be(we,ve,le))}catch(je){we(ve,je,le)}}):(le.value=fe,le.state=te,ee(le,!1))}catch(ve){we({done:!1},ve,le)}}};if(R&&(U=function(fe){d(this,U,L),f(fe),oe.call(this);var pe=Y(this);try{fe(be(ye,pe),be(we,pe))}catch(he){we(pe,he)}},P=U.prototype,oe=function(fe){re(this,{type:L,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:I,value:void 0})},oe.prototype=t(P,{then:function(fe,pe){var he=z(this),ve=q(S(this,U));return ve.ok=typeof fe=="function"?fe:!0,ve.fail=typeof pe=="function"&&pe,ve.domain=F?J.domain:void 0,he.parent=!0,he.reactions.push(ve),he.state!=I&&ee(he,!1),ve.promise},catch:function(le){return this.then(void 0,le)}}),me=function(){var le=new oe,fe=Y(le);this.promise=le,this.resolve=be(ye,fe),this.reject=be(we,fe)},O.f=q=function(le){return le===U||le===ge?new me(le):X(le)},!r&&typeof c=="function"&&G!==Object.prototype)){$=G.then,ce||(s(G,"then",function(fe,pe){var he=this;return new U(function(ve,je){$.call(he,ve,je)}).then(fe,pe)},{unsafe:!0}),s(G,"catch",P.catch,{unsafe:!0}));try{delete G.constructor}catch{}i&&i(G,P)}a({global:!0,wrap:!0,forced:R},{Promise:U}),n(U,L,!1,!0),o(L),ge=l(L),a({target:L,stat:!0,forced:R},{reject:function(fe){var pe=q(this);return pe.reject.call(void 0,fe),pe.promise}}),a({target:L,stat:!0,forced:r||R},{resolve:function(fe){return y(r&&this===ge?U:this,fe)}}),a({target:L,stat:!0,forced:C},{all:function(fe){var pe=this,he=q(pe),ve=he.resolve,je=he.reject,Te=A(function(){var Ee=f(pe.resolve),Se=[],Ae=0,_e=1;h(fe,function(Oe){var Ie=Ae++,ke=!1;Se.push(void 0),_e++,Ee.call(pe,Oe).then(function(Ce){ke||(ke=!0,Se[Ie]=Ce,--_e||ve(Se))},je)}),--_e||ve(Se)});return Te.error&&je(Te.value),he.promise},race:function(fe){var pe=this,he=q(pe),ve=he.reject,je=A(function(){var Te=f(pe.resolve);h(fe,function(Ee){Te.call(pe,Ee).then(he.resolve,ve)})});return je.error&&ve(je.value),he.promise}})},{"../internals/a-function":89,"../internals/an-instance":93,"../internals/check-correctness-of-iteration":113,"../internals/engine-is-browser":129,"../internals/engine-is-node":133,"../internals/engine-v8-version":136,"../internals/export":139,"../internals/get-built-in":143,"../internals/global":147,"../internals/host-report-errors":150,"../internals/inspect-source":156,"../internals/internal-state":157,"../internals/is-forced":160,"../internals/is-object":162,"../internals/is-pure":163,"../internals/iterate":166,"../internals/microtask":170,"../internals/native-promise-constructor":171,"../internals/new-promise-capability":174,"../internals/object-set-prototype-of":188,"../internals/perform":194,"../internals/promise-resolve":195,"../internals/redefine":197,"../internals/redefine-all":196,"../internals/set-species":207,"../internals/set-to-string-tag":208,"../internals/species-constructor":212,"../internals/task":216,"../internals/well-known-symbol":237}],260:[function(e,w,g){var a=e("../internals/descriptors"),r=e("../internals/global"),u=e("../internals/is-forced"),l=e("../internals/inherit-if-required"),c=e("../internals/create-non-enumerable-property"),s=e("../internals/object-define-property").f,t=e("../internals/object-get-own-property-names").f,i=e("../internals/is-regexp"),n=e("../internals/to-string"),o=e("../internals/regexp-flags"),p=e("../internals/regexp-sticky-helpers"),f=e("../internals/redefine"),d=e("../internals/fails"),m=e("../internals/has"),h=e("../internals/internal-state").enforce,b=e("../internals/set-species"),S=e("../internals/well-known-symbol"),v=e("../internals/regexp-unsupported-dot-all"),j=e("../internals/regexp-unsupported-ncg"),y=S("match"),x=r.RegExp,O=x.prototype,A=/^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/,E=/a/g,_=/a/g,T=new x(E)!==E,k=p.UNSUPPORTED_Y,F=a&&(!T||k||v||j||d(function(){return _[y]=!1,x(E)!=E||x(_)==_||x(E,"i")!="/a/i"})),W=function(G){for(var U=G.length,P=0,B="",K=!1,J;P<=U;P++){if(J=G.charAt(P),J==="\\"){B+=J+G.charAt(++P);continue}!K&&J==="."?B+="[\\s\\S]":(J==="["?K=!0:J==="]"&&(K=!1),B+=J)}return B},V=function(G){for(var U=G.length,P=0,B="",K=[],J={},q=!1,X=!1,ae=0,M="",D;P<=U;P++){if(D=G.charAt(P),D==="\\")D=D+G.charAt(++P);else if(D==="]")q=!1;else if(!q)switch(!0){case D==="[":q=!0;break;case D==="(":A.test(G.slice(P+1))&&(P+=2,X=!0),B+=D,ae++;continue;case(D===">"&&X):if(M===""||m(J,M))throw new SyntaxError("Invalid capture group name");J[M]=!0,K.push([M,ae]),X=!1,M="";continue}X?M+=D:B+=D}return[B,K]};if(u("RegExp",F)){for(var L=function(U,P){var B=this instanceof L,K=i(U),J=P===void 0,q=[],X=U,ae,M,D,N,I,te;if(!B&&K&&J&&U.constructor===L)return U;if((K||U instanceof L)&&(U=U.source,J&&(P="flags"in X?X.flags:o.call(X))),U=U===void 0?"":n(U),P=P===void 0?"":n(P),X=U,v&&"dotAll"in E&&(M=!!P&&P.indexOf("s")>-1,M&&(P=P.replace(/s/g,""))),ae=P,k&&"sticky"in E&&(D=!!P&&P.indexOf("y")>-1,D&&(P=P.replace(/y/g,""))),j&&(N=V(U),U=N[0],q=N[1]),I=l(x(U,P),B?this:O,L),(M||D||q.length)&&(te=h(I),M&&(te.dotAll=!0,te.raw=L(W(U),ae)),D&&(te.sticky=!0),q.length&&(te.groups=q)),U!==X)try{c(I,"source",X===""?"(?:)":X)}catch{}return I},Y=function(G){G in L||s(L,G,{configurable:!0,get:function(){return x[G]},set:function(U){x[G]=U}})},re=t(x),z=0;re.length>z;)Y(re[z++]);O.constructor=L,L.prototype=O,f(r,"RegExp",L)}b("RegExp")},{"../internals/create-non-enumerable-property":120,"../internals/descriptors":125,"../internals/fails":140,"../internals/global":147,"../internals/has":148,"../internals/inherit-if-required":155,"../internals/internal-state":157,"../internals/is-forced":160,"../internals/is-regexp":164,"../internals/object-define-property":179,"../internals/object-get-own-property-names":182,"../internals/redefine":197,"../internals/regexp-flags":200,"../internals/regexp-sticky-helpers":201,"../internals/regexp-unsupported-dot-all":202,"../internals/regexp-unsupported-ncg":203,"../internals/set-species":207,"../internals/to-string":228,"../internals/well-known-symbol":237}],261:[function(e,w,g){var a=e("../internals/export"),r=e("../internals/regexp-exec");a({target:"RegExp",proto:!0,forced:/./.exec!==r},{exec:r})},{"../internals/export":139,"../internals/regexp-exec":199}],262:[function(e,w,g){var a=e("../internals/redefine"),r=e("../internals/an-object"),u=e("../internals/to-string"),l=e("../internals/fails"),c=e("../internals/regexp-flags"),s="toString",t=RegExp.prototype,i=t[s],n=l(function(){return i.call({source:"a",flags:"b"})!="/a/b"}),o=i.name!=s;(n||o)&&a(RegExp.prototype,s,function(){var f=r(this),d=u(f.source),m=f.flags,h=u(m===void 0&&f instanceof RegExp&&!("flags"in t)?c.call(f):m);return"/"+d+"/"+h},{unsafe:!0})},{"../internals/an-object":94,"../internals/fails":140,"../internals/redefine":197,"../internals/regexp-flags":200,"../internals/to-string":228}],263:[function(e,w,g){var a=e("../internals/export"),r=e("../internals/not-a-regexp"),u=e("../internals/require-object-coercible"),l=e("../internals/to-string"),c=e("../internals/correct-is-regexp-logic");a({target:"String",proto:!0,forced:!c("includes")},{includes:function(t){return!!~l(u(this)).indexOf(l(r(t)),arguments.length>1?arguments[1]:void 0)}})},{"../internals/correct-is-regexp-logic":117,"../internals/export":139,"../internals/not-a-regexp":175,"../internals/require-object-coercible":204,"../internals/to-string":228}],264:[function(e,w,g){var a=e("../internals/string-multibyte").charAt,r=e("../internals/to-string"),u=e("../internals/internal-state"),l=e("../internals/define-iterator"),c="String Iterator",s=u.set,t=u.getterFor(c);l(String,"String",function(i){s(this,{type:c,string:r(i),index:0})},function(){var n=t(this),o=n.string,p=n.index,f;return p>=o.length?{value:void 0,done:!0}:(f=a(o,p),n.index+=f.length,{value:f,done:!1})})},{"../internals/define-iterator":123,"../internals/internal-state":157,"../internals/string-multibyte":213,"../internals/to-string":228}],265:[function(e,w,g){var a=e("../internals/fix-regexp-well-known-symbol-logic"),r=e("../internals/an-object"),u=e("../internals/to-length"),l=e("../internals/to-string"),c=e("../internals/require-object-coercible"),s=e("../internals/advance-string-index"),t=e("../internals/regexp-exec-abstract");a("match",function(i,n,o){return[function(f){var d=c(this),m=f==null?void 0:f[i];return m!==void 0?m.call(f,d):new RegExp(f)[i](l(d))},function(p){var f=r(this),d=l(p),m=o(n,f,d);if(m.done)return m.value;if(!f.global)return t(f,d);var h=f.unicode;f.lastIndex=0;for(var b=[],S=0,v;(v=t(f,d))!==null;){var j=l(v[0]);b[S]=j,j===""&&(f.lastIndex=s(d,u(f.lastIndex),h)),S++}return S===0?null:b}]})},{"../internals/advance-string-index":92,"../internals/an-object":94,"../internals/fix-regexp-well-known-symbol-logic":141,"../internals/regexp-exec-abstract":198,"../internals/require-object-coercible":204,"../internals/to-length":221,"../internals/to-string":228}],266:[function(e,w,g){var a=e("../internals/fix-regexp-well-known-symbol-logic"),r=e("../internals/fails"),u=e("../internals/an-object"),l=e("../internals/to-integer"),c=e("../internals/to-length"),s=e("../internals/to-string"),t=e("../internals/require-object-coercible"),i=e("../internals/advance-string-index"),n=e("../internals/get-substitution"),o=e("../internals/regexp-exec-abstract"),p=e("../internals/well-known-symbol"),f=p("replace"),d=Math.max,m=Math.min,h=function(j){return j===void 0?j:String(j)},b=function(){return"a".replace(/./,"$0")==="$0"}(),S=function(){return/./[f]?/./[f]("a","$0")==="":!1}(),v=!r(function(){var j=/./;return j.exec=function(){var y=[];return y.groups={a:"7"},y},"".replace(j,"$")!=="7"});a("replace",function(j,y,x){var O=S?"$":"$0";return[function(E,_){var T=t(this),k=E==null?void 0:E[f];return k!==void 0?k.call(E,T,_):y.call(s(T),E,_)},function(A,E){var _=u(this),T=s(A);if(typeof E=="string"&&E.indexOf(O)===-1&&E.indexOf("$<")===-1){var k=x(y,_,T,E);if(k.done)return k.value}var F=typeof E=="function";F||(E=s(E));var W=_.global;if(W){var V=_.unicode;_.lastIndex=0}for(var L=[];;){var Y=o(_,T);if(Y===null||(L.push(Y),!W))break;var re=s(Y[0]);re===""&&(_.lastIndex=i(T,c(_.lastIndex),V))}for(var z="",G=0,U=0;U=G&&(z+=T.slice(G,B)+ae,G=B+P.length)}return z+T.slice(G)}]},!v||!b||S)},{"../internals/advance-string-index":92,"../internals/an-object":94,"../internals/fails":140,"../internals/fix-regexp-well-known-symbol-logic":141,"../internals/get-substitution":146,"../internals/regexp-exec-abstract":198,"../internals/require-object-coercible":204,"../internals/to-integer":220,"../internals/to-length":221,"../internals/to-string":228,"../internals/well-known-symbol":237}],267:[function(e,w,g){var a=e("../internals/fix-regexp-well-known-symbol-logic"),r=e("../internals/an-object"),u=e("../internals/require-object-coercible"),l=e("../internals/same-value"),c=e("../internals/to-string"),s=e("../internals/regexp-exec-abstract");a("search",function(t,i,n){return[function(p){var f=u(this),d=p==null?void 0:p[t];return d!==void 0?d.call(p,f):new RegExp(p)[t](c(f))},function(o){var p=r(this),f=c(o),d=n(i,p,f);if(d.done)return d.value;var m=p.lastIndex;l(m,0)||(p.lastIndex=0);var h=s(p,f);return l(p.lastIndex,m)||(p.lastIndex=m),h===null?-1:h.index}]})},{"../internals/an-object":94,"../internals/fix-regexp-well-known-symbol-logic":141,"../internals/regexp-exec-abstract":198,"../internals/require-object-coercible":204,"../internals/same-value":205,"../internals/to-string":228}],268:[function(e,w,g){var a=e("../internals/fix-regexp-well-known-symbol-logic"),r=e("../internals/is-regexp"),u=e("../internals/an-object"),l=e("../internals/require-object-coercible"),c=e("../internals/species-constructor"),s=e("../internals/advance-string-index"),t=e("../internals/to-length"),i=e("../internals/to-string"),n=e("../internals/regexp-exec-abstract"),o=e("../internals/regexp-exec"),p=e("../internals/regexp-sticky-helpers"),f=e("../internals/fails"),d=p.UNSUPPORTED_Y,m=[].push,h=Math.min,b=4294967295,S=!f(function(){var v=/(?:)/,j=v.exec;v.exec=function(){return j.apply(this,arguments)};var y="ab".split(v);return y.length!==2||y[0]!=="a"||y[1]!=="b"});a("split",function(v,j,y){var x;return"abbc".split(/(b)*/)[1]=="c"||"test".split(/(?:)/,-1).length!=4||"ab".split(/(?:ab)*/).length!=2||".".split(/(.?)(.?)/).length!=4||".".split(/()()/).length>1||"".split(/.?/).length?x=function(O,A){var E=i(l(this)),_=A===void 0?b:A>>>0;if(_===0)return[];if(O===void 0)return[E];if(!r(O))return j.call(E,O,_);for(var T=[],k=(O.ignoreCase?"i":"")+(O.multiline?"m":"")+(O.unicode?"u":"")+(O.sticky?"y":""),F=0,W=new RegExp(O.source,k+"g"),V,L,Y;(V=o.call(W,E))&&(L=W.lastIndex,!(L>F&&(T.push(E.slice(F,V.index)),V.length>1&&V.index=_)));)W.lastIndex===V.index&&W.lastIndex++;return F===E.length?(Y||!W.test(""))&&T.push(""):T.push(E.slice(F)),T.length>_?T.slice(0,_):T}:"0".split(void 0,0).length?x=function(O,A){return O===void 0&&A===0?[]:j.call(this,O,A)}:x=j,[function(A,E){var _=l(this),T=A==null?void 0:A[v];return T!==void 0?T.call(A,_,E):x.call(i(_),A,E)},function(O,A){var E=u(this),_=i(O),T=y(x,E,_,A,x!==j);if(T.done)return T.value;var k=c(E,RegExp),F=E.unicode,W=(E.ignoreCase?"i":"")+(E.multiline?"m":"")+(E.unicode?"u":"")+(d?"g":"y"),V=new k(d?"^(?:"+E.source+")":E,W),L=A===void 0?b:A>>>0;if(L===0)return[];if(_.length===0)return n(V,_)===null?[_]:[];for(var Y=0,re=0,z=[];re<_.length;){V.lastIndex=d?0:re;var G=n(V,d?_.slice(re):_),U;if(G===null||(U=h(t(V.lastIndex+(d?re:0)),_.length))===Y)re=s(_,re,F);else{if(z.push(_.slice(Y,re)),z.length===L)return z;for(var P=1;P<=G.length-1;P++)if(z.push(G[P]),z.length===L)return z;re=Y=U}}return z.push(_.slice(Y)),z}]},!S,d)},{"../internals/advance-string-index":92,"../internals/an-object":94,"../internals/fails":140,"../internals/fix-regexp-well-known-symbol-logic":141,"../internals/is-regexp":164,"../internals/regexp-exec":199,"../internals/regexp-exec-abstract":198,"../internals/regexp-sticky-helpers":201,"../internals/require-object-coercible":204,"../internals/species-constructor":212,"../internals/to-length":221,"../internals/to-string":228}],269:[function(e,w,g){var a=e("../internals/export"),r=e("../internals/string-trim").trim,u=e("../internals/string-trim-forced");a({target:"String",proto:!0,forced:u("trim")},{trim:function(){return r(this)}})},{"../internals/export":139,"../internals/string-trim":215,"../internals/string-trim-forced":214}],270:[function(e,w,g){var a=e("../internals/export"),r=e("../internals/descriptors"),u=e("../internals/global"),l=e("../internals/has"),c=e("../internals/is-object"),s=e("../internals/object-define-property").f,t=e("../internals/copy-constructor-properties"),i=u.Symbol;if(r&&typeof i=="function"&&(!("description"in i.prototype)||i().description!==void 0)){var n={},o=function(){var b=arguments.length<1||arguments[0]===void 0?void 0:String(arguments[0]),S=this instanceof o?new i(b):b===void 0?i():i(b);return b===""&&(n[S]=!0),S};t(o,i);var p=o.prototype=i.prototype;p.constructor=o;var f=p.toString,d=String(i("test"))=="Symbol(test)",m=/^Symbol\((.*)\)[^)]+$/;s(p,"description",{configurable:!0,get:function(){var b=c(this)?this.valueOf():this,S=f.call(b);if(l(n,b))return"";var v=d?S.slice(7,-1):S.replace(m,"$1");return v===""?void 0:v}}),a({global:!0,forced:!0},{Symbol:o})}},{"../internals/copy-constructor-properties":116,"../internals/descriptors":125,"../internals/export":139,"../internals/global":147,"../internals/has":148,"../internals/is-object":162,"../internals/object-define-property":179}],271:[function(e,w,g){var a=e("../internals/export"),r=e("../internals/global"),u=e("../internals/get-built-in"),l=e("../internals/is-pure"),c=e("../internals/descriptors"),s=e("../internals/native-symbol"),t=e("../internals/fails"),i=e("../internals/has"),n=e("../internals/is-array"),o=e("../internals/is-object"),p=e("../internals/is-symbol"),f=e("../internals/an-object"),d=e("../internals/to-object"),m=e("../internals/to-indexed-object"),h=e("../internals/to-property-key"),b=e("../internals/to-string"),S=e("../internals/create-property-descriptor"),v=e("../internals/object-create"),j=e("../internals/object-keys"),y=e("../internals/object-get-own-property-names"),x=e("../internals/object-get-own-property-names-external"),O=e("../internals/object-get-own-property-symbols"),A=e("../internals/object-get-own-property-descriptor"),E=e("../internals/object-define-property"),_=e("../internals/object-property-is-enumerable"),T=e("../internals/create-non-enumerable-property"),k=e("../internals/redefine"),F=e("../internals/shared"),W=e("../internals/shared-key"),V=e("../internals/hidden-keys"),L=e("../internals/uid"),Y=e("../internals/well-known-symbol"),re=e("../internals/well-known-symbol-wrapped"),z=e("../internals/define-well-known-symbol"),G=e("../internals/set-to-string-tag"),U=e("../internals/internal-state"),P=e("../internals/array-iteration").forEach,B=W("hidden"),K="Symbol",J="prototype",q=Y("toPrimitive"),X=U.set,ae=U.getterFor(K),M=Object[J],D=r.Symbol,N=u("JSON","stringify"),I=A.f,te=E.f,Q=x.f,Z=_.f,ie=F("symbols"),ce=F("op-symbols"),oe=F("string-to-symbol-registry"),me=F("symbol-to-string-registry"),ge=F("wks"),$=r.QObject,R=!$||!$[J]||!$[J].findChild,C=c&&t(function(){return v(te({},"a",{get:function(){return te(this,"a",{value:7}).a}})).a!=7})?function(le,fe,pe){var he=I(M,fe);he&&delete M[fe],te(le,fe,pe),he&&le!==M&&te(M,fe,he)}:te,H=function(le,fe){var pe=ie[le]=v(D[J]);return X(pe,{type:K,tag:le,description:fe}),c||(pe.description=fe),pe},ee=function(fe,pe,he){fe===M&&ee(ce,pe,he),f(fe);var ve=h(pe);return f(he),i(ie,ve)?(he.enumerable?(i(fe,B)&&fe[B][ve]&&(fe[B][ve]=!1),he=v(he,{enumerable:S(0,!1)})):(i(fe,B)||te(fe,B,S(1,{})),fe[B][ve]=!0),C(fe,ve,he)):te(fe,ve,he)},ne=function(fe,pe){f(fe);var he=m(pe),ve=j(he).concat(we(he));return P(ve,function(je){(!c||se.call(he,je))&&ee(fe,je,he[je])}),fe},ue=function(fe,pe){return pe===void 0?v(fe):ne(v(fe),pe)},se=function(fe){var pe=h(fe),he=Z.call(this,pe);return this===M&&i(ie,pe)&&!i(ce,pe)?!1:he||!i(this,pe)||!i(ie,pe)||i(this,B)&&this[B][pe]?he:!0},de=function(fe,pe){var he=m(fe),ve=h(pe);if(!(he===M&&i(ie,ve)&&!i(ce,ve))){var je=I(he,ve);return je&&i(ie,ve)&&!(i(he,B)&&he[B][ve])&&(je.enumerable=!0),je}},be=function(fe){var pe=Q(m(fe)),he=[];return P(pe,function(ve){!i(ie,ve)&&!i(V,ve)&&he.push(ve)}),he},we=function(fe){var pe=fe===M,he=Q(pe?ce:m(fe)),ve=[];return P(he,function(je){i(ie,je)&&(!pe||i(M,je))&&ve.push(ie[je])}),ve};if(s||(D=function(){if(this instanceof D)throw TypeError("Symbol is not a constructor");var fe=!arguments.length||arguments[0]===void 0?void 0:b(arguments[0]),pe=L(fe),he=function(ve){this===M&&he.call(ce,ve),i(this,B)&&i(this[B],pe)&&(this[B][pe]=!1),C(this,pe,S(1,ve))};return c&&R&&C(M,pe,{configurable:!0,set:he}),H(pe,fe)},k(D[J],"toString",function(){return ae(this).tag}),k(D,"withoutSetter",function(le){return H(L(le),le)}),_.f=se,E.f=ee,A.f=de,y.f=x.f=be,O.f=we,re.f=function(le){return H(Y(le),le)},c&&(te(D[J],"description",{configurable:!0,get:function(){return ae(this).description}}),l||k(M,"propertyIsEnumerable",se,{unsafe:!0}))),a({global:!0,wrap:!0,forced:!s,sham:!s},{Symbol:D}),P(j(ge),function(le){z(le)}),a({target:K,stat:!0,forced:!s},{for:function(le){var fe=b(le);if(i(oe,fe))return oe[fe];var pe=D(fe);return oe[fe]=pe,me[pe]=fe,pe},keyFor:function(fe){if(!p(fe))throw TypeError(fe+" is not a symbol");if(i(me,fe))return me[fe]},useSetter:function(){R=!0},useSimple:function(){R=!1}}),a({target:"Object",stat:!0,forced:!s,sham:!c},{create:ue,defineProperty:ee,defineProperties:ne,getOwnPropertyDescriptor:de}),a({target:"Object",stat:!0,forced:!s},{getOwnPropertyNames:be,getOwnPropertySymbols:we}),a({target:"Object",stat:!0,forced:t(function(){O.f(1)})},{getOwnPropertySymbols:function(fe){return O.f(d(fe))}}),N){var ye=!s||t(function(){var le=D();return N([le])!="[null]"||N({a:le})!="{}"||N(Object(le))!="{}"});a({target:"JSON",stat:!0,forced:ye},{stringify:function(fe,pe,he){for(var ve=[fe],je=1,Te;arguments.length>je;)ve.push(arguments[je++]);if(Te=pe,!(!o(pe)&&fe===void 0||p(fe)))return n(pe)||(pe=function(Ee,Se){if(typeof Te=="function"&&(Se=Te.call(this,Ee,Se)),!p(Se))return Se}),ve[1]=pe,N.apply(null,ve)}})}D[J][q]||T(D[J],q,D[J].valueOf),G(D,K),V[B]=!0},{"../internals/an-object":94,"../internals/array-iteration":104,"../internals/create-non-enumerable-property":120,"../internals/create-property-descriptor":121,"../internals/define-well-known-symbol":124,"../internals/descriptors":125,"../internals/export":139,"../internals/fails":140,"../internals/get-built-in":143,"../internals/global":147,"../internals/has":148,"../internals/hidden-keys":149,"../internals/internal-state":157,"../internals/is-array":159,"../internals/is-object":162,"../internals/is-pure":163,"../internals/is-symbol":165,"../internals/native-symbol":172,"../internals/object-create":177,"../internals/object-define-property":179,"../internals/object-get-own-property-descriptor":180,"../internals/object-get-own-property-names":182,"../internals/object-get-own-property-names-external":181,"../internals/object-get-own-property-symbols":183,"../internals/object-keys":186,"../internals/object-property-is-enumerable":187,"../internals/redefine":197,"../internals/set-to-string-tag":208,"../internals/shared":211,"../internals/shared-key":209,"../internals/to-indexed-object":219,"../internals/to-object":222,"../internals/to-property-key":226,"../internals/to-string":228,"../internals/uid":234,"../internals/well-known-symbol":237,"../internals/well-known-symbol-wrapped":236}],272:[function(e,w,g){var a=e("../internals/array-buffer-view-core"),r=e("../internals/array-copy-within"),u=a.aTypedArray,l=a.exportTypedArrayMethod;l("copyWithin",function(s,t){return r.call(u(this),s,t,arguments.length>2?arguments[2]:void 0)})},{"../internals/array-buffer-view-core":96,"../internals/array-copy-within":98}],273:[function(e,w,g){var a=e("../internals/array-buffer-view-core"),r=e("../internals/array-iteration").every,u=a.aTypedArray,l=a.exportTypedArrayMethod;l("every",function(s){return r(u(this),s,arguments.length>1?arguments[1]:void 0)})},{"../internals/array-buffer-view-core":96,"../internals/array-iteration":104}],274:[function(e,w,g){var a=e("../internals/array-buffer-view-core"),r=e("../internals/array-fill"),u=a.aTypedArray,l=a.exportTypedArrayMethod;l("fill",function(s){return r.apply(u(this),arguments)})},{"../internals/array-buffer-view-core":96,"../internals/array-fill":99}],275:[function(e,w,g){var a=e("../internals/array-buffer-view-core"),r=e("../internals/array-iteration").filter,u=e("../internals/typed-array-from-species-and-list"),l=a.aTypedArray,c=a.exportTypedArrayMethod;c("filter",function(t){var i=r(l(this),t,arguments.length>1?arguments[1]:void 0);return u(this,i)})},{"../internals/array-buffer-view-core":96,"../internals/array-iteration":104,"../internals/typed-array-from-species-and-list":231}],276:[function(e,w,g){var a=e("../internals/array-buffer-view-core"),r=e("../internals/array-iteration").findIndex,u=a.aTypedArray,l=a.exportTypedArrayMethod;l("findIndex",function(s){return r(u(this),s,arguments.length>1?arguments[1]:void 0)})},{"../internals/array-buffer-view-core":96,"../internals/array-iteration":104}],277:[function(e,w,g){var a=e("../internals/array-buffer-view-core"),r=e("../internals/array-iteration").find,u=a.aTypedArray,l=a.exportTypedArrayMethod;l("find",function(s){return r(u(this),s,arguments.length>1?arguments[1]:void 0)})},{"../internals/array-buffer-view-core":96,"../internals/array-iteration":104}],278:[function(e,w,g){var a=e("../internals/array-buffer-view-core"),r=e("../internals/array-iteration").forEach,u=a.aTypedArray,l=a.exportTypedArrayMethod;l("forEach",function(s){r(u(this),s,arguments.length>1?arguments[1]:void 0)})},{"../internals/array-buffer-view-core":96,"../internals/array-iteration":104}],279:[function(e,w,g){var a=e("../internals/array-buffer-view-core"),r=e("../internals/array-includes").includes,u=a.aTypedArray,l=a.exportTypedArrayMethod;l("includes",function(s){return r(u(this),s,arguments.length>1?arguments[1]:void 0)})},{"../internals/array-buffer-view-core":96,"../internals/array-includes":103}],280:[function(e,w,g){var a=e("../internals/array-buffer-view-core"),r=e("../internals/array-includes").indexOf,u=a.aTypedArray,l=a.exportTypedArrayMethod;l("indexOf",function(s){return r(u(this),s,arguments.length>1?arguments[1]:void 0)})},{"../internals/array-buffer-view-core":96,"../internals/array-includes":103}],281:[function(e,w,g){var a=e("../internals/global"),r=e("../internals/array-buffer-view-core"),u=e("../modules/es.array.iterator"),l=e("../internals/well-known-symbol"),c=l("iterator"),s=a.Uint8Array,t=u.values,i=u.keys,n=u.entries,o=r.aTypedArray,p=r.exportTypedArrayMethod,f=s&&s.prototype[c],d=!!f&&(f.name=="values"||f.name==null),m=function(){return t.call(o(this))};p("entries",function(){return n.call(o(this))}),p("keys",function(){return i.call(o(this))}),p("values",m,!d),p(c,m,!d)},{"../internals/array-buffer-view-core":96,"../internals/global":147,"../internals/well-known-symbol":237,"../modules/es.array.iterator":247}],282:[function(e,w,g){var a=e("../internals/array-buffer-view-core"),r=a.aTypedArray,u=a.exportTypedArrayMethod,l=[].join;u("join",function(s){return l.apply(r(this),arguments)})},{"../internals/array-buffer-view-core":96}],283:[function(e,w,g){var a=e("../internals/array-buffer-view-core"),r=e("../internals/array-last-index-of"),u=a.aTypedArray,l=a.exportTypedArrayMethod;l("lastIndexOf",function(s){return r.apply(u(this),arguments)})},{"../internals/array-buffer-view-core":96,"../internals/array-last-index-of":105}],284:[function(e,w,g){var a=e("../internals/array-buffer-view-core"),r=e("../internals/array-iteration").map,u=e("../internals/typed-array-species-constructor"),l=a.aTypedArray,c=a.exportTypedArrayMethod;c("map",function(t){return r(l(this),t,arguments.length>1?arguments[1]:void 0,function(i,n){return new(u(i))(n)})})},{"../internals/array-buffer-view-core":96,"../internals/array-iteration":104,"../internals/typed-array-species-constructor":233}],285:[function(e,w,g){var a=e("../internals/array-buffer-view-core"),r=e("../internals/array-reduce").right,u=a.aTypedArray,l=a.exportTypedArrayMethod;l("reduceRight",function(s){return r(u(this),s,arguments.length,arguments.length>1?arguments[1]:void 0)})},{"../internals/array-buffer-view-core":96,"../internals/array-reduce":108}],286:[function(e,w,g){var a=e("../internals/array-buffer-view-core"),r=e("../internals/array-reduce").left,u=a.aTypedArray,l=a.exportTypedArrayMethod;l("reduce",function(s){return r(u(this),s,arguments.length,arguments.length>1?arguments[1]:void 0)})},{"../internals/array-buffer-view-core":96,"../internals/array-reduce":108}],287:[function(e,w,g){var a=e("../internals/array-buffer-view-core"),r=a.aTypedArray,u=a.exportTypedArrayMethod,l=Math.floor;u("reverse",function(){for(var s=this,t=r(s).length,i=l(t/2),n=0,o;n1?arguments[1]:void 0,1),f=this.length,d=l(o),m=r(d.length),h=0;if(m+p>f)throw RangeError("Wrong length");for(;hd;)h[d]=p[d++];return h},t)},{"../internals/array-buffer-view-core":96,"../internals/fails":140,"../internals/typed-array-species-constructor":233}],290:[function(e,w,g){var a=e("../internals/array-buffer-view-core"),r=e("../internals/array-iteration").some,u=a.aTypedArray,l=a.exportTypedArrayMethod;l("some",function(s){return r(u(this),s,arguments.length>1?arguments[1]:void 0)})},{"../internals/array-buffer-view-core":96,"../internals/array-iteration":104}],291:[function(e,w,g){var a=e("../internals/array-buffer-view-core"),r=e("../internals/global"),u=e("../internals/fails"),l=e("../internals/a-function"),c=e("../internals/to-length"),s=e("../internals/array-sort"),t=e("../internals/engine-ff-version"),i=e("../internals/engine-is-ie-or-edge"),n=e("../internals/engine-v8-version"),o=e("../internals/engine-webkit-version"),p=a.aTypedArray,f=a.exportTypedArrayMethod,d=r.Uint16Array,m=d&&d.prototype.sort,h=!!m&&!u(function(){var v=new d(2);v.sort(null),v.sort({})}),b=!!m&&!u(function(){if(n)return n<74;if(t)return t<67;if(i)return!0;if(o)return o<602;var v=new d(516),j=Array(516),y,x;for(y=0;y<516;y++)x=y%4,v[y]=515-y,j[y]=y-2*x+3;for(v.sort(function(O,A){return(O/4|0)-(A/4|0)}),y=0;y<516;y++)if(v[y]!==j[y])return!0}),S=function(v){return function(j,y){return v!==void 0?+v(j,y)||0:y!==y?-1:j!==j?1:j===0&&y===0?1/j>0&&1/y<0?1:-1:j>y}};f("sort",function(j){var y=this;if(j!==void 0&&l(j),b)return m.call(y,j);p(y);var x=c(y.length),O=Array(x),A;for(A=0;A0?"-":"+")+u(Math.floor(Math.abs(E)/60)*100+Math.abs(E)%60,4),S:["th","st","nd","rd"][b%10>3?0:(b%100-b%10!=10)*b%10],W:_,N:T};return p.replace(t,function(F){return F in k?k[F]:F.slice(1,F.length-1)})}}();r.masks={default:"ddd mmm dd yyyy HH:MM:ss",shortDate:"m/d/yy",mediumDate:"mmm d, yyyy",longDate:"mmmm d, yyyy",fullDate:"dddd, mmmm d, yyyy",shortTime:"h:MM TT",mediumTime:"h:MM:ss TT",longTime:"h:MM:ss TT Z",isoDate:"yyyy-mm-dd",isoTime:"HH:MM:ss",isoDateTime:"yyyy-mm-dd'T'HH:MM:sso",isoUtcDateTime:"UTC:yyyy-mm-dd'T'HH:MM:ss'Z'",expiresHeaderFormat:"ddd, dd mmm yyyy HH:MM:ss Z"},r.i18n={dayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","January","February","March","April","May","June","July","August","September","October","November","December"]};function u(t,i){for(t=String(t),i=i||2;t.length]/;w.exports=r;function r(u){var l=""+u,c=a.exec(l);if(!c)return l;var s,t="",i=0,n=0;for(i=c.index;i0&&this._events[s].length>i&&(this._events[s].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[s].length),typeof console.trace=="function"&&console.trace())),this},a.prototype.on=a.prototype.addListener,a.prototype.once=function(s,t){if(!r(t))throw TypeError("listener must be a function");var i=!1;function n(){this.removeListener(s,n),i||(i=!0,t.apply(this,arguments))}return n.listener=t,this.on(s,n),this},a.prototype.removeListener=function(s,t){var i,n,o,p;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[s])return this;if(i=this._events[s],o=i.length,n=-1,i===t||r(i.listener)&&i.listener===t)delete this._events[s],this._events.removeListener&&this.emit("removeListener",s,t);else if(l(i)){for(p=o;p-- >0;)if(i[p]===t||i[p].listener&&i[p].listener===t){n=p;break}if(n<0)return this;i.length===1?(i.length=0,delete this._events[s]):i.splice(n,1),this._events.removeListener&&this.emit("removeListener",s,t)}return this},a.prototype.removeAllListeners=function(s){var t,i;if(!this._events)return this;if(!this._events.removeListener)return arguments.length===0?this._events={}:this._events[s]&&delete this._events[s],this;if(arguments.length===0){for(t in this._events)t!=="removeListener"&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(i=this._events[s],r(i))this.removeListener(s,i);else if(i)for(;i.length;)this.removeListener(s,i[i.length-1]);return delete this._events[s],this},a.prototype.listeners=function(s){var t;return!this._events||!this._events[s]?t=[]:r(this._events[s])?t=[this._events[s]]:t=this._events[s].slice(),t},a.prototype.listenerCount=function(s){if(this._events){var t=this._events[s];if(r(t))return 1;if(t)return t.length}return 0},a.listenerCount=function(s,t){return s.listenerCount(t)};function r(s){return typeof s=="function"}function u(s){return typeof s=="number"}function l(s){return typeof s=="object"&&s!==null}function c(s){return s===void 0}},{}],302:[function(e,w,g){var a=e("http"),r=w.exports;for(var u in a)a.hasOwnProperty(u)&&(r[u]=a[u]);r.request=function(l,c){return l||(l={}),l.scheme="https",l.protocol="https:",a.request.call(this,l,c)}},{http:400}],303:[function(e,w,g){var a=e("util"),r=e("ms");w.exports=function(u){if(typeof u=="number")return u;var l=r(u);if(l===void 0){var c=new Error(a.format("humanize-ms(%j) result undefined",u));console.warn(c.stack)}return l}},{ms:319,util:352}],304:[function(e,w,g){/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */g.read=function(a,r,u,l,c){var s,t,i=c*8-l-1,n=(1<>1,p=-7,f=u?c-1:0,d=u?-1:1,m=a[r+f];for(f+=d,s=m&(1<<-p)-1,m>>=-p,p+=i;p>0;s=s*256+a[r+f],f+=d,p-=8);for(t=s&(1<<-p)-1,s>>=-p,p+=l;p>0;t=t*256+a[r+f],f+=d,p-=8);if(s===0)s=1-o;else{if(s===n)return t?NaN:(m?-1:1)*(1/0);t=t+Math.pow(2,l),s=s-o}return(m?-1:1)*t*Math.pow(2,s-l)},g.write=function(a,r,u,l,c,s){var t,i,n,o=s*8-c-1,p=(1<>1,d=c===23?Math.pow(2,-24)-Math.pow(2,-77):0,m=l?0:s-1,h=l?1:-1,b=r<0||r===0&&1/r<0?1:0;for(r=Math.abs(r),isNaN(r)||r===1/0?(i=isNaN(r)?1:0,t=p):(t=Math.floor(Math.log(r)/Math.LN2),r*(n=Math.pow(2,-t))<1&&(t--,n*=2),t+f>=1?r+=d/n:r+=d*Math.pow(2,1-f),r*n>=2&&(t++,n/=2),t+f>=p?(i=0,t=p):t+f>=1?(i=(r*n-1)*Math.pow(2,c),t=t+f):(i=r*Math.pow(2,f-1)*Math.pow(2,c),t=0));c>=8;a[u+m]=i&255,m+=h,i/=256,c-=8);for(t=t<0;a[u+m]=t&255,m+=h,t/=256,o-=8);a[u+m-h]|=b*128}},{}],305:[function(e,w,g){var a=[e("./nextTick"),e("./queueMicrotask"),e("./mutation.js"),e("./messageChannel"),e("./stateChange"),e("./timeout")],r,u,l=-1,c=[],s=!1;function t(){!r||!u||(r=!1,u.length?c=u.concat(c):l=-1,c.length&&i())}function i(){if(!r){s=!1,r=!0;for(var m=c.length,h=setTimeout(t);m;){for(u=c,c=[];u&&++l1)for(var b=1;b + * @license MIT + */w.exports=function(u){return u!=null&&(a(u)||r(u)||!!u._isBuffer)};function a(u){return!!u.constructor&&typeof u.constructor.isBuffer=="function"&&u.constructor.isBuffer(u)}function r(u){return typeof u.readFloatLE=="function"&&typeof u.slice=="function"&&a(u.slice(0,0))}},{}],313:[function(e,w,g){var a={}.toString;w.exports=Array.isArray||function(r){return a.call(r)=="[object Array]"}},{}],314:[function(e,w,g){(function(a){(function(){(function(r,u){typeof g=="object"&&typeof w!="undefined"?w.exports=u(r):u(r)})(typeof self!="undefined"?self:typeof window!="undefined"?window:typeof a!="undefined"?a:this,function(r){r=r||{};var u=r.Base64,l="2.6.4",c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=function(V){for(var L={},Y=0,re=V.length;Y>>6)+t(128|L&63):t(224|L>>>12&15)+t(128|L>>>6&63)+t(128|L&63)}else{var L=65536+(V.charCodeAt(0)-55296)*1024+(V.charCodeAt(1)-56320);return t(240|L>>>18&7)+t(128|L>>>12&63)+t(128|L>>>6&63)+t(128|L&63)}},n=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g,o=function(V){return V.replace(n,i)},p=function(V){var L=[0,2,1][V.length%3],Y=V.charCodeAt(0)<<16|(V.length>1?V.charCodeAt(1):0)<<8|(V.length>2?V.charCodeAt(2):0),re=[c.charAt(Y>>>18),c.charAt(Y>>>12&63),L>=2?"=":c.charAt(Y>>>6&63),L>=1?"=":c.charAt(Y&63)];return re.join("")},f=r.btoa&&typeof r.btoa=="function"?function(V){return r.btoa(V)}:function(V){if(V.match(/[^\x00-\xFF]/))throw new RangeError("The string contains invalid characters.");return V.replace(/[\s\S]{1,3}/g,p)},d=function(V){return f(o(String(V)))},m=function(V){return V.replace(/[+\/]/g,function(L){return L=="+"?"-":"_"}).replace(/=/g,"")},h=function(V,L){return L?m(d(V)):d(V)},b=function(V){return h(V,!0)},S;r.Uint8Array&&(S=function(V,L){for(var Y="",re=0,z=V.length;re>>18)+c.charAt(B>>>12&63)+(typeof U!="undefined"?c.charAt(B>>>6&63):"=")+(typeof P!="undefined"?c.charAt(B&63):"=")}return L?m(Y):Y});var v=/[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g,j=function(V){switch(V.length){case 4:var L=(7&V.charCodeAt(0))<<18|(63&V.charCodeAt(1))<<12|(63&V.charCodeAt(2))<<6|63&V.charCodeAt(3),Y=L-65536;return t((Y>>>10)+55296)+t((Y&1023)+56320);case 3:return t((15&V.charCodeAt(0))<<12|(63&V.charCodeAt(1))<<6|63&V.charCodeAt(2));default:return t((31&V.charCodeAt(0))<<6|63&V.charCodeAt(1))}},y=function(V){return V.replace(v,j)},x=function(V){var L=V.length,Y=L%4,re=(L>0?s[V.charAt(0)]<<18:0)|(L>1?s[V.charAt(1)]<<12:0)|(L>2?s[V.charAt(2)]<<6:0)|(L>3?s[V.charAt(3)]:0),z=[t(re>>>16),t(re>>>8&255),t(re&255)];return z.length-=[0,0,2,1][Y],z.join("")},O=r.atob&&typeof r.atob=="function"?function(V){return r.atob(V)}:function(V){return V.replace(/\S{1,4}/g,x)},A=function(V){return O(String(V).replace(/[^A-Za-z0-9\+\/]/g,""))},E=function(V){return y(O(V))},_=function(V){return String(V).replace(/[-_]/g,function(L){return L=="-"?"+":"/"}).replace(/[^A-Za-z0-9\+\/]/g,"")},T=function(V){return E(_(V))},k;r.Uint8Array&&(k=function(V){return Uint8Array.from(A(_(V)),function(L){return L.charCodeAt(0)})});var F=function(){var V=r.Base64;return r.Base64=u,V};if(r.Base64={VERSION:l,atob:A,btoa:f,fromBase64:T,toBase64:h,utob:o,encode:h,encodeURI:b,btou:y,decode:T,noConflict:F,fromUint8Array:S,toUint8Array:k},typeof Object.defineProperty=="function"){var W=function(V){return{value:V,enumerable:!1,writable:!0,configurable:!0}};r.Base64.extendString=function(){Object.defineProperty(String.prototype,"fromBase64",W(function(){return T(this)})),Object.defineProperty(String.prototype,"toBase64",W(function(V){return h(this,V)})),Object.defineProperty(String.prototype,"toBase64URI",W(function(){return h(this,!0)}))}}return r.Meteor&&(Base64=r.Base64),typeof w!="undefined"&&w.exports&&(w.exports.Base64=r.Base64),{Base64:r.Base64}})}).call(this)}).call(this,typeof xe!="undefined"?xe:typeof self!="undefined"?self:typeof window!="undefined"?window:{})},{}],315:[function(e,w,g){w.exports=r;var a=Object.prototype.hasOwnProperty;function r(u,l,c){if(!u)throw new TypeError("argument dest is required");if(!l)throw new TypeError("argument src is required");return c===void 0&&(c=!0),Object.getOwnPropertyNames(l).forEach(function(t){if(!(!c&&a.call(u,t))){var i=Object.getOwnPropertyDescriptor(l,t);Object.defineProperty(u,t,i)}}),u}},{}],316:[function(e,w,g){e("core-js/modules/es.array.map.js"),e("core-js/modules/es.regexp.exec.js"),e("core-js/modules/es.string.replace.js"),e("core-js/modules/es.regexp.constructor.js"),e("core-js/modules/es.regexp.to-string.js");function a(){this._types=Object.create(null),this._extensions=Object.create(null);for(var r=0;r0)return t(p);if(d==="number"&&isFinite(p))return f.long?n(p):i(p);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(p))};function t(p){if(p=String(p),!(p.length>100)){var f=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(p);if(!!f){var d=parseFloat(f[1]),m=(f[2]||"ms").toLowerCase();switch(m){case"years":case"year":case"yrs":case"yr":case"y":return d*s;case"weeks":case"week":case"w":return d*c;case"days":case"day":case"d":return d*l;case"hours":case"hour":case"hrs":case"hr":case"h":return d*u;case"minutes":case"minute":case"mins":case"min":case"m":return d*r;case"seconds":case"second":case"secs":case"sec":case"s":return d*a;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return d;default:return}}}}function i(p){var f=Math.abs(p);return f>=l?Math.round(p/l)+"d":f>=u?Math.round(p/u)+"h":f>=r?Math.round(p/r)+"m":f>=a?Math.round(p/a)+"s":p+"ms"}function n(p){var f=Math.abs(p);return f>=l?o(p,f,l,"day"):f>=u?o(p,f,u,"hour"):f>=r?o(p,f,r,"minute"):f>=a?o(p,f,a,"second"):p+" ms"}function o(p,f,d,m){var h=f>=d*1.5;return Math.round(p/d)+" "+m+(h?"s":"")}},{}],320:[function(e,w,g){var a=Object.getOwnPropertySymbols,r=Object.prototype.hasOwnProperty,u=Object.prototype.propertyIsEnumerable;function l(s){if(s==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(s)}function c(){try{if(!Object.assign)return!1;var s=new String("abc");if(s[5]="de",Object.getOwnPropertyNames(s)[0]==="5")return!1;for(var t={},i=0;i<10;i++)t["_"+String.fromCharCode(i)]=i;var n=Object.getOwnPropertyNames(t).map(function(p){return t[p]});if(n.join("")!=="0123456789")return!1;var o={};return"abcdefghijklmnopqrst".split("").forEach(function(p){o[p]=p}),Object.keys(Object.assign({},o)).join("")==="abcdefghijklmnopqrst"}catch{return!1}}w.exports=c()?Object.assign:function(s,t){for(var i,n=l(s),o,p=1;p=0;n--){var o=s[n];o==="."?s.splice(n,1):o===".."?(s.splice(n,1),i++):i&&(s.splice(n,1),i--)}if(t)for(;i--;i)s.unshift("..");return s}g.resolve=function(){for(var s="",t=!1,i=arguments.length-1;i>=-1&&!t;i--){var n=i>=0?arguments[i]:a.cwd();if(typeof n!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!n)continue;s=n+"/"+s,t=n.charAt(0)==="/"}return s=r(l(s.split("/"),function(o){return!!o}),!t).join("/"),(t?"/":"")+s||"."},g.normalize=function(s){var t=g.isAbsolute(s),i=c(s,-1)==="/";return s=r(l(s.split("/"),function(n){return!!n}),!t).join("/"),!s&&!t&&(s="."),s&&i&&(s+="/"),(t?"/":"")+s},g.isAbsolute=function(s){return s.charAt(0)==="/"},g.join=function(){var s=Array.prototype.slice.call(arguments,0);return g.normalize(l(s,function(t,i){if(typeof t!="string")throw new TypeError("Arguments to path.join must be strings");return t}).join("/"))},g.relative=function(s,t){s=g.resolve(s).substr(1),t=g.resolve(t).substr(1);function i(h){for(var b=0;b=0&&h[S]==="";S--);return b>S?[]:h.slice(b,S-b+1)}for(var n=i(s.split("/")),o=i(t.split("/")),p=Math.min(n.length,o.length),f=p,d=0;d=1;--p)if(t=s.charCodeAt(p),t===47){if(!o){n=p;break}}else o=!1;return n===-1?i?"/":".":i&&n===1?"/":s.slice(0,n)};function u(s){typeof s!="string"&&(s=s+"");var t=0,i=-1,n=!0,o;for(o=s.length-1;o>=0;--o)if(s.charCodeAt(o)===47){if(!n){t=o+1;break}}else i===-1&&(n=!1,i=o+1);return i===-1?"":s.slice(t,i)}g.basename=function(s,t){var i=u(s);return t&&i.substr(-1*t.length)===t&&(i=i.substr(0,i.length-t.length)),i},g.extname=function(s){typeof s!="string"&&(s=s+"");for(var t=-1,i=0,n=-1,o=!0,p=0,f=s.length-1;f>=0;--f){var d=s.charCodeAt(f);if(d===47){if(!o){i=f+1;break}continue}n===-1&&(o=!1,n=f+1),d===46?t===-1?t=f:p!==1&&(p=1):t!==-1&&(p=-1)}return t===-1||n===-1||p===0||p===1&&t===n-1&&t===i+1?"":s.slice(t,n)};function l(s,t){if(s.filter)return s.filter(t);for(var i=[],n=0;n-1&&k<=t)for(;++T3&&"WebKit"||/\bOpera\b/.test(Z)&&(/\bOPR\b/.test(E)?"Blink":"Presto")||/\b(?:Midori|Nook|Safari)\b/i.test(E)&&!/^(?:Trident|EdgeHTML)$/.test(Q)&&"WebKit"||!Q&&/\bMSIE\b/i.test(E)&&(oe=="Mac OS"?"Tasman":"Trident")||Q=="WebKit"&&/\bPlayStation\b(?! Vita\b)/i.test(Z)&&"NetFront")&&(Q=[X]),Z=="IE"&&(X=(/; *(?:XBLWP|ZuneWP)(\d+)/i.exec(E)||0)[1])?(Z+=" Mobile",oe="Windows Phone "+(/\+$/.test(X)?X:X+".x"),M.unshift("desktop mode")):/\bWPDesktop\b/i.test(E)?(Z="IE Mobile",oe="Windows Phone 8.x",M.unshift("desktop mode"),I||(I=(/\brv:([\d.]+)/.exec(E)||0)[1])):Z!="IE"&&Q=="Trident"&&(X=/\brv:([\d.]+)/.exec(E))&&(Z&&M.push("identifying as "+Z+(I?" "+I:"")),Z="IE",I=X[1]),N){if(v(_,"global"))if(G&&(X=G.lang.System,ae=X.getProperty("os.arch"),oe=oe||X.getProperty("os.name")+" "+X.getProperty("os.version")),U){try{I=_.require("ringo/engine").version.join("."),Z="RingoJS"}catch{(X=_.system)&&X.global.system==_.system&&(Z="Narwhal",oe||(oe=X[0].os||null))}Z||(Z="Rhino")}else typeof _.process=="object"&&!_.process.browser&&(X=_.process)&&(typeof X.versions=="object"&&(typeof X.versions.electron=="string"?(M.push("Node "+X.versions.node),Z="Electron",I=X.versions.electron):typeof X.versions.nw=="string"&&(M.push("Chromium "+I,"Node "+X.versions.node),Z="NW.js",I=X.versions.nw)),Z||(Z="Node.js",ae=X.arch,oe=X.platform,I=/[\d.]+/.exec(X.version),I=I?I[0]:null));else S(X=_.runtime)==L?(Z="Adobe AIR",oe=X.flash.system.Capabilities.os):S(X=_.phantom)==z?(Z="PhantomJS",I=(X=X.version||null)&&X.major+"."+X.minor+"."+X.patch):typeof K.documentMode=="number"&&(X=/\bTrident\/(\d+)/i.exec(E))?(I=[I,K.documentMode],(X=+X[1]+4)!=I[1]&&(M.push("IE "+I[1]+" mode"),Q&&(Q[1]=""),I[1]=X),I=Z=="IE"?String(I[1].toFixed(1)):I[0]):typeof K.documentMode=="number"&&/^(?:Chrome|Firefox)\b/.test(Z)&&(M.push("masking as "+Z+" "+I),Z="IE",I="11.0",Q=["Trident"],oe="Windows");oe=oe&&h(oe)}if(I&&(X=/(?:[ab]|dp|pre|[ab]\d+pre)(?:\d+\+?)?$/i.exec(I)||/(?:alpha|beta)(?: ?\d)?/i.exec(E+";"+(N&&k.appMinorVersion))||/\bMinefield\b/i.test(E)&&"a")&&(D=/b/i.test(X)?"beta":"alpha",I=I.replace(RegExp(X+"\\+?$"),"")+(D=="beta"?B:P)+(/\d+\+?/.exec(X)||"")),Z=="Fennec"||Z=="Firefox"&&/\b(?:Android|Firefox OS|KaiOS)\b/.test(oe))Z="Firefox Mobile";else if(Z=="Maxthon"&&I)I=I.replace(/\.[\d.]+/,".x");else if(/\bXbox\b/i.test(ie))ie=="Xbox 360"&&(oe=null),ie=="Xbox 360"&&/\bIEMobile\b/.test(E)&&M.unshift("mobile mode");else if((/^(?:Chrome|IE|Opera)$/.test(Z)||Z&&!ie&&!/Browser|Mobi/.test(Z))&&(oe=="Windows CE"||/Mobi/i.test(E)))Z+=" Mobile";else if(Z=="IE"&&N)try{_.external===null&&M.unshift("platform preview")}catch{M.unshift("embedded")}else(/\bBlackBerry\b/.test(ie)||/\bBB10\b/.test(E))&&(X=(RegExp(ie.replace(/ +/g," *")+"/([.\\d]+)","i").exec(E)||0)[1]||I)?(X=[X,/BB10/.test(E)],oe=(X[1]?(ie=null,ce="BlackBerry"):"Device Software")+" "+X[0],I=null):this!=b&&ie!="Wii"&&(N&&J||/Opera/.test(Z)&&/\b(?:MSIE|Firefox)\b/i.test(E)||Z=="Firefox"&&/\bOS X (?:\d+\.){2,}/.test(oe)||Z=="IE"&&(oe&&!/^Win/.test(oe)&&I>5.5||/\bWindows XP\b/.test(oe)&&I>8||I==8&&!/\bTrident\b/.test(E)))&&!i.test(X=O.call(b,E.replace(i,"")+";"))&&X.name&&(X="ing as "+X.name+((X=X.version)?" "+X:""),i.test(Z)?(/\bIE\b/.test(X)&&oe=="Mac OS"&&(oe=null),X="identify"+X):(X="mask"+X,q?Z=h(q.replace(/([a-z])([A-Z])/g,"$1 $2")):Z="Opera",/\bIE\b/.test(X)&&(oe=null),N||(I=null)),Q=["Presto"],M.push(X));(X=(/\bAppleWebKit\/([\d.]+\+?)/i.exec(E)||0)[1])&&(X=[parseFloat(X.replace(/\.(\d)$/,".0$1")),X],Z=="Safari"&&X[1].slice(-1)=="+"?(Z="WebKit Nightly",D="alpha",I=X[1].slice(0,-1)):(I==X[1]||I==(X[2]=(/\bSafari\/([\d.]+\+?)/i.exec(E)||0)[1]))&&(I=null),X[1]=(/\b(?:Headless)?Chrome\/([\d.]+)/i.exec(E)||0)[1],X[0]==537.36&&X[2]==537.36&&parseFloat(X[1])>=28&&Q=="WebKit"&&(Q=["Blink"]),!N||!W&&!X[1]?(Q&&(Q[1]="like Safari"),X=(X=X[0],X<400?1:X<500?2:X<526?3:X<533?4:X<534?"4+":X<535?5:X<537?6:X<538?7:X<601?8:X<602?9:X<604?10:X<606?11:X<608?12:"12")):(Q&&(Q[1]="like Chrome"),X=X[1]||(X=X[0],X<530?1:X<532?2:X<532.05?3:X<533?4:X<534.03?5:X<534.07?6:X<534.1?7:X<534.13?8:X<534.16?9:X<534.24?10:X<534.3?11:X<535.01?12:X<535.02?"13+":X<535.07?15:X<535.11?16:X<535.19?17:X<536.05?18:X<536.1?19:X<537.01?20:X<537.11?"21+":X<537.13?23:X<537.18?24:X<537.24?25:X<537.36?26:Q!="Blink"?"27":"28")),Q&&(Q[1]+=" "+(X+=typeof X=="number"?".x":/[.+]/.test(X)?"":"+")),Z=="Safari"&&(!I||parseInt(I)>45)?I=X:Z=="Chrome"&&/\bHeadlessChrome/i.test(E)&&M.unshift("headless")),Z=="Opera"&&(X=/\bzbov|zvav$/.exec(oe))?(Z+=" ",M.unshift("desktop mode"),X=="zvav"?(Z+="Mini",I=null):Z+="Mobile",oe=oe.replace(RegExp(" *"+X+"$"),"")):Z=="Safari"&&/\bChrome\b/.exec(Q&&Q[1])?(M.unshift("desktop mode"),Z="Chrome Mobile",I=null,/\bOS X\b/.test(oe)?(ce="Apple",oe="iOS 4.3+"):oe=null):/\bSRWare Iron\b/.test(Z)&&!I&&(I=H("Chrome")),I&&I.indexOf(X=/[\d.]+$/.exec(oe))==0&&E.indexOf("/"+X+"-")>-1&&(oe=x(oe.replace(X,""))),oe&&oe.indexOf(Z)!=-1&&!RegExp(Z+" OS").test(oe)&&(oe=oe.replace(RegExp(" *"+j(Z)+" *"),"")),Q&&!/\b(?:Avant|Nook)\b/.test(Z)&&(/Browser|Lunascape|Maxthon/.test(Z)||Z!="Safari"&&/^iOS/.test(oe)&&/\bSafari\b/.test(Q[1])||/^(?:Adobe|Arora|Breach|Midori|Opera|Phantom|Rekonq|Rock|Samsung Internet|Sleipnir|SRWare Iron|Vivaldi|Web)/.test(Z)&&Q[1])&&(X=Q[Q.length-1])&&M.push(X),M.length&&(M=["("+M.join("; ")+")"]),ce&&ie&&ie.indexOf(ce)<0&&M.push("on "+ce),ie&&M.push((/^on /.test(M[M.length-1])?"":"on ")+ie),oe&&(X=/ ([\d.+]+)$/.exec(oe),te=X&&oe.charAt(oe.length-X[0].length-1)=="/",oe={architecture:32,family:X&&!te?oe.replace(X[0],""):oe,version:X?X[1]:null,toString:function(){var ue=this.version;return this.family+(ue&&!te?" "+ue:"")+(this.architecture==64?" 64-bit":"")}}),(X=/\b(?:AMD|IA|Win|WOW|x86_|x)64\b/i.exec(ae))&&!/\bi686\b/i.test(ae)?(oe&&(oe.architecture=64,oe.family=oe.family.replace(RegExp(" *"+X),"")),Z&&(/\bWOW64\b/i.test(E)||N&&/\w(?:86|32)$/.test(k.cpuClass||k.platform)&&!/\bWin64; x64\b/i.test(E))&&M.unshift("32-bit")):oe&&/^OS X/.test(oe.family)&&Z=="Chrome"&&parseFloat(I)>=39&&(oe.architecture=64),E||(E=null);var ne={};return ne.description=E,ne.layout=Q&&Q[0],ne.manufacturer=ce,ne.name=Z,ne.prerelease=D,ne.product=ie,ne.ua=E,ne.version=Z&&I,ne.os=oe||{architecture:null,family:null,version:null,toString:function(){return"null"}},ne.parse=O,ne.toString=ee,ne.version&&M.unshift(I),ne.name&&M.unshift(Z),oe&&Z&&!(oe==String(oe).split(" ")[0]&&(oe==Z.split(" ")[0]||ie))&&M.push(ie?"("+oe+")":"on "+oe),M.length&&(ne.description=M.join(" ")),ne}var A=O();l&&c?b(A,function(E,_){l[_]=E}):u.platform=A}).call(this)}).call(this)}).call(this,typeof xe!="undefined"?xe:typeof self!="undefined"?self:typeof window!="undefined"?window:{})},{}],323:[function(e,w,g){(function(a){(function(){typeof a=="undefined"||!a.version||a.version.indexOf("v0.")===0||a.version.indexOf("v1.")===0&&a.version.indexOf("v1.8.")!==0?w.exports={nextTick:r}:w.exports=a;function r(u,l,c,s){if(typeof u!="function")throw new TypeError('"callback" argument must be a function');var t=arguments.length,i,n;switch(t){case 0:case 1:return a.nextTick(u);case 2:return a.nextTick(function(){u.call(null,l)});case 3:return a.nextTick(function(){u.call(null,l,c)});case 4:return a.nextTick(function(){u.call(null,l,c,s)});default:for(i=new Array(t-1),n=0;n1)for(var v=1;v= 0x80 (not a basic code point)","invalid-input":"Invalid input"},y=i-n,x=Math.floor,O=String.fromCharCode,A;function E(U){throw new RangeError(j[U])}function _(U,P){for(var B=U.length,K=[];B--;)K[B]=P(U[B]);return K}function T(U,P){var B=U.split("@"),K="";B.length>1&&(K=B[0]+"@",U=B[1]),U=U.replace(v,".");var J=U.split("."),q=_(J,P).join(".");return K+q}function k(U){for(var P=[],B=0,K=U.length,J,q;B=55296&&J<=56319&&B65535&&(P-=65536,B+=O(P>>>10&1023|55296),P=56320|P&1023),B+=O(P),B}).join("")}function W(U){return U-48<10?U-22:U-65<26?U-65:U-97<26?U-97:i}function V(U,P){return U+22+75*(U<26)-((P!=0)<<5)}function L(U,P,B){var K=0;for(U=B?x(U/f):U>>1,U+=x(U/P);U>y*o>>1;K+=i)U=x(U/y);return x(K+(y+1)*U/(U+p))}function Y(U){var P=[],B=U.length,K,J=0,q=m,X=d,ae,M,D,N,I,te,Q,Z,ie;for(ae=U.lastIndexOf(h),ae<0&&(ae=0),M=0;M=128&&E("not-basic"),P.push(U.charCodeAt(M));for(D=ae>0?ae+1:0;D=B&&E("invalid-input"),Q=W(U.charCodeAt(D++)),(Q>=i||Q>x((t-J)/I))&&E("overflow"),J+=Q*I,Z=te<=X?n:te>=X+o?o:te-X,!(Qx(t/ie)&&E("overflow"),I*=ie;K=P.length+1,X=L(J-N,K,N==0),x(J/K)>t-q&&E("overflow"),q+=x(J/K),J%=K,P.splice(J++,0,q)}return F(P)}function re(U){var P,B,K,J,q,X,ae,M,D,N,I,te=[],Q,Z,ie,ce;for(U=k(U),Q=U.length,P=m,B=0,q=d,X=0;X=P&&Ix((t-B)/Z)&&E("overflow"),B+=(ae-P)*Z,P=ae,X=0;Xt&&E("overflow"),I==P){for(M=B,D=i;N=D<=q?n:D>=q+o?o:D-q,!(M0&&o>n&&(o=n);for(var p=0;p=0?(m=f.substr(0,d),h=f.substr(d+1)):(m=f,h=""),b=decodeURIComponent(m),S=decodeURIComponent(h),a(t,b)?r(t[b])?t[b].push(S):t[b]=[t[b],S]:t[b]=S}return t};var r=Array.isArray||function(u){return Object.prototype.toString.call(u)==="[object Array]"}},{}],327:[function(e,w,g){var a=function(c){switch(typeof c){case"string":return c;case"boolean":return c?"true":"false";case"number":return isFinite(c)?c:"";default:return""}};w.exports=function(c,s,t,i){return s=s||"&",t=t||"=",c===null&&(c=void 0),typeof c=="object"?u(l(c),function(n){var o=encodeURIComponent(a(n))+t;return r(c[n])?u(c[n],function(p){return o+encodeURIComponent(a(p))}).join(s):o+encodeURIComponent(a(c[n]))}).join(s):i?encodeURIComponent(a(i))+t+encodeURIComponent(a(c)):""};var r=Array.isArray||function(c){return Object.prototype.toString.call(c)==="[object Array]"};function u(c,s){if(c.map)return c.map(s);for(var t=[],i=0;i0?(typeof I!="string"&&!ie.objectMode&&Object.getPrototypeOf(I)!==i.prototype&&(I=o(I)),Q?ie.endEmitted?N.emit("error",new Error("stream.unshift() after end event")):A(N,ie,I,!0):ie.ended?N.emit("error",new Error("stream.push() after EOF")):(ie.reading=!1,ie.decoder&&!te?(I=ie.decoder.write(I),ie.objectMode||I.length!==0?A(N,ie,I,!1):Y(N,ie)):A(N,ie,I,!1))):Q||(ie.reading=!1)}return _(ie)}function A(N,I,te,Q){I.flowing&&I.length===0&&!I.sync?(N.emit("data",te),N.read(0)):(I.length+=I.objectMode?1:te.length,Q?I.buffer.unshift(te):I.buffer.push(te),I.needReadable&&V(N)),Y(N,I)}function E(N,I){var te;return!p(I)&&typeof I!="string"&&I!==void 0&&!N.objectMode&&(te=new TypeError("Invalid non-string/buffer chunk")),te}function _(N){return!N.ended&&(N.needReadable||N.length=T?N=T:(N--,N|=N>>>1,N|=N>>>2,N|=N>>>4,N|=N>>>8,N|=N>>>16,N++),N}function F(N,I){return N<=0||I.length===0&&I.ended?0:I.objectMode?1:N!==N?I.flowing&&I.length?I.buffer.head.data.length:I.length:(N>I.highWaterMark&&(I.highWaterMark=k(N)),N<=I.length?N:I.ended?I.length:(I.needReadable=!0,0))}x.prototype.read=function(N){m("read",N),N=parseInt(N,10);var I=this._readableState,te=N;if(N!==0&&(I.emittedReadable=!1),N===0&&I.needReadable&&(I.length>=I.highWaterMark||I.ended))return m("read: emitReadable",I.length,I.ended),I.length===0&&I.ended?ae(this):V(this),null;if(N=F(N,I),N===0&&I.ended)return I.length===0&&ae(this),null;var Q=I.needReadable;m("need readable",Q),(I.length===0||I.length-N0?Z=K(N,I):Z=null,Z===null?(I.needReadable=!0,N=0):I.length-=N,I.length===0&&(I.ended||(I.needReadable=!0),te!==N&&I.ended&&ae(this)),Z!==null&&this.emit("data",Z),Z};function W(N,I){if(!I.ended){if(I.decoder){var te=I.decoder.end();te&&te.length&&(I.buffer.push(te),I.length+=I.objectMode?1:te.length)}I.ended=!0,V(N)}}function V(N){var I=N._readableState;I.needReadable=!1,I.emittedReadable||(m("emitReadable",I.flowing),I.emittedReadable=!0,I.sync?u.nextTick(L,N):L(N))}function L(N){m("emit readable"),N.emit("readable"),B(N)}function Y(N,I){I.readingMore||(I.readingMore=!0,u.nextTick(re,N,I))}function re(N,I){for(var te=I.length;!I.reading&&!I.flowing&&!I.ended&&I.length1&&D(Q.pipes,N)!==-1)&&!ge&&(m("false write response, pause",te._readableState.awaitDrain),te._readableState.awaitDrain++,R=!0),te.pause())}function H(se){m("onerror",se),ue(),N.removeListener("error",H),s(N,"error")===0&&N.emit("error",se)}j(N,"error",H);function ee(){N.removeListener("finish",ne),ue()}N.once("close",ee);function ne(){m("onfinish"),N.removeListener("close",ee),ue()}N.once("finish",ne);function ue(){m("unpipe"),te.unpipe(N)}return N.emit("pipe",te),Q.flowing||(m("pipe resume"),te.resume()),N};function z(N){return function(){var I=N._readableState;m("pipeOnDrain",I.awaitDrain),I.awaitDrain&&I.awaitDrain--,I.awaitDrain===0&&s(N,"data")&&(I.flowing=!0,B(N))}}x.prototype.unpipe=function(N){var I=this._readableState,te={hasUnpiped:!1};if(I.pipesCount===0)return this;if(I.pipesCount===1)return N&&N!==I.pipes?this:(N||(N=I.pipes),I.pipes=null,I.pipesCount=0,I.flowing=!1,N&&N.emit("unpipe",this,te),this);if(!N){var Q=I.pipes,Z=I.pipesCount;I.pipes=null,I.pipesCount=0,I.flowing=!1;for(var ie=0;ie=I.length?(I.decoder?te=I.buffer.join(""):I.buffer.length===1?te=I.buffer.head.data:te=I.buffer.concat(I.length),I.buffer.clear()):te=J(N,I.buffer,I.decoder),te}function J(N,I,te){var Q;return Nie.length?ie.length:N;if(ce===ie.length?Z+=ie:Z+=ie.slice(0,N),N-=ce,N===0){ce===ie.length?(++Q,te.next?I.head=te.next:I.head=I.tail=null):(I.head=te,te.data=ie.slice(ce));break}++Q}return I.length-=Q,Z}function X(N,I){var te=i.allocUnsafe(N),Q=I.head,Z=1;for(Q.data.copy(te),N-=Q.data.length;Q=Q.next;){var ie=Q.data,ce=N>ie.length?ie.length:N;if(ie.copy(te,te.length-N,0,ce),N-=ce,N===0){ce===ie.length?(++Z,Q.next?I.head=Q.next:I.head=I.tail=null):(I.head=Q,Q.data=ie.slice(ce));break}++Z}return I.length-=Z,te}function ae(N){var I=N._readableState;if(I.length>0)throw new Error('"endReadable()" called on non-empty stream');I.endEmitted||(I.ended=!0,u.nextTick(M,I,N))}function M(N,I){!N.endEmitted&&N.length===0&&(N.endEmitted=!0,I.readable=!1,I.emit("end"))}function D(N,I){for(var te=0,Q=N.length;te-1?u:l.nextTick,t;j.WritableState=S;var i=Object.create(e("core-util-is"));i.inherits=e("inherits");var n={deprecate:e("util-deprecate")},o=e("./internal/streams/stream"),p=e("safe-buffer").Buffer,f=r.Uint8Array||function(){};function d(P){return p.from(P)}function m(P){return p.isBuffer(P)||P instanceof f}var h=e("./internal/streams/destroy");i.inherits(j,o);function b(){}function S(P,B){t=t||e("./_stream_duplex"),P=P||{};var K=B instanceof t;this.objectMode=!!P.objectMode,K&&(this.objectMode=this.objectMode||!!P.writableObjectMode);var J=P.highWaterMark,q=P.writableHighWaterMark,X=this.objectMode?16:16*1024;J||J===0?this.highWaterMark=J:K&&(q||q===0)?this.highWaterMark=q:this.highWaterMark=X,this.highWaterMark=Math.floor(this.highWaterMark),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var ae=P.decodeStrings===!1;this.decodeStrings=!ae,this.defaultEncoding=P.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(M){k(B,M)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new c(this)}S.prototype.getBuffer=function(){for(var B=this.bufferedRequest,K=[];B;)K.push(B),B=B.next;return K},function(){try{Object.defineProperty(S.prototype,"buffer",{get:n.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch{}}();var v;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(v=Function.prototype[Symbol.hasInstance],Object.defineProperty(j,Symbol.hasInstance,{value:function(P){return v.call(this,P)?!0:this!==j?!1:P&&P._writableState instanceof S}})):v=function(P){return P instanceof this};function j(P){if(t=t||e("./_stream_duplex"),!v.call(j,this)&&!(this instanceof t))return new j(P);this._writableState=new S(P,this),this.writable=!0,P&&(typeof P.write=="function"&&(this._write=P.write),typeof P.writev=="function"&&(this._writev=P.writev),typeof P.destroy=="function"&&(this._destroy=P.destroy),typeof P.final=="function"&&(this._final=P.final)),o.call(this)}j.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))};function y(P,B){var K=new Error("write after end");P.emit("error",K),l.nextTick(B,K)}function x(P,B,K,J){var q=!0,X=!1;return K===null?X=new TypeError("May not write null values to stream"):typeof K!="string"&&K!==void 0&&!B.objectMode&&(X=new TypeError("Invalid non-string/buffer chunk")),X&&(P.emit("error",X),l.nextTick(J,X),q=!1),q}j.prototype.write=function(P,B,K){var J=this._writableState,q=!1,X=!J.objectMode&&m(P);return X&&!p.isBuffer(P)&&(P=d(P)),typeof B=="function"&&(K=B,B=null),X?B="buffer":B||(B=J.defaultEncoding),typeof K!="function"&&(K=b),J.ended?y(this,K):(X||x(this,J,P,K))&&(J.pendingcb++,q=A(this,J,X,P,B,K)),q},j.prototype.cork=function(){var P=this._writableState;P.corked++},j.prototype.uncork=function(){var P=this._writableState;P.corked&&(P.corked--,!P.writing&&!P.corked&&!P.finished&&!P.bufferProcessing&&P.bufferedRequest&&V(this,P))},j.prototype.setDefaultEncoding=function(B){if(typeof B=="string"&&(B=B.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((B+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+B);return this._writableState.defaultEncoding=B,this};function O(P,B,K){return!P.objectMode&&P.decodeStrings!==!1&&typeof B=="string"&&(B=p.from(B,K)),B}Object.defineProperty(j.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function A(P,B,K,J,q,X){if(!K){var ae=O(B,J,q);J!==ae&&(K=!0,q="buffer",J=ae)}var M=B.objectMode?1:J.length;B.length+=M;var D=B.length0?this.tail.next=i:this.head=i,this.tail=i,++this.length},c.prototype.unshift=function(t){var i={data:t,next:this.head};this.length===0&&(this.tail=i),this.head=i,++this.length},c.prototype.shift=function(){if(this.length!==0){var t=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,t}},c.prototype.clear=function(){this.head=this.tail=null,this.length=0},c.prototype.join=function(t){if(this.length===0)return"";for(var i=this.head,n=""+i.data;i=i.next;)n+=t+i.data;return n},c.prototype.concat=function(t){if(this.length===0)return r.alloc(0);if(this.length===1)return this.head.data;for(var i=r.allocUnsafe(t>>>0),n=this.head,o=0;n;)l(n.data,i,o),o+=n.data.length,n=n.next;return i},c}(),u&&u.inspect&&u.inspect.custom&&(w.exports.prototype[u.inspect.custom]=function(){var c=u.inspect({length:this.length});return this.constructor.name+" "+c})},{"safe-buffer":343,util:84}],336:[function(e,w,g){var a=e("process-nextick-args");function r(c,s){var t=this,i=this._readableState&&this._readableState.destroyed,n=this._writableState&&this._writableState.destroyed;return i||n?(s?s(c):c&&(!this._writableState||!this._writableState.errorEmitted)&&a.nextTick(l,this,c),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(c||null,function(o){!s&&o?(a.nextTick(l,t,o),t._writableState&&(t._writableState.errorEmitted=!0)):s&&s(o)}),this)}function u(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function l(c,s){c.emit("error",s)}w.exports={destroy:r,undestroy:u}},{"process-nextick-args":323}],337:[function(e,w,g){w.exports=e("events").EventEmitter},{events:301}],338:[function(e,w,g){w.exports=e("./readable").PassThrough},{"./readable":339}],339:[function(e,w,g){g=w.exports=e("./lib/_stream_readable.js"),g.Stream=g,g.Readable=g,g.Writable=e("./lib/_stream_writable.js"),g.Duplex=e("./lib/_stream_duplex.js"),g.Transform=e("./lib/_stream_transform.js"),g.PassThrough=e("./lib/_stream_passthrough.js")},{"./lib/_stream_duplex.js":330,"./lib/_stream_passthrough.js":331,"./lib/_stream_readable.js":332,"./lib/_stream_transform.js":333,"./lib/_stream_writable.js":334}],340:[function(e,w,g){w.exports=e("./readable").Transform},{"./readable":339}],341:[function(e,w,g){w.exports=e("./lib/_stream_writable.js")},{"./lib/_stream_writable.js":334}],342:[function(e,w,g){var a=function(r){var u=Object.prototype,l=u.hasOwnProperty,c,s=typeof Symbol=="function"?Symbol:{},t=s.iterator||"@@iterator",i=s.asyncIterator||"@@asyncIterator",n=s.toStringTag||"@@toStringTag";function o(z,G,U){return Object.defineProperty(z,G,{value:U,enumerable:!0,configurable:!0,writable:!0}),z[G]}try{o({},"")}catch{o=function(G,U,P){return G[U]=P}}function p(z,G,U,P){var B=G&&G.prototype instanceof v?G:v,K=Object.create(B.prototype),J=new L(P||[]);return K._invoke=k(z,U,J),K}r.wrap=p;function f(z,G,U){try{return{type:"normal",arg:z.call(G,U)}}catch(P){return{type:"throw",arg:P}}}var d="suspendedStart",m="suspendedYield",h="executing",b="completed",S={};function v(){}function j(){}function y(){}var x={};o(x,t,function(){return this});var O=Object.getPrototypeOf,A=O&&O(O(Y([])));A&&A!==u&&l.call(A,t)&&(x=A);var E=y.prototype=v.prototype=Object.create(x);j.prototype=y,o(E,"constructor",y),o(y,"constructor",j),j.displayName=o(y,n,"GeneratorFunction");function _(z){["next","throw","return"].forEach(function(G){o(z,G,function(U){return this._invoke(G,U)})})}r.isGeneratorFunction=function(z){var G=typeof z=="function"&&z.constructor;return G?G===j||(G.displayName||G.name)==="GeneratorFunction":!1},r.mark=function(z){return Object.setPrototypeOf?Object.setPrototypeOf(z,y):(z.__proto__=y,o(z,n,"GeneratorFunction")),z.prototype=Object.create(E),z},r.awrap=function(z){return{__await:z}};function T(z,G){function U(K,J,q,X){var ae=f(z[K],z,J);if(ae.type==="throw")X(ae.arg);else{var M=ae.arg,D=M.value;return D&&typeof D=="object"&&l.call(D,"__await")?G.resolve(D.__await).then(function(N){U("next",N,q,X)},function(N){U("throw",N,q,X)}):G.resolve(D).then(function(N){M.value=N,q(M)},function(N){return U("throw",N,q,X)})}}var P;function B(K,J){function q(){return new G(function(X,ae){U(K,J,X,ae)})}return P=P?P.then(q,q):q()}this._invoke=B}_(T.prototype),o(T.prototype,i,function(){return this}),r.AsyncIterator=T,r.async=function(z,G,U,P,B){B===void 0&&(B=Promise);var K=new T(p(z,G,U,P),B);return r.isGeneratorFunction(G)?K:K.next().then(function(J){return J.done?J.value:K.next()})};function k(z,G,U){var P=d;return function(K,J){if(P===h)throw new Error("Generator is already running");if(P===b){if(K==="throw")throw J;return re()}for(U.method=K,U.arg=J;;){var q=U.delegate;if(q){var X=F(q,U);if(X){if(X===S)continue;return X}}if(U.method==="next")U.sent=U._sent=U.arg;else if(U.method==="throw"){if(P===d)throw P=b,U.arg;U.dispatchException(U.arg)}else U.method==="return"&&U.abrupt("return",U.arg);P=h;var ae=f(z,G,U);if(ae.type==="normal"){if(P=U.done?b:m,ae.arg===S)continue;return{value:ae.arg,done:U.done}}else ae.type==="throw"&&(P=b,U.method="throw",U.arg=ae.arg)}}}function F(z,G){var U=z.iterator[G.method];if(U===c){if(G.delegate=null,G.method==="throw"){if(z.iterator.return&&(G.method="return",G.arg=c,F(z,G),G.method==="throw"))return S;G.method="throw",G.arg=new TypeError("The iterator does not provide a 'throw' method")}return S}var P=f(U,z.iterator,G.arg);if(P.type==="throw")return G.method="throw",G.arg=P.arg,G.delegate=null,S;var B=P.arg;if(!B)return G.method="throw",G.arg=new TypeError("iterator result is not an object"),G.delegate=null,S;if(B.done)G[z.resultName]=B.value,G.next=z.nextLoc,G.method!=="return"&&(G.method="next",G.arg=c);else return B;return G.delegate=null,S}_(E),o(E,n,"Generator"),o(E,t,function(){return this}),o(E,"toString",function(){return"[object Generator]"});function W(z){var G={tryLoc:z[0]};1 in z&&(G.catchLoc=z[1]),2 in z&&(G.finallyLoc=z[2],G.afterLoc=z[3]),this.tryEntries.push(G)}function V(z){var G=z.completion||{};G.type="normal",delete G.arg,z.completion=G}function L(z){this.tryEntries=[{tryLoc:"root"}],z.forEach(W,this),this.reset(!0)}r.keys=function(z){var G=[];for(var U in z)G.push(U);return G.reverse(),function P(){for(;G.length;){var B=G.pop();if(B in z)return P.value=B,P.done=!1,P}return P.done=!0,P}};function Y(z){if(z){var G=z[t];if(G)return G.call(z);if(typeof z.next=="function")return z;if(!isNaN(z.length)){var U=-1,P=function B(){for(;++U=0;--P){var B=this.tryEntries[P],K=B.completion;if(B.tryLoc==="root")return U("end");if(B.tryLoc<=this.prev){var J=l.call(B,"catchLoc"),q=l.call(B,"finallyLoc");if(J&&q){if(this.prev=0;--U){var P=this.tryEntries[U];if(P.tryLoc<=this.prev&&l.call(P,"finallyLoc")&&this.prev=0;--G){var U=this.tryEntries[G];if(U.finallyLoc===z)return this.complete(U.completion,U.afterLoc),V(U),S}},catch:function(z){for(var G=this.tryEntries.length-1;G>=0;--G){var U=this.tryEntries[G];if(U.tryLoc===z){var P=U.completion;if(P.type==="throw"){var B=P.arg;V(U)}return B}}throw new Error("illegal catch attempt")},delegateYield:function(z,G,U){return this.delegate={iterator:Y(z),resultName:G,nextLoc:U},this.method==="next"&&(this.arg=c),S}},r}(typeof w=="object"?w.exports:{});try{regeneratorRuntime=a}catch{typeof globalThis=="object"?globalThis.regeneratorRuntime=a:Function("r","regeneratorRuntime = r")(a)}},{}],343:[function(e,w,g){var a=e("buffer"),r=a.Buffer;function u(c,s){for(var t in c)s[t]=c[t]}r.from&&r.alloc&&r.allocUnsafe&&r.allocUnsafeSlow?w.exports=a:(u(a,g),g.Buffer=l);function l(c,s,t){return r(c,s,t)}u(r,l),l.from=function(c,s,t){if(typeof c=="number")throw new TypeError("Argument must not be a number");return r(c,s,t)},l.alloc=function(c,s,t){if(typeof c!="number")throw new TypeError("Argument must be a number");var i=r(c);return s!==void 0?typeof t=="string"?i.fill(s,t):i.fill(s):i.fill(0),i},l.allocUnsafe=function(c){if(typeof c!="number")throw new TypeError("Argument must be a number");return r(c)},l.allocUnsafeSlow=function(c){if(typeof c!="number")throw new TypeError("Argument must be a number");return a.SlowBuffer(c)}},{buffer:85}],344:[function(e,w,g){(function(a){(function(){(function(r){r.parser=function(M,D){return new l(M,D)},r.SAXParser=l,r.SAXStream=p,r.createStream=o,r.MAX_BUFFER_LENGTH=64*1024;var u=["comment","sgmlDecl","textNode","tagName","doctype","procInstName","procInstBody","entity","attribName","attribValue","cdata","script"];r.EVENTS=["text","processinginstruction","sgmldeclaration","doctype","comment","opentagstart","attribute","opentag","closetag","opencdata","cdata","closecdata","error","end","ready","script","opennamespace","closenamespace"];function l(M,D){if(!(this instanceof l))return new l(M,D);var N=this;s(N),N.q=N.c="",N.bufferCheckPosition=r.MAX_BUFFER_LENGTH,N.opt=D||{},N.opt.lowercase=N.opt.lowercase||N.opt.lowercasetags,N.looseCase=N.opt.lowercase?"toLowerCase":"toUpperCase",N.tags=[],N.closed=N.closedRoot=N.sawRoot=!1,N.tag=N.error=null,N.strict=!!M,N.noscript=!!(M||N.opt.noscript),N.state=T.BEGIN,N.strictEntities=N.opt.strictEntities,N.ENTITIES=N.strictEntities?Object.create(r.XML_ENTITIES):Object.create(r.ENTITIES),N.attribList=[],N.opt.xmlns&&(N.ns=Object.create(b)),N.trackPosition=N.opt.position!==!1,N.trackPosition&&(N.position=N.line=N.column=0),F(N,"onready")}Object.create||(Object.create=function(M){function D(){}D.prototype=M;var N=new D;return N}),Object.keys||(Object.keys=function(M){var D=[];for(var N in M)M.hasOwnProperty(N)&&D.push(N);return D});function c(M){for(var D=Math.max(r.MAX_BUFFER_LENGTH,10),N=0,I=0,te=u.length;ID)switch(u[I]){case"textNode":V(M);break;case"cdata":W(M,"oncdata",M.cdata),M.cdata="";break;case"script":W(M,"onscript",M.script),M.script="";break;default:Y(M,"Max buffer length exceeded: "+u[I])}N=Math.max(N,Q)}var Z=r.MAX_BUFFER_LENGTH-N;M.bufferCheckPosition=Z+M.position}function s(M){for(var D=0,N=u.length;D"||x(M)}function E(M,D){return M.test(D)}function _(M,D){return!E(M,D)}var T=0;r.STATE={BEGIN:T++,BEGIN_WHITESPACE:T++,TEXT:T++,TEXT_ENTITY:T++,OPEN_WAKA:T++,SGML_DECL:T++,SGML_DECL_QUOTED:T++,DOCTYPE:T++,DOCTYPE_QUOTED:T++,DOCTYPE_DTD:T++,DOCTYPE_DTD_QUOTED:T++,COMMENT_STARTING:T++,COMMENT:T++,COMMENT_ENDING:T++,COMMENT_ENDED:T++,CDATA:T++,CDATA_ENDING:T++,CDATA_ENDING_2:T++,PROC_INST:T++,PROC_INST_BODY:T++,PROC_INST_ENDING:T++,OPEN_TAG:T++,OPEN_TAG_SLASH:T++,ATTRIB:T++,ATTRIB_NAME:T++,ATTRIB_NAME_SAW_WHITE:T++,ATTRIB_VALUE:T++,ATTRIB_VALUE_QUOTED:T++,ATTRIB_VALUE_CLOSED:T++,ATTRIB_VALUE_UNQUOTED:T++,ATTRIB_VALUE_ENTITY_Q:T++,ATTRIB_VALUE_ENTITY_U:T++,CLOSE_TAG:T++,CLOSE_TAG_SAW_WHITE:T++,SCRIPT:T++,SCRIPT_ENDING:T++},r.XML_ENTITIES={amp:"&",gt:">",lt:"<",quot:'"',apos:"'"},r.ENTITIES={amp:"&",gt:">",lt:"<",quot:'"',apos:"'",AElig:198,Aacute:193,Acirc:194,Agrave:192,Aring:197,Atilde:195,Auml:196,Ccedil:199,ETH:208,Eacute:201,Ecirc:202,Egrave:200,Euml:203,Iacute:205,Icirc:206,Igrave:204,Iuml:207,Ntilde:209,Oacute:211,Ocirc:212,Ograve:210,Oslash:216,Otilde:213,Ouml:214,THORN:222,Uacute:218,Ucirc:219,Ugrave:217,Uuml:220,Yacute:221,aacute:225,acirc:226,aelig:230,agrave:224,aring:229,atilde:227,auml:228,ccedil:231,eacute:233,ecirc:234,egrave:232,eth:240,euml:235,iacute:237,icirc:238,igrave:236,iuml:239,ntilde:241,oacute:243,ocirc:244,ograve:242,oslash:248,otilde:245,ouml:246,szlig:223,thorn:254,uacute:250,ucirc:251,ugrave:249,uuml:252,yacute:253,yuml:255,copy:169,reg:174,nbsp:160,iexcl:161,cent:162,pound:163,curren:164,yen:165,brvbar:166,sect:167,uml:168,ordf:170,laquo:171,not:172,shy:173,macr:175,deg:176,plusmn:177,sup1:185,sup2:178,sup3:179,acute:180,micro:181,para:182,middot:183,cedil:184,ordm:186,raquo:187,frac14:188,frac12:189,frac34:190,iquest:191,times:215,divide:247,OElig:338,oelig:339,Scaron:352,scaron:353,Yuml:376,fnof:402,circ:710,tilde:732,Alpha:913,Beta:914,Gamma:915,Delta:916,Epsilon:917,Zeta:918,Eta:919,Theta:920,Iota:921,Kappa:922,Lambda:923,Mu:924,Nu:925,Xi:926,Omicron:927,Pi:928,Rho:929,Sigma:931,Tau:932,Upsilon:933,Phi:934,Chi:935,Psi:936,Omega:937,alpha:945,beta:946,gamma:947,delta:948,epsilon:949,zeta:950,eta:951,theta:952,iota:953,kappa:954,lambda:955,mu:956,nu:957,xi:958,omicron:959,pi:960,rho:961,sigmaf:962,sigma:963,tau:964,upsilon:965,phi:966,chi:967,psi:968,omega:969,thetasym:977,upsih:978,piv:982,ensp:8194,emsp:8195,thinsp:8201,zwnj:8204,zwj:8205,lrm:8206,rlm:8207,ndash:8211,mdash:8212,lsquo:8216,rsquo:8217,sbquo:8218,ldquo:8220,rdquo:8221,bdquo:8222,dagger:8224,Dagger:8225,bull:8226,hellip:8230,permil:8240,prime:8242,Prime:8243,lsaquo:8249,rsaquo:8250,oline:8254,frasl:8260,euro:8364,image:8465,weierp:8472,real:8476,trade:8482,alefsym:8501,larr:8592,uarr:8593,rarr:8594,darr:8595,harr:8596,crarr:8629,lArr:8656,uArr:8657,rArr:8658,dArr:8659,hArr:8660,forall:8704,part:8706,exist:8707,empty:8709,nabla:8711,isin:8712,notin:8713,ni:8715,prod:8719,sum:8721,minus:8722,lowast:8727,radic:8730,prop:8733,infin:8734,ang:8736,and:8743,or:8744,cap:8745,cup:8746,int:8747,there4:8756,sim:8764,cong:8773,asymp:8776,ne:8800,equiv:8801,le:8804,ge:8805,sub:8834,sup:8835,nsub:8836,sube:8838,supe:8839,oplus:8853,otimes:8855,perp:8869,sdot:8901,lceil:8968,rceil:8969,lfloor:8970,rfloor:8971,lang:9001,rang:9002,loz:9674,spades:9824,clubs:9827,hearts:9829,diams:9830},Object.keys(r.ENTITIES).forEach(function(M){var D=r.ENTITIES[M],N=typeof D=="number"?String.fromCharCode(D):D;r.ENTITIES[M]=N});for(var k in r.STATE)r.STATE[r.STATE[k]]=k;T=r.STATE;function F(M,D,N){M[D]&&M[D](N)}function W(M,D,N){M.textNode&&V(M),F(M,D,N)}function V(M){M.textNode=L(M.opt,M.textNode),M.textNode&&F(M,"ontext",M.textNode),M.textNode=""}function L(M,D){return M.trim&&(D=D.trim()),M.normalize&&(D=D.replace(/\s+/g," ")),D}function Y(M,D){return V(M),M.trackPosition&&(D+=` +Line: `+M.line+` +Column: `+M.column+` +Char: `+M.c),D=new Error(D),M.error=D,F(M,"onerror",D),M}function re(M){return M.sawRoot&&!M.closedRoot&&z(M,"Unclosed root tag"),M.state!==T.BEGIN&&M.state!==T.BEGIN_WHITESPACE&&M.state!==T.TEXT&&Y(M,"Unexpected end"),V(M),M.c="",M.closed=!0,F(M,"onend"),l.call(M,M.strict,M.opt),M}function z(M,D){if(typeof M!="object"||!(M instanceof l))throw new Error("bad call to strictFail");M.strict&&Y(M,D)}function G(M){M.strict||(M.tagName=M.tagName[M.looseCase]());var D=M.tags[M.tags.length-1]||M,N=M.tag={name:M.tagName,attributes:{}};M.opt.xmlns&&(N.ns=D.ns),M.attribList.length=0,W(M,"onopentagstart",N)}function U(M,D){var N=M.indexOf(":"),I=N<0?["",M]:M.split(":"),te=I[0],Q=I[1];return D&&M==="xmlns"&&(te="xmlns",Q=""),{prefix:te,local:Q}}function P(M){if(M.strict||(M.attribName=M.attribName[M.looseCase]()),M.attribList.indexOf(M.attribName)!==-1||M.tag.attributes.hasOwnProperty(M.attribName)){M.attribName=M.attribValue="";return}if(M.opt.xmlns){var D=U(M.attribName,!0),N=D.prefix,I=D.local;if(N==="xmlns")if(I==="xml"&&M.attribValue!==m)z(M,"xml: prefix must be bound to "+m+` +Actual: `+M.attribValue);else if(I==="xmlns"&&M.attribValue!==h)z(M,"xmlns: prefix must be bound to "+h+` +Actual: `+M.attribValue);else{var te=M.tag,Q=M.tags[M.tags.length-1]||M;te.ns===Q.ns&&(te.ns=Object.create(Q.ns)),te.ns[I]=M.attribValue}M.attribList.push([M.attribName,M.attribValue])}else M.tag.attributes[M.attribName]=M.attribValue,W(M,"onattribute",{name:M.attribName,value:M.attribValue});M.attribName=M.attribValue=""}function B(M,D){if(M.opt.xmlns){var N=M.tag,I=U(M.tagName);N.prefix=I.prefix,N.local=I.local,N.uri=N.ns[I.prefix]||"",N.prefix&&!N.uri&&(z(M,"Unbound namespace prefix: "+JSON.stringify(M.tagName)),N.uri=I.prefix);var te=M.tags[M.tags.length-1]||M;N.ns&&te.ns!==N.ns&&Object.keys(N.ns).forEach(function(H){W(M,"onopennamespace",{prefix:H,uri:N.ns[H]})});for(var Q=0,Z=M.attribList.length;Q",M.tagName="",M.state=T.SCRIPT;return}W(M,"onscript",M.script),M.script=""}var D=M.tags.length,N=M.tagName;M.strict||(N=N[M.looseCase]());for(var I=N;D--;){var te=M.tags[D];if(te.name!==I)z(M,"Unexpected close tag");else break}if(D<0){z(M,"Unmatched closing tag: "+M.tagName),M.textNode+="",M.state=T.TEXT;return}M.tagName=N;for(var Q=M.tags.length;Q-- >D;){var Z=M.tag=M.tags.pop();M.tagName=M.tag.name,W(M,"onclosetag",M.tagName);var ie={};for(var ce in Z.ns)ie[ce]=Z.ns[ce];var oe=M.tags[M.tags.length-1]||M;M.opt.xmlns&&Z.ns!==oe.ns&&Object.keys(Z.ns).forEach(function(me){var ge=Z.ns[me];W(M,"onclosenamespace",{prefix:me,uri:ge})})}D===0&&(M.closedRoot=!0),M.tagName=M.attribValue=M.attribName="",M.attribList.length=0,M.state=T.TEXT}function J(M){var D=M.entity,N=D.toLowerCase(),I,te="";return M.ENTITIES[D]?M.ENTITIES[D]:M.ENTITIES[N]?M.ENTITIES[N]:(D=N,D.charAt(0)==="#"&&(D.charAt(1)==="x"?(D=D.slice(2),I=parseInt(D,16),te=I.toString(16)):(D=D.slice(1),I=parseInt(D,10),te=I.toString(10))),D=D.replace(/^0+/,""),isNaN(I)||te.toLowerCase()!==D?(z(M,"Invalid character entity"),"&"+M.entity+";"):String.fromCodePoint(I))}function q(M,D){D==="<"?(M.state=T.OPEN_WAKA,M.startTagPosition=M.position):x(D)||(z(M,"Non-whitespace before first tag."),M.textNode=D,M.state=T.TEXT)}function X(M,D){var N="";return D"?(W(D,"onsgmldeclaration",D.sgmlDecl),D.sgmlDecl="",D.state=T.TEXT):(O(I)&&(D.state=T.SGML_DECL_QUOTED),D.sgmlDecl+=I);continue;case T.SGML_DECL_QUOTED:I===D.q&&(D.state=T.SGML_DECL,D.q=""),D.sgmlDecl+=I;continue;case T.DOCTYPE:I===">"?(D.state=T.TEXT,W(D,"ondoctype",D.doctype),D.doctype=!0):(D.doctype+=I,I==="["?D.state=T.DOCTYPE_DTD:O(I)&&(D.state=T.DOCTYPE_QUOTED,D.q=I));continue;case T.DOCTYPE_QUOTED:D.doctype+=I,I===D.q&&(D.q="",D.state=T.DOCTYPE);continue;case T.DOCTYPE_DTD:D.doctype+=I,I==="]"?D.state=T.DOCTYPE:O(I)&&(D.state=T.DOCTYPE_DTD_QUOTED,D.q=I);continue;case T.DOCTYPE_DTD_QUOTED:D.doctype+=I,I===D.q&&(D.state=T.DOCTYPE_DTD,D.q="");continue;case T.COMMENT:I==="-"?D.state=T.COMMENT_ENDING:D.comment+=I;continue;case T.COMMENT_ENDING:I==="-"?(D.state=T.COMMENT_ENDED,D.comment=L(D.opt,D.comment),D.comment&&W(D,"oncomment",D.comment),D.comment=""):(D.comment+="-"+I,D.state=T.COMMENT);continue;case T.COMMENT_ENDED:I!==">"?(z(D,"Malformed comment"),D.comment+="--"+I,D.state=T.COMMENT):D.state=T.TEXT;continue;case T.CDATA:I==="]"?D.state=T.CDATA_ENDING:D.cdata+=I;continue;case T.CDATA_ENDING:I==="]"?D.state=T.CDATA_ENDING_2:(D.cdata+="]"+I,D.state=T.CDATA);continue;case T.CDATA_ENDING_2:I===">"?(D.cdata&&W(D,"oncdata",D.cdata),W(D,"onclosecdata"),D.cdata="",D.state=T.TEXT):I==="]"?D.cdata+="]":(D.cdata+="]]"+I,D.state=T.CDATA);continue;case T.PROC_INST:I==="?"?D.state=T.PROC_INST_ENDING:x(I)?D.state=T.PROC_INST_BODY:D.procInstName+=I;continue;case T.PROC_INST_BODY:if(!D.procInstBody&&x(I))continue;I==="?"?D.state=T.PROC_INST_ENDING:D.procInstBody+=I;continue;case T.PROC_INST_ENDING:I===">"?(W(D,"onprocessinginstruction",{name:D.procInstName,body:D.procInstBody}),D.procInstName=D.procInstBody="",D.state=T.TEXT):(D.procInstBody+="?"+I,D.state=T.PROC_INST_BODY);continue;case T.OPEN_TAG:E(v,I)?D.tagName+=I:(G(D),I===">"?B(D):I==="/"?D.state=T.OPEN_TAG_SLASH:(x(I)||z(D,"Invalid character in tag name"),D.state=T.ATTRIB));continue;case T.OPEN_TAG_SLASH:I===">"?(B(D,!0),K(D)):(z(D,"Forward-slash in opening tag not followed by >"),D.state=T.ATTRIB);continue;case T.ATTRIB:if(x(I))continue;I===">"?B(D):I==="/"?D.state=T.OPEN_TAG_SLASH:E(S,I)?(D.attribName=I,D.attribValue="",D.state=T.ATTRIB_NAME):z(D,"Invalid attribute name");continue;case T.ATTRIB_NAME:I==="="?D.state=T.ATTRIB_VALUE:I===">"?(z(D,"Attribute without value"),D.attribValue=D.attribName,P(D),B(D)):x(I)?D.state=T.ATTRIB_NAME_SAW_WHITE:E(v,I)?D.attribName+=I:z(D,"Invalid attribute name");continue;case T.ATTRIB_NAME_SAW_WHITE:if(I==="=")D.state=T.ATTRIB_VALUE;else{if(x(I))continue;z(D,"Attribute without value"),D.tag.attributes[D.attribName]="",D.attribValue="",W(D,"onattribute",{name:D.attribName,value:""}),D.attribName="",I===">"?B(D):E(S,I)?(D.attribName=I,D.state=T.ATTRIB_NAME):(z(D,"Invalid attribute name"),D.state=T.ATTRIB)}continue;case T.ATTRIB_VALUE:if(x(I))continue;O(I)?(D.q=I,D.state=T.ATTRIB_VALUE_QUOTED):(z(D,"Unquoted attribute value"),D.state=T.ATTRIB_VALUE_UNQUOTED,D.attribValue=I);continue;case T.ATTRIB_VALUE_QUOTED:if(I!==D.q){I==="&"?D.state=T.ATTRIB_VALUE_ENTITY_Q:D.attribValue+=I;continue}P(D),D.q="",D.state=T.ATTRIB_VALUE_CLOSED;continue;case T.ATTRIB_VALUE_CLOSED:x(I)?D.state=T.ATTRIB:I===">"?B(D):I==="/"?D.state=T.OPEN_TAG_SLASH:E(S,I)?(z(D,"No whitespace between attributes"),D.attribName=I,D.attribValue="",D.state=T.ATTRIB_NAME):z(D,"Invalid attribute name");continue;case T.ATTRIB_VALUE_UNQUOTED:if(!A(I)){I==="&"?D.state=T.ATTRIB_VALUE_ENTITY_U:D.attribValue+=I;continue}P(D),I===">"?B(D):D.state=T.ATTRIB;continue;case T.CLOSE_TAG:if(D.tagName)I===">"?K(D):E(v,I)?D.tagName+=I:D.script?(D.script+=""?K(D):z(D,"Invalid characters in closing tag");continue;case T.TEXT_ENTITY:case T.ATTRIB_VALUE_ENTITY_Q:case T.ATTRIB_VALUE_ENTITY_U:var Z,ie;switch(D.state){case T.TEXT_ENTITY:Z=T.TEXT,ie="textNode";break;case T.ATTRIB_VALUE_ENTITY_Q:Z=T.ATTRIB_VALUE_QUOTED,ie="attribValue";break;case T.ATTRIB_VALUE_ENTITY_U:Z=T.ATTRIB_VALUE_UNQUOTED,ie="attribValue";break}I===";"?(D[ie]+=J(D),D.entity="",D.state=Z):E(D.entity.length?y:j,I)?D.entity+=I:(z(D,"Invalid character in entity name"),D[ie]+="&"+D.entity+I,D.entity="",D.state=Z);continue;default:throw new Error(D,"Unknown state: "+D.state)}return D.position>=D.bufferCheckPosition&&c(D),D}/*! http://mths.be/fromcodepoint v0.1.0 by @mathias */String.fromCodePoint||function(){var M=String.fromCharCode,D=Math.floor,N=function(){var I=16384,te=[],Q,Z,ie=-1,ce=arguments.length;if(!ce)return"";for(var oe="";++ie1114111||D(me)!==me)throw RangeError("Invalid code point: "+me);me<=65535?te.push(me):(me-=65536,Q=(me>>10)+55296,Z=me%1024+56320,te.push(Q,Z)),(ie+1===ce||te.length>I)&&(oe+=M.apply(null,te),te.length=0)}return oe};Object.defineProperty?Object.defineProperty(String,"fromCodePoint",{value:N,configurable:!0,writable:!0}):String.fromCodePoint=N}()})(typeof g=="undefined"?this.sax={}:g)}).call(this)}).call(this,e("buffer").Buffer)},{buffer:85,stream:345,string_decoder:86}],345:[function(e,w,g){w.exports=u;var a=e("events").EventEmitter,r=e("inherits");r(u,a),u.Readable=e("readable-stream/readable.js"),u.Writable=e("readable-stream/writable.js"),u.Duplex=e("readable-stream/duplex.js"),u.Transform=e("readable-stream/transform.js"),u.PassThrough=e("readable-stream/passthrough.js"),u.Stream=u;function u(){a.call(this)}u.prototype.pipe=function(l,c){var s=this;function t(m){l.writable&&l.write(m)===!1&&s.pause&&s.pause()}s.on("data",t);function i(){s.readable&&s.resume&&s.resume()}l.on("drain",i),!l._isStdio&&(!c||c.end!==!1)&&(s.on("end",o),s.on("close",p));var n=!1;function o(){n||(n=!0,l.end())}function p(){n||(n=!0,typeof l.destroy=="function"&&l.destroy())}function f(m){if(d(),a.listenerCount(this,"error")===0)throw m}s.on("error",f),l.on("error",f);function d(){s.removeListener("data",t),l.removeListener("drain",i),s.removeListener("end",o),s.removeListener("close",p),s.removeListener("error",f),l.removeListener("error",f),s.removeListener("end",d),s.removeListener("close",d),l.removeListener("close",d)}return s.on("end",d),s.on("close",d),l.on("close",d),l.emit("pipe",s),l}},{events:301,inherits:311,"readable-stream/duplex.js":329,"readable-stream/passthrough.js":338,"readable-stream/readable.js":339,"readable-stream/transform.js":340,"readable-stream/writable.js":341}],346:[function(e,w,g){var a=e("safe-buffer").Buffer,r=a.isEncoding||function(v){switch(v=""+v,v&&v.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function u(v){if(!v)return"utf8";for(var j;;)switch(v){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return v;default:if(j)return;v=(""+v).toLowerCase(),j=!0}}function l(v){var j=u(v);if(typeof j!="string"&&(a.isEncoding===r||!r(v)))throw new Error("Unknown encoding: "+v);return j||v}g.StringDecoder=c;function c(v){this.encoding=l(v);var j;switch(this.encoding){case"utf16le":this.text=f,this.end=d,j=4;break;case"utf8":this.fillLast=n,j=4;break;case"base64":this.text=m,this.end=h,j=3;break;default:this.write=b,this.end=S;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=a.allocUnsafe(j)}c.prototype.write=function(v){if(v.length===0)return"";var j,y;if(this.lastNeed){if(j=this.fillLast(v),j===void 0)return"";y=this.lastNeed,this.lastNeed=0}else y=0;return y>5===6?2:v>>4===14?3:v>>3===30?4:v>>6===2?-1:-2}function t(v,j,y){var x=j.length-1;if(x=0?(O>0&&(v.lastNeed=O-1),O):--x=0?(O>0&&(v.lastNeed=O-2),O):--x=0?(O>0&&(O===2?O=0:v.lastNeed=O-3),O):0))}function i(v,j,y){if((j[0]&192)!==128)return v.lastNeed=0,"\uFFFD";if(v.lastNeed>1&&j.length>1){if((j[1]&192)!==128)return v.lastNeed=1,"\uFFFD";if(v.lastNeed>2&&j.length>2&&(j[2]&192)!==128)return v.lastNeed=2,"\uFFFD"}}function n(v){var j=this.lastTotal-this.lastNeed,y=i(this,v);if(y!==void 0)return y;if(this.lastNeed<=v.length)return v.copy(this.lastChar,j,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);v.copy(this.lastChar,j,0,v.length),this.lastNeed-=v.length}function o(v,j){var y=t(this,v,j);if(!this.lastNeed)return v.toString("utf8",j);this.lastTotal=y;var x=v.length-(y-this.lastNeed);return v.copy(this.lastChar,0,x),v.toString("utf8",j,x)}function p(v){var j=v&&v.length?this.write(v):"";return this.lastNeed?j+"\uFFFD":j}function f(v,j){if((v.length-j)%2===0){var y=v.toString("utf16le",j);if(y){var x=y.charCodeAt(y.length-1);if(x>=55296&&x<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=v[v.length-2],this.lastChar[1]=v[v.length-1],y.slice(0,-1)}return y}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=v[v.length-1],v.toString("utf16le",j,v.length-1)}function d(v){var j=v&&v.length?this.write(v):"";if(this.lastNeed){var y=this.lastTotal-this.lastNeed;return j+this.lastChar.toString("utf16le",0,y)}return j}function m(v,j){var y=(v.length-j)%3;return y===0?v.toString("base64",j):(this.lastNeed=3-y,this.lastTotal=3,y===1?this.lastChar[0]=v[v.length-1]:(this.lastChar[0]=v[v.length-2],this.lastChar[1]=v[v.length-1]),v.toString("base64",j,v.length-y))}function h(v){var j=v&&v.length?this.write(v):"";return this.lastNeed?j+this.lastChar.toString("base64",0,3-this.lastNeed):j}function b(v){return v.toString(this.encoding)}function S(v){return v&&v.length?this.write(v):""}},{"safe-buffer":343}],347:[function(e,w,g){(function(a,r){(function(){var u=e("process/browser.js").nextTick,l=Function.prototype.apply,c=Array.prototype.slice,s={},t=0;g.setTimeout=function(){return new i(l.call(setTimeout,window,arguments),clearTimeout)},g.setInterval=function(){return new i(l.call(setInterval,window,arguments),clearInterval)},g.clearTimeout=g.clearInterval=function(n){n.close()};function i(n,o){this._id=n,this._clearFn=o}i.prototype.unref=i.prototype.ref=function(){},i.prototype.close=function(){this._clearFn.call(window,this._id)},g.enroll=function(n,o){clearTimeout(n._idleTimeoutId),n._idleTimeout=o},g.unenroll=function(n){clearTimeout(n._idleTimeoutId),n._idleTimeout=-1},g._unrefActive=g.active=function(n){clearTimeout(n._idleTimeoutId);var o=n._idleTimeout;o>=0&&(n._idleTimeoutId=setTimeout(function(){n._onTimeout&&n._onTimeout()},o))},g.setImmediate=typeof a=="function"?a:function(n){var o=t++,p=arguments.length<2?!1:c.call(arguments,1);return s[o]=!0,u(function(){s[o]&&(p?n.apply(null,p):n.call(null),g.clearImmediate(o))}),o},g.clearImmediate=typeof r=="function"?r:function(n){delete s[n]}}).call(this)}).call(this,e("timers").setImmediate,e("timers").clearImmediate)},{"process/browser.js":324,timers:347}],348:[function(e,w,g){var a=e("buffer").Buffer;w.exports=function(r){if(r instanceof Uint8Array){if(r.byteOffset===0&&r.byteLength===r.buffer.byteLength)return r.buffer;if(typeof r.buffer.slice=="function")return r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength)}if(a.isBuffer(r)){for(var u=new Uint8Array(r.length),l=r.length,c=0;c=0||t.indexOf(">")>=0||t.indexOf("<")>=0)},c=function(t){return""},u=function(t){return t.replace("]]>","]]]]>")},g.Builder=function(){function t(i){var n,o,p;this.options={},o=r["0.2"];for(n in o)!s.call(o,n)||(p=o[n],this.options[n]=p);for(n in i)!s.call(i,n)||(p=i[n],this.options[n]=p)}return t.prototype.buildObject=function(i){var n,o,p,f,d;return n=this.options.attrkey,o=this.options.charkey,Object.keys(i).length===1&&this.options.rootName===r["0.2"].rootName?(d=Object.keys(i)[0],i=i[d]):d=this.options.rootName,p=function(m){return function(h,b){var S,v,j,y,x,O;if(typeof b!="object")m.options.cdata&&l(b)?h.raw(c(b)):h.txt(b);else if(Array.isArray(b)){for(y in b)if(!!s.call(b,y)){v=b[y];for(x in v)j=v[x],h=p(h.ele(x),j).up()}}else for(x in b)if(!!s.call(b,x))if(v=b[x],x===n){if(typeof v=="object")for(S in v)O=v[S],h=h.att(S,O)}else if(x===o)m.options.cdata&&l(v)?h=h.raw(c(v)):h=h.txt(v);else if(Array.isArray(v))for(y in v)!s.call(v,y)||(j=v[y],typeof j=="string"?m.options.cdata&&l(j)?h=h.ele(x).raw(c(j)).up():h=h.ele(x,j).up():h=p(h.ele(x),j).up());else typeof v=="object"?h=p(h.ele(x),v).up():typeof v=="string"&&m.options.cdata&&l(v)?h=h.ele(x).raw(c(v)).up():(v==null&&(v=""),h=h.ele(x,v.toString()).up());return h}}(this),f=a.create(d,this.options.xmldec,this.options.doctype,{headless:this.options.headless,allowSurrogateChars:this.options.allowSurrogateChars}),p(f,i).end(this.options.renderOpts)},t}()}).call(this)},{"./defaults":355,xmlbuilder:391}],355:[function(e,w,g){(function(){g.defaults={"0.1":{explicitCharkey:!1,trim:!0,normalize:!0,normalizeTags:!1,attrkey:"@",charkey:"#",explicitArray:!1,ignoreAttrs:!1,mergeAttrs:!1,explicitRoot:!1,validator:null,xmlns:!1,explicitChildren:!1,childkey:"@@",charsAsChildren:!1,includeWhiteChars:!1,async:!1,strict:!0,attrNameProcessors:null,attrValueProcessors:null,tagNameProcessors:null,valueProcessors:null,emptyTag:""},"0.2":{explicitCharkey:!1,trim:!1,normalize:!1,normalizeTags:!1,attrkey:"$",charkey:"_",explicitArray:!0,ignoreAttrs:!1,mergeAttrs:!1,explicitRoot:!0,validator:null,xmlns:!1,explicitChildren:!1,preserveChildrenOrder:!1,childkey:"$$",charsAsChildren:!1,includeWhiteChars:!1,async:!1,strict:!0,attrNameProcessors:null,attrValueProcessors:null,tagNameProcessors:null,valueProcessors:null,rootName:"root",xmldec:{version:"1.0",encoding:"UTF-8",standalone:!0},doctype:null,renderOpts:{pretty:!0,indent:" ",newline:` +`},headless:!1,chunkSize:1e4,emptyTag:"",cdata:!1}}}).call(this)},{}],356:[function(e,w,g){(function(){var a,r,u,l,c,s,t,i,n=function(f,d){return function(){return f.apply(d,arguments)}},o=function(f,d){for(var m in d)p.call(d,m)&&(f[m]=d[m]);function h(){this.constructor=f}return h.prototype=d.prototype,f.prototype=new h,f.__super__=d.prototype,f},p={}.hasOwnProperty;t=e("sax"),u=e("events"),a=e("./bom"),s=e("./processors"),i=e("timers").setImmediate,r=e("./defaults").defaults,l=function(f){return typeof f=="object"&&f!=null&&Object.keys(f).length===0},c=function(f,d,m){var h,b,S;for(h=0,b=f.length;h0&&(O[v.options.childkey]=E),E=O;else if(k){k[v.options.childkey]=k[v.options.childkey]||[],_={};for(x in E)!p.call(E,x)||(_[x]=E[x]);k[v.options.childkey].push(_),delete E["#name"],Object.keys(E).length===1&&h in E&&!v.EXPLICIT_CHARKEY&&(E=E[h])}}return S.length>0?v.assignOrPush(k,A,E):(v.options.explicitRoot&&(T=E,E={},E[A]=T),v.resultObject=E,v.saxParser.ended=!0,v.emit("end",v.resultObject))}}(this),b=function(v){return function(j){var y,x;if(x=S[S.length-1],x)return x[h]+=j,v.options.explicitChildren&&v.options.preserveChildrenOrder&&v.options.charsAsChildren&&(v.options.includeWhiteChars||j.replace(/\\n/g,"").trim()!=="")&&(x[v.options.childkey]=x[v.options.childkey]||[],y={"#name":"__text__"},y[h]=j,v.options.normalize&&(y[h]=y[h].replace(/\s{2,}/g," ").trim()),x[v.options.childkey].push(y)),x}}(this),this.saxParser.ontext=b,this.saxParser.oncdata=function(v){return function(j){var y;if(y=b(j),y)return y.cdata=!0}}()},d.prototype.parseString=function(m,h){var b;h!=null&&typeof h=="function"&&(this.on("end",function(S){return this.reset(),h(null,S)}),this.on("error",function(S){return this.reset(),h(S)}));try{return m=m.toString(),m.trim()===""?(this.emit("end",null),!0):(m=a.stripBOM(m),this.options.async?(this.remaining=m,i(this.processAsync),this.saxParser):this.saxParser.write(m).close())}catch(S){if(b=S,this.saxParser.errThrown||this.saxParser.ended){if(this.saxParser.ended)throw b}else return this.emit("error",b),this.saxParser.errThrown=!0}},d.prototype.parseStringPromise=function(m){return new Promise(function(h){return function(b,S){return h.parseString(m,function(v,j){return v?S(v):b(j)})}}(this))},d}(u),g.parseString=function(f,d,m){var h,b,S;return m!=null?(typeof m=="function"&&(h=m),typeof d=="object"&&(b=d)):(typeof d=="function"&&(h=d),b={}),S=new g.Parser(b),S.parseString(f,h)},g.parseStringPromise=function(f,d){var m,h;return typeof d=="object"&&(m=d),h=new g.Parser(m),h.parseStringPromise(f)}}).call(this)},{"./bom":353,"./defaults":355,"./processors":357,events:301,sax:344,timers:347}],357:[function(e,w,g){(function(){var a;a=new RegExp(/(?!xmlns)^.*:/),g.normalize=function(r){return r.toLowerCase()},g.firstCharLowerCase=function(r){return r.charAt(0).toLowerCase()+r.slice(1)},g.stripPrefix=function(r){return r.replace(a,"")},g.parseNumbers=function(r){return isNaN(r)||(r=r%1===0?parseInt(r,10):parseFloat(r)),r},g.parseBooleans=function(r){return/^(?:true|false)$/i.test(r)&&(r=r.toLowerCase()==="true"),r}}).call(this)},{}],358:[function(e,w,g){(function(){var a,r,u,l,c=function(t,i){for(var n in i)s.call(i,n)&&(t[n]=i[n]);function o(){this.constructor=t}return o.prototype=i.prototype,t.prototype=new o,t.__super__=i.prototype,t},s={}.hasOwnProperty;r=e("./defaults"),a=e("./builder"),u=e("./parser"),l=e("./processors"),g.defaults=r.defaults,g.processors=l,g.ValidationError=function(t){c(i,t);function i(n){this.message=n}return i}(Error),g.Builder=a.Builder,g.Parser=u.Parser,g.parseString=u.parseString,g.parseStringPromise=u.parseStringPromise}).call(this)},{"./builder":354,"./defaults":355,"./parser":356,"./processors":357}],359:[function(e,w,g){(function(){w.exports={Disconnected:1,Preceding:2,Following:4,Contains:8,ContainedBy:16,ImplementationSpecific:32}}).call(this)},{}],360:[function(e,w,g){(function(){w.exports={Element:1,Attribute:2,Text:3,CData:4,EntityReference:5,EntityDeclaration:6,ProcessingInstruction:7,Comment:8,Document:9,DocType:10,DocumentFragment:11,NotationDeclaration:12,Declaration:201,Raw:202,AttributeDeclaration:203,ElementDeclaration:204,Dummy:205}}).call(this)},{}],361:[function(e,w,g){(function(){var a,r,u,l,c,s,t,i=[].slice,n={}.hasOwnProperty;a=function(){var o,p,f,d,m,h;if(h=arguments[0],m=2<=arguments.length?i.call(arguments,1):[],c(Object.assign))Object.assign.apply(null,arguments);else for(o=0,f=m.length;o":"attribute: {"+u+"}, parent: <"+this.parent.name+">"},r.prototype.isEqualNode=function(u){return!(u.namespaceURI!==this.namespaceURI||u.prefix!==this.prefix||u.localName!==this.localName||u.value!==this.value)},r}()}).call(this)},{"./NodeType":360,"./XMLNode":382}],364:[function(e,w,g){(function(){var a,r,u=function(c,s){for(var t in s)l.call(s,t)&&(c[t]=s[t]);function i(){this.constructor=c}return i.prototype=s.prototype,c.prototype=new i,c.__super__=s.prototype,c},l={}.hasOwnProperty;a=e("./NodeType"),r=e("./XMLCharacterData"),w.exports=function(c){u(s,c);function s(t,i){if(s.__super__.constructor.call(this,t),i==null)throw new Error("Missing CDATA text. "+this.debugInfo());this.name="#cdata-section",this.type=a.CData,this.value=this.stringify.cdata(i)}return s.prototype.clone=function(){return Object.create(this)},s.prototype.toString=function(t){return this.options.writer.cdata(this,this.options.writer.filterOptions(t))},s}(r)}).call(this)},{"./NodeType":360,"./XMLCharacterData":365}],365:[function(e,w,g){(function(){var a,r=function(l,c){for(var s in c)u.call(c,s)&&(l[s]=c[s]);function t(){this.constructor=l}return t.prototype=c.prototype,l.prototype=new t,l.__super__=c.prototype,l},u={}.hasOwnProperty;a=e("./XMLNode"),w.exports=function(l){r(c,l);function c(s){c.__super__.constructor.call(this,s),this.value=""}return Object.defineProperty(c.prototype,"data",{get:function(){return this.value},set:function(s){return this.value=s||""}}),Object.defineProperty(c.prototype,"length",{get:function(){return this.value.length}}),Object.defineProperty(c.prototype,"textContent",{get:function(){return this.value},set:function(s){return this.value=s||""}}),c.prototype.clone=function(){return Object.create(this)},c.prototype.substringData=function(s,t){throw new Error("This DOM method is not implemented."+this.debugInfo())},c.prototype.appendData=function(s){throw new Error("This DOM method is not implemented."+this.debugInfo())},c.prototype.insertData=function(s,t){throw new Error("This DOM method is not implemented."+this.debugInfo())},c.prototype.deleteData=function(s,t){throw new Error("This DOM method is not implemented."+this.debugInfo())},c.prototype.replaceData=function(s,t,i){throw new Error("This DOM method is not implemented."+this.debugInfo())},c.prototype.isEqualNode=function(s){return!(!c.__super__.isEqualNode.apply(this,arguments).isEqualNode(s)||s.data!==this.data)},c}(a)}).call(this)},{"./XMLNode":382}],366:[function(e,w,g){(function(){var a,r,u=function(c,s){for(var t in s)l.call(s,t)&&(c[t]=s[t]);function i(){this.constructor=c}return i.prototype=s.prototype,c.prototype=new i,c.__super__=s.prototype,c},l={}.hasOwnProperty;a=e("./NodeType"),r=e("./XMLCharacterData"),w.exports=function(c){u(s,c);function s(t,i){if(s.__super__.constructor.call(this,t),i==null)throw new Error("Missing comment text. "+this.debugInfo());this.name="#comment",this.type=a.Comment,this.value=this.stringify.comment(i)}return s.prototype.clone=function(){return Object.create(this)},s.prototype.toString=function(t){return this.options.writer.comment(this,this.options.writer.filterOptions(t))},s}(r)}).call(this)},{"./NodeType":360,"./XMLCharacterData":365}],367:[function(e,w,g){(function(){var a,r;a=e("./XMLDOMErrorHandler"),r=e("./XMLDOMStringList"),w.exports=function(){function u(){this.defaultParams={"canonical-form":!1,"cdata-sections":!1,comments:!1,"datatype-normalization":!1,"element-content-whitespace":!0,entities:!0,"error-handler":new a,infoset:!0,"validate-if-schema":!1,namespaces:!0,"namespace-declarations":!0,"normalize-characters":!1,"schema-location":"","schema-type":"","split-cdata-sections":!0,validate:!1,"well-formed":!0},this.params=Object.create(this.defaultParams)}return Object.defineProperty(u.prototype,"parameterNames",{get:function(){return new r(Object.keys(this.defaultParams))}}),u.prototype.getParameter=function(l){return this.params.hasOwnProperty(l)?this.params[l]:null},u.prototype.canSetParameter=function(l,c){return!0},u.prototype.setParameter=function(l,c){return c!=null?this.params[l]=c:delete this.params[l]},u}()}).call(this)},{"./XMLDOMErrorHandler":368,"./XMLDOMStringList":370}],368:[function(e,w,g){(function(){w.exports=function(){function a(){}return a.prototype.handleError=function(r){throw new Error(r)},a}()}).call(this)},{}],369:[function(e,w,g){(function(){w.exports=function(){function a(){}return a.prototype.hasFeature=function(r,u){return!0},a.prototype.createDocumentType=function(r,u,l){throw new Error("This DOM method is not implemented.")},a.prototype.createDocument=function(r,u,l){throw new Error("This DOM method is not implemented.")},a.prototype.createHTMLDocument=function(r){throw new Error("This DOM method is not implemented.")},a.prototype.getFeature=function(r,u){throw new Error("This DOM method is not implemented.")},a}()}).call(this)},{}],370:[function(e,w,g){(function(){w.exports=function(){function a(r){this.arr=r||[]}return Object.defineProperty(a.prototype,"length",{get:function(){return this.arr.length}}),a.prototype.item=function(r){return this.arr[r]||null},a.prototype.contains=function(r){return this.arr.indexOf(r)!==-1},a}()}).call(this)},{}],371:[function(e,w,g){(function(){var a,r,u=function(c,s){for(var t in s)l.call(s,t)&&(c[t]=s[t]);function i(){this.constructor=c}return i.prototype=s.prototype,c.prototype=new i,c.__super__=s.prototype,c},l={}.hasOwnProperty;r=e("./XMLNode"),a=e("./NodeType"),w.exports=function(c){u(s,c);function s(t,i,n,o,p,f){if(s.__super__.constructor.call(this,t),i==null)throw new Error("Missing DTD element name. "+this.debugInfo());if(n==null)throw new Error("Missing DTD attribute name. "+this.debugInfo(i));if(!o)throw new Error("Missing DTD attribute type. "+this.debugInfo(i));if(!p)throw new Error("Missing DTD attribute default. "+this.debugInfo(i));if(p.indexOf("#")!==0&&(p="#"+p),!p.match(/^(#REQUIRED|#IMPLIED|#FIXED|#DEFAULT)$/))throw new Error("Invalid default value type; expected: #REQUIRED, #IMPLIED, #FIXED or #DEFAULT. "+this.debugInfo(i));if(f&&!p.match(/^(#FIXED|#DEFAULT)$/))throw new Error("Default value only applies to #FIXED or #DEFAULT. "+this.debugInfo(i));this.elementName=this.stringify.name(i),this.type=a.AttributeDeclaration,this.attributeName=this.stringify.name(n),this.attributeType=this.stringify.dtdAttType(o),f&&(this.defaultValue=this.stringify.dtdAttDefault(f)),this.defaultValueType=p}return s.prototype.toString=function(t){return this.options.writer.dtdAttList(this,this.options.writer.filterOptions(t))},s}(r)}).call(this)},{"./NodeType":360,"./XMLNode":382}],372:[function(e,w,g){(function(){var a,r,u=function(c,s){for(var t in s)l.call(s,t)&&(c[t]=s[t]);function i(){this.constructor=c}return i.prototype=s.prototype,c.prototype=new i,c.__super__=s.prototype,c},l={}.hasOwnProperty;r=e("./XMLNode"),a=e("./NodeType"),w.exports=function(c){u(s,c);function s(t,i,n){if(s.__super__.constructor.call(this,t),i==null)throw new Error("Missing DTD element name. "+this.debugInfo());n||(n="(#PCDATA)"),Array.isArray(n)&&(n="("+n.join(",")+")"),this.name=this.stringify.name(i),this.type=a.ElementDeclaration,this.value=this.stringify.dtdElementValue(n)}return s.prototype.toString=function(t){return this.options.writer.dtdElement(this,this.options.writer.filterOptions(t))},s}(r)}).call(this)},{"./NodeType":360,"./XMLNode":382}],373:[function(e,w,g){(function(){var a,r,u,l=function(s,t){for(var i in t)c.call(t,i)&&(s[i]=t[i]);function n(){this.constructor=s}return n.prototype=t.prototype,s.prototype=new n,s.__super__=t.prototype,s},c={}.hasOwnProperty;u=e("./Utility").isObject,r=e("./XMLNode"),a=e("./NodeType"),w.exports=function(s){l(t,s);function t(i,n,o,p){if(t.__super__.constructor.call(this,i),o==null)throw new Error("Missing DTD entity name. "+this.debugInfo(o));if(p==null)throw new Error("Missing DTD entity value. "+this.debugInfo(o));if(this.pe=!!n,this.name=this.stringify.name(o),this.type=a.EntityDeclaration,!u(p))this.value=this.stringify.dtdEntityValue(p),this.internal=!0;else{if(!p.pubID&&!p.sysID)throw new Error("Public and/or system identifiers are required for an external entity. "+this.debugInfo(o));if(p.pubID&&!p.sysID)throw new Error("System identifier is required for a public external entity. "+this.debugInfo(o));if(this.internal=!1,p.pubID!=null&&(this.pubID=this.stringify.dtdPubID(p.pubID)),p.sysID!=null&&(this.sysID=this.stringify.dtdSysID(p.sysID)),p.nData!=null&&(this.nData=this.stringify.dtdNData(p.nData)),this.pe&&this.nData)throw new Error("Notation declaration is not allowed in a parameter entity. "+this.debugInfo(o))}}return Object.defineProperty(t.prototype,"publicId",{get:function(){return this.pubID}}),Object.defineProperty(t.prototype,"systemId",{get:function(){return this.sysID}}),Object.defineProperty(t.prototype,"notationName",{get:function(){return this.nData||null}}),Object.defineProperty(t.prototype,"inputEncoding",{get:function(){return null}}),Object.defineProperty(t.prototype,"xmlEncoding",{get:function(){return null}}),Object.defineProperty(t.prototype,"xmlVersion",{get:function(){return null}}),t.prototype.toString=function(i){return this.options.writer.dtdEntity(this,this.options.writer.filterOptions(i))},t}(r)}).call(this)},{"./NodeType":360,"./Utility":361,"./XMLNode":382}],374:[function(e,w,g){(function(){var a,r,u=function(c,s){for(var t in s)l.call(s,t)&&(c[t]=s[t]);function i(){this.constructor=c}return i.prototype=s.prototype,c.prototype=new i,c.__super__=s.prototype,c},l={}.hasOwnProperty;r=e("./XMLNode"),a=e("./NodeType"),w.exports=function(c){u(s,c);function s(t,i,n){if(s.__super__.constructor.call(this,t),i==null)throw new Error("Missing DTD notation name. "+this.debugInfo(i));if(!n.pubID&&!n.sysID)throw new Error("Public or system identifiers are required for an external entity. "+this.debugInfo(i));this.name=this.stringify.name(i),this.type=a.NotationDeclaration,n.pubID!=null&&(this.pubID=this.stringify.dtdPubID(n.pubID)),n.sysID!=null&&(this.sysID=this.stringify.dtdSysID(n.sysID))}return Object.defineProperty(s.prototype,"publicId",{get:function(){return this.pubID}}),Object.defineProperty(s.prototype,"systemId",{get:function(){return this.sysID}}),s.prototype.toString=function(t){return this.options.writer.dtdNotation(this,this.options.writer.filterOptions(t))},s}(r)}).call(this)},{"./NodeType":360,"./XMLNode":382}],375:[function(e,w,g){(function(){var a,r,u,l=function(s,t){for(var i in t)c.call(t,i)&&(s[i]=t[i]);function n(){this.constructor=s}return n.prototype=t.prototype,s.prototype=new n,s.__super__=t.prototype,s},c={}.hasOwnProperty;u=e("./Utility").isObject,r=e("./XMLNode"),a=e("./NodeType"),w.exports=function(s){l(t,s);function t(i,n,o,p){var f;t.__super__.constructor.call(this,i),u(n)&&(f=n,n=f.version,o=f.encoding,p=f.standalone),n||(n="1.0"),this.type=a.Declaration,this.version=this.stringify.xmlVersion(n),o!=null&&(this.encoding=this.stringify.xmlEncoding(o)),p!=null&&(this.standalone=this.stringify.xmlStandalone(p))}return t.prototype.toString=function(i){return this.options.writer.declaration(this,this.options.writer.filterOptions(i))},t}(r)}).call(this)},{"./NodeType":360,"./Utility":361,"./XMLNode":382}],376:[function(e,w,g){(function(){var a,r,u,l,c,s,t,i,n=function(p,f){for(var d in f)o.call(f,d)&&(p[d]=f[d]);function m(){this.constructor=p}return m.prototype=f.prototype,p.prototype=new m,p.__super__=f.prototype,p},o={}.hasOwnProperty;i=e("./Utility").isObject,t=e("./XMLNode"),a=e("./NodeType"),r=e("./XMLDTDAttList"),l=e("./XMLDTDEntity"),u=e("./XMLDTDElement"),c=e("./XMLDTDNotation"),s=e("./XMLNamedNodeMap"),w.exports=function(p){n(f,p);function f(d,m,h){var b,S,v,j,y,x;if(f.__super__.constructor.call(this,d),this.type=a.DocType,d.children){for(j=d.children,S=0,v=j.length;S=0;)this.up();return this.onEnd()},_.prototype.openCurrent=function(){if(this.currentNode)return this.currentNode.children=!0,this.openNode(this.currentNode)},_.prototype.openNode=function(T){var k,F,W,V;if(!T.isOpen){if(!this.root&&this.currentLevel===0&&T.type===a.Element&&(this.root=T),F="",T.type===a.Element){this.writerOptions.state=r.OpenTag,F=this.writer.indent(T,this.writerOptions,this.currentLevel)+"<"+T.name,V=T.attribs;for(W in V)!E.call(V,W)||(k=V[W],F+=this.writer.attribute(k,this.writerOptions,this.currentLevel));F+=(T.children?">":"/>")+this.writer.endline(T,this.writerOptions,this.currentLevel),this.writerOptions.state=r.InsideTag}else this.writerOptions.state=r.OpenTag,F=this.writer.indent(T,this.writerOptions,this.currentLevel)+""),F+=this.writer.endline(T,this.writerOptions,this.currentLevel);return this.onData(F,this.currentLevel),T.isOpen=!0}},_.prototype.closeNode=function(T){var k;if(!T.isClosed)return k="",this.writerOptions.state=r.CloseTag,T.type===a.Element?k=this.writer.indent(T,this.writerOptions,this.currentLevel)+""+this.writer.endline(T,this.writerOptions,this.currentLevel):k=this.writer.indent(T,this.writerOptions,this.currentLevel)+"]>"+this.writer.endline(T,this.writerOptions,this.currentLevel),this.writerOptions.state=r.None,this.onData(k,this.currentLevel),T.isClosed=!0},_.prototype.onData=function(T,k){return this.documentStarted=!0,this.onDataCallback(T,k+1)},_.prototype.onEnd=function(){return this.documentCompleted=!0,this.onEndCallback()},_.prototype.debugInfo=function(T){return T==null?"":"node: <"+T+">"},_.prototype.ele=function(){return this.element.apply(this,arguments)},_.prototype.nod=function(T,k,F){return this.node(T,k,F)},_.prototype.txt=function(T){return this.text(T)},_.prototype.dat=function(T){return this.cdata(T)},_.prototype.com=function(T){return this.comment(T)},_.prototype.ins=function(T,k){return this.instruction(T,k)},_.prototype.dec=function(T,k,F){return this.declaration(T,k,F)},_.prototype.dtd=function(T,k,F){return this.doctype(T,k,F)},_.prototype.e=function(T,k,F){return this.element(T,k,F)},_.prototype.n=function(T,k,F){return this.node(T,k,F)},_.prototype.t=function(T){return this.text(T)},_.prototype.d=function(T){return this.cdata(T)},_.prototype.c=function(T){return this.comment(T)},_.prototype.r=function(T){return this.raw(T)},_.prototype.i=function(T,k){return this.instruction(T,k)},_.prototype.att=function(){return this.currentNode&&this.currentNode.type===a.DocType?this.attList.apply(this,arguments):this.attribute.apply(this,arguments)},_.prototype.a=function(){return this.currentNode&&this.currentNode.type===a.DocType?this.attList.apply(this,arguments):this.attribute.apply(this,arguments)},_.prototype.ent=function(T,k){return this.entity(T,k)},_.prototype.pent=function(T,k){return this.pEntity(T,k)},_.prototype.not=function(T,k){return this.notation(T,k)},_}()}).call(this)},{"./NodeType":360,"./Utility":361,"./WriterState":362,"./XMLAttribute":363,"./XMLCData":364,"./XMLComment":366,"./XMLDTDAttList":371,"./XMLDTDElement":372,"./XMLDTDEntity":373,"./XMLDTDNotation":374,"./XMLDeclaration":375,"./XMLDocType":376,"./XMLDocument":377,"./XMLElement":380,"./XMLProcessingInstruction":384,"./XMLRaw":385,"./XMLStringWriter":387,"./XMLStringifier":388,"./XMLText":389}],379:[function(e,w,g){(function(){var a,r,u=function(c,s){for(var t in s)l.call(s,t)&&(c[t]=s[t]);function i(){this.constructor=c}return i.prototype=s.prototype,c.prototype=new i,c.__super__=s.prototype,c},l={}.hasOwnProperty;r=e("./XMLNode"),a=e("./NodeType"),w.exports=function(c){u(s,c);function s(t){s.__super__.constructor.call(this,t),this.type=a.Dummy}return s.prototype.clone=function(){return Object.create(this)},s.prototype.toString=function(t){return""},s}(r)}).call(this)},{"./NodeType":360,"./XMLNode":382}],380:[function(e,w,g){(function(){var a,r,u,l,c,s,t,i,n=function(p,f){for(var d in f)o.call(f,d)&&(p[d]=f[d]);function m(){this.constructor=p}return m.prototype=f.prototype,p.prototype=new m,p.__super__=f.prototype,p},o={}.hasOwnProperty;i=e("./Utility"),t=i.isObject,s=i.isFunction,c=i.getValue,l=e("./XMLNode"),a=e("./NodeType"),r=e("./XMLAttribute"),u=e("./XMLNamedNodeMap"),w.exports=function(p){n(f,p);function f(d,m,h){var b,S,v,j;if(f.__super__.constructor.call(this,d),m==null)throw new Error("Missing element name. "+this.debugInfo());if(this.name=this.stringify.name(m),this.type=a.Element,this.attribs={},this.schemaTypeInfo=null,h!=null&&this.attribute(h),d.type===a.Document&&(this.isRoot=!0,this.documentObject=d,d.rootObject=this,d.children)){for(j=d.children,S=0,v=j.length;S=b;m=0<=b?++h:--h)if(!this.attribs[m].isEqualNode(d.attribs[m]))return!1;return!0},f}(l)}).call(this)},{"./NodeType":360,"./Utility":361,"./XMLAttribute":363,"./XMLNamedNodeMap":381,"./XMLNode":382}],381:[function(e,w,g){(function(){w.exports=function(){function a(r){this.nodes=r}return Object.defineProperty(a.prototype,"length",{get:function(){return Object.keys(this.nodes).length||0}}),a.prototype.clone=function(){return this.nodes=null},a.prototype.getNamedItem=function(r){return this.nodes[r]},a.prototype.setNamedItem=function(r){var u;return u=this.nodes[r.nodeName],this.nodes[r.nodeName]=r,u||null},a.prototype.removeNamedItem=function(r){var u;return u=this.nodes[r],delete this.nodes[r],u||null},a.prototype.item=function(r){return this.nodes[Object.keys(this.nodes)[r]]||null},a.prototype.getNamedItemNS=function(r,u){throw new Error("This DOM method is not implemented.")},a.prototype.setNamedItemNS=function(r){throw new Error("This DOM method is not implemented.")},a.prototype.removeNamedItemNS=function(r,u){throw new Error("This DOM method is not implemented.")},a}()}).call(this)},{}],382:[function(e,w,g){(function(){var a,r,u,l,c,s,t,i,n,o,p,f,d,m,h,b,S,v={}.hasOwnProperty;S=e("./Utility"),b=S.isObject,h=S.isFunction,m=S.isEmpty,d=S.getValue,i=null,u=null,l=null,c=null,s=null,p=null,f=null,o=null,t=null,r=null,n=null,a=null,w.exports=function(){function j(y){this.parent=y,this.parent&&(this.options=this.parent.options,this.stringify=this.parent.stringify),this.value=null,this.children=[],this.baseURI=null,i||(i=e("./XMLElement"),u=e("./XMLCData"),l=e("./XMLComment"),c=e("./XMLDeclaration"),s=e("./XMLDocType"),p=e("./XMLRaw"),f=e("./XMLText"),o=e("./XMLProcessingInstruction"),t=e("./XMLDummy"),r=e("./NodeType"),n=e("./XMLNodeList"),e("./XMLNamedNodeMap"),a=e("./DocumentPosition"))}return Object.defineProperty(j.prototype,"nodeName",{get:function(){return this.name}}),Object.defineProperty(j.prototype,"nodeType",{get:function(){return this.type}}),Object.defineProperty(j.prototype,"nodeValue",{get:function(){return this.value}}),Object.defineProperty(j.prototype,"parentNode",{get:function(){return this.parent}}),Object.defineProperty(j.prototype,"childNodes",{get:function(){return(!this.childNodeList||!this.childNodeList.nodes)&&(this.childNodeList=new n(this.children)),this.childNodeList}}),Object.defineProperty(j.prototype,"firstChild",{get:function(){return this.children[0]||null}}),Object.defineProperty(j.prototype,"lastChild",{get:function(){return this.children[this.children.length-1]||null}}),Object.defineProperty(j.prototype,"previousSibling",{get:function(){var y;return y=this.parent.children.indexOf(this),this.parent.children[y-1]||null}}),Object.defineProperty(j.prototype,"nextSibling",{get:function(){var y;return y=this.parent.children.indexOf(this),this.parent.children[y+1]||null}}),Object.defineProperty(j.prototype,"ownerDocument",{get:function(){return this.document()||null}}),Object.defineProperty(j.prototype,"textContent",{get:function(){var y,x,O,A,E;if(this.nodeType===r.Element||this.nodeType===r.DocumentFragment){for(E="",A=this.children,x=0,O=A.length;x":((O=this.parent)!=null?O.name:void 0)?"node: <"+y+">, parent: <"+this.parent.name+">":"node: <"+y+">"},j.prototype.ele=function(y,x,O){return this.element(y,x,O)},j.prototype.nod=function(y,x,O){return this.node(y,x,O)},j.prototype.txt=function(y){return this.text(y)},j.prototype.dat=function(y){return this.cdata(y)},j.prototype.com=function(y){return this.comment(y)},j.prototype.ins=function(y,x){return this.instruction(y,x)},j.prototype.doc=function(){return this.document()},j.prototype.dec=function(y,x,O){return this.declaration(y,x,O)},j.prototype.e=function(y,x,O){return this.element(y,x,O)},j.prototype.n=function(y,x,O){return this.node(y,x,O)},j.prototype.t=function(y){return this.text(y)},j.prototype.d=function(y){return this.cdata(y)},j.prototype.c=function(y){return this.comment(y)},j.prototype.r=function(y){return this.raw(y)},j.prototype.i=function(y,x){return this.instruction(y,x)},j.prototype.u=function(){return this.up()},j.prototype.importXMLBuilder=function(y){return this.importDocument(y)},j.prototype.replaceChild=function(y,x){throw new Error("This DOM method is not implemented."+this.debugInfo())},j.prototype.removeChild=function(y){throw new Error("This DOM method is not implemented."+this.debugInfo())},j.prototype.appendChild=function(y){throw new Error("This DOM method is not implemented."+this.debugInfo())},j.prototype.hasChildNodes=function(){return this.children.length!==0},j.prototype.cloneNode=function(y){throw new Error("This DOM method is not implemented."+this.debugInfo())},j.prototype.normalize=function(){throw new Error("This DOM method is not implemented."+this.debugInfo())},j.prototype.isSupported=function(y,x){return!0},j.prototype.hasAttributes=function(){return this.attribs.length!==0},j.prototype.compareDocumentPosition=function(y){var x,O;return x=this,x===y?0:this.document()!==y.document()?(O=a.Disconnected|a.ImplementationSpecific,Math.random()<.5?O|=a.Preceding:O|=a.Following,O):x.isAncestor(y)?a.Contains|a.Preceding:x.isDescendant(y)?a.Contains|a.Following:x.isPreceding(y)?a.Preceding:a.Following},j.prototype.isSameNode=function(y){throw new Error("This DOM method is not implemented."+this.debugInfo())},j.prototype.lookupPrefix=function(y){throw new Error("This DOM method is not implemented."+this.debugInfo())},j.prototype.isDefaultNamespace=function(y){throw new Error("This DOM method is not implemented."+this.debugInfo())},j.prototype.lookupNamespaceURI=function(y){throw new Error("This DOM method is not implemented."+this.debugInfo())},j.prototype.isEqualNode=function(y){var x,O,A;if(y.nodeType!==this.nodeType||y.children.length!==this.children.length)return!1;for(x=O=0,A=this.children.length-1;0<=A?O<=A:O>=A;x=0<=A?++O:--O)if(!this.children[x].isEqualNode(y.children[x]))return!1;return!0},j.prototype.getFeature=function(y,x){throw new Error("This DOM method is not implemented."+this.debugInfo())},j.prototype.setUserData=function(y,x,O){throw new Error("This DOM method is not implemented."+this.debugInfo())},j.prototype.getUserData=function(y){throw new Error("This DOM method is not implemented."+this.debugInfo())},j.prototype.contains=function(y){return y?y===this||this.isDescendant(y):!1},j.prototype.isDescendant=function(y){var x,O,A,E,_;for(_=this.children,A=0,E=_.length;AO},j.prototype.treePosition=function(y){var x,O;return O=0,x=!1,this.foreachTreeNode(this.document(),function(A){if(O++,!x&&A===y)return x=!0}),x?O:-1},j.prototype.foreachTreeNode=function(y,x){var O,A,E,_,T;for(y||(y=this.document()),_=y.children,A=0,E=_.length;A0){for(this.stream.write(" ["),this.stream.write(this.endline(i,n,o)),n.state=r.InsideTag,m=i.children,f=0,d=m.length;f"),this.stream.write(this.endline(i,n,o)),n.state=r.None,this.closeNode(i,n,o)},t.prototype.element=function(i,n,o){var p,f,d,m,h,b,S,v,j;o||(o=0),this.openNode(i,n,o),n.state=r.OpenTag,this.stream.write(this.indent(i,n,o)+"<"+i.name),v=i.attribs;for(S in v)!c.call(v,S)||(p=v[S],this.attribute(p,n,o));if(d=i.children.length,m=d===0?null:i.children[0],d===0||i.children.every(function(y){return(y.type===a.Text||y.type===a.Raw)&&y.value===""}))n.allowEmpty?(this.stream.write(">"),n.state=r.CloseTag,this.stream.write("")):(n.state=r.CloseTag,this.stream.write(n.spaceBeforeSlash+"/>"));else if(n.pretty&&d===1&&(m.type===a.Text||m.type===a.Raw)&&m.value!=null)this.stream.write(">"),n.state=r.InsideTag,n.suppressPrettyCount++,this.writeChildNode(m,n,o+1),n.suppressPrettyCount--,n.state=r.CloseTag,this.stream.write("");else{for(this.stream.write(">"+this.endline(i,n,o)),n.state=r.InsideTag,j=i.children,h=0,b=j.length;h")}return this.stream.write(this.endline(i,n,o)),n.state=r.None,this.closeNode(i,n,o)},t.prototype.processingInstruction=function(i,n,o){return this.stream.write(t.__super__.processingInstruction.call(this,i,n,o))},t.prototype.raw=function(i,n,o){return this.stream.write(t.__super__.raw.call(this,i,n,o))},t.prototype.text=function(i,n,o){return this.stream.write(t.__super__.text.call(this,i,n,o))},t.prototype.dtdAttList=function(i,n,o){return this.stream.write(t.__super__.dtdAttList.call(this,i,n,o))},t.prototype.dtdElement=function(i,n,o){return this.stream.write(t.__super__.dtdElement.call(this,i,n,o))},t.prototype.dtdEntity=function(i,n,o){return this.stream.write(t.__super__.dtdEntity.call(this,i,n,o))},t.prototype.dtdNotation=function(i,n,o){return this.stream.write(t.__super__.dtdNotation.call(this,i,n,o))},t}(u)}).call(this)},{"./NodeType":360,"./WriterState":362,"./XMLWriterBase":390}],387:[function(e,w,g){(function(){var a,r=function(l,c){for(var s in c)u.call(c,s)&&(l[s]=c[s]);function t(){this.constructor=l}return t.prototype=c.prototype,l.prototype=new t,l.__super__=c.prototype,l},u={}.hasOwnProperty;a=e("./XMLWriterBase"),w.exports=function(l){r(c,l);function c(s){c.__super__.constructor.call(this,s)}return c.prototype.document=function(s,t){var i,n,o,p,f;for(t=this.filterOptions(t),p="",f=s.children,n=0,o=f.length;n","]]]]>"),this.assertLegalChar(l))},u.prototype.comment=function(l){if(this.options.noValidation)return l;if(l=""+l||"",l.match(/--/))throw new Error("Comment text cannot contain double-hypen: "+l);return this.assertLegalChar(l)},u.prototype.raw=function(l){return this.options.noValidation?l:""+l||""},u.prototype.attValue=function(l){return this.options.noValidation?l:this.assertLegalChar(this.attEscape(l=""+l||""))},u.prototype.insTarget=function(l){return this.options.noValidation?l:this.assertLegalChar(""+l||"")},u.prototype.insValue=function(l){if(this.options.noValidation)return l;if(l=""+l||"",l.match(/\?>/))throw new Error("Invalid processing instruction value: "+l);return this.assertLegalChar(l)},u.prototype.xmlVersion=function(l){if(this.options.noValidation)return l;if(l=""+l||"",!l.match(/1\.[0-9]+/))throw new Error("Invalid version number: "+l);return l},u.prototype.xmlEncoding=function(l){if(this.options.noValidation)return l;if(l=""+l||"",!l.match(/^[A-Za-z](?:[A-Za-z0-9._-])*$/))throw new Error("Invalid encoding: "+l);return this.assertLegalChar(l)},u.prototype.xmlStandalone=function(l){return this.options.noValidation?l:l?"yes":"no"},u.prototype.dtdPubID=function(l){return this.options.noValidation?l:this.assertLegalChar(""+l||"")},u.prototype.dtdSysID=function(l){return this.options.noValidation?l:this.assertLegalChar(""+l||"")},u.prototype.dtdElementValue=function(l){return this.options.noValidation?l:this.assertLegalChar(""+l||"")},u.prototype.dtdAttType=function(l){return this.options.noValidation?l:this.assertLegalChar(""+l||"")},u.prototype.dtdAttDefault=function(l){return this.options.noValidation?l:this.assertLegalChar(""+l||"")},u.prototype.dtdEntityValue=function(l){return this.options.noValidation?l:this.assertLegalChar(""+l||"")},u.prototype.dtdNData=function(l){return this.options.noValidation?l:this.assertLegalChar(""+l||"")},u.prototype.convertAttKey="@",u.prototype.convertPIKey="?",u.prototype.convertTextKey="#text",u.prototype.convertCDataKey="#cdata",u.prototype.convertCommentKey="#comment",u.prototype.convertRawKey="#raw",u.prototype.assertLegalChar=function(l){var c,s;if(this.options.noValidation)return l;if(c="",this.options.version==="1.0"){if(c=/[\0-\x08\x0B\f\x0E-\x1F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,s=l.match(c))throw new Error("Invalid character in string: "+l+" at index "+s.index)}else if(this.options.version==="1.1"&&(c=/[\0\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,s=l.match(c)))throw new Error("Invalid character in string: "+l+" at index "+s.index);return l},u.prototype.assertLegalName=function(l){var c;if(this.options.noValidation)return l;if(this.assertLegalChar(l),c=/^([:A-Z_a-z\xC0-\xD6\xD8-\xF6\xF8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|[\uD800-\uDB7F][\uDC00-\uDFFF])([\x2D\.0-:A-Z_a-z\xB7\xC0-\xD6\xD8-\xF6\xF8-\u037D\u037F-\u1FFF\u200C\u200D\u203F\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|[\uD800-\uDB7F][\uDC00-\uDFFF])*$/,!l.match(c))throw new Error("Invalid character in name");return l},u.prototype.textEscape=function(l){var c;return this.options.noValidation?l:(c=this.options.noDoubleEncoding?/(?!&\S+;)&/g:/&/g,l.replace(c,"&").replace(//g,">").replace(/\r/g," "))},u.prototype.attEscape=function(l){var c;return this.options.noValidation?l:(c=this.options.noDoubleEncoding?/(?!&\S+;)&/g:/&/g,l.replace(c,"&").replace(/0)?new Array(n).join(t.indent):""},c.prototype.endline=function(s,t,i){return!t.pretty||t.suppressPrettyCount?"":t.newline},c.prototype.attribute=function(s,t,i){var n;return this.openAttribute(s,t,i),n=" "+s.name+'="'+s.value+'"',this.closeAttribute(s,t,i),n},c.prototype.cdata=function(s,t,i){var n;return this.openNode(s,t,i),t.state=r.OpenTag,n=this.indent(s,t,i)+""+this.endline(s,t,i),t.state=r.None,this.closeNode(s,t,i),n},c.prototype.comment=function(s,t,i){var n;return this.openNode(s,t,i),t.state=r.OpenTag,n=this.indent(s,t,i)+""+this.endline(s,t,i),t.state=r.None,this.closeNode(s,t,i),n},c.prototype.declaration=function(s,t,i){var n;return this.openNode(s,t,i),t.state=r.OpenTag,n=this.indent(s,t,i)+"",n+=this.endline(s,t,i),t.state=r.None,this.closeNode(s,t,i),n},c.prototype.docType=function(s,t,i){var n,o,p,f,d;if(i||(i=0),this.openNode(s,t,i),t.state=r.OpenTag,f=this.indent(s,t,i),f+="0){for(f+=" [",f+=this.endline(s,t,i),t.state=r.InsideTag,d=s.children,o=0,p=d.length;o",f+=this.endline(s,t,i),t.state=r.None,this.closeNode(s,t,i),f},c.prototype.element=function(s,t,i){var n,o,p,f,d,m,h,b,S,v,j,y,x,O;i||(i=0),v=!1,j="",this.openNode(s,t,i),t.state=r.OpenTag,j+=this.indent(s,t,i)+"<"+s.name,y=s.attribs;for(S in y)!l.call(y,S)||(n=y[S],j+=this.attribute(n,t,i));if(p=s.children.length,f=p===0?null:s.children[0],p===0||s.children.every(function(A){return(A.type===a.Text||A.type===a.Raw)&&A.value===""}))t.allowEmpty?(j+=">",t.state=r.CloseTag,j+=""+this.endline(s,t,i)):(t.state=r.CloseTag,j+=t.spaceBeforeSlash+"/>"+this.endline(s,t,i));else if(t.pretty&&p===1&&(f.type===a.Text||f.type===a.Raw)&&f.value!=null)j+=">",t.state=r.InsideTag,t.suppressPrettyCount++,v=!0,j+=this.writeChildNode(f,t,i+1),t.suppressPrettyCount--,v=!1,t.state=r.CloseTag,j+=""+this.endline(s,t,i);else{if(t.dontPrettyTextNodes){for(x=s.children,d=0,h=x.length;d"+this.endline(s,t,i),t.state=r.InsideTag,O=s.children,m=0,b=O.length;m",v&&t.suppressPrettyCount--,j+=this.endline(s,t,i),t.state=r.None}return this.closeNode(s,t,i),j},c.prototype.writeChildNode=function(s,t,i){switch(s.type){case a.CData:return this.cdata(s,t,i);case a.Comment:return this.comment(s,t,i);case a.Element:return this.element(s,t,i);case a.Raw:return this.raw(s,t,i);case a.Text:return this.text(s,t,i);case a.ProcessingInstruction:return this.processingInstruction(s,t,i);case a.Dummy:return"";case a.Declaration:return this.declaration(s,t,i);case a.DocType:return this.docType(s,t,i);case a.AttributeDeclaration:return this.dtdAttList(s,t,i);case a.ElementDeclaration:return this.dtdElement(s,t,i);case a.EntityDeclaration:return this.dtdEntity(s,t,i);case a.NotationDeclaration:return this.dtdNotation(s,t,i);default:throw new Error("Unknown XML node type: "+s.constructor.name)}},c.prototype.processingInstruction=function(s,t,i){var n;return this.openNode(s,t,i),t.state=r.OpenTag,n=this.indent(s,t,i)+"",n+=this.endline(s,t,i),t.state=r.None,this.closeNode(s,t,i),n},c.prototype.raw=function(s,t,i){var n;return this.openNode(s,t,i),t.state=r.OpenTag,n=this.indent(s,t,i),t.state=r.InsideTag,n+=s.value,t.state=r.CloseTag,n+=this.endline(s,t,i),t.state=r.None,this.closeNode(s,t,i),n},c.prototype.text=function(s,t,i){var n;return this.openNode(s,t,i),t.state=r.OpenTag,n=this.indent(s,t,i),t.state=r.InsideTag,n+=s.value,t.state=r.CloseTag,n+=this.endline(s,t,i),t.state=r.None,this.closeNode(s,t,i),n},c.prototype.dtdAttList=function(s,t,i){var n;return this.openNode(s,t,i),t.state=r.OpenTag,n=this.indent(s,t,i)+""+this.endline(s,t,i),t.state=r.None,this.closeNode(s,t,i),n},c.prototype.dtdElement=function(s,t,i){var n;return this.openNode(s,t,i),t.state=r.OpenTag,n=this.indent(s,t,i)+""+this.endline(s,t,i),t.state=r.None,this.closeNode(s,t,i),n},c.prototype.dtdEntity=function(s,t,i){var n;return this.openNode(s,t,i),t.state=r.OpenTag,n=this.indent(s,t,i)+""+this.endline(s,t,i),t.state=r.None,this.closeNode(s,t,i),n},c.prototype.dtdNotation=function(s,t,i){var n;return this.openNode(s,t,i),t.state=r.OpenTag,n=this.indent(s,t,i)+""+this.endline(s,t,i),t.state=r.None,this.closeNode(s,t,i),n},c.prototype.openNode=function(s,t,i){},c.prototype.closeNode=function(s,t,i){},c.prototype.openAttribute=function(s,t,i){},c.prototype.closeAttribute=function(s,t,i){},c}()}).call(this)},{"./NodeType":360,"./Utility":361,"./WriterState":362,"./XMLCData":364,"./XMLComment":366,"./XMLDTDAttList":371,"./XMLDTDElement":372,"./XMLDTDEntity":373,"./XMLDTDNotation":374,"./XMLDeclaration":375,"./XMLDocType":376,"./XMLDummy":379,"./XMLElement":380,"./XMLProcessingInstruction":384,"./XMLRaw":385,"./XMLText":389}],391:[function(e,w,g){(function(){var a,r,u,l,c,s,t,i,n,o;o=e("./Utility"),i=o.assign,n=o.isFunction,u=e("./XMLDOMImplementation"),l=e("./XMLDocument"),c=e("./XMLDocumentCB"),t=e("./XMLStringWriter"),s=e("./XMLStreamWriter"),a=e("./NodeType"),r=e("./WriterState"),w.exports.create=function(p,f,d,m){var h,b;if(p==null)throw new Error("Root element needs a name.");return m=i({},f,d,m),h=new l(m),b=h.element(p),m.headless||(h.declaration(m),(m.pubID!=null||m.sysID!=null)&&h.dtd(m)),b},w.exports.begin=function(p,f,d){var m;return n(p)&&(m=[p,f],f=m[0],d=m[1],p={}),f?new c(p,f,d):new l(p)},w.exports.stringWriter=function(p){return new t(p)},w.exports.streamWriter=function(p,f){return new s(p,f)},w.exports.implementation=new u,w.exports.nodeType=a,w.exports.writerState=r}).call(this)},{"./NodeType":360,"./Utility":361,"./WriterState":362,"./XMLDOMImplementation":369,"./XMLDocument":377,"./XMLDocumentCB":378,"./XMLStreamWriter":386,"./XMLStringWriter":387}],392:[function(e,w,g){w.exports=r;var a=Object.prototype.hasOwnProperty;function r(){for(var u={},l=0;lc?p=o(p):p.length>5]|=128<>>9<<4)+14]=p;for(var f=1732584193,d=-271733879,m=-1732584194,h=271733878,b=0;b>16)+(p>>16)+(f>>16);return d<<16|f&65535}function n(o,p){return o<>>32-p}w.exports=function(p){return a.hash(p,r,16)}},{"./helpers":394}],396:[function(e,w,g){var a=e("./helpers");function r(t,i){t[i>>5]|=128<<24-i%32,t[(i+64>>9<<4)+15]=i;for(var n=Array(80),o=1732584193,p=-271733879,f=-1732584194,d=271733878,m=-1009589776,h=0;h>16)+(i>>16)+(n>>16);return o<<16|n&65535}function s(t,i){return t<>>32-i}w.exports=function(i){return a.hash(i,r,20,!0)}},{"./helpers":394}],397:[function(e,w,g){w.exports=function(){return function(){}}},{}],398:[function(e,w,g){(function(a){(function(){var r=e("@babel/runtime/helpers/interopRequireDefault"),u=r(e("@babel/runtime/helpers/typeof")),l=e("stream"),c=l.Stream,s=e("../lib/common/utils/isArray"),t=s.isArray;w.exports.string=function(o){return typeof o=="string"},w.exports.array=t,w.exports.buffer=a.isBuffer;function i(n){return n instanceof c}w.exports.writableStream=function(o){return i(o)&&typeof o._write=="function"&&(0,u.default)(o._writableState)==="object"}}).call(this)}).call(this,{isBuffer:e("../node_modules/is-buffer/index.js")})},{"../lib/common/utils/isArray":61,"../node_modules/is-buffer/index.js":312,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/helpers/typeof":75,stream:345}],399:[function(e,w,g){var a=e("immediate"),r=w.exports={};r.nextTick=a,r.title="browser",r.browser=!0,r.env={},r.argv=[],r.version="",r.versions={};function u(){}r.on=u,r.addListener=u,r.once=u,r.off=u,r.removeListener=u,r.removeAllListeners=u,r.emit=u,r.prependListener=u,r.prependOnceListener=u,r.listeners=function(l){return[]},r.binding=function(l){throw new Error("process.binding is not supported")},r.cwd=function(){return"/"},r.chdir=function(l){throw new Error("process.chdir is not supported")},r.umask=function(){return 0}},{immediate:305}],400:[function(e,w,g){(function(a){(function(){e("core-js/modules/es.regexp.exec.js"),e("core-js/modules/es.string.search.js");var r=e("./lib/request"),u=e("./lib/response"),l=e("xtend"),c=e("builtin-status-codes"),s=e("url"),t=g;t.request=function(i,n){typeof i=="string"?i=s.parse(i):i=l(i);var o=a.location.protocol.search(/^https?:$/)===-1?"http:":"",p=i.protocol||o,f=i.hostname||i.host,d=i.port,m=i.path||"/";f&&f.indexOf(":")!==-1&&(f="["+f+"]"),i.url=(f?p+"//"+f:"")+(d?":"+d:"")+m,i.method=(i.method||"GET").toUpperCase(),i.headers=i.headers||{};var h=new r(i);return n&&h.on("response",n),h},t.get=function(n,o){var p=t.request(n,o);return p.end(),p},t.ClientRequest=r,t.IncomingMessage=u.IncomingMessage,t.Agent=function(){},t.Agent.defaultMaxSockets=4,t.globalAgent=new t.Agent,t.STATUS_CODES=c,t.METHODS=["CHECKOUT","CONNECT","COPY","DELETE","GET","HEAD","LOCK","M-SEARCH","MERGE","MKACTIVITY","MKCOL","MOVE","NOTIFY","OPTIONS","PATCH","POST","PROPFIND","PROPPATCH","PURGE","PUT","REPORT","SEARCH","SUBSCRIBE","TRACE","UNLOCK","UNSUBSCRIBE"]}).call(this)}).call(this,typeof xe!="undefined"?xe:typeof self!="undefined"?self:typeof window!="undefined"?window:{})},{"./lib/request":402,"./lib/response":403,"builtin-status-codes":87,"core-js/modules/es.regexp.exec.js":261,"core-js/modules/es.string.search.js":267,url:404,xtend:392}],401:[function(e,w,g){(function(a){(function(){e("core-js/modules/es.object.to-string.js"),e("core-js/modules/es.promise.js"),e("core-js/modules/es.array-buffer.constructor.js"),e("core-js/modules/es.array-buffer.slice.js"),e("core-js/modules/es.array.slice.js"),g.fetch=t(a.fetch)&&t(a.ReadableStream),g.writableStream=t(a.WritableStream),g.abortController=t(a.AbortController),g.blobConstructor=!1;try{new Blob([new ArrayBuffer(1)]),g.blobConstructor=!0}catch{}var r;function u(){if(r!==void 0)return r;if(a.XMLHttpRequest){r=new a.XMLHttpRequest;try{r.open("GET",a.XDomainRequest?"/":"https://example.com")}catch{r=null}}else r=null;return r}function l(i){var n=u();if(!n)return!1;try{return n.responseType=i,n.responseType===i}catch{}return!1}var c=typeof a.ArrayBuffer!="undefined",s=c&&t(a.ArrayBuffer.prototype.slice);g.arraybuffer=g.fetch||c&&l("arraybuffer"),g.msstream=!g.fetch&&s&&l("ms-stream"),g.mozchunkedarraybuffer=!g.fetch&&c&&l("moz-chunked-arraybuffer"),g.overrideMimeType=g.fetch||(u()?t(u().overrideMimeType):!1),g.vbArray=t(a.VBArray);function t(i){return typeof i=="function"}r=null}).call(this)}).call(this,typeof xe!="undefined"?xe:typeof self!="undefined"?self:typeof window!="undefined"?window:{})},{"core-js/modules/es.array-buffer.constructor.js":239,"core-js/modules/es.array-buffer.slice.js":240,"core-js/modules/es.array.slice.js":250,"core-js/modules/es.object.to-string.js":258,"core-js/modules/es.promise.js":259}],402:[function(e,w,g){(function(a,r,u){(function(){e("core-js/modules/es.object.to-string.js"),e("core-js/modules/es.regexp.to-string.js"),e("core-js/modules/web.dom-collections.for-each.js"),e("core-js/modules/es.object.keys.js"),e("core-js/modules/es.array.concat.js"),e("core-js/modules/es.array.map.js"),e("core-js/modules/es.function.name.js"),e("core-js/modules/es.promise.js"),e("core-js/modules/es.regexp.exec.js"),e("core-js/modules/es.string.split.js");var l=e("./capability"),c=e("inherits"),s=e("./response"),t=e("readable-stream"),i=e("to-arraybuffer"),n=s.IncomingMessage,o=s.readyStates;function p(h,b){return l.fetch&&b?"fetch":l.mozchunkedarraybuffer?"moz-chunked-arraybuffer":l.msstream?"ms-stream":l.arraybuffer&&h?"arraybuffer":l.vbArray&&h?"text:vbarray":"text"}var f=w.exports=function(h){var b=this;t.Writable.call(b),b._opts=h,b._body=[],b._headers={},h.auth&&b.setHeader("Authorization","Basic "+new u(h.auth).toString("base64")),Object.keys(h.headers).forEach(function(j){b.setHeader(j,h.headers[j])});var S,v=!0;if(h.mode==="disable-fetch"||"requestTimeout"in h&&!l.abortController)v=!1,S=!0;else if(h.mode==="prefer-streaming")S=!1;else if(h.mode==="allow-wrong-content-type")S=!l.overrideMimeType;else if(!h.mode||h.mode==="default"||h.mode==="prefer-fast")S=!0;else throw new Error("Invalid value for opts.mode");b._mode=p(S,v),b._fetchTimer=null,b.on("finish",function(){b._onFinish()})};c(f,t.Writable),f.prototype.setHeader=function(h,b){var S=this,v=h.toLowerCase();m.indexOf(v)===-1&&(S._headers[v]={name:h,value:b})},f.prototype.getHeader=function(h){var b=this._headers[h.toLowerCase()];return b?b.value:null},f.prototype.removeHeader=function(h){var b=this;delete b._headers[h.toLowerCase()]},f.prototype._onFinish=function(){var h=this;if(!h._destroyed){var b=h._opts,S=h._headers,v=null;b.method!=="GET"&&b.method!=="HEAD"&&(l.arraybuffer?v=i(u.concat(h._body)):l.blobConstructor?v=new r.Blob(h._body.map(function(A){return i(A)}),{type:(S["content-type"]||{}).value||""}):v=u.concat(h._body).toString());var j=[];if(Object.keys(S).forEach(function(A){var E=S[A].name,_=S[A].value;Array.isArray(_)?_.forEach(function(T){j.push([E,T])}):j.push([E,_])}),h._mode==="fetch"){var y=null;if(l.abortController){var x=new AbortController;y=x.signal,h._fetchAbortController=x,"requestTimeout"in b&&b.requestTimeout!==0&&(h._fetchTimer=r.setTimeout(function(){h.emit("requestTimeout"),h._fetchAbortController&&h._fetchAbortController.abort()},b.requestTimeout))}r.fetch(h._opts.url,{method:h._opts.method,headers:j,body:v||void 0,mode:"cors",credentials:b.withCredentials?"include":"same-origin",signal:y}).then(function(A){h._fetchResponse=A,h._connect()},function(A){r.clearTimeout(h._fetchTimer),h._destroyed||h.emit("error",A)})}else{var O=h._xhr=new r.XMLHttpRequest;try{O.open(h._opts.method,h._opts.url,!0)}catch(A){a.nextTick(function(){h.emit("error",A)});return}"responseType"in O&&(O.responseType=h._mode.split(":")[0]),"withCredentials"in O&&(O.withCredentials=!!b.withCredentials),h._mode==="text"&&"overrideMimeType"in O&&O.overrideMimeType("text/plain; charset=x-user-defined"),"requestTimeout"in b&&(O.timeout=b.requestTimeout,O.ontimeout=function(){h.emit("requestTimeout")}),j.forEach(function(A){O.setRequestHeader(A[0],A[1])}),h._response=null,O.onreadystatechange=function(){switch(O.readyState){case o.LOADING:case o.DONE:h._onXHRProgress();break}},h._mode==="moz-chunked-arraybuffer"&&(O.onprogress=function(){h._onXHRProgress()}),O.onerror=function(){h._destroyed||h.emit("error",new Error("XHR error"))};try{O.send(v)}catch(A){a.nextTick(function(){h.emit("error",A)});return}}}};function d(h){try{var b=h.status;return b!==null&&b!==0}catch{return!1}}f.prototype._onXHRProgress=function(){var h=this;!d(h._xhr)||h._destroyed||(h._response||h._connect(),h._response._onXHRProgress())},f.prototype._connect=function(){var h=this;h._destroyed||(h._response=new n(h._xhr,h._fetchResponse,h._mode,h._fetchTimer),h._response.on("error",function(b){h.emit("error",b)}),h.emit("response",h._response))},f.prototype._write=function(h,b,S){var v=this;v._body.push(h),S()},f.prototype.abort=f.prototype.destroy=function(){var h=this;h._destroyed=!0,r.clearTimeout(h._fetchTimer),h._response&&(h._response._destroyed=!0),h._xhr?h._xhr.abort():h._fetchAbortController&&h._fetchAbortController.abort()},f.prototype.end=function(h,b,S){var v=this;typeof h=="function"&&(S=h,h=void 0),t.Writable.prototype.end.call(v,h,b,S)},f.prototype.flushHeaders=function(){},f.prototype.setTimeout=function(){},f.prototype.setNoDelay=function(){},f.prototype.setSocketKeepAlive=function(){};var m=["accept-charset","accept-encoding","access-control-request-headers","access-control-request-method","connection","content-length","cookie","cookie2","date","dnt","expect","host","keep-alive","origin","referer","te","trailer","transfer-encoding","upgrade","user-agent","via"]}).call(this)}).call(this,e("_process"),typeof xe!="undefined"?xe:typeof self!="undefined"?self:typeof window!="undefined"?window:{},e("buffer").Buffer)},{"./capability":401,"./response":403,_process:399,buffer:85,"core-js/modules/es.array.concat.js":241,"core-js/modules/es.array.map.js":249,"core-js/modules/es.function.name.js":253,"core-js/modules/es.object.keys.js":257,"core-js/modules/es.object.to-string.js":258,"core-js/modules/es.promise.js":259,"core-js/modules/es.regexp.exec.js":261,"core-js/modules/es.regexp.to-string.js":262,"core-js/modules/es.string.split.js":268,"core-js/modules/web.dom-collections.for-each.js":296,inherits:311,"readable-stream":339,"to-arraybuffer":348}],403:[function(e,w,g){(function(a,r,u){(function(){e("core-js/modules/web.dom-collections.for-each.js"),e("core-js/modules/es.object.to-string.js"),e("core-js/modules/es.promise.js"),e("core-js/modules/es.regexp.exec.js"),e("core-js/modules/es.string.split.js"),e("core-js/modules/es.string.match.js"),e("core-js/modules/es.array.iterator.js"),e("core-js/modules/es.array-buffer.slice.js"),e("core-js/modules/es.typed-array.uint8-array.js"),e("core-js/modules/es.typed-array.copy-within.js"),e("core-js/modules/es.typed-array.every.js"),e("core-js/modules/es.typed-array.fill.js"),e("core-js/modules/es.typed-array.filter.js"),e("core-js/modules/es.typed-array.find.js"),e("core-js/modules/es.typed-array.find-index.js"),e("core-js/modules/es.typed-array.for-each.js"),e("core-js/modules/es.typed-array.includes.js"),e("core-js/modules/es.typed-array.index-of.js"),e("core-js/modules/es.typed-array.iterator.js"),e("core-js/modules/es.typed-array.join.js"),e("core-js/modules/es.typed-array.last-index-of.js"),e("core-js/modules/es.typed-array.map.js"),e("core-js/modules/es.typed-array.reduce.js"),e("core-js/modules/es.typed-array.reduce-right.js"),e("core-js/modules/es.typed-array.reverse.js"),e("core-js/modules/es.typed-array.set.js"),e("core-js/modules/es.typed-array.slice.js"),e("core-js/modules/es.typed-array.some.js"),e("core-js/modules/es.typed-array.sort.js"),e("core-js/modules/es.typed-array.subarray.js"),e("core-js/modules/es.typed-array.to-locale-string.js"),e("core-js/modules/es.typed-array.to-string.js"),e("core-js/modules/es.array.slice.js");var l=e("./capability"),c=e("inherits"),s=e("readable-stream"),t=g.readyStates={UNSENT:0,OPENED:1,HEADERS_RECEIVED:2,LOADING:3,DONE:4},i=g.IncomingMessage=function(n,o,p,f){var d=this;if(s.Readable.call(d),d._mode=p,d.headers={},d.rawHeaders=[],d.trailers={},d.rawTrailers=[],d.on("end",function(){a.nextTick(function(){d.emit("close")})}),p==="fetch"){var m=function y(){b.read().then(function(x){if(!d._destroyed){if(x.done){r.clearTimeout(f),d.push(null);return}d.push(new u(x.value)),y()}}).catch(function(x){r.clearTimeout(f),d._destroyed||d.emit("error",x)})};if(d._fetchResponse=o,d.url=o.url,d.statusCode=o.status,d.statusMessage=o.statusText,o.headers.forEach(function(y,x){d.headers[x.toLowerCase()]=y,d.rawHeaders.push(x,y)}),l.writableStream){var h=new WritableStream({write:function(x){return new Promise(function(O,A){d._destroyed?A():d.push(new u(x))?O():d._resumeFetch=O})},close:function(){r.clearTimeout(f),d._destroyed||d.push(null)},abort:function(x){d._destroyed||d.emit("error",x)}});try{o.body.pipeTo(h).catch(function(y){r.clearTimeout(f),d._destroyed||d.emit("error",y)});return}catch{}}var b=o.body.getReader();m()}else{d._xhr=n,d._pos=0,d.url=n.responseURL,d.statusCode=n.status,d.statusMessage=n.statusText;var S=n.getAllResponseHeaders().split(/\r?\n/);if(S.forEach(function(y){var x=y.match(/^([^:]+):\s*(.*)/);if(x){var O=x[1].toLowerCase();O==="set-cookie"?(d.headers[O]===void 0&&(d.headers[O]=[]),d.headers[O].push(x[2])):d.headers[O]!==void 0?d.headers[O]+=", "+x[2]:d.headers[O]=x[2],d.rawHeaders.push(x[1],x[2])}}),d._charset="x-user-defined",!l.overrideMimeType){var v=d.rawHeaders["mime-type"];if(v){var j=v.match(/;\s*charset=([^;])(;|$)/);j&&(d._charset=j[1].toLowerCase())}d._charset||(d._charset="utf-8")}}};c(i,s.Readable),i.prototype._read=function(){var n=this,o=n._resumeFetch;o&&(n._resumeFetch=null,o())},i.prototype._onXHRProgress=function(){var n=this,o=n._xhr,p=null;switch(n._mode){case"text:vbarray":if(o.readyState!==t.DONE)break;try{p=new r.VBArray(o.responseBody).toArray()}catch{}if(p!==null){n.push(new u(p));break}case"text":try{p=o.responseText}catch{n._mode="text:vbarray";break}if(p.length>n._pos){var f=p.substr(n._pos);if(n._charset==="x-user-defined"){for(var d=new u(f.length),m=0;mn._pos&&(n.push(new u(new Uint8Array(h.result.slice(n._pos)))),n._pos=h.result.byteLength)},h.onload=function(){n.push(null)},h.readAsArrayBuffer(p);break}n._xhr.readyState===t.DONE&&n._mode!=="ms-stream"&&n.push(null)}}).call(this)}).call(this,e("_process"),typeof xe!="undefined"?xe:typeof self!="undefined"?self:typeof window!="undefined"?window:{},e("buffer").Buffer)},{"./capability":401,_process:399,buffer:85,"core-js/modules/es.array-buffer.slice.js":240,"core-js/modules/es.array.iterator.js":247,"core-js/modules/es.array.slice.js":250,"core-js/modules/es.object.to-string.js":258,"core-js/modules/es.promise.js":259,"core-js/modules/es.regexp.exec.js":261,"core-js/modules/es.string.match.js":265,"core-js/modules/es.string.split.js":268,"core-js/modules/es.typed-array.copy-within.js":272,"core-js/modules/es.typed-array.every.js":273,"core-js/modules/es.typed-array.fill.js":274,"core-js/modules/es.typed-array.filter.js":275,"core-js/modules/es.typed-array.find-index.js":276,"core-js/modules/es.typed-array.find.js":277,"core-js/modules/es.typed-array.for-each.js":278,"core-js/modules/es.typed-array.includes.js":279,"core-js/modules/es.typed-array.index-of.js":280,"core-js/modules/es.typed-array.iterator.js":281,"core-js/modules/es.typed-array.join.js":282,"core-js/modules/es.typed-array.last-index-of.js":283,"core-js/modules/es.typed-array.map.js":284,"core-js/modules/es.typed-array.reduce-right.js":285,"core-js/modules/es.typed-array.reduce.js":286,"core-js/modules/es.typed-array.reverse.js":287,"core-js/modules/es.typed-array.set.js":288,"core-js/modules/es.typed-array.slice.js":289,"core-js/modules/es.typed-array.some.js":290,"core-js/modules/es.typed-array.sort.js":291,"core-js/modules/es.typed-array.subarray.js":292,"core-js/modules/es.typed-array.to-locale-string.js":293,"core-js/modules/es.typed-array.to-string.js":294,"core-js/modules/es.typed-array.uint8-array.js":295,"core-js/modules/web.dom-collections.for-each.js":296,inherits:311,"readable-stream":339}],404:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/helpers/typeof"));e("core-js/modules/es.regexp.exec.js"),e("core-js/modules/es.string.search.js"),e("core-js/modules/es.array.concat.js"),e("core-js/modules/es.string.split.js"),e("core-js/modules/es.string.replace.js"),e("core-js/modules/es.array.join.js"),e("core-js/modules/es.string.trim.js"),e("core-js/modules/es.string.match.js"),e("core-js/modules/es.array.slice.js"),e("core-js/modules/es.object.keys.js"),e("core-js/modules/es.array.splice.js");var u=e("punycode"),l=e("./util");g.parse=x,g.resolve=A,g.resolveObject=E,g.format=O,g.Url=c;function c(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}var s=/^([a-z0-9.+-]+:)/i,t=/:[0-9]*$/,i=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,n=["<",">",'"',"`"," ","\r",` +`," "],o=["{","}","|","\\","^","`"].concat(n),p=["'"].concat(o),f=["%","/","?",";","#"].concat(p),d=["/","?","#"],m=255,h=/^[+a-z0-9A-Z_-]{0,63}$/,b=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,S={javascript:!0,"javascript:":!0},v={javascript:!0,"javascript:":!0},j={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},y=e("querystring");function x(_,T,k){if(_&&l.isObject(_)&&_ instanceof c)return _;var F=new c;return F.parse(_,T,k),F}c.prototype.parse=function(_,T,k){if(!l.isString(_))throw new TypeError("Parameter 'url' must be a string, not "+(0,r.default)(_));var F=_.indexOf("?"),W=F!==-1&&F<_.indexOf("#")?"?":"#",V=_.split(W),L=/\\/g;V[0]=V[0].replace(L,"/"),_=V.join(W);var Y=_;if(Y=Y.trim(),!k&&_.split("#").length===1){var re=i.exec(Y);if(re)return this.path=Y,this.href=Y,this.pathname=re[1],re[2]?(this.search=re[2],T?this.query=y.parse(this.search.substr(1)):this.query=this.search.substr(1)):T&&(this.search="",this.query={}),this}var z=s.exec(Y);if(z){z=z[0];var G=z.toLowerCase();this.protocol=G,Y=Y.substr(z.length)}if(k||z||Y.match(/^\/\/[^@\/]+@[^@\/]+/)){var U=Y.substr(0,2)==="//";U&&!(z&&v[z])&&(Y=Y.substr(2),this.slashes=!0)}if(!v[z]&&(U||z&&!j[z])){for(var P=-1,B=0;B127?N+="x":N+=D[I];if(!N.match(h)){var Q=ae.slice(0,B),Z=ae.slice(B+1),ie=D.match(b);ie&&(Q.push(ie[1]),Z.unshift(ie[2])),Z.length&&(Y="/"+Z.join(".")+Y),this.hostname=Q.join(".");break}}}this.hostname.length>m?this.hostname="":this.hostname=this.hostname.toLowerCase(),X||(this.hostname=u.toASCII(this.hostname));var ce=this.port?":"+this.port:"",oe=this.hostname||"";this.host=oe+ce,this.href+=this.host,X&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),Y[0]!=="/"&&(Y="/"+Y))}if(!S[G])for(var B=0,M=p.length;B0?k.host.split("@"):!1;N&&(k.auth=N.shift(),k.host=k.hostname=N.shift())}return k.search=_.search,k.query=_.query,(!l.isNull(k.pathname)||!l.isNull(k.search))&&(k.path=(k.pathname?k.pathname:"")+(k.search?k.search:"")),k.href=k.format(),k}if(!ae.length)return k.pathname=null,k.search?k.path="/"+k.search:k.path=null,k.href=k.format(),k;for(var I=ae.slice(-1)[0],te=(k.host||_.host||ae.length>1)&&(I==="."||I==="..")||I==="",Q=0,Z=ae.length;Z>=0;Z--)I=ae[Z],I==="."?ae.splice(Z,1):I===".."?(ae.splice(Z,1),Q++):Q&&(ae.splice(Z,1),Q--);if(!q&&!X)for(;Q--;Q)ae.unshift("..");q&&ae[0]!==""&&(!ae[0]||ae[0].charAt(0)!=="/")&&ae.unshift(""),te&&ae.join("/").substr(-1)!=="/"&&ae.push("");var ie=ae[0]===""||ae[0]&&ae[0].charAt(0)==="/";if(D){k.hostname=k.host=ie?"":ae.length?ae.shift():"";var N=k.host&&k.host.indexOf("@")>0?k.host.split("@"):!1;N&&(k.auth=N.shift(),k.host=k.hostname=N.shift())}return q=q||k.host&&ae.length,q&&!ie&&ae.unshift(""),ae.length?k.pathname=ae.join("/"):(k.pathname=null,k.path=null),(!l.isNull(k.pathname)||!l.isNull(k.search))&&(k.path=(k.pathname?k.pathname:"")+(k.search?k.search:"")),k.auth=_.auth||k.auth,k.slashes=k.slashes||_.slashes,k.href=k.format(),k},c.prototype.parseHost=function(){var _=this.host,T=t.exec(_);T&&(T=T[0],T!==":"&&(this.port=T.substr(1)),_=_.substr(0,_.length-T.length)),_&&(this.hostname=_)}},{"./util":405,"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/helpers/typeof":75,"core-js/modules/es.array.concat.js":241,"core-js/modules/es.array.join.js":248,"core-js/modules/es.array.slice.js":250,"core-js/modules/es.array.splice.js":252,"core-js/modules/es.object.keys.js":257,"core-js/modules/es.regexp.exec.js":261,"core-js/modules/es.string.match.js":265,"core-js/modules/es.string.replace.js":266,"core-js/modules/es.string.search.js":267,"core-js/modules/es.string.split.js":268,"core-js/modules/es.string.trim.js":269,punycode:325,querystring:328}],405:[function(e,w,g){var a=e("@babel/runtime/helpers/interopRequireDefault"),r=a(e("@babel/runtime/helpers/typeof"));w.exports={isString:function(l){return typeof l=="string"},isObject:function(l){return(0,r.default)(l)==="object"&&l!==null},isNull:function(l){return l===null},isNullOrUndefined:function(l){return l==null}}},{"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/helpers/typeof":75}],406:[function(e,w,g){e("core-js/modules/es.number.constructor.js"),g.encodeURIComponent=function(a){try{return encodeURIComponent(a)}catch{return a}},g.escape=e("escape-html"),g.timestamp=function(r){if(r){var u=r;return typeof u=="string"&&(u=Number(u)),String(r).length===10&&(u*=1e3),new Date(u)}return Math.round(Date.now()/1e3)}},{"core-js/modules/es.number.constructor.js":254,"escape-html":300}],407:[function(e,w,g){(function(a,r){(function(){var u=e("@babel/runtime/helpers/interopRequireDefault"),l=u(e("@babel/runtime/helpers/typeof"));e("core-js/modules/es.string.trim.js"),e("core-js/modules/es.regexp.exec.js"),e("core-js/modules/es.string.split.js"),e("core-js/modules/es.object.to-string.js"),e("core-js/modules/es.promise.js"),e("core-js/modules/es.function.name.js"),e("core-js/modules/es.array.concat.js");var c=e("util"),s=e("url"),t=e("http"),i=e("https"),n=e("debug")("urllib"),o=e("humanize-ms"),p=0,f=Math.pow(2,31)-10,d=/^https?:\/\//i;function m(v,j){return v===void 0?j:v}function h(v){return v?v.split(";")[0].trim().toLowerCase():""}function b(v,j){return function(y,x,O){if(y)return j(y);v({data:x,status:O.statusCode,headers:O.headers,res:O})}}g.TIMEOUTS=[o("300s"),o("300s")];var S=["json","text"];g.request=function(j,y,x){return arguments.length===2&&typeof y=="function"&&(x=y,y=null),typeof x=="function"?g.requestWithCallback(j,y,x):new Promise(function(O,A){g.requestWithCallback(j,y,b(O,A))})},g.requestWithCallback=function(j,y,x){if(!j||typeof j!="string"&&(0,l.default)(j)!=="object"){var O=c.format("expect request url to be a string or a http request options, but got %j",j);throw new Error(O)}arguments.length===2&&typeof y=="function"&&(x=y,y=null),y=y||{},p>=f&&(p=0);var A=++p;y.requestUrls=y.requestUrls||[];var E={requestId:A,url:j,args:y,ctx:y.ctx};y.emitter&&y.emitter.emit("request",E),y.timeout=y.timeout||g.TIMEOUTS,y.maxRedirects=y.maxRedirects||10,y.streaming=y.streaming||y.customResponse;var _=Date.now(),T;typeof j=="string"?(d.test(j)||(j="https://"+j),T=s.parse(j)):T=j;var k=(y.type||y.method||T.method||"GET").toUpperCase(),F=T.port||80,W=t,V=m(y.agent,g.agent),L=y.fixJSONCtlChars;T.protocol==="https:"&&(W=i,V=m(y.httpsAgent,g.httpsAgent),T.port||(F=443));var Y={host:T.hostname||T.host||"localhost",path:T.path||"/",method:k,port:F,agent:V,headers:y.headers||{},lookup:y.lookup};Array.isArray(y.timeout)?Y.requestTimeout=y.timeout[y.timeout.length-1]:typeof y.timeout!="undefined"&&(Y.requestTimeout=y.timeout);var re=y.auth||T.auth;re&&(Y.auth=re);var z=y.content||y.data,G=k==="GET"||k==="HEAD"||y.dataAsQueryString;if(!y.content&&z&&!(typeof z=="string"||r.isBuffer(z)))if(G)z=y.nestedQuerystring?qs.stringify(z):querystring.stringify(z);else{var U=Y.headers["Content-Type"]||Y.headers["content-type"];U||(y.contentType==="json"?U="application/json":U="application/x-www-form-urlencoded",Y.headers["Content-Type"]=U),h(U)==="application/json"?z=JSON.stringify(z):z=y.nestedQuerystring?qs.stringify(z):querystring.stringify(z)}G&&z&&(Y.path+=(T.query?"&":"?")+z,z=null);var P=0;if(z){var B=z.length;r.isBuffer(z)||(B=r.byteLength(z)),P=Y.headers["Content-Length"]=B}y.dataType==="json"&&(Y.headers.Accept="application/json"),typeof y.beforeRequest=="function"&&y.beforeRequest(Y);var K=null,J=null,q=null,X=!1,ae=!1,M=0,D=-1,N=!1,I="",te="",Q=null;y.timing&&(Q={queuing:0,dnslookup:0,connected:0,requestSent:0,waiting:0,contentDownload:0});function Z(){K&&(clearTimeout(K),K=null)}function ie(){J&&(clearTimeout(J),J=null)}function ce(se,de,be){if(ie(),!x){console.warn("[urllib:warn] [%s] [%s] [worker:%s] %s %s callback twice!!!",Date(),A,a.pid,Y.method,j),se&&console.warn(`[urllib:warn] [%s] [%s] [worker:%s] %s: %s +stack: %s`,Date(),A,a.pid,se.name,se.message,se.stack);return}var we=x;x=null;var ye={};be&&(D=be.statusCode,ye=be.headers);var le=Date.now()-_;Q&&(Q.contentDownload=le),n("[%sms] done, %s bytes HTTP %s %s %s %s, keepAliveSocket: %s, timing: %j",le,M,D,Y.method,Y.host,Y.path,ae,Q);var fe={status:D,statusCode:D,headers:ye,size:M,aborted:N,rt:le,keepAliveSocket:ae,data:de,requestUrls:y.requestUrls,timing:Q,remoteAddress:I,remotePort:te};if(se){var pe="";V&&typeof V.getCurrentStatus=="function"&&(pe=", agent status: "+JSON.stringify(V.getCurrentStatus())),se.message+=", "+Y.method+" "+j+" "+D+" (connected: "+X+", keepalive socket: "+ae+pe+`) +headers: `+JSON.stringify(ye),se.data=de,se.path=Y.path,se.status=D,se.headers=ye,se.res=fe}we(se,de,y.streaming?be:fe),y.emitter&&(E.url=j,E.socket=ne&&ne.connection,E.options=Y,E.size=P,y.emitter.emit("response",{requestId:A,error:se,ctx:y.ctx,req:E,res:fe}))}function oe(se){var de=null;if(y.followRedirect&&statuses.redirect[se.statusCode]){y._followRedirectCount=(y._followRedirectCount||0)+1;var be=se.headers.location;if(!be)de=new Error("Got statusCode "+se.statusCode+" but cannot resolve next location from headers"),de.name="FollowRedirectError";else if(y._followRedirectCount>y.maxRedirects)de=new Error("Exceeded maxRedirects. Probably stuck in a redirect loop "+j),de.name="MaxRedirectError";else{var we=y.formatRedirectUrl?y.formatRedirectUrl(j,be):s.resolve(j,be);n("Request#%d %s: `redirected` from %s to %s",A,Y.path,j,we),ie(),y.headers&&y.headers.Host&&d.test(be)&&(y.headers.Host=null);var ye=x;return x=null,g.requestWithCallback(we,y,ye),{redirect:!0,error:null}}}return{redirect:!1,error:de}}y.gzip&&!Y.headers["Accept-Encoding"]&&!Y.headers["accept-encoding"]&&(Y.headers["Accept-Encoding"]="gzip");function me(se,de,be){var we=se.headers["content-encoding"];return be(null,de,we)}var ge=y.writeStream;n("Request#%d %s %s with headers %j, options.path: %s",A,k,j,Y.headers,Y.path),y.requestUrls.push(j);function $(se){if(Q&&(Q.waiting=Date.now()-_),n("Request#%d %s `req response` event emit: status %d, headers: %j",A,j,se.statusCode,se.headers),y.streaming){var de=oe(se);if(de.redirect){se.resume();return}return de.error?(se.resume(),ce(de.error,null,se)):ce(null,null,se)}if(se.on("close",function(){n("Request#%d %s: `res close` event emit, total size %d",A,j,M)}),se.on("error",function(){n("Request#%d %s: `res error` event emit, total size %d",A,j,M)}),se.on("aborted",function(){N=!0,n("Request#%d %s: `res aborted` event emit, total size %d",A,j,M)}),ge){var be=oe(se);if(be.redirect){se.resume();return}return be.error?(se.resume(),ge.end(),ce(be.error,null,se)):(y.consumeWriteStream===!1?se.on("end",ce.bind(null,null,null,se)):ge.on("close",function(){n("Request#%d %s: writeStream close event emitted",A,j),ce(q||null,null,se)}),se.pipe(ge))}var we=[];se.on("data",function(ye){n("Request#%d %s: `res data` event emit, size %d",A,j,ye.length),M+=ye.length,we.push(ye)}),se.on("end",function(){var ye=r.concat(we,M);if(n("Request#%d %s: `res end` event emit, total size %d, _dumped: %s",A,j,M,se._dumped),q)return ce(q,ye,se);var le=oe(se);if(le.error)return ce(le.error,ye,se);le.redirect||me(se,ye,function(fe,pe,he){if(fe)return ce(fe,ye,se);if(!he&&S.indexOf(y.dataType)>=0){try{pe=decodeBodyByCharset(pe,se)}catch(je){return n("decodeBodyByCharset error: %s",je),ce(null,pe,se)}if(y.dataType==="json")if(M===0)pe=null;else{var ve=parseJSON(pe,L);ve.error?fe=ve.error:pe=ve.data}}N&&n("Request#%d %s: Remote socket was terminated before `response.end()` was called",A,j),ce(fe,pe,se)})})}var R,C;Array.isArray(y.timeout)?(R=o(y.timeout[0]),C=o(y.timeout[1])):R=C=o(y.timeout),n("ConnectTimeout: %d, ResponseTimeout: %d",R,C);function H(){n("Connect timer ticking, timeout: %d",R),K=setTimeout(function(){K=null,D===-1&&(D=-2);var se="Connect timeout for "+R+"ms",de="ConnectionTimeoutError";ne.socket||(de="SocketAssignTimeoutError",se+=", working sockets is full"),q=new Error(se),q.name=de,q.requestId=A,n("ConnectTimeout: Request#%d %s %s: %s, connected: %s",A,j,q.name,se,X),ue()},R)}function ee(){n("Response timer ticking, timeout: %d",C),J=setTimeout(function(){J=null;var se="Response timeout for "+C+"ms",de="ResponseTimeoutError";q=new Error(se),q.name=de,q.requestId=A,n("ResponseTimeout: Request#%d %s %s: %s, connected: %s",A,j,q.name,se,X),ue()},C)}var ne;Y.mode=y.mode?y.mode:"";try{ne=W.request(Y,$)}catch(se){return ce(se)}typeof window=="undefined"?H():ne.on("requestTimeout",function(){D===-1&&(D=-2);var se="Connect timeout for "+R+"ms",de="ConnectionTimeoutError";q=new Error(se),q.name=de,q.requestId=A,ue()});function ue(){n("Request#%d %s abort, connected: %s",A,j,X),ne.socket||(q.noSocket=!0,ce(q)),ne.abort()}return Q&&ne.on("finish",function(){Q.requestSent=Date.now()-_}),ne.once("socket",function(se){Q&&(Q.queuing=Date.now()-_);var de=se.readyState;if(de==="opening"){se.once("lookup",function(be,we,ye){n("Request#%d %s lookup: %s, %s, %s",A,j,be,we,ye),Q&&(Q.dnslookup=Date.now()-_),we&&(I=we)}),se.once("connect",function(){Q&&(Q.connected=Date.now()-_),Z(),ee(),n("Request#%d %s new socket connected",A,j),X=!0,I||(I=se.remoteAddress),te=se.remotePort});return}n("Request#%d %s reuse socket connected, readyState: %s",A,j,de),X=!0,ae=!0,I||(I=se.remoteAddress),te=se.remotePort,Z(),ee()}),ne.on("error",function(se){(se.name==="Error"||se.name==="TypeError")&&(se.name=X?"ResponseError":"RequestError"),se.message+=' (req "error")',n("Request#%d %s `req error` event emit, %s: %s",A,j,se.name,se.message),ce(q||se)}),ge&&ge.once("error",function(se){se.message+=' (writeStream "error")',q=se,n("Request#%d %s `writeStream error` event emit, %s: %s",A,j,se.name,se.message),ue()}),y.stream?(y.stream.pipe(ne),y.stream.once("error",function(se){se.message+=' (stream "error")',q=se,n("Request#%d %s `readStream error` event emit, %s: %s",A,j,se.name,se.message),ue()})):ne.end(z),ne.requestId=A,ne}}).call(this)}).call(this,e("_process"),e("buffer").Buffer)},{"@babel/runtime/helpers/interopRequireDefault":74,"@babel/runtime/helpers/typeof":75,_process:399,buffer:85,"core-js/modules/es.array.concat.js":241,"core-js/modules/es.function.name.js":253,"core-js/modules/es.object.to-string.js":258,"core-js/modules/es.promise.js":259,"core-js/modules/es.regexp.exec.js":261,"core-js/modules/es.string.split.js":268,"core-js/modules/es.string.trim.js":269,debug:397,http:400,https:302,"humanize-ms":303,url:404,util:352}]},{},[1])(1)})})(De);var Be=Me(De.exports);export{Be as O}; diff --git a/public/exadmin/assets/ant-design-vue.6b10f349.js b/public/exadmin/assets/ant-design-vue.6b10f349.js new file mode 100644 index 0000000..1aeac25 --- /dev/null +++ b/public/exadmin/assets/ant-design-vue.6b10f349.js @@ -0,0 +1,40 @@ +import{_ as Be,b as k,d as _e,e as H,f as O,h as Pe,i as os,r as sn,j as mi,k as pi,l as bb,m as Cb}from"./@babel.6cd0804c.js";import"./vue.db505ee4.js";import{G as xb,H as ht,T as ls,I as gn,d as Z,q as bt,x as nn,o as Ye,D as dn,z as yn,w as pe,B as ot,p as M,u as un,c,A as lt,J as wo,K as mm,L as is,r as U,M as Bl,f as Ze,n as Je,a as ut,N as Xt,O as Sb,P as da,v as ze,Q as Ln,R as hv,y as us,S as An,m as wb,t as qa,s as dt,U as Rt,b as cs,e as kb,V as Pb,F as pm,W as gi,X as ss,Y as Tb}from"./@vue.cb43a243.js";import{I as gm,C as ko,a as fa,E as Po,L as Rn,b as Un,c as ds,d as vs,e as fs,f as yi,g as mv,h as bi,S as Ci,D as To,V as Ib,i as hs,R as va,P as Ob,j as tr,k as ym,l as bm,m as Nb,n as ms,o as _b,p as Mb,q as Eb,Z as Fb,r as Ab,U as Rb,B as Db,s as Bb,t as Lb,A as Kb,u as Vb,v as oc,w as $b,W as jb,x as Hb,y as zb,F as Cm,z as Wb,M as Ub,G as Yb,H as Gb,J as qb,K as Xb,N as xm,O as Qb,Q as Zb,T as Jb,X as eC,Y as tC,_ as nC,$ as aC}from"./@ant-design.bcfb08ae.js";import{i as ps}from"./resize-observer-polyfill.8deb1e21.js";import{z as rC}from"./vue-types.6e6d84ba.js";import"./regenerator-runtime.8e24db72.js";import{T as su}from"./@ctrl.fa7cbd46.js";import{a as oC,b as lC}from"./dom-align.f1b5d360.js";import{i as xi,u as du,p as Sm,a as wm,b as km,d as Si,c as il,f as iC,o as uC,e as cC,g as sC,h as dC,j as vC,k as fC}from"./lodash-es.0ea26897.js";import{d as Gt,c as hC,a as mC,w as pC,l as gC,b as yC,e as bC}from"./dayjs.38e390ea.js";import{S as CC}from"./async-validator.5d25c98b.js";import{s as xC}from"./scroll-into-view-if-needed.5191fdbf.js";var SC=function(e){return typeof e=="function"},wC=Array.isArray,kC=function(e){return typeof e=="string"},PC=function(e){return e!==null&&Be(e)==="object"},TC=/^on[^a-z]/,IC=function(e){return TC.test(e)},Pm=function(e){var a=Object.create(null);return function(t){var r=a[t];return r||(a[t]=e(t))}},OC=/-(\w)/g,gs=Pm(function(n){return n.replace(OC,function(e,a){return a?a.toUpperCase():""})}),NC=/\B([A-Z])/g,_C=Pm(function(n){return n.replace(NC,"-$1").toLowerCase()}),MC=Object.prototype.hasOwnProperty,pv=function(e,a){return MC.call(e,a)};function EC(n,e,a,t){var r=n[a];if(r!=null){var o=pv(r,"default");if(o&&t===void 0){var l=r.default;t=r.type!==Function&&SC(l)?l():l}r.type===Boolean&&(!pv(e,a)&&!o?t=!1:t===""&&(t=!0))}return t}function FC(n){return Object.keys(n).reduce(function(e,a){return(a.substr(0,5)==="data-"||a.substr(0,5)==="aria-")&&(e[a]=n[a]),e},{})}function za(n){return typeof n=="number"?"".concat(n,"px"):n}function Qr(n){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},a=arguments.length>2?arguments[2]:void 0;return typeof n=="function"?n(e):n!=null?n:a}function te(){for(var n=[],e=0;e0&&arguments[0]!==void 0?arguments[0]:"",a=arguments.length>1?arguments[1]:void 0,t={},r=/;(?![^(]*\))/g,o=/:(.+)/;return Be(e)==="object"?e:(e.split(r).forEach(function(l){if(l){var i=l.split(o);if(i.length>1){var u=a?gs(i[0].trim()):i[0].trim();t[u]=i[1].trim()}}}),t)},oa=function(e,a){return e[a]!==void 0},St=function n(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,t=Array.isArray(e)?e:[e],r=[];return t.forEach(function(o){Array.isArray(o)?r.push.apply(r,_e(n(o,a))):o&&o.type===ht?r.push.apply(r,_e(n(o.children,a))):o&&gn(o)?a&&!Oo(o)?r.push(o):a||r.push(o):lc(o)&&r.push(o)}),r},Io=function(e){var a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"default",t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};if(gn(e))return e.type===ht?a==="default"?St(e.children):[]:e.children&&e.children[a]?St(e.children[a](t)):[];var r=e.$slots[a]&&e.$slots[a](t);return St(r)},ka=function(e){for(var a,t=((a=e==null?void 0:e.vnode)===null||a===void 0?void 0:a.el)||e&&(e.$el||e);t&&!t.tagName;)t=t.nextSibling;return t},Tm=function(e){var a={};if(e.$&&e.$.vnode){var t=e.$.vnode.props||{};Object.keys(e.$props).forEach(function(i){var u=e.$props[i],s=_C(i);(u!==void 0||s in t)&&(a[i]=u)})}else if(gn(e)&&Be(e.type)==="object"){var r=e.props||{},o={};Object.keys(r).forEach(function(i){o[gs(i)]=r[i]});var l=e.type.props||{};Object.keys(l).forEach(function(i){var u=EC(l,o,i,o[i]);(u!==void 0||i in o)&&(a[i]=u)})}return a},Cs=function(e){var a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"default",t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e,r=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,o=void 0;if(e.$){var l=e[a];if(l!==void 0)return typeof l=="function"&&r?l(t):l;o=e.$slots[a],o=r&&o?o(t):o}else if(gn(e)){var i=e.props&&e.props[a];if(i!==void 0&&e.props!==null)return typeof i=="function"&&r?i(t):i;e.type===ht?o=e.children:e.children&&e.children[a]&&(o=e.children[a],o=r&&o?o(t):o)}return Array.isArray(o)&&(o=St(o),o=o.length===1?o[0]:o,o=o.length===0?void 0:o),o};function gv(){var n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,a={};return n.$?a=k(k({},a),n.$attrs):a=k(k({},a),n.props),ys(a)[e?"onEvents":"events"]}function DC(n){var e=(gn(n)?n.props:n.$attrs)||{},a=e.class||{},t={};return typeof a=="string"?a.split(" ").forEach(function(r){t[r.trim()]=!0}):Array.isArray(a)?te(a).split(" ").forEach(function(r){t[r.trim()]=!0}):t=k(k({},t),a),t}function Im(n,e){var a=(gn(n)?n.props:n.$attrs)||{},t=a.style||{};if(typeof t=="string")t=bs(t,e);else if(e&&t){var r={};return Object.keys(t).forEach(function(o){return r[gs(o)]=t[o]}),r}return t}function BC(n){return n==null||n===""||Array.isArray(n)&&n.length===0}function Oo(n){return n&&(n.type===xb||n.type===ht&&n.children.length===0||n.type===ls&&n.children.trim()==="")}function LC(n){return n&&n.type===ls}function Ht(){var n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],e=[];return n.forEach(function(a){Array.isArray(a)?e.push.apply(e,_e(a)):a.type===ht?e.push.apply(e,_e(a.children)):e.push(a)}),e.filter(function(a){return!Oo(a)})}function Ur(n){if(n){var e=Ht(n);return e.length?e:void 0}else return n}function Vt(n){return Array.isArray(n)&&n.length===1&&(n=n[0]),n&&n.__v_isVNode&&Be(n.type)!=="symbol"}function wt(n,e){var a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"default",t,r;return(t=e[a])!==null&&t!==void 0?t:(r=n[a])===null||r===void 0?void 0:r.call(n)}var Nn=Z({name:"ResizeObserver",props:{disabled:Boolean,onResize:Function},emits:["resize"],setup:function(e,a){var t=a.slots,r=bt({width:0,height:0,offsetHeight:0,offsetWidth:0}),o=null,l=null,i=function(){l&&(l.disconnect(),l=null)},u=function(h){var f=e.onResize,m=h[0].target,y=m.getBoundingClientRect(),p=y.width,g=y.height,b=m.offsetWidth,C=m.offsetHeight,x=Math.floor(p),w=Math.floor(g);if(r.width!==x||r.height!==w||r.offsetWidth!==b||r.offsetHeight!==C){var S={width:x,height:w,offsetWidth:b,offsetHeight:C};k(r,S),f&&Promise.resolve().then(function(){f(k(k({},S),{offsetWidth:b,offsetHeight:C}),m)})}},s=nn(),d=function(){var h=e.disabled;if(h){i();return}var f=ka(s),m=f!==o;m&&(i(),o=f),!l&&f&&(l=new ps(u),l.observe(f))};return Ye(function(){d()}),dn(function(){d()}),yn(function(){i()}),pe(function(){return e.disabled},function(){d()},{flush:"post"}),function(){var v;return(v=t.default)===null||v===void 0?void 0:v.call(t)[0]}}}),Om=function(e){return setTimeout(e,16)},Nm=function(e){return clearTimeout(e)};typeof window!="undefined"&&"requestAnimationFrame"in window&&(Om=function(e){return window.requestAnimationFrame(e)},Nm=function(e){return window.cancelAnimationFrame(e)});var yv=0,xs=new Map;function _m(n){xs.delete(n)}function Qe(n){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1;yv+=1;var a=yv;function t(r){if(r===0)_m(a),n();else{var o=Om(function(){t(r-1)});xs.set(a,o)}}return t(e),a}Qe.cancel=function(n){var e=xs.get(n);return _m(e),Nm(e)};function ic(n){var e,a=function(o){return function(){e=null,n.apply(void 0,_e(o))}},t=function(){if(e==null){for(var o=arguments.length,l=new Array(o),i=0;in.top-a)return"".concat(a+e.top,"px")}function xv(n,e,a){if(a!==void 0&&e.bottom2&&arguments[2]!==void 0?arguments[2]:"";Hm(n,"[antdv: ".concat(e,"] ").concat(a))},uc="internalMark",ul=Z({name:"ALocaleProvider",props:{locale:{type:Object},ANT_MARK__:String},setup:function(e,a){var t=a.slots;Kt(e.ANT_MARK__===uc,"LocaleProvider","`LocaleProvider` is deprecated. Please use `locale` with `ConfigProvider` instead");var r=bt({antLocale:k(k({},e.locale),{exist:!0}),ANT_MARK__:uc});return lt("localeData",r),pe(function(){return e.locale},function(){r.antLocale=k(k({},e.locale),{exist:!0})},{immediate:!0}),function(){var o;return(o=t.default)===null||o===void 0?void 0:o.call(t)}}});ul.install=function(n){return n.component(ul.name,ul),n};var zm=Et(ul);globalThis&&globalThis.__rest;Tt("bottomLeft","bottomRight","topLeft","topRight");var ZC=function(e){return e!==void 0&&(e==="topLeft"||e==="topRight")?"slide-down":"slide-up"},Ma=function(e){var a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=e?k({name:e,appear:!0,enterFromClass:"".concat(e,"-enter ").concat(e,"-enter-prepare"),enterActiveClass:"".concat(e,"-enter ").concat(e,"-enter-prepare"),enterToClass:"".concat(e,"-enter ").concat(e,"-enter-active"),leaveFromClass:" ".concat(e,"-leave"),leaveActiveClass:"".concat(e,"-leave"),leaveToClass:"".concat(e,"-leave ").concat(e,"-leave-active")},a):k({css:!1},a);return t},Ss=function(e){var a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=e?k({name:e,appear:!0,appearActiveClass:"".concat(e),appearToClass:"".concat(e,"-appear ").concat(e,"-appear-active"),enterFromClass:"".concat(e,"-appear ").concat(e,"-enter ").concat(e,"-appear-prepare ").concat(e,"-enter-prepare"),enterActiveClass:"".concat(e),enterToClass:"".concat(e,"-enter ").concat(e,"-appear ").concat(e,"-appear-active ").concat(e,"-enter-active"),leaveActiveClass:"".concat(e," ").concat(e,"-leave"),leaveToClass:"".concat(e,"-leave-active")},a):k({css:!1},a);return t},ha=wo,Wm=mm,Bn=function(e,a,t){return t!==void 0?t:"".concat(e,"-").concat(a)},JC=Z({name:"Notice",inheritAttrs:!1,props:["prefixCls","duration","updateMark","noticeKey","closeIcon","closable","props","onClick","onClose","holder","visible"],setup:function(e,a){var t=a.attrs,r=a.slots,o,l=M(function(){return e.duration===void 0?1.5:e.duration}),i=function(){l.value&&(o=setTimeout(function(){s()},l.value*1e3))},u=function(){o&&(clearTimeout(o),o=null)},s=function(h){h&&h.stopPropagation(),u();var f=e.onClose,m=e.noticeKey;f&&f(m)},d=function(){u(),i()};return Ye(function(){i()}),yn(function(){u()}),pe([l,function(){return e.updateMark},function(){return e.visible}],function(v,h){var f=Pe(v,3),m=f[0],y=f[1],p=f[2],g=Pe(h,3),b=g[0],C=g[1],x=g[2];(m!==b||y!==C||p!==x&&x)&&d()},{flush:"post"}),function(){var v,h,f=e.prefixCls,m=e.closable,y=e.closeIcon,p=y===void 0?(v=r.closeIcon)===null||v===void 0?void 0:v.call(r):y,g=e.onClick,b=e.holder,C=t.class,x=t.style,w="".concat(f,"-notice"),S=Object.keys(t).reduce(function(T,I){return(I.substr(0,5)==="data-"||I.substr(0,5)==="aria-"||I==="role")&&(T[I]=t[I]),T},{}),P=c("div",H({class:te(w,C,O({},"".concat(w,"-closable"),m)),style:x,onMouseenter:u,onMouseleave:i,onClick:g},S),[c("div",{class:"".concat(w,"-content")},[(h=r.default)===null||h===void 0?void 0:h.call(r)]),m?c("a",{tabindex:0,onClick:s,class:"".concat(w,"-close")},[p||c("span",{class:"".concat(w,"-close-x")},null)]):null]);return b?c(is,{to:b},{default:function(){return P}}):P}}}),e1=globalThis&&globalThis.__rest||function(n,e){var a={};for(var t in n)Object.prototype.hasOwnProperty.call(n,t)&&e.indexOf(t)<0&&(a[t]=n[t]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,t=Object.getOwnPropertySymbols(n);r=p&&(y.key=b[0].notice.key,y.updateMark=Tv(),y.userPassKey=m,b.shift()),b.push({notice:y,holderCallback:f})),i.value=b},d=function(h){i.value=i.value.filter(function(f){var m=f.notice,y=m.key,p=m.userPassKey,g=p||y;return g!==h})};return r({add:s,remove:d,notices:i}),function(){var v,h,f=e.prefixCls,m=e.closeIcon,y=m===void 0?(h=o.closeIcon)===null||h===void 0?void 0:h.call(o,{prefixCls:f}):m,p=i.value.map(function(b,C){var x=b.notice,w=b.holderCallback,S=C===i.value.length-1?x.updateMark:void 0,P=x.key,T=x.userPassKey,I=x.content,N=k(k(k({prefixCls:f,closeIcon:typeof y=="function"?y({prefixCls:f}):y},x),x.props),{key:P,noticeKey:T||P,updateMark:S,onClose:function(R){var E;d(R),(E=x.onClose)===null||E===void 0||E.call(x)},onClick:x.onClick});return w?c("div",{key:P,class:"".concat(f,"-hook-holder"),ref:function(R){typeof P!="undefined"&&(R?(l.set(P,R),w(R,N)):l.delete(P))}},null):c(JC,N,{default:function(){return[typeof I=="function"?I({prefixCls:f}):I]}})}),g=(v={},O(v,f,1),O(v,t.class,!!t.class),v);return c("div",{class:g,style:t.style||{top:"65px",left:"50%"}},[c(mm,H({tag:"div"},u.value),{default:function(){return[p]}})])}}});cc.newInstance=function(e,a){var t=e||{},r=t.name,o=r===void 0?"notification":r,l=t.getContainer,i=t.appContext,u=t.prefixCls,s=t.rootPrefixCls,d=t.transitionName,v=t.hasTransitionName,h=e1(t,["name","getContainer","appContext","prefixCls","rootPrefixCls","transitionName","hasTransitionName"]),f=document.createElement("div");if(l){var m=l();m.appendChild(f)}else document.body.appendChild(f);var y=Z({name:"NotificationWrapper",setup:function(b,C){var x=C.attrs,w=U();return Ye(function(){a({notice:function(P){var T;(T=w.value)===null||T===void 0||T.add(P)},removeNotice:function(P){var T;(T=w.value)===null||T===void 0||T.remove(P)},destroy:function(){Bl(null,f),f.parentNode&&f.parentNode.removeChild(f)},component:w})}),function(){var S=pn,P=S.getPrefixCls(o,u),T=S.getRootPrefixCls(s,P),I=v?d:"".concat(T,"-").concat(d);return c(Is,H(H({},S),{},{notUpdateGlobalConfig:!0,prefixCls:T}),{default:function(){return[c(cc,H(H({ref:w},x),{},{prefixCls:P,transitionName:I}),null)]}})}}}),p=c(y,h);p.appContext=i||p.appContext,Bl(p,f)};var Um=cc,Ym=3,Gm,tn,n1=1,qm="",Xm="move-up",Qm=!1,Zm=function(){return document.body},Jm,ep=!1;function a1(){return n1++}function r1(n){n.top!==void 0&&(Gm=n.top,tn=null),n.duration!==void 0&&(Ym=n.duration),n.prefixCls!==void 0&&(qm=n.prefixCls),n.getContainer!==void 0&&(Zm=n.getContainer,tn=null),n.transitionName!==void 0&&(Xm=n.transitionName,tn=null,Qm=!0),n.maxCount!==void 0&&(Jm=n.maxCount,tn=null),n.rtl!==void 0&&(ep=n.rtl)}function o1(n,e){if(tn){e(tn);return}Um.newInstance({appContext:n.appContext,prefixCls:n.prefixCls||qm,rootPrefixCls:n.rootPrefixCls,transitionName:Xm,hasTransitionName:Qm,style:{top:Gm},getContainer:Zm||n.getPopupContainer,maxCount:Jm,name:"message"},function(a){if(tn){e(tn);return}tn=a,e(a)})}var l1={info:gm,success:ko,error:fa,warning:Po,loading:Rn};function i1(n){var e=n.duration!==void 0?n.duration:Ym,a=n.key||a1(),t=new Promise(function(o){var l=function(){return typeof n.onClose=="function"&&n.onClose(),o(!0)};o1(n,function(i){i.notice({key:a,duration:e,style:n.style||{},class:n.class,content:function(s){var d,v=s.prefixCls,h=l1[n.type],f=h?c(h,null,null):"",m=te("".concat(v,"-custom-content"),(d={},O(d,"".concat(v,"-").concat(n.type),n.type),O(d,"".concat(v,"-rtl"),ep===!0),d));return c("div",{class:m},[typeof n.icon=="function"?n.icon():n.icon||f,c("span",null,[typeof n.content=="function"?n.content():n.content])])},onClose:l,onClick:n.onClick})})}),r=function(){tn&&tn.removeNotice(a)};return r.then=function(o,l){return t.then(o,l)},r.promise=t,r}function u1(n){return Object.prototype.toString.call(n)==="[object Object]"&&!!n.content}var Ll={open:i1,config:r1,destroy:function(e){if(tn)if(e){var a=tn,t=a.removeNotice;t(e)}else{var r=tn,o=r.destroy;o(),tn=null}}};function c1(n,e){n[e]=function(a,t,r){return u1(a)?n.open(k(k({},a),{type:e})):(typeof t=="function"&&(r=t,t=void 0),n.open({content:a,duration:t,type:e,onClose:r}))}}["success","info","warning","error","loading"].forEach(function(n){return c1(Ll,n)});Ll.warn=Ll.warning;var ws=Ll;globalThis&&globalThis.__awaiter;var Wa={},tp=4.5,np="24px",ap="24px",sc="",rp="topRight",op=function(){return document.body},lp=null,dc=!1,ip;function s1(n){var e=n.duration,a=n.placement,t=n.bottom,r=n.top,o=n.getContainer,l=n.closeIcon,i=n.prefixCls;i!==void 0&&(sc=i),e!==void 0&&(tp=e),a!==void 0&&(rp=a),t!==void 0&&(ap=typeof t=="number"?"".concat(t,"px"):t),r!==void 0&&(np=typeof r=="number"?"".concat(r,"px"):r),o!==void 0&&(op=o),l!==void 0&&(lp=l),n.rtl!==void 0&&(dc=n.rtl),n.maxCount!==void 0&&(ip=n.maxCount)}function d1(n){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:np,a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:ap,t;switch(n){case"topLeft":t={left:"0px",top:e,bottom:"auto"};break;case"topRight":t={right:"0px",top:e,bottom:"auto"};break;case"bottomLeft":t={left:"0px",top:"auto",bottom:a};break;default:t={right:"0px",top:"auto",bottom:a};break}return t}function v1(n,e){var a=n.prefixCls,t=n.placement,r=t===void 0?rp:t,o=n.getContainer,l=o===void 0?op:o,i=n.top,u=n.bottom,s=n.closeIcon,d=s===void 0?lp:s,v=n.appContext,h=T1(),f=h.getPrefixCls,m=f("notification",a||sc),y="".concat(m,"-").concat(r,"-").concat(dc),p=Wa[y];if(p){Promise.resolve(p).then(function(b){e(b)});return}var g=te("".concat(m,"-").concat(r),O({},"".concat(m,"-rtl"),dc===!0));Um.newInstance({name:"notification",prefixCls:a||sc,class:g,style:d1(r,i,u),appContext:v,getContainer:l,closeIcon:function(C){var x=C.prefixCls,w=c("span",{class:"".concat(x,"-close-x")},[Qr(d,{},c(Un,{class:"".concat(x,"-close-icon")},null))]);return w},maxCount:ip,hasTransitionName:!0},function(b){Wa[y]=b,e(b)})}var f1={success:ds,info:vs,error:fs,warning:yi};function h1(n){var e=n.icon,a=n.type,t=n.description,r=n.message,o=n.btn,l=n.duration===void 0?tp:n.duration;v1(n,function(i){i.notice({content:function(s){var d=s.prefixCls,v="".concat(d,"-notice"),h=null;if(e)h=function(){return c("span",{class:"".concat(v,"-icon")},[Qr(e)])};else if(a){var f=f1[a];h=function(){return c(f,{class:"".concat(v,"-icon ").concat(v,"-icon-").concat(a)},null)}}return c("div",{class:h?"".concat(v,"-with-icon"):""},[h&&h(),c("div",{class:"".concat(v,"-message")},[!t&&h?c("span",{class:"".concat(v,"-message-single-line-auto-margin")},null):null,Qr(r)]),c("div",{class:"".concat(v,"-description")},[Qr(t)]),o?c("span",{class:"".concat(v,"-btn")},[Qr(o)]):null])},duration:l,closable:!0,onClose:n.onClose,onClick:n.onClick,key:n.key,style:n.style||{},class:n.class})})}var ho={open:h1,close:function(e){Object.keys(Wa).forEach(function(a){return Promise.resolve(Wa[a]).then(function(t){t.removeNotice(e)})})},config:s1,destroy:function(){Object.keys(Wa).forEach(function(e){Promise.resolve(Wa[e]).then(function(a){a.destroy()}),delete Wa[e]})}},m1=["success","info","warning","error"];m1.forEach(function(n){ho[n]=function(e){return ho.open(k(k({},e),{type:n}))}});ho.warn=ho.warning;var ks=ho;function rr(){return!!(typeof window!="undefined"&&window.document&&window.document.createElement)}var p1="vc-util-key";function up(){var n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=n.mark;return e?e.startsWith("data-")?e:"data-".concat(e):p1}function Ps(n){if(n.attachTo)return n.attachTo;var e=document.querySelector("head");return e||document.body}function Iv(n){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},a,t;if(!rr())return null;var r=document.createElement("style");((a=e.csp)===null||a===void 0?void 0:a.nonce)&&(r.nonce=(t=e.csp)===null||t===void 0?void 0:t.nonce),r.innerHTML=n;var o=Ps(e),l=o.firstChild;return e.prepend&&o.prepend?o.prepend(r):e.prepend&&l?o.insertBefore(r,l):o.appendChild(r),r}var vc=new Map;function g1(n){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},a=Ps(e);return Array.from(vc.get(a).children).find(function(t){return t.tagName==="STYLE"&&t.getAttribute(up(e))===n})}function y1(n,e){var a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},t,r,o,l=Ps(a);if(!vc.has(l)){var i=Iv("",a),u=i.parentNode;vc.set(l,u),u.removeChild(i)}var s=g1(e,a);if(s)return((t=a.csp)===null||t===void 0?void 0:t.nonce)&&s.nonce!==((r=a.csp)===null||r===void 0?void 0:r.nonce)&&(s.nonce=(o=a.csp)===null||o===void 0?void 0:o.nonce),s.innerHTML!==n&&(s.innerHTML=n),s;var d=Iv(n,a);return d.setAttribute(up(a),e),d}var gt=function(n,e,a){Hm(n,"[ant-design-vue: ".concat(e,"] ").concat(a))},b1="-ant-".concat(Date.now(),"-").concat(Math.random());function C1(n,e){var a={},t=function(d,v){var h=d.clone();return h=(v==null?void 0:v(h))||h,h.toRgbString()},r=function(d,v){var h=new su(d),f=mv(h.toRgbString());a["".concat(v,"-color")]=t(h),a["".concat(v,"-color-disabled")]=f[1],a["".concat(v,"-color-hover")]=f[4],a["".concat(v,"-color-active")]=f[7],a["".concat(v,"-color-outline")]=h.clone().setAlpha(.2).toRgbString(),a["".concat(v,"-color-deprecated-bg")]=f[1],a["".concat(v,"-color-deprecated-border")]=f[3]};if(e.primaryColor){r(e.primaryColor,"primary");var o=new su(e.primaryColor),l=mv(o.toRgbString());l.forEach(function(s,d){a["primary-".concat(d+1)]=s}),a["primary-color-deprecated-l-35"]=t(o,function(s){return s.lighten(35)}),a["primary-color-deprecated-l-20"]=t(o,function(s){return s.lighten(20)}),a["primary-color-deprecated-t-20"]=t(o,function(s){return s.tint(20)}),a["primary-color-deprecated-t-50"]=t(o,function(s){return s.tint(50)}),a["primary-color-deprecated-f-12"]=t(o,function(s){return s.setAlpha(s.getAlpha()*.12)});var i=new su(l[0]);a["primary-color-active-deprecated-f-30"]=t(i,function(s){return s.setAlpha(s.getAlpha()*.3)}),a["primary-color-active-deprecated-d-02"]=t(i,function(s){return s.darken(2)})}e.successColor&&r(e.successColor,"success"),e.warningColor&&r(e.warningColor,"warning"),e.errorColor&&r(e.errorColor,"error"),e.infoColor&&r(e.infoColor,"info");var u=Object.keys(a).map(function(s){return"--".concat(n,"-").concat(s,": ").concat(a[s],";")});rr()?y1(` + :root { + `.concat(u.join(` +`),` + } + `),"".concat(b1,"-dynamic-theme")):gt(!1,"ConfigProvider","SSR do not support dynamic theme with css variables.")}var cp=Symbol("GlobalFormContextKey"),x1=function(e){lt(cp,e)},S1=function(){return ot(cp,{validateMessages:M(function(){})})},w1=function(){return{getTargetContainer:{type:Function},getPopupContainer:{type:Function},prefixCls:String,getPrefixCls:{type:Function},renderEmpty:{type:Function},transformCellText:{type:Function},csp:{type:Object,default:void 0},input:{type:Object},autoInsertSpaceInButton:{type:Boolean,default:void 0},locale:{type:Object,default:void 0},pageHeader:{type:Object},componentSize:{type:String},direction:{type:String},space:{type:Object},virtual:{type:Boolean,default:void 0},dropdownMatchSelectWidth:{type:[Number,Boolean],default:!0},form:{type:Object,default:void 0},notUpdateGlobalConfig:Boolean}},k1="ant";function kr(){return pn.prefixCls||k1}var fc=bt({}),sp=bt({}),pn=bt({});Ze(function(){k(pn,fc,sp),pn.prefixCls=kr(),pn.getPrefixCls=function(n,e){return e||(n?"".concat(pn.prefixCls,"-").concat(n):pn.prefixCls)},pn.getRootPrefixCls=function(n,e){return n||(pn.prefixCls?pn.prefixCls:e&&e.includes("-")?e.replace(/^(.*)-[^-]*$/,"$1"):kr())}});var vu,P1=function(e){vu&&vu(),vu=Ze(function(){k(sp,bt(e))}),e.theme&&C1(kr(),e.theme)},T1=function(){return{getPrefixCls:function(a,t){return t||(a?"".concat(kr(),"-").concat(a):kr())},getRootPrefixCls:function(a,t){return a||(pn.prefixCls?pn.prefixCls:t&&t.includes("-")?t.replace(/^(.*)-[^-]*$/,"$1"):kr())}}},ao=Z({name:"AConfigProvider",inheritAttrs:!1,props:w1(),setup:function(e,a){var t=a.slots,r=function(v,h){var f=e.prefixCls,m=f===void 0?"ant":f;return h||(v?"".concat(m,"-").concat(v):m)},o=function(v){var h=e.renderEmpty||t.renderEmpty||$m;return h(v)},l=function(v,h){var f=e.prefixCls;if(h)return h;var m=f||r("");return v?"".concat(m,"-").concat(v):m},i=bt(k(k({},e),{getPrefixCls:l,renderEmpty:o}));Object.keys(e).forEach(function(d){pe(function(){return e[d]},function(){i[d]=e[d]})}),e.notUpdateGlobalConfig||(k(fc,i),pe(i,function(){k(fc,i)}));var u=M(function(){var d,v,h={};return e.locale&&(h=((d=e.locale.Form)===null||d===void 0?void 0:d.defaultValidateMessages)||((v=Dn.Form)===null||v===void 0?void 0:v.defaultValidateMessages)||{}),e.form&&e.form.validateMessages&&(h=k(k({},h),e.form.validateMessages)),h});x1({validateMessages:u}),lt("configProvider",i);var s=function(v){var h;return c(zm,{locale:e.locale||v,ANT_MARK__:uc},{default:function(){return[(h=t.default)===null||h===void 0?void 0:h.call(t)]}})};return Ze(function(){e.direction&&(ws.config({rtl:e.direction==="rtl"}),ks.config({rtl:e.direction==="rtl"}))}),function(){return c(Br,{children:function(v,h,f){return s(f)}},null)}}}),Ts=bt({getPrefixCls:function(e,a){return a||(e?"ant-".concat(e):"ant")},renderEmpty:$m,direction:"ltr"});ao.config=P1;ao.install=function(n){n.component(ao.name,ao)};var Is=ao,Re=function(n,e){var a=ot("configProvider",Ts),t=M(function(){return a.getPrefixCls(n,e.prefixCls)}),r=M(function(){var b;return(b=e.direction)!==null&&b!==void 0?b:a.direction}),o=M(function(){return a.getPrefixCls()}),l=M(function(){return a.autoInsertSpaceInButton}),i=M(function(){return a.renderEmpty}),u=M(function(){return a.space}),s=M(function(){return a.pageHeader}),d=M(function(){return a.form}),v=M(function(){return e.getTargetContainer||a.getTargetContainer}),h=M(function(){return e.getPopupContainer||a.getPopupContainer}),f=M(function(){var b;return(b=e.dropdownMatchSelectWidth)!==null&&b!==void 0?b:a.dropdownMatchSelectWidth}),m=M(function(){return(e.virtual===void 0?a.virtual!==!1:e.virtual!==!1)&&f.value!==!1}),y=M(function(){return e.size||a.componentSize}),p=M(function(){var b;return e.autocomplete||((b=a.input)===null||b===void 0?void 0:b.autocomplete)}),g=M(function(){return a.csp});return{configProvider:a,prefixCls:t,direction:r,size:y,getTargetContainer:v,getPopupContainer:h,space:u,pageHeader:s,form:d,autoInsertSpaceInButton:l,renderEmpty:i,virtual:m,dropdownMatchSelectWidth:f,rootPrefixCls:o,getPrefixCls:a.getPrefixCls,autocomplete:p,csp:g}};function tt(n,e){for(var a=k({},n),t=0;t1&&arguments[1]!==void 0?arguments[1]:{},a=e.getContainer,t=a===void 0?function(){return window}:a,r=e.callback,o=e.duration,l=o===void 0?450:o,i=t(),u=Os(i,!0),s=Date.now(),d=function v(){var h=Date.now(),f=h-s,m=_1(f>l?l:f,u,n,l);hc(i)?i.scrollTo(window.pageXOffset,m):i instanceof HTMLDocument||i.constructor.name==="HTMLDocument"?i.documentElement.scrollTop=m:i.scrollTop=m,f0&&arguments[0]!==void 0?arguments[0]:0,P=arguments.length>1&&arguments[1]!==void 0?arguments[1]:5,T=[],I=y.value();if(f.links.forEach(function(A){var R=Nv.exec(A.toString());if(!!R){var E=document.getElementById(R[1]);if(E){var L=Ov(E,I);LA.top?R:A});return N.link}return""},g=function(S){var P=e.getCurrentAnchor;m.value!==S&&(m.value=typeof P=="function"?P():S,t("change",S))},b=function(S){var P=e.offsetTop,T=e.targetOffset;g(S);var I=y.value(),N=Os(I,!0),A=Nv.exec(S);if(!!A){var R=document.getElementById(A[1]);if(!!R){var E=Ov(R,I),L=N+E;L-=T!==void 0?T:P||0,f.animating=!0,Ns(L,{callback:function(){f.animating=!1},getContainer:y.value})}}};l({scrollTo:b});var C=function(){if(!f.animating){var S=e.offsetTop,P=e.bounds,T=e.targetOffset,I=p(T!==void 0?T:S||0,P);g(I)}},x=function(){var S=h.value.getElementsByClassName("".concat(u.value,"-link-title-active"))[0];S&&(v.value.style.top="".concat(S.offsetTop+S.clientHeight/2-4.5,"px"))};return F1({registerLink:function(S){f.links.includes(S)||f.links.push(S)},unregisterLink:function(S){var P=f.links.indexOf(S);P!==-1&&f.links.splice(P,1)},activeLink:m,scrollTo:b,handleClick:function(S,P){t("click",S,P)}}),Ye(function(){Je(function(){var w=y.value();f.scrollContainer=w,f.scrollEvent=Pt(f.scrollContainer,"scroll",C),C()})}),ut(function(){f.scrollEvent&&f.scrollEvent.remove()}),dn(function(){if(f.scrollEvent){var w=y.value();f.scrollContainer!==w&&(f.scrollContainer=w,f.scrollEvent.remove(),f.scrollEvent=Pt(f.scrollContainer,"scroll",C),C())}x()}),function(){var w,S=e.offsetTop,P=e.affix,T=e.showInkInFixed,I=u.value,N=te("".concat(I,"-ink-ball"),{visible:m.value}),A=te(e.wrapperClass,"".concat(I,"-wrapper"),O({},"".concat(I,"-rtl"),d.value==="rtl")),R=te(I,O({},"".concat(I,"-fixed"),!P&&!T)),E=k({maxHeight:S?"calc(100vh - ".concat(S,"px)"):"100vh"},e.wrapperStyle),L=c("div",{class:A,style:E,ref:h},[c("div",{class:R},[c("div",{class:"".concat(I,"-ink")},[c("span",{class:N,ref:v},null)]),(w=o.default)===null||w===void 0?void 0:w.call(o)])]);return P?c(dp,H(H({},r),{},{offsetTop:S,target:y.value}),{default:function(){return[L]}}):L}}}),D1=function(){return{prefixCls:String,href:String,title:$.any,target:String}},fp=Z({name:"AAnchorLink",props:it(D1(),{href:"#"}),slots:["title"],setup:function(e,a){var t=a.slots,r=null,o=E1(),l=o.handleClick,i=o.scrollTo,u=o.unregisterLink,s=o.registerLink,d=o.activeLink,v=Re("anchor",e),h=v.prefixCls,f=function(y){var p=e.href;l(y,{title:r,href:p}),i(p)};return pe(function(){return e.href},function(m,y){Je(function(){u(y),s(m)})}),Ye(function(){s(e.href)}),ut(function(){u(e.href)}),function(){var m,y=e.href,p=e.target,g=h.value,b=wt(t,e,"title");r=b;var C=d.value===y,x=te("".concat(g,"-link"),O({},"".concat(g,"-link-active"),C)),w=te("".concat(g,"-link-title"),O({},"".concat(g,"-link-title-active"),C));return c("div",{class:x},[c("a",{class:w,href:y,title:typeof b=="string"?b:"",target:p,onClick:f},[b]),(m=t.default)===null||m===void 0?void 0:m.call(t)])}}});Ua.Link=fp;Ua.install=function(n){return n.component(Ua.name,Ua),n.component(Ua.Link.name,Ua.Link),n};function _v(n,e){var a=n.key,t;return"value"in n&&(t=n.value),a!=null?a:t!==void 0?t:"rc-index-key-".concat(e)}function hp(n,e){var a=n||{},t=a.label,r=a.value,o=a.options;return{label:t||(e?"children":"label"),value:r||"value",options:o||"options"}}function B1(n){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},a=e.fieldNames,t=e.childrenAsData,r=[],o=hp(a,!1),l=o.label,i=o.value,u=o.options;function s(d,v){d.forEach(function(h){var f=h[l];if(v||!(u in h)){var m=h[i];r.push({key:_v(h,r.length),groupOption:v,data:h,label:f,value:m})}else{var y=f;y===void 0&&t&&(y=h.label),r.push({key:_v(h,r.length),group:!0,data:h,label:y}),s(h[u],!0)}})}return s(n,!1),r}function mc(n){var e=k({},n);return"props"in e||Object.defineProperty(e,"props",{get:function(){return e}}),e}function L1(n,e){if(!e||!e.length)return null;var a=!1;function t(o,l){var i=os(l),u=i[0],s=i.slice(1);if(!u)return[o];var d=o.split(u);return a=a||d.length>1,d.reduce(function(v,h){return[].concat(_e(v),_e(t(h,s)))},[]).filter(function(v){return v})}var r=t(n,e);return a?r:null}function Ya(n,e){return n?n.contains(e):!1}var mp=["moz","ms","webkit"];function K1(){var n=0;return function(e){var a=new Date().getTime(),t=Math.max(0,16-(a-n)),r=window.setTimeout(function(){e(a+t)},t);return n=a+t,r}}function V1(){if(typeof window=="undefined")return function(){};if(window.requestAnimationFrame)return window.requestAnimationFrame.bind(window);var n=mp.filter(function(e){return"".concat(e,"RequestAnimationFrame")in window})[0];return n?window["".concat(n,"RequestAnimationFrame")]:K1()}function $1(n){if(typeof window=="undefined")return null;if(window.cancelAnimationFrame)return window.cancelAnimationFrame(n);var e=mp.filter(function(a){return"".concat(a,"CancelAnimationFrame")in window||"".concat(a,"CancelRequestAnimationFrame")in window})[0];return e?(window["".concat(e,"CancelAnimationFrame")]||window["".concat(e,"CancelRequestAnimationFrame")]).call(this,n):clearTimeout(n)}var Mv=V1(),j1=function(e){return $1(e.id)},H1=function(e){var a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,t=Date.now();function r(){Date.now()-t>=a?e.call():o.id=Mv(r)}var o={id:Mv(r)};return o},_s={visible:Boolean,prefixCls:String,zIndex:Number,destroyPopupOnHide:Boolean,forceRender:Boolean,animation:[String,Object],transitionName:String,stretch:{type:String},align:{type:Object},point:{type:Object},getRootDomNode:{type:Function},getClassNameFromAlign:{type:Function},onMouseenter:{type:Function},onMouseleave:{type:Function},onMousedown:{type:Function},onTouchstart:{type:Function}},z1=k(k({},_s),{mobile:{type:Object}}),W1=k(k({},_s),{mask:Boolean,mobile:{type:Object},maskAnimation:String,maskTransitionName:String});function pp(n){var e=n.prefixCls,a=n.animation,t=n.transitionName;return a?{name:"".concat(e,"-").concat(a)}:t?{name:t}:{}}function gp(n){var e=n.prefixCls,a=n.visible,t=n.zIndex,r=n.mask,o=n.maskAnimation,l=n.maskTransitionName;if(!r)return null;var i={};return(l||o)&&(i=pp({prefixCls:e,transitionName:l,animation:o})),c(wo,H({appear:!0},i),{default:function(){return[Xt(c("div",{style:{zIndex:t},class:"".concat(e,"-mask")},null),[[Sb("if"),a]])]}})}gp.displayName="Mask";var U1=Z({name:"MobilePopupInner",inheritAttrs:!1,props:z1,emits:["mouseenter","mouseleave","mousedown","touchstart","align"],setup:function(e,a){var t=a.expose,r=a.slots,o=U();return t({forceAlign:function(){},getElement:function(){return o.value}}),function(){var l,i=e.zIndex,u=e.visible,s=e.prefixCls,d=e.mobile;d=d===void 0?{}:d;var v=d.popupClassName,h=d.popupStyle,f=d.popupMotion,m=f===void 0?{}:f,y=d.popupRender,p=k({zIndex:i},h),g=St((l=r.default)===null||l===void 0?void 0:l.call(r));g.length>1&&(g=c("div",{class:"".concat(s,"-content")},[g])),y&&(g=y(g));var b=te(s,v);return c(wo,H({ref:o},m),{default:function(){return[u?c("div",{class:b,style:p},[g]):null]}})}}}),Y1=globalThis&&globalThis.__awaiter||function(n,e,a,t){function r(o){return o instanceof a?o:new a(function(l){l(o)})}return new(a||(a=Promise))(function(o,l){function i(d){try{s(t.next(d))}catch(v){l(v)}}function u(d){try{s(t.throw(d))}catch(v){l(v)}}function s(d){d.done?o(d.value):r(d.value).then(i,u)}s((t=t.apply(n,e||[])).next())})},Ev=["measure","align",null,"motion"],G1=function(n,e){var a=U(null),t=U(),r=U(!1);function o(u){r.value||(a.value=u)}function l(){Qe.cancel(t.value)}function i(u){l(),t.value=Qe(function(){var s=a.value;switch(a.value){case"align":s="motion";break;case"motion":s="stable";break}o(s),u==null||u()})}return pe(n,function(){o("measure")},{immediate:!0,flush:"post"}),Ye(function(){pe(a,function(){switch(a.value){case"measure":e();break}a.value&&(t.value=Qe(function(){return Y1(void 0,void 0,void 0,sn.mark(function u(){var s,d;return sn.wrap(function(h){for(;;)switch(h.prev=h.next){case 0:s=Ev.indexOf(a.value),d=Ev[s+1],d&&s!==-1&&o(d);case 3:case"end":return h.stop()}},u)}))}))},{immediate:!0,flush:"post"})}),ut(function(){r.value=!0,l()}),[a,i]},q1=function(n){var e=U({width:0,height:0});function a(r){e.value={width:r.offsetWidth,height:r.offsetHeight}}var t=M(function(){var r={};if(n.value){var o=e.value,l=o.width,i=o.height;n.value.indexOf("height")!==-1&&i?r.height="".concat(i,"px"):n.value.indexOf("minHeight")!==-1&&i&&(r.minHeight="".concat(i,"px")),n.value.indexOf("width")!==-1&&l?r.width="".concat(l,"px"):n.value.indexOf("minWidth")!==-1&&l&&(r.minWidth="".concat(l,"px"))}return r});return[t,a]};function ft(n){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,t=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1,r=n;if(Array.isArray(n)&&(r=Ht(n)[0]),!r)return null;var o=da(r,e,t);return o.props=a?k(k({},o.props),e):o.props,Kt(Be(o.props.class)!=="object","class must be string"),o}function X1(n){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;return n.map(function(t){return ft(t,e,a)})}var Ms=function(n){if(!n)return!1;if(n.offsetParent)return!0;if(n.getBBox){var e=n.getBBox();if(e.width||e.height)return!0}if(n.getBoundingClientRect){var a=n.getBoundingClientRect();if(a.width||a.height)return!0}return!1};function Q1(n,e){return n===e?!0:!n||!e?!1:"pageX"in e&&"pageY"in e?n.pageX===e.pageX&&n.pageY===e.pageY:"clientX"in e&&"clientY"in e?n.clientX===e.clientX&&n.clientY===e.clientY:!1}function Z1(n,e){n!==document.activeElement&&Ya(e,n)&&typeof n.focus=="function"&&n.focus()}function Fv(n,e){var a=null,t=null;function r(l){var i=Pe(l,1),u=i[0].target;if(!!document.documentElement.contains(u)){var s=u.getBoundingClientRect(),d=s.width,v=s.height,h=Math.floor(d),f=Math.floor(v);(a!==h||t!==f)&&Promise.resolve().then(function(){e({width:h,height:f})}),a=h,t=f}}var o=new ps(r);return n&&o.observe(n),function(){o.disconnect()}}var J1=function(n,e){var a=!1,t=null;function r(){clearTimeout(t)}function o(l){if(!a||l===!0){if(n()===!1)return;a=!0,r(),t=setTimeout(function(){a=!1},e.value)}else r(),t=setTimeout(function(){a=!1,o()},e.value)}return[o,function(){a=!1,r()}]},ex={align:Object,target:[Object,Function],onAlign:Function,monitorBufferTime:Number,monitorWindowResize:Boolean,disabled:Boolean};function Av(n){return typeof n!="function"?null:n()}function Rv(n){return Be(n)!=="object"||!n?null:n}var tx=Z({name:"Align",props:ex,emits:["align"],setup:function(e,a){var t=a.expose,r=a.slots,o=U({}),l=U(),i=J1(function(){var y=e.disabled,p=e.target,g=e.align,b=e.onAlign;if(!y&&p&&l.value){var C=l.value,x,w=Av(p),S=Rv(p);o.value.element=w,o.value.point=S,o.value.align=g;var P=document,T=P.activeElement;return w&&Ms(w)?x=oC(C,w,g):S&&(x=lC(C,S,g)),Z1(T,C),b&&x&&b(C,x),!0}return!1},M(function(){return e.monitorBufferTime})),u=Pe(i,2),s=u[0],d=u[1],v=U({cancel:function(){}}),h=U({cancel:function(){}}),f=function(){var p=e.target,g=Av(p),b=Rv(p);l.value!==h.value.element&&(h.value.cancel(),h.value.element=l.value,h.value.cancel=Fv(l.value,s)),(o.value.element!==g||!Q1(o.value.point,b)||!xi(o.value.align,e.align))&&(s(),v.value.element!==g&&(v.value.cancel(),v.value.element=g,v.value.cancel=Fv(g,s)))};Ye(function(){Je(function(){f()})}),dn(function(){Je(function(){f()})}),pe(function(){return e.disabled},function(y){y?d():s()},{immediate:!0,flush:"post"});var m=U(null);return pe(function(){return e.monitorWindowResize},function(y){y?m.value||(m.value=Pt(window,"resize",s)):m.value&&(m.value.remove(),m.value=null)},{flush:"post"}),yn(function(){v.value.cancel(),h.value.cancel(),m.value&&m.value.remove(),d()}),t({forceAlign:function(){return s(!0)}}),function(){var y=r==null?void 0:r.default();return y?ft(y[0],{ref:l},!0,!0):null}}}),nx=Z({name:"PopupInner",inheritAttrs:!1,props:_s,emits:["mouseenter","mouseleave","mousedown","touchstart","align"],setup:function(e,a){var t=a.expose,r=a.attrs,o=a.slots,l=U(),i=U(),u=U(),s=q1(ze(e,"stretch")),d=Pe(s,2),v=d[0],h=d[1],f=function(){e.stretch&&h(e.getRootDomNode())},m=U(!1),y;pe(function(){return e.visible},function(A){clearTimeout(y),A?y=setTimeout(function(){m.value=e.visible}):m.value=!1},{immediate:!0});var p=G1(m,f),g=Pe(p,2),b=g[0],C=g[1],x=U(),w=function(){return e.point?e.point:e.getRootDomNode},S=function(){var R;(R=l.value)===null||R===void 0||R.forceAlign()},P=function(R,E){var L,B=e.getClassNameFromAlign(E),D=u.value;u.value!==B&&(u.value=B),b.value==="align"&&(D!==B?Promise.resolve().then(function(){S()}):C(function(){var F;(F=x.value)===null||F===void 0||F.call(x)}),(L=e.onAlign)===null||L===void 0||L.call(e,R,E))},T=M(function(){var A=Be(e.animation)==="object"?e.animation:pp(e);return["onAfterEnter","onAfterLeave"].forEach(function(R){var E=A[R];A[R]=function(L){C(),b.value="stable",E==null||E(L)}}),A}),I=function(){return new Promise(function(R){x.value=R})};pe([T,b],function(){!T.value&&b.value==="motion"&&C()},{immediate:!0}),t({forceAlign:S,getElement:function(){return i.value.$el||i.value}});var N=M(function(){var A;return!(((A=e.align)===null||A===void 0?void 0:A.points)&&(b.value==="align"||b.value==="stable"))});return function(){var A,R=e.zIndex,E=e.align,L=e.prefixCls,B=e.destroyPopupOnHide,D=e.onMouseenter,F=e.onMouseleave,_=e.onTouchstart,K=_===void 0?function(){}:_,z=e.onMousedown,j=b.value,G=[k(k({},v.value),{zIndex:R,opacity:j==="motion"||j==="stable"||!m.value?null:0,pointerEvents:j==="stable"?null:"none"}),r.style],Y=St((A=o.default)===null||A===void 0?void 0:A.call(o,{visible:e.visible}));Y.length>1&&(Y=c("div",{class:"".concat(L,"-content")},[Y]));var V=te(L,r.class,u.value),W=m.value||!e.visible,q=W?Ma(T.value.name,T.value):{};return c(wo,H(H({ref:i},q),{},{onBeforeEnter:I}),{default:function(){return!B||e.visible?Xt(c(tx,{target:w(),key:"popup",ref:l,monitorWindowResize:!0,disabled:N.value,align:E,onAlign:P},{default:function(){return c("div",H(H({class:V,onMouseenter:D,onMouseleave:F,onMousedown:hv(z,["capture"])},O({},jt?"onTouchstartPassive":"onTouchstart",hv(K,["capture"]))),{},{style:G}),[Y])}}),[[Ln,m.value]]):null}})}}}),ax=Z({name:"Popup",inheritAttrs:!1,props:W1,setup:function(e,a){var t=a.attrs,r=a.slots,o=a.expose,l=U(!1),i=U(!1),u=U();return pe([function(){return e.visible},function(){return e.mobile}],function(){l.value=e.visible,e.visible&&e.mobile&&(i.value=!0)},{immediate:!0,flush:"post"}),o({forceAlign:function(){var d;(d=u.value)===null||d===void 0||d.forceAlign()},getElement:function(){var d;return(d=u.value)===null||d===void 0?void 0:d.getElement()}}),function(){var s=k(k(k({},e),t),{visible:l.value}),d=i.value?c(U1,H(H({},s),{},{mobile:e.mobile,ref:u}),{default:r.default}):c(nx,H(H({},s),{},{ref:u}),{default:r.default});return c("div",null,[c(gp,s,null),d])}}});function rx(n,e,a){return a?n[0]===e[0]:n[0]===e[0]&&n[1]===e[1]}function Dv(n,e,a){var t=n[e]||{};return k(k({},t),a)}function ox(n,e,a,t){for(var r=a.points,o=Object.keys(n),l=0;l0&&arguments[0]!==void 0?arguments[0]:{},a=arguments.length>1?arguments[1]:void 0,t=typeof e=="function"?e(this.$data,this.$props):e;if(this.getDerivedStateFromProps){var r=this.getDerivedStateFromProps(Tm(this),k(k({},this.$data),t));if(r===null)return;t=k(k({},t),r||{})}k(this.$data,t),this._.isMounted&&this.$forceUpdate(),Je(function(){a&&a()})},__emit:function(){var e=[].slice.call(arguments,0),a=e[0];a="on".concat(a[0].toUpperCase()).concat(a.substring(1));var t=this.$props[a]||this.$attrs[a];if(e.length&&t)if(Array.isArray(t))for(var r=0,o=t.length;r1&&arguments[1]!==void 0?arguments[1]:{inTriggerContext:!0};lt(Cp,{inTriggerContext:a.inTriggerContext,shouldRender:M(function(){var t=e||{},r=t.sPopupVisible,o=t.popupRef,l=t.forceRender,i=t.autoDestroy,u=!1;return(r||o||l)&&(u=!0),!r&&i&&(u=!1),u})})},ix=function(){Es({},{inTriggerContext:!1});var e=ot(Cp,{shouldRender:M(function(){return!1}),inTriggerContext:!1});return{shouldRender:M(function(){return e.shouldRender.value||e.inTriggerContext===!1})}},pc=Z({name:"Portal",inheritAttrs:!1,props:{getContainer:$.func.isRequired,didUpdate:Function},setup:function(e,a){var t=a.slots,r=!0,o,l=ix(),i=l.shouldRender;us(function(){r=!1,i.value&&(o=e.getContainer())});var u=pe(i,function(){i.value&&!o&&(o=e.getContainer()),o&&u()});return dn(function(){Je(function(){var s;i.value&&((s=e.didUpdate)===null||s===void 0||s.call(e,e))})}),ut(function(){o&&o.parentNode&&o.parentNode.removeChild(o)}),function(){var s;return i.value?r?(s=t.default)===null||s===void 0?void 0:s.call(t):o?c(is,{to:o},t):null:null}}});function Bv(){}function ux(){return""}function cx(n){return n?n.ownerDocument:window.document}var sx=["onClick","onMousedown","onTouchstart","onMouseenter","onMouseleave","onFocus","onBlur","onContextmenu"],Kr=Z({name:"Trigger",mixins:[or],inheritAttrs:!1,props:{action:$.oneOfType([$.string,$.arrayOf($.string)]).def([]),showAction:$.any.def([]),hideAction:$.any.def([]),getPopupClassNameFromAlign:$.any.def(ux),onPopupVisibleChange:Function,afterPopupVisibleChange:$.func.def(Bv),popup:$.any,popupStyle:{type:Object,default:void 0},prefixCls:$.string.def("rc-trigger-popup"),popupClassName:$.string.def(""),popupPlacement:String,builtinPlacements:$.object,popupTransitionName:String,popupAnimation:$.any,mouseEnterDelay:$.number.def(0),mouseLeaveDelay:$.number.def(.1),zIndex:Number,focusDelay:$.number.def(0),blurDelay:$.number.def(.15),getPopupContainer:Function,getDocument:$.func.def(cx),forceRender:{type:Boolean,default:void 0},destroyPopupOnHide:{type:Boolean,default:!1},mask:{type:Boolean,default:!1},maskClosable:{type:Boolean,default:!0},popupAlign:$.object.def(function(){return{}}),popupVisible:{type:Boolean,default:void 0},defaultPopupVisible:{type:Boolean,default:!1},maskTransitionName:String,maskAnimation:String,stretch:String,alignPoint:{type:Boolean,default:void 0},autoDestroy:{type:Boolean,default:!1},mobile:Object,getTriggerDOMNode:Function},setup:function(e){var a=M(function(){var u=e.popupPlacement,s=e.popupAlign,d=e.builtinPlacements;return u&&d?Dv(d,u,s):s}),t=lx(),r=t.setPortal,o=t.popPortal,l=U(null),i=function(s){l.value=s};return{popPortal:o,setPortal:r,vcTriggerContext:ot("vcTriggerContext",{}),popupRef:l,setPopupRef:i,triggerRef:U(null),align:a,focusTime:null,clickOutsideHandler:null,contextmenuOutsideHandler1:null,contextmenuOutsideHandler2:null,touchOutsideHandler:null,attachId:null,delayTimer:null,hasPopupMouseDown:!1,preClickTime:null,preTouchTime:null,mouseDownTimeout:null,childOriginEvents:{}}},data:function(){var e=this,a,t,r=this.$props,o;return this.popupVisible!==void 0?o=!!r.popupVisible:o=!!r.defaultPopupVisible,sx.forEach(function(l){e["fire".concat(l)]=function(i){e.fireEvents(l,i)}}),(t=(a=this).setPortal)===null||t===void 0||t.call(a,c(pc,{key:"portal",getContainer:this.getContainer,didUpdate:this.handlePortalUpdate},{default:this.getComponent})),{prevPopupVisible:o,sPopupVisible:o,point:null}},watch:{popupVisible:function(e){e!==void 0&&(this.prevPopupVisible=this.sPopupVisible,this.sPopupVisible=e)}},created:function(){lt("vcTriggerContext",{onPopupMouseDown:this.onPopupMouseDown}),Es(this)},deactivated:function(){this.setPopupVisible(!1)},mounted:function(){var e=this;this.$nextTick(function(){e.updatedCal()})},updated:function(){var e=this;this.$nextTick(function(){e.updatedCal()})},beforeUnmount:function(){this.clearDelayTimer(),this.clearOutsideHandler(),clearTimeout(this.mouseDownTimeout),Qe.cancel(this.attachId)},methods:{updatedCal:function(){var e=this.$props,a=this.$data;if(a.sPopupVisible){var t;!this.clickOutsideHandler&&(this.isClickToHide()||this.isContextmenuToShow())&&(t=e.getDocument(this.getRootDomNode()),this.clickOutsideHandler=Pt(t,"mousedown",this.onDocumentClick)),this.touchOutsideHandler||(t=t||e.getDocument(this.getRootDomNode()),this.touchOutsideHandler=Pt(t,"touchstart",this.onDocumentClick,jt?{passive:!1}:!1)),!this.contextmenuOutsideHandler1&&this.isContextmenuToShow()&&(t=t||e.getDocument(this.getRootDomNode()),this.contextmenuOutsideHandler1=Pt(t,"scroll",this.onContextmenuClose)),!this.contextmenuOutsideHandler2&&this.isContextmenuToShow()&&(this.contextmenuOutsideHandler2=Pt(window,"blur",this.onContextmenuClose))}else this.clearOutsideHandler()},onMouseenter:function(e){var a=this.$props.mouseEnterDelay;this.fireEvents("onMouseenter",e),this.delaySetPopupVisible(!0,a,a?null:e)},onMouseMove:function(e){this.fireEvents("onMousemove",e),this.setPoint(e)},onMouseleave:function(e){this.fireEvents("onMouseleave",e),this.delaySetPopupVisible(!1,this.$props.mouseLeaveDelay)},onPopupMouseenter:function(){this.clearDelayTimer()},onPopupMouseleave:function(e){var a;e&&e.relatedTarget&&!e.relatedTarget.setTimeout&&Ya((a=this.popupRef)===null||a===void 0?void 0:a.getElement(),e.relatedTarget)||this.delaySetPopupVisible(!1,this.$props.mouseLeaveDelay)},onFocus:function(e){this.fireEvents("onFocus",e),this.clearDelayTimer(),this.isFocusToShow()&&(this.focusTime=Date.now(),this.delaySetPopupVisible(!0,this.$props.focusDelay))},onMousedown:function(e){this.fireEvents("onMousedown",e),this.preClickTime=Date.now()},onTouchstart:function(e){this.fireEvents("onTouchstart",e),this.preTouchTime=Date.now()},onBlur:function(e){Ya(e.target,e.relatedTarget||document.activeElement)||(this.fireEvents("onBlur",e),this.clearDelayTimer(),this.isBlurToHide()&&this.delaySetPopupVisible(!1,this.$props.blurDelay))},onContextmenu:function(e){e.preventDefault(),this.fireEvents("onContextmenu",e),this.setPopupVisible(!0,e)},onContextmenuClose:function(){this.isContextmenuToShow()&&this.close()},onClick:function(e){if(this.fireEvents("onClick",e),this.focusTime){var a;if(this.preClickTime&&this.preTouchTime?a=Math.min(this.preClickTime,this.preTouchTime):this.preClickTime?a=this.preClickTime:this.preTouchTime&&(a=this.preTouchTime),Math.abs(a-this.focusTime)<20)return;this.focusTime=0}this.preClickTime=0,this.preTouchTime=0,this.isClickToShow()&&(this.isClickToHide()||this.isBlurToHide())&&e&&e.preventDefault&&e.preventDefault(),e&&e.domEvent&&e.domEvent.preventDefault();var t=!this.$data.sPopupVisible;(this.isClickToHide()&&!t||t&&this.isClickToShow())&&this.setPopupVisible(!this.$data.sPopupVisible,e)},onPopupMouseDown:function(){var e=this,a=this.vcTriggerContext,t=a===void 0?{}:a;this.hasPopupMouseDown=!0,clearTimeout(this.mouseDownTimeout),this.mouseDownTimeout=setTimeout(function(){e.hasPopupMouseDown=!1},0),t.onPopupMouseDown&&t.onPopupMouseDown.apply(t,arguments)},onDocumentClick:function(e){if(!(this.$props.mask&&!this.$props.maskClosable)){var a=e.target,t=this.getRootDomNode(),r=this.getPopupDomNode();(!Ya(t,a)||this.isContextMenuOnly())&&!Ya(r,a)&&!this.hasPopupMouseDown&&this.delaySetPopupVisible(!1,.1)}},getPopupDomNode:function(){var e;return((e=this.popupRef)===null||e===void 0?void 0:e.getElement())||null},getRootDomNode:function(){var e=this.$props.getTriggerDOMNode;if(e){var a=ka(this.triggerRef);return ka(e(a))}try{var t=ka(this.triggerRef);if(t)return t}catch{}return ka(this)},handleGetPopupClassFromAlign:function(e){var a=[],t=this.$props,r=t.popupPlacement,o=t.builtinPlacements,l=t.prefixCls,i=t.alignPoint,u=t.getPopupClassNameFromAlign;return r&&o&&a.push(ox(o,l,e,i)),u&&a.push(u(e)),a.join(" ")},getPopupAlign:function(){var e=this.$props,a=e.popupPlacement,t=e.popupAlign,r=e.builtinPlacements;return a&&r?Dv(r,a,t):t},getComponent:function(){var e=this,a={};this.isMouseEnterToShow()&&(a.onMouseenter=this.onPopupMouseenter),this.isMouseLeaveToHide()&&(a.onMouseleave=this.onPopupMouseleave),a.onMousedown=this.onPopupMouseDown,a[jt?"onTouchstartPassive":"onTouchstart"]=this.onPopupMouseDown;var t=this.handleGetPopupClassFromAlign,r=this.getRootDomNode,o=this.getContainer,l=this.$attrs,i=this.$props,u=i.prefixCls,s=i.destroyPopupOnHide,d=i.popupClassName,v=i.popupAnimation,h=i.popupTransitionName,f=i.popupStyle,m=i.mask,y=i.maskAnimation,p=i.maskTransitionName,g=i.zIndex,b=i.stretch,C=i.alignPoint,x=i.mobile,w=i.forceRender,S=this.$data,P=S.sPopupVisible,T=S.point,I=k(k({prefixCls:u,destroyPopupOnHide:s,visible:P,point:C?T:null,align:this.align,animation:v,getClassNameFromAlign:t,stretch:b,getRootDomNode:r,mask:m,zIndex:g,transitionName:h,maskAnimation:y,maskTransitionName:p,getContainer:o,class:d,style:f,onAlign:l.onPopupAlign||Bv},a),{ref:this.setPopupRef,mobile:x,forceRender:w});return c(ax,I,{default:this.$slots.popup||function(){return Cs(e,"popup")}})},attachParent:function(e){var a=this;Qe.cancel(this.attachId);var t=this.$props,r=t.getPopupContainer,o=t.getDocument,l=this.getRootDomNode(),i;r?(l||r.length===0)&&(i=r(l)):i=o(this.getRootDomNode()).body,i?i.appendChild(e):this.attachId=Qe(function(){a.attachParent(e)})},getContainer:function(){var e=this.$props,a=e.getDocument,t=a(this.getRootDomNode()).createElement("div");return t.style.position="absolute",t.style.top="0",t.style.left="0",t.style.width="100%",this.attachParent(t),t},setPopupVisible:function(e,a){var t=this.alignPoint,r=this.sPopupVisible,o=this.onPopupVisibleChange;this.clearDelayTimer(),r!==e&&(oa(this,"popupVisible")||this.setState({sPopupVisible:e,prevPopupVisible:r}),o&&o(e)),t&&a&&e&&this.setPoint(a)},setPoint:function(e){var a=this.$props.alignPoint;!a||!e||this.setState({point:{pageX:e.pageX,pageY:e.pageY}})},handlePortalUpdate:function(){this.prevPopupVisible!==this.sPopupVisible&&this.afterPopupVisibleChange(this.sPopupVisible)},delaySetPopupVisible:function(e,a,t){var r=this,o=a*1e3;if(this.clearDelayTimer(),o){var l=t?{pageX:t.pageX,pageY:t.pageY}:null;this.delayTimer=H1(function(){r.setPopupVisible(e,l),r.clearDelayTimer()},o)}else this.setPopupVisible(e,t)},clearDelayTimer:function(){this.delayTimer&&(j1(this.delayTimer),this.delayTimer=null)},clearOutsideHandler:function(){this.clickOutsideHandler&&(this.clickOutsideHandler.remove(),this.clickOutsideHandler=null),this.contextmenuOutsideHandler1&&(this.contextmenuOutsideHandler1.remove(),this.contextmenuOutsideHandler1=null),this.contextmenuOutsideHandler2&&(this.contextmenuOutsideHandler2.remove(),this.contextmenuOutsideHandler2=null),this.touchOutsideHandler&&(this.touchOutsideHandler.remove(),this.touchOutsideHandler=null)},createTwoChains:function(e){var a=function(){},t=gv(this);return this.childOriginEvents[e]&&t[e]?this["fire".concat(e)]:(a=this.childOriginEvents[e]||t[e]||a,a)},isClickToShow:function(){var e=this.$props,a=e.action,t=e.showAction;return a.indexOf("click")!==-1||t.indexOf("click")!==-1},isContextMenuOnly:function(){var e=this.$props.action;return e==="contextmenu"||e.length===1&&e[0]==="contextmenu"},isContextmenuToShow:function(){var e=this.$props,a=e.action,t=e.showAction;return a.indexOf("contextmenu")!==-1||t.indexOf("contextmenu")!==-1},isClickToHide:function(){var e=this.$props,a=e.action,t=e.hideAction;return a.indexOf("click")!==-1||t.indexOf("click")!==-1},isMouseEnterToShow:function(){var e=this.$props,a=e.action,t=e.showAction;return a.indexOf("hover")!==-1||t.indexOf("mouseenter")!==-1},isMouseLeaveToHide:function(){var e=this.$props,a=e.action,t=e.hideAction;return a.indexOf("hover")!==-1||t.indexOf("mouseleave")!==-1},isFocusToShow:function(){var e=this.$props,a=e.action,t=e.showAction;return a.indexOf("focus")!==-1||t.indexOf("focus")!==-1},isBlurToHide:function(){var e=this.$props,a=e.action,t=e.hideAction;return a.indexOf("focus")!==-1||t.indexOf("blur")!==-1},forcePopupAlign:function(){var e;this.$data.sPopupVisible&&((e=this.popupRef)===null||e===void 0||e.forceAlign())},fireEvents:function(e,a){this.childOriginEvents[e]&&this.childOriginEvents[e](a);var t=this.$props[e]||this.$attrs[e];t&&t(a)},close:function(){this.setPopupVisible(!1)}},render:function(){var e=this,a=this.$attrs,t=Ht(Io(this)),r=this.$props.alignPoint,o=t[0];this.childOriginEvents=gv(o);var l={key:"trigger"};this.isContextmenuToShow()?l.onContextmenu=this.onContextmenu:l.onContextmenu=this.createTwoChains("onContextmenu"),this.isClickToHide()||this.isClickToShow()?(l.onClick=this.onClick,l.onMousedown=this.onMousedown,l[jt?"onTouchstartPassive":"onTouchstart"]=this.onTouchstart):(l.onClick=this.createTwoChains("onClick"),l.onMousedown=this.createTwoChains("onMousedown"),l[jt?"onTouchstartPassive":"onTouchstart"]=this.createTwoChains("onTouchstart")),this.isMouseEnterToShow()?(l.onMouseenter=this.onMouseenter,r&&(l.onMousemove=this.onMouseMove)):l.onMouseenter=this.createTwoChains("onMouseenter"),this.isMouseLeaveToHide()?l.onMouseleave=this.onMouseleave:l.onMouseleave=this.createTwoChains("onMouseleave"),this.isFocusToShow()||this.isBlurToHide()?(l.onFocus=this.onFocus,l.onBlur=this.onBlur):(l.onFocus=this.createTwoChains("onFocus"),l.onBlur=function(d){d&&(!d.relatedTarget||!Ya(d.target,d.relatedTarget))&&e.createTwoChains("onBlur")(d)});var i=te(o&&o.props&&o.props.class,a.class);i&&(l.class=i);var u=ft(o,k(k({},l),{ref:"triggerRef"}),!0,!0);if(this.popPortal)return u;var s=c(pc,{key:"portal",getContainer:this.getContainer,didUpdate:this.handlePortalUpdate},{default:this.getComponent});return c(ht,null,[s,u])}}),dx=globalThis&&globalThis.__rest||function(n,e){var a={};for(var t in n)Object.prototype.hasOwnProperty.call(n,t)&&e.indexOf(t)<0&&(a[t]=n[t]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function")for(var r=0,t=Object.getOwnPropertySymbols(n);r=st.F1&&a<=st.F12)return!1;switch(a){case st.ALT:case st.CAPS_LOCK:case st.CONTEXT_MENU:case st.CTRL:case st.DOWN:case st.END:case st.ESC:case st.HOME:case st.INSERT:case st.LEFT:case st.MAC_FF_META:case st.META:case st.NUMLOCK:case st.NUM_CENTER:case st.PAGE_DOWN:case st.PAGE_UP:case st.PAUSE:case st.PRINT_SCREEN:case st.RIGHT:case st.SHIFT:case st.UP:case st.WIN_KEY:case st.WIN_KEY_RIGHT:return!1;default:return!0}},isCharacterKey:function(e){if(e>=st.ZERO&&e<=st.NINE||e>=st.NUM_ZERO&&e<=st.NUM_MULTIPLY||e>=st.A&&e<=st.Z||window.navigator.userAgent.indexOf("WebKit")!==-1&&e===0)return!0;switch(e){case st.SPACE:case st.QUESTION_MARK:case st.NUM_PLUS:case st.NUM_MINUS:case st.NUM_PERIOD:case st.NUM_DIVISION:case st.SEMICOLON:case st.DASH:case st.EQUALS:case st.COMMA:case st.PERIOD:case st.SLASH:case st.APOSTROPHE:case st.SINGLE_QUOTE:case st.OPEN_SQUARE_BRACKET:case st.BACKSLASH:case st.CLOSE_SQUARE_BRACKET:return!0;default:return!1}}},ke=st,wi=function(e,a){var t=a.slots,r,o=e.class,l=e.customizeIcon,i=e.customizeIconProps,u=e.onMousedown,s=e.onClick,d;return typeof l=="function"?d=l(i):d=l,c("span",{class:o,onMousedown:function(h){h.preventDefault(),u&&u(h)},style:{userSelect:"none",WebkitUserSelect:"none"},unselectable:"on",onClick:s,"aria-hidden":!0},[d!==void 0?d:c("span",{class:o.split(/\s+/).map(function(v){return"".concat(v,"-icon")})},[(r=t.default)===null||r===void 0?void 0:r.call(t)])])};wi.inheritAttrs=!1;wi.displayName="TransBtn";wi.props={class:String,customizeIcon:$.any,customizeIconProps:$.any,onMousedown:Function,onClick:Function};var Kl=wi;function mx(n){n.target.composing=!0}function Lv(n){!n.target.composing||(n.target.composing=!1,px(n.target,"input"))}function px(n,e){var a=document.createEvent("HTMLEvents");a.initEvent(e,!0,!0),n.dispatchEvent(a)}function fu(n,e,a,t){n.addEventListener(e,a,t)}var gx={created:function(e,a){(!a.modifiers||!a.modifiers.lazy)&&(fu(e,"compositionstart",mx),fu(e,"compositionend",Lv),fu(e,"change",Lv))}},Vr=gx,yx={inputRef:$.any,prefixCls:String,id:String,inputElement:$.VueNode,disabled:{type:Boolean,default:void 0},autofocus:{type:Boolean,default:void 0},autocomplete:String,editable:{type:Boolean,default:void 0},activeDescendantId:String,value:String,open:{type:Boolean,default:void 0},tabindex:$.oneOfType([$.number,$.string]),attrs:$.object,onKeydown:{type:Function},onMousedown:{type:Function},onChange:{type:Function},onPaste:{type:Function},onCompositionstart:{type:Function},onCompositionend:{type:Function},onFocus:{type:Function},onBlur:{type:Function}},bx=Z({name:"Input",inheritAttrs:!1,props:yx,setup:function(e){var a=null,t=ot("VCSelectContainerEvent");return function(){var r,o=e.prefixCls,l=e.id,i=e.inputElement,u=e.disabled,s=e.tabindex,d=e.autofocus,v=e.autocomplete,h=e.editable,f=e.activeDescendantId,m=e.value,y=e.onKeydown,p=e.onMousedown,g=e.onChange,b=e.onPaste,C=e.onCompositionstart,x=e.onCompositionend,w=e.onFocus,S=e.onBlur,P=e.open,T=e.inputRef,I=e.attrs,N=i||Xt(c("input",null,null),[[Vr]]),A=N.props||{},R=A.onKeydown,E=A.onInput,L=A.onFocus,B=A.onBlur,D=A.onMousedown,F=A.onCompositionstart,_=A.onCompositionend,K=A.style;return N=ft(N,k(k(k(k(k({type:"search"},A),{id:l,ref:T,disabled:u,tabindex:s,autocomplete:v||"off",autofocus:d,class:te("".concat(o,"-selection-search-input"),(r=N==null?void 0:N.props)===null||r===void 0?void 0:r.class),role:"combobox","aria-expanded":P,"aria-haspopup":"listbox","aria-owns":"".concat(l,"_list"),"aria-autocomplete":"list","aria-controls":"".concat(l,"_list"),"aria-activedescendant":f}),I),{value:h?m:"",readonly:!h,unselectable:h?null:"on",style:k(k({},K),{opacity:h?null:0}),onKeydown:function(j){y(j),R&&R(j)},onMousedown:function(j){p(j),D&&D(j)},onInput:function(j){g(j),E&&E(j)},onCompositionstart:function(j){C(j),F&&F(j)},onCompositionend:function(j){x(j),_&&_(j)},onPaste:b,onFocus:function(){clearTimeout(a),L&&L(arguments.length<=0?void 0:arguments[0]),w&&w(arguments.length<=0?void 0:arguments[0]),t==null||t.focus(arguments.length<=0?void 0:arguments[0])},onBlur:function(){for(var j=arguments.length,G=new Array(j),Y=0;Y
    `).replace(/"(language-\w+)"/,'"$1 line-numbers-mode"')}},bt=[[/^<(script|pre|style)(?=(\s|>|$))/i,/<\/(script|pre|style)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[/^<[A-Z]/,/>/,!0],[/^<\w+\-/,/>/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(na.source+"\\s*$"),/^$/,!1]],oo=t=>{t.block.ruler.at("html_block",ro)},ro=(t,n,a,o)=>{let e,r,i,d=t.bMarks[n]+t.tShift[n],x=t.eMarks[n];if(t.sCount[n]-t.blkIndent>=4||!t.md.options.html||t.src.charCodeAt(d)!==60)return!1;for(i=t.src.slice(d,x),e=0;e{t.use(...kt("tip","TIP")).use(...kt("info","INFO")).use(...kt("warning","WARNING")).use(...kt("danger","WARNING")).use(...kt("details","Details")).use(pn,"v-pre",{render:(n,a)=>n[a].nesting===1?`
    +`:`
    +`})};function kt(t,n){return[pn,t,{render(a,o){const e=a[o],r=e.info.trim().slice(t.length).trim();return e.nesting===1?t==="details"?`
    ${r?`${r}`:""} +`:`

    ${r||n}

    +`:t==="details"?`
    +`:` +`}}]}function lo(t){const n=/^([ \t]*)(.*)\n/gm;let a,o=null;for(;(a=n.exec(t))!==null;){const[e,r]=a.slice(1);if(!r)continue;const i=e.length;if(i>0)o=o!==null?Math.min(o,i):i;else break}return o&&(t=t.replace(new RegExp(`^[ ]{${o}}(.*)`,"gm"),"$1")),t}function Qt(t,n,a,o=!1){const[e,r,i]=n.exec(t.trim())||[];return e&&r&&i===a&&r.match(o?/^[Ee]nd ?[rR]egion$/:/^[rR]egion$/)}function so(t,n){const a=[/^\/\/ ?#?((?:end)?region) ([\w*-]+)$/,/^\/\* ?#((?:end)?region) ([\w*-]+) ?\*\/$/,/^#pragma ((?:end)?region) ([\w*-]+)$/,/^$/,/^#((?:End )Region) ([\w*-]+)$/,/^::#((?:end)region) ([\w*-]+)$/,/^# ?((?:end)?region) ([\w*-]+)$/];let o=null,e=-1;for(const[r,i]of t.entries())if(o===null){for(const d of a)if(Qt(i,d,n)){e=r+1,o=d;break}}else if(Qt(i,o,n,!0))return{start:e,end:r,regexp:o};return null}const po=(t,n)=>{const a=(e,r,i,d)=>{const x="<".charCodeAt(0),w=e.bMarks[r]+e.tShift[r],p=e.eMarks[r];if(e.sCount[r]-e.blkIndent>=4)return!1;for(let b=0;b<3;++b)if(e.src.charCodeAt(w+b)!==x||w+b>=p)return!1;if(d)return!0;const y=w+3,X=e.skipSpacesBack(p,w),_=/^(.+(?:\.([a-z]+)))(?:(#[\w-]+))?(?: ?({\d+(?:[,-]\d+)*}))?$/,Y=e.src.slice(y,X).trim().replace(/^@/,n).trim(),[Z="",O="",T="",s=""]=(_.exec(Y)||[]).slice(1);e.line=r+1;const k=e.push("fence","code",0);return k.info=O+s,k.src=zt.resolve(Z)+T,k.markup="```",k.map=[r,r+1],!0},o=t.renderer.rules.fence;t.renderer.rules.fence=(...e)=>{const[r,i,,{loader:d}]=e,x=r[i],w=x.src,[p,y]=w?w.split("#"):[""];if(p){d&&d.addDependency(p);const X=zt.lstatSync(p).isFile();if(zt.existsSync(p)&&X){let _=zt.readFileSync(p,"utf8");if(y){const Y=_.split(/\r?\n/),Z=so(Y,y);Z&&(_=lo(Y.slice(Z.start,Z.end).filter(O=>!Z.regexp.test(O.trim())).join(` +`)))}x.content=_}else x.content=X?`Code snippet path not found: ${p}`:"Invalid code snippet option",x.info=""}return o(...e)},t.block.ruler.before("fence","snippet",a)},co=t=>{const n=/^<(script|style)(?=(\s|>|$))/i;t.renderer.rules.html_block=(a,o)=>{const e=a[o].content,r=t.__data,i=r.hoistedTags||(r.hoistedTags=[]);return n.test(e.trim())?(i.push(e),""):e}},mo=t=>{const n=t.renderer.rules.fence;t.renderer.rules.fence=(...a)=>{const[o,e]=a,r=o[e],i=n(...a);return`
    ${i}
    `}},uo=/(^|.*\/)index.md(#?.*)$/i,bo=(t,n,a)=>{t.renderer.rules.link_open=(r,i,d,x,w)=>{const p=r[i],y=p.attrIndex("href");if(y>=0){const X=p.attrs[y],_=X[1];!_.startsWith("#")&&!_.startsWith("mailto:")&&!/\.(?!html|md)\w+($|\?)/i.test(_)&&o(X),X[1]=X[1].replace(/\bimport\.meta/g,"import%2Emeta").replace(/\bprocess\.env/g,"process%2Eenv")}return w.renderToken(r,i,d)};function o(r){let i=r[1];const d=i.match(uo);if(d){const[,x,w]=d;i=x+w}else{let x=i.replace(/[?#].*$/,"");x.endsWith(".md")&&(x=x.replace(/\.md$/,".html")),!x.endsWith(".html")&&!x.endsWith("/")&&(x+=".html")}!i.startsWith("/")&&!/^\.\//.test(i),e(i.replace(/\.html$/,"")),i.startsWith("/")&&(i=`${a}${i}`.replace(/\/+/g,"/")),r[1]=decodeURI(i)}function e(r){const i=t.__data;(i.links||(i.links=[])).push(r)}},go=(t,n=["h2","h3"])=>{t.renderer.rules.heading_open=(a,o,e,r,i)=>{const d=a[o];if(n.includes(d.tag)){const x=a[o+1].content,w=d.attrs.find(([_])=>_==="id"),p=w&&w[1],y=t.__data;(y.headers||(y.headers=[])).push({level:parseInt(d.tag.slice(1),10),title:Je(x),slug:p||Ct(x)})}return i.renderToken(a,o,e)}},fo=t=>{t.renderer.rules.image=(n,a,o,e,r)=>{const i=n[a],d=i.attrGet("src");return d&&!/^\.?\//.test(d)&&i.attrSet("src",d),r.renderToken(n,a,o)}},ho=(t,n={},a)=>{const o=aa(tt({html:!0,linkify:!0,highlight:vn},n));o.use(oo).use(ao).use(mo).use(po,t).use(co).use(io).use(go).use(fo).use(bo,tt({target:"_blank",rel:"noopener noreferrer"},n.externalLinks),a).use(la,n.attrs).use($t,tt({slugify:Ct,permalink:$t.permalink.ariaHidden({})},n.anchor)).use(sa,tt({slugify:Ct,includeLevel:[2,3],format:kn},n.toc)).use(oa),n.config&&n.config(o),n.lineNumbers&&o.use(eo);const e=o.render;return o.render=(...r)=>(o.__data={},e.call(o,...r)),o},xo=F("\u524D\u5F80\u67E5\u770B"),wo=[xo],ko=["innerHTML"],vo={name:"ExProgress"},yo=Object.assign(vo,{props:{refresh:Boolean,class:String,grid:Object},setup(t){const n=t,a=xt(),o=at(0),e=at(""),r=a.fullPath;let i;At(()=>{clearInterval(i)}),d();function d(){rt("ex-admin/system/queueInit?key="+n.class).then(()=>{i=setInterval(()=>{x()},500)})}function x(){rt("ex-admin/system/queueProgress?key="+n.class).then(p=>{isNaN(p.data)?(e.value=p.data,clearInterval(i)):(o.value=p.data,o.value==100&&(clearInterval(i),n.refresh&&a.fullPath===r&&w()))})}function w(){n.grid?n.grid.refresh():B.loadComponent(r,!0)}return(p,y)=>{const X=v("a-progress"),_=v("a-alert"),Y=rn("redirect");return h(),D(H,null,[e.value?N("",!0):(h(),L(X,{key:0,percent:o.value,size:"small"},null,8,["percent"])),o.value==100?ct((h(),D("a",{key:1,onClick:w},wo)),[[Y,l(r)]]):N("",!0),e.value?(h(),L(_,{key:2,message:"\u5931\u8D25",type:"error","show-icon":""},{description:u(()=>[$("div",{innerHTML:e.value},null,8,ko)]),_:1})):N("",!0)],64)}}});z.directive("redirect",{created(t,n){t.onclick=function(){lt(n.value)}}});z.directive("copy",{created(t,n){n.clipboard=new Qn(t,{text:function(){return n.value}}),n.clipboard.on("success",a=>{pt.success(S("Copy.success"))}),n.clipboard.on("error",a=>{pt.error(S("Copy.error"))})},beforeUnmount(t,n){n.clipboard&&n.clipboard.destroy()}});z.directive("ajax",{created(t,n){let a=t.onclick;t.onclick=function(o){o.stopPropagation(),a&&a(o);let e=[];if(n.arg.gridBatch&&(e=n.instance.grid.exposed.selectIds.value),n.arg.confirm){if(n.arg.gridBatch&&e.length==0)return pt.warn(S("Grid.selectedAction"));n.arg.confirm.content&&n.arg.confirm.content.name&&(n.arg.confirm.content=G(vt,{data:n.arg.confirm.content})),ln.confirm(Object.assign({onOk(){return new Promise((r,i)=>{ht(n.value,n.arg.gridBatch,e,n.instance).then(d=>{n.arg.confirm.gridRefresh&&n.instance.grid.exposed.refresh(),n.instance.$emit("success"),r()}).catch(()=>{i()})})}},n.arg.confirm))}else ht(n.value,n.arg.gridBatch,e,n.instance).then(r=>{n.arg.gridRefresh&&n.instance.grid.exposed.refresh()})}}});z.directive("queueProgress",{created(t,n){let a=t.onclick;t.onclick=function(o){o.stopPropagation(),a&&a(o),sn.open({appContext:z._context,message:n.value,duration:null,description:G(yo,{class:n.arg.class,refresh:n.arg.refresh,grid:n.instance.grid?n.instance.grid.exposed:null})})}}});z.directive("prism",{created(t,n){const a=vn(n.value,n.arg.lang);t.innerHTML="
    "+a+"
    "}});z.directive("markdown",{created(t,n){const a=ho("/",n.arg||{},"/");t.innerHTML=a.render(n.value)}});z.directive("focus",{created(t,n){setTimeout(()=>{t.querySelector("input").focus()})}});z.directive("select",{created(t,n){setTimeout(()=>{t.querySelector("input").select()})}});z.directive("rowSign",{created(t,n){let a=document.createElement("span");a.innerText="row",a.className="curd-sign-position",t.append(a)}});z.directive("RowColSign",{created(t,n){let a=document.createElement("span");a.innerText=n.value,a.className=n.arg,t.append(a)}});Kn.locale("zh-cn");cn.use(pa,{Prism:_t});z.use(cn);z.config.globalProperties.$script=Qa;z.config.globalProperties.$request=rt;z.config.globalProperties.$action=B;z.use($n);window.$app=z;for(const t in Ft)z.component(t,Ft[t]);z.provide(xn,j);B.getSystemConfig().then(()=>{z.use(nt),z.mount("#app")});export{Vt as A,vt as B,st as _,xr as a,wr as b,ut as c,br as d,gr as e,fr as f,Ga as g,ne as h,qt as i,lt as j,Ht as k,dr as l,cr as m,yt as n,Ka as o,hr as p,Gt as q,Wt as r,rt as s,S as t,et as u,ur as v,ht as w,K as x,mr as y,Wa as z}; diff --git a/public/exadmin/assets/index.e3eff962.js b/public/exadmin/assets/index.e3eff962.js new file mode 100644 index 0000000..ceb744b --- /dev/null +++ b/public/exadmin/assets/index.e3eff962.js @@ -0,0 +1 @@ +var Oe=Object.defineProperty;var he=Object.getOwnPropertySymbols;var Ve=Object.prototype.hasOwnProperty,Le=Object.prototype.propertyIsEnumerable;var ge=(l,p,A)=>p in l?Oe(l,p,{enumerable:!0,configurable:!0,writable:!0,value:A}):l[p]=A,_e=(l,p)=>{for(var A in p||(p={}))Ve.call(p,A)&&ge(l,A,p[A]);if(he)for(var A of he(p))Le.call(p,A)&&ge(l,A,p[A]);return l};import{_ as $e,b as Se,s as F,x as q,y as re,h as ve}from"./index.b35f53c6.js";import{l as W}from"./lodash.c9cf1bdb.js";import"./vue.db505ee4.js";import{d as ze}from"./vuedraggable.e7e6f001.js";import{d as Ne,q as Be,r as Fe,a as Pe,p as Ue,n as qe,t as We,aW as _,aR as v,ar as w,bd as i,c as d,as as D,au as u,at as O,aV as X,R as V,af as le,S as R,ai as k,H as Y,ah as je,U as Ge,aT as He,aS as Ke}from"./@vue.cb43a243.js";import{m as Je,M as Me}from"./ant-design-vue.6b10f349.js";import"./js-md5.5179c6be.js";import"./@babel.6cd0804c.js";import"./regenerator-runtime.8e24db72.js";import"./vue-router.a08742b9.js";import"./js-cookie.31874410.js";import"./spark-md5.2cc5764b.js";import"./@vueuse.952f4739.js";import"./vue-demi.5fb18120.js";import"./axios.e3200588.js";import"./@ant-design.bcfb08ae.js";import"./@ctrl.fa7cbd46.js";/* empty css */import"./dayjs.38e390ea.js";import"./sortablejs.412b554c.js";import"./clipboard.099d05c9.js";import"./markdown-it.80c3a67b.js";import"./entities.0d2c0164.js";import"./uc.micro.981ceb7b.js";import"./mdurl.ef76b4dc.js";import"./linkify-it.92c30060.js";import"./markdown-it-emoji.e3e91710.js";import"./escape-html.e5dfadb9.js";import"./prismjs.c97a8414.js";import"./diacritics.6be19c75.js";import"./markdown-it-container.512a5043.js";import"./markdown-it-anchor.c88e5394.js";import"./markdown-it-attrs.3af5ab50.js";import"./markdown-it-table-of-contents.8a4ce16f.js";import"./@kangc.86f7507c.js";import"./resize-observer-polyfill.8deb1e21.js";import"./vue-types.6e6d84ba.js";import"./dom-align.f1b5d360.js";import"./lodash-es.0ea26897.js";import"./async-validator.5d25c98b.js";import"./scroll-into-view-if-needed.5191fdbf.js";import"./compute-scroll-into-view.6058b3be.js";const Qe=Ne({name:"ExCurd",components:{draggable:ze},setup(l,p){const A=Se(),e=Be({tables:[],searchTable:"",controller:[],controllerIndex:-1,method:[],methodIndex:-1,drawingMain:{component:null,ref:null},componentList:[],controllerForm:null,controllerEditForm:null,methodForm:null,methodEditForm:null,settingForm:null,settingFormList:[],settingFormVisible:!0,tableVisible:!1,tableModalRender:null,tableTreeNode:null,tableModalTitle:null,index:-1,database:null,isSave:!0,methodTypes:[{value:"grid",label:"\u6570\u636E\u8868\u683C(grid)"},{value:"form",label:"\u8868\u5355(form)"},{value:"detail",label:"\u8BE6\u60C5(detail)"}]}),ce=Fe(),ue=Fe();Z(),addEventListener("keydown",L),addEventListener("keyup",G),Pe(()=>{removeEventListener("keydown",L),removeEventListener("keyup",G)});const j=Ue(()=>e.tables.filter(t=>t.name.indexOf(e.searchTable)>-1||t.comment.indexOf(e.searchTable)>-1));let C=0,E=0;function L(t){t.keyCode==17&&(C=1),t.keyCode==83&&(E=1),C==1&&E==1&&te()}function G(t){t.keyCode==17&&(C=0),t.keyCode==83&&(E=0)}function z(){H()}function Z(){Q(),S(),F("ex-admin/plugin-curd-controller-Index/getFormComponent").then(t=>{e.componentList=t.data,e.componentList.forEach(n=>{n.options.forEach(o=>{F("ex-admin/plugin-curd-controller-Index/getComponent?type="+o.name).then(a=>{o.component=a.data})})})})}function N(t){["ExForm","ARow","ACol","ExFormMany","ATabPane"].indexOf(t.name)>-1&&!t.content.default&&(t.content.default=[]);for(let n in t.content){let o=t.content,a=[];o[n].forEach(s=>{a.push(s),N(s)}),["ExForm","ARow","ACol","ExFormMany","ATabPane"].indexOf(t.name)>-1&&(n=="default"?t.content[n]=I(t.name,a,t):t.content[n]=a)}}function ee(t){return y(t,!0)}function y(t,n=!1){let o;return n?o=t.draggedContext.element.component.name:o=t.draggedContext.element.name,!(o=="ACol"&&t.relatedContext.component.$attrs.group.name!="ARow"||o!="ACol"&&t.relatedContext.component.$attrs.group.name=="ARow")}function I(t,n,o={}){let a="ex-drag-container";return t=="ARow"?a+=" curd-children-row":t=="ACol"&&(a+=" curd-row-draggable"),[{name:"DraggableRender",attribute:{group:{name:t,put:!0,pull:!0},animation:1e3,chosenClass:"ex-drag-choose",list:n,tag:t=="ARow"?"render":"div",componentData:{data:o},class:a,style:{width:"100%",minHeight:"32px"},move:s=>y(s)},event:{End:s=>{fe()},Sort:s=>{e.drawingMain.ref.forceUpdate()},Choose:s=>{document.querySelectorAll("[data-choose]").forEach(g=>{g.removeAttribute("data-choose")}),s.item.setAttribute("data-choose",!0);let r=s.item.__draggable_context.element;r.name==="AFormItem"?e.settingForm=r.content.default[0].attribute.drawingForm:r.name=="DraggableRender"?e.settingForm=r.attribute.componentData.data.attribute.drawingForm:e.settingForm=r.attribute.drawingForm}}}]}const H=W.exports.debounce(J,150);function $(t,n,o,a,s,r,g){t.forEach(m=>{if(m.name=="AFormItem"){if(m.attribute&&m.attribute.name.indexOf("default")>-1){let x=n[m.content.default[0].bindAttribute.value.replace(a+".","")];x===void 0&&(x=n[o[r]]),n[o[r]]=x,o.default=n[o[r]],m.content.default[0].bindAttribute.value=g,m.content.default[0].modelBind.value=g}else if(s.name==="ARangePicker"&&m.attribute.title==="\u9ED8\u8BA4\u503C"){n[o[r]]=n[m.content.default[0].bindAttribute.value.replace(a+".","")],o.default=n[o[r]],m.content.default[0].bindAttribute.value=g,m.content.default[0].modelBind.value=g;const x=s.attribute.startField;s.attribute.startField=a+"."+x.substr(x.indexOf(".")+1);const h=s.attribute.endField;s.attribute.endField=a+"."+h.substr(h.indexOf(".")+1)}}else m.content&&m.content.default&&$(m.content.default,n,o,a,s,r,g)})}function K(t,n=null){t.forEach(o=>{if(typeof o=="object"){if(o.name=="AFormItem"){const a=e.drawingMain.component,s=a.bindAttribute.model,r=a.bind[s];let g=o,m=g.content.default[0],x=m.attribute.drawingForm,h=x.bind[x.bindAttribute.model];for(let b in h)if(b=="title"&&m.name!="ExFormMany")g.attribute.label=h[b];else if(!(["name","default"].indexOf(b)>-1))if(b=="required")g.attribute.required=h[b];else if(b=="field"&&m.name!="ACascader"){let M=s+"."+h[b];n=="ExFormMany"&&(M=h[b]),m.bindAttribute[h.modelValue]=M,m.modelBind[h.modelValue]=M,g.attribute.name=[h[b]],m.name=="ExFormMany"&&r[h[b]]===void 0&&(r[h[b]]=h.default),$(x.content.default,r,h,s,m,b,M)}else if(["character","addonBefore","addonAfter","prefix","suffix"].indexOf(b)>-1&&h[b]){let M=Ge(h[b]);Array.isArray(M)?m.content[b]=M:m.content[b]=[M]}else if(b==="config"){for(let M in h[b])M=="options"&&h[b].options_type==3&&(m.attribute.options=[],Object.assign(m.attribute.options,h[b][M]));if(m.name=="ExSelectTable"){let M="ex-admin/"+h[b].grid_class.replaceAll("\\","-")+"/"+h[b].grid_method,be={};h[b].params.forEach(pe=>{be[pe.var]=pe.value}),q(m.attribute,"gridUrl",M),q(m.attribute,"params",be)}}else q(m.attribute,b,h[b])}else if(o.name=="DraggableRender")o.attribute.key=re(20),K(o.attribute.list,o.attribute.group.name);else if(o.name=="ARow"||o.name=="ACol"){let a=o.attribute.drawingForm,s=a.bind[a.bindAttribute.model];delete o.attribute.md,delete o.attribute.sm,delete o.attribute.xs;for(let r in s)q(o.attribute,r,s[r])}else if(o.name=="ATabs"){let a=o.attribute.drawingForm,s=a.bind[a.bindAttribute.model],r=[],g;s.pane.forEach((x,h)=>{let b=W.exports.cloneDeep(o.content.default[h]);if(b)g=b;else{let M=[];b=W.exports.cloneDeep(g),b.attribute.key=h+1,b.content={default:I("ATabPane",M)}}b.attribute.tab=x.title,r.push(b);for(let M in s)q(o.attribute,M,s[M])}),o.content.default=r;let m=a.bindAttribute.model+"."+s.modelValue;o.bindAttribute.activeKey=m,o.modelBind.activeKey=m}else if(o.name=="ADivider"){let a=o.attribute.drawingForm,s=a.bind[a.bindAttribute.model];for(let r in s)r=="title"?o.content={default:[s[r]]}:q(o.attribute,r,s[r])}o.content&&o.content.default&&K(o.content.default)}})}function J(){const t=e.drawingMain.component;let n=t.attribute.drawingForm,o=n.bind[n.bindAttribute.model];if(t.name=="ExForm")Object.assign(t.attribute,o),t.content.default||(t.content.default=[]),K(t.content.default);else if(t.name=="ExGrid"){const a=[];for(let s in o)s=="columns"?(o[s].forEach(r=>{a.push({dataIndex:r.field,title:r.label,type:r.form_type||"",header:{name:"html",attribute:{class:"ex_admin_table_th_name","data-tag":"span"},content:{default:[r.label]}}})}),o.switch.indexOf("hideAction")==-1&&a.push({dataIndex:"ExAdminAction",title:"",header:{name:"html",attribute:{class:"ex_admin_table_th_name","data-tag":"span"},content:{default:[""]}}}),t.attribute.columns=a):s=="switch"?o.swtichOptions.forEach(r=>{t.attribute[r]=o[s].indexOf(r)>-1}):t.attribute[s]=o[s]}else if(t.name=="ADescriptions")for(let a in o)if(a=="items"){const s=[];o[a].forEach(r=>{var g;s.push({name:"ADescriptionsItem",attribute:{title:r.label,span:r.span},content:{default:[(g=t.attribute.data[r.field])!=null?g:"--"],label:[r.label]}})}),t.content.default=s}else t.attribute[a]=o[a];e.drawingMain.ref.forceUpdate(),e.isSave=!1}function B(t,n){t.forEach(o=>{let a;if(typeof o=="object"){if(o.name=="AFormItem"){const s=e.drawingMain.component;let r=o.content.default[0].attribute.drawingForm;e.settingFormList.push(r);let g=r.bindAttribute.model;ve(r.bind[g],r.attribute.exceptField||[]);const m=s.bindAttribute.model,x=s.bind[m];r.bind[g].default=x[r.bind[g].field],n.push(r.bind[g]),a=r.bind[g]}else if(o.name=="DraggableRender")B(o.attribute.list,n);else if(["ARow","ACol","ExFormMany","ATabs","ATabPane","ADivider"].indexOf(o.name)>-1){let s=o.attribute.drawingForm,r=s.bindAttribute.model;ve(s.bind[r],s.attribute.exceptField||[]),n.push(s.bind[r]),a=s.bind[r]}o.content&&o.content.default&&a&&(a.content=[],B(o.content.default,a.content))}})}function te(){e.settingFormList=[],H(),setTimeout(()=>{let t={};const n=e.drawingMain.component;let o=n.attribute.drawingForm.bindAttribute.model;if(t.config=n.attribute.drawingForm.bind[o],n.name=="ExForm"){t.type="form",t.component=[],B(n.content.default,t.component);let a=0;qe(()=>{e.settingFormList.forEach(s=>{A[s.bindAttribute.ref].form.validate().then(()=>{a++,a==e.settingFormList.length&&P(t)}).catch(r=>{r.errorFields.length===0&&(a++,a==e.settingFormList.length&&P(t)),r.errorFields.forEach(g=>{let m=`\u3010${r.values.title}\u3011`||"\u3010\u3011";Je.error(m+g.errors[0]),e.settingFormList=[]})})})})}else n.name=="ExGrid"?(t.type="grid",P(t)):n.name=="ADescriptions"&&(t.type="detail",P(t))},500)}function P(t){F({url:"ex-admin/plugin-curd-controller-Index/save",method:"post",data:{id:e.method[e.methodIndex].id,controller:e.controller[e.controllerIndex].name,class:e.controller[e.controllerIndex].class,function:e.method[e.methodIndex].name,setting:t}}).then(n=>{e.settingFormList=[],me(e.methodIndex,!1),e.isSave=!0})}function ae(t){e.drawingMain.ref=t}function Q(){F("ex-admin/plugin-curd-controller-Index/getController?curd_ref="+p.attrs.curd_ref).then(t=>{e.controller=t.data.list,e.controllerForm=t.data.controllerForm})}function S(){F("ex-admin/plugin-curd-controller-Database/getTable").then(t=>{e.tables=t.data.map(n=>(n.tableName=n.name,n.dataRef=n,n.name=n.id,n.children=[],n.class="table-tree-node",n))})}function ne(t){if(e.tableVisible=!1,!t){S();return}return new Promise(n=>{F("ex-admin/plugin-curd-controller-Database/getTableColumn?table="+t.dataRef.id).then(o=>{t.dataRef.children=o.data.map(a=>(a.id=t.id+a.field,a.name=a.field,a.table=t.id,a.parent=t,a.isLeaf=!0,a)),e.tables=[...e.tables],n()})})}function U(t){Me.confirm({title:"\u5220\u9664\u8868",content:"\u786E\u8BA4\u5220\u9664\u8868\uFF0C\u4E0D\u53EF\u6062\u590D\uFF1F",onOk(){F.delete("/ex-admin/plugin-curd-controller-Database/grid",{data:{ex_admin_action:"delete",ex_admin_sidebar:!0,ids:[t]}}).then(n=>{S()})}})}function oe(t,n,o){Me.confirm({title:"\u5220\u9664\u8868\u5B57\u6BB5",content:"\u786E\u8BA4\u5220\u9664\u8868\u5B57\u6BB5\uFF0C\u4E0D\u53EF\u6062\u590D\uFF1F",onOk(){F.delete("/ex-admin/plugin-curd-controller-Database/grid",{data:{ex_admin_action:"delete",ex_admin_trashed:"false",table:t,ids:[n]}}).then(a=>{ne(o)})}})}function de(t,n,o){e.tableTreeNode=o,e.tableModalTitle="\u7F16\u8F91\u5B57\u6BB5",e.tableModalRender=null,F.put("/ex-admin/plugin-curd-controller-Database/form",{table:t,field:n}).then(a=>{e.tableVisible=!0,e.tableModalRender=a,e.tableModalRender.footer=a.content.footer[0],delete e.tableModalRender.content.footer})}function ie(){e.tableTreeNode=null,e.tableModalTitle="\u6DFB\u52A0\u8868",e.tableModalRender=null,F.post("/ex-admin/plugin-curd-controller-Database/tableForm").then(t=>{e.tableVisible=!0,e.tableModalRender=t,e.tableModalRender.footer=t.content.footer[0],delete e.tableModalRender.content.footer})}function c(){e.tableTreeNode=null,e.tableModalTitle="\u8868\u9884\u8BBE\u5B57\u6BB5",e.tableModalRender=null,F.post("/ex-admin/plugin-curd-controller-Database/presetFields").then(t=>{e.tableVisible=!0,e.tableModalRender=t,e.tableModalRender.footer=t.content.footer[0],delete e.tableModalRender.content.footer})}function f(t){e.tableTreeNode=null,e.tableModalTitle="\u7F16\u8F91\u8868",e.tableModalRender=null,F.post("/ex-admin/plugin-curd-controller-Database/tableForm",{id:t}).then(n=>{e.tableVisible=!0,e.tableModalRender=n,e.tableModalRender.footer=n.content.footer[0],delete e.tableModalRender.content.footer})}function T(t){e.tableModalTitle="\u5173\u8054\u8868(\u6A21\u578B)",e.tableModalRender=null,F.post("/ex-admin/plugin-curd-controller-Database/modelRelationForm",{table:t}).then(n=>{e.tableVisible=!0,e.tableModalRender=n,e.tableModalRender.footer=n.content.footer[0],delete e.tableModalRender.content.footer})}function ye(t){e.tableModalTitle="\u6DFB\u52A0\u8868\u5B57\u6BB5",e.tableModalRender=null,F.post("/ex-admin/plugin-curd-controller-Database/form",{table:t}).then(n=>{e.tableVisible=!0,e.tableModalRender=n,e.tableModalRender.footer=n.content.footer[0],delete e.tableModalRender.content.footer})}function Ce(){e.methodIndex=-1,F({url:"ex-admin/plugin-curd-controller-Index/getMethod",method:"post",data:{curd_ref:p.attrs.curd_ref,class:e.controller[e.controllerIndex].class,controller:e.controller[e.controllerIndex].name,table:e.controller[e.controllerIndex].table,id:e.controller[e.controllerIndex].id}}).then(t=>{e.methodForm=t.data.methodForm,e.method=t.data.list})}function xe(){F({url:"ex-admin/plugin-curd-controller-Index/deleteMethod",method:"post",data:{class:e.controller[e.controllerIndex].class,controller:e.controller[e.controllerIndex].name,method:e.method[e.methodIndex].name,id:e.method[e.methodIndex].id}}).then(t=>{e.methodIndex=-1,e.method.splice(e.methodIndex,1)})}function ke(){const t=e.controller[e.controllerIndex];F({url:"ex-admin/plugin-curd-controller-Index/deleteController",method:"post",data:{id:t.id,path:t.path}}).then(n=>{e.controllerIndex=-1,Q(),e.method=[]})}function me(t,n=!0){e.methodIndex=t,e.settingForm=null,F({url:"ex-admin/plugin-curd-controller-Index/render",method:"post",data:{class:e.controller[e.controllerIndex].class,function:e.method[e.methodIndex].name,var:[]}}).then(o=>{e.isSave=!0,N(o.data),e.drawingMain.component=o.data})}function Re(t,n){n.mouseenter=!0,e.tableTreeNode=n,e.tables=[...e.tables]}function Ae(t,n){n.mouseenter=!1,e.tables=[...e.tables]}function we(t){t.newIndex!==t.oldIndex&&F.post("ex-admin/plugin-curd-controller-Database/sortField",{table:t.item.__draggable_context.element.table,field:t.item.__draggable_context.element.field,sort:t.newIndex})}function Ie(t){if(!t.component)return!1;let n=W.exports.cloneDeep(t.component);if(n.name=="AFormItem"){let a=n.content.default[0].attribute.drawingForm,s=a.bind[a.bindAttribute.model];if(a.attribute.key=re(20),s.field||(s.field=re(20)),n.attribute.validateFormField=e.drawingMain.component.bindAttribute.validateField,n.content.default[0].name=="ExFormMany"){let r=[];n.content.default[0].content={default:I(n.content.default[0].name,r,n.content.default[0])}}}let o=[];if(n.name=="ARow"){let a=[];n.content.default[0].content={default:I("ACol",a)},o=n.content.default,n.content={default:I(n.name,o,n)}}else if(n.name=="ACol")n.content={default:I(n.name,o,n)};else if(n.name=="ATabs"){let a=n.content.default[0];a.content={default:I("ATabPane",o,a)},n.content={default:[a]}}return n}function fe(t){J()}function Ee(t){return!(t.relatedContext.element&&!t.relatedContext.element.table&&!t.draggedContext.element.component)}function Te(t){if(t){const n=e.controller[e.controllerIndex];e.controllerEditForm=W.exports.cloneDeep(e.controllerForm);let o=e.controllerEditForm.content.content[0].attribute.params;o.id=n.id,o.class=n.class,o.path=n.path,o.title=n.title,o.name=n.name,o.table=n.table}}function De(t){if(t){const n=e.method[e.methodIndex];e.methodEditForm=W.exports.cloneDeep(e.methodForm);let o=e.methodEditForm.content.content[0].attribute.params;o.id=n.id,o.type=n.type,o.name=n.name,o.oldTitle=n.title}}return _e({onFieldMove:Ee,onMove:y,onCloneMove:ee,onEnd:fe,onClone:Ie,relationTable:T,onFieldSort:we,addTable:ie,presetFields:c,editTableField:de,editTable:f,deleteTable:U,addTableField:ye,tableMouseLeave:Ae,tableMouseenter:Re,onLoadTable:ne,deleteTableField:oe,getController:Q,watchModel:z,dragSave:te,getRender:me,getMethod:Ce,deleteMethod:xe,deleteController:ke,getTable:S,controllerFormVisible:Te,methodFormVisible:De,dragRef:ce,drawingRef:ue,setRef:ae,tableMenus:j},We(e))}}),se=l=>(He("data-v-18921aa6"),l=l(),Ke(),l),Xe=R(" \u6DFB\u52A0 "),Ye=R(" \u7F16\u8F91 "),Ze=R(" \u5220\u9664 "),et={class:"flex-column"},tt={class:"title"},nt=se(()=>u("span",null,"\u63A7\u5236\u5668",-1)),ot={class:"flex-1-auto"},lt=["onContextmenu","onClick"],at={class:"name"},dt={class:"desc"},it=R(" \u6DFB\u52A0 "),rt=R(" \u7F16\u8F91 "),st=R(" \u5220\u9664 "),ct={class:"flex-column"},ut={class:"title"},mt=se(()=>u("span",null,"\u65B9\u6CD5",-1)),ft={class:"flex-1-auto"},bt=["onContextmenu","onClick"],pt={class:"name"},ht={class:"desc"},gt={class:"flex-column"},_t={style:{margin:"0 10px 10px 10px"}},vt=R("\u6DFB\u52A0\u8868"),Ft=R("\u8868\u9884\u8BBE\u5B57\u6BB5"),Mt=["onMouseenter","onMouseleave"],yt={class:"table-tree-title"},Ct=["title"],xt={key:0,class:"table-tree-action-table"},kt=["title"],Rt=["onMouseenter","onMouseleave"],At={class:"table-tree-title"},wt=["title"],It={key:0,class:"table-tree-action"},Et=["title"],Tt={class:"components"},Dt={style:{display:"flex","align-items":"center",margin:"5px"}},Ot=se(()=>u("i",{class:"fas fa-layer-group"},null,-1)),Vt={style:{"margin-left":"5px"}},Lt={class:"components-draggable"},$t={class:"components-item"},St={class:"components-body"},zt={class:"header"},Nt=R("(ctrl+s)"),Bt={class:"drawing scrollbar",ref:"drawingRef"},Pt={style:{display:"none"}};function Ut(l,p,A,e,ce,ue){const j=_("PlusOutlined"),C=_("render"),E=_("a-menu-item"),L=_("EditOutlined"),G=_("question-circle-outlined"),z=_("DeleteOutlined"),Z=_("a-popconfirm"),N=_("a-menu"),ee=_("ReloadOutlined"),y=_("a-button"),I=_("a-tooltip"),H=_("a-dropdown"),$=_("a-layout-sider"),K=_("a-modal"),J=_("reload-outlined"),B=_("a-space"),te=_("a-input"),P=_("FolderOutlined"),ae=_("NodeIndexOutlined"),Q=_("FileOutlined"),S=_("draggable"),ne=_("a-sub-menu"),U=_("a-tab-pane"),oe=_("a-tabs"),de=_("a-layout-content"),ie=_("a-layout");return v(),w(ie,{class:"layout"},{default:i(()=>[d($,{width:130,class:"controller scrollbar"},{default:i(()=>[d(H,{trigger:["contextmenu"],onVisibleChange:l.controllerFormVisible},{overlay:i(()=>[d(N,null,{default:i(()=>[d(E,null,{default:i(()=>[d(C,{data:l.controllerEditForm},{default:i(()=>[d(j),Xe]),_:1},8,["data"])]),_:1}),l.controllerIndex>-1?(v(),w(E,{key:0},{default:i(()=>[d(C,{data:l.controllerEditForm},{default:i(()=>[d(L),Ye]),_:1},8,["data"])]),_:1})):D("",!0),l.controllerIndex>-1?(v(),w(Z,{key:1,title:"\u786E\u8BA4\u5220\u9664\uFF1F",onConfirm:p[0]||(p[0]=c=>l.deleteController())},{icon:i(()=>[d(G,{style:{color:"red"}})]),default:i(()=>[d(E,null,{icon:i(()=>[d(z)]),default:i(()=>[Ze]),_:1})]),_:1})):D("",!0)]),_:1})]),default:i(()=>[u("div",et,[u("div",tt,[nt,u("div",null,[d(C,{data:l.controllerForm},null,8,["data"]),d(y,{size:"small",shape:"circle",onClick:l.getController},{icon:i(()=>[d(ee)]),_:1},8,["onClick"])])]),u("ul",ot,[(v(!0),O(Y,null,X(l.controller,(c,f)=>(v(),O("li",{key:f,onContextmenu:V(T=>l.controllerIndex=f,["prevent"]),onClick:T=>{l.controllerIndex=f,l.getMethod()},class:le(l.controllerIndex==f?"active":"")},[d(I,{placement:"bottom",mouseEnterDelay:1},{title:i(()=>[R(k(c.title),1)]),default:i(()=>[u("div",at,k(c.title),1)]),_:2},1024),d(I,{placement:"bottom",mouseEnterDelay:1},{title:i(()=>[R(k(c.path),1)]),default:i(()=>[u("div",dt,k(c.name),1)]),_:2},1024)],42,lt))),128))])])]),_:1},8,["onVisibleChange"])]),_:1}),d($,{width:130,class:"controller scrollbar"},{default:i(()=>[d(H,{trigger:["contextmenu"],onVisibleChange:l.methodFormVisible},{overlay:i(()=>[d(N,null,{default:i(()=>[l.controllerIndex>-1?(v(),w(E,{key:0},{default:i(()=>[d(C,{data:l.methodForm},{default:i(()=>[d(j),it]),_:1},8,["data"])]),_:1})):D("",!0),l.methodIndex>-1?(v(),w(E,{key:1},{default:i(()=>[d(C,{data:l.methodEditForm},{default:i(()=>[d(L),rt]),_:1},8,["data"])]),_:1})):D("",!0),l.methodIndex>-1?(v(),w(Z,{key:2,title:"\u786E\u8BA4\u5220\u9664\uFF1F",onConfirm:p[1]||(p[1]=c=>l.deleteMethod())},{icon:i(()=>[d(G,{style:{color:"red"}})]),default:i(()=>[d(E,null,{icon:i(()=>[d(z)]),default:i(()=>[st]),_:1})]),_:1})):D("",!0)]),_:1})]),default:i(()=>[u("div",ct,[u("div",ut,[mt,u("div",null,[d(C,{disabled:l.controllerIndex==-1,data:l.methodForm},null,8,["disabled","data"]),d(y,{size:"small",shape:"circle",onClick:p[2]||(p[2]=c=>l.getMethod())},{icon:i(()=>[d(ee)]),_:1})])]),u("ul",ft,[(v(!0),O(Y,null,X(l.method,(c,f)=>(v(),O("li",{key:f,onContextmenu:V(T=>l.methodIndex=f,["prevent"]),onClick:T=>l.getRender(f),class:le(l.methodIndex==f?"active":"")},[d(I,{placement:"bottom",mouseEnterDelay:1},{title:i(()=>[R(k(c.title),1)]),default:i(()=>[u("div",pt,k(c.title),1)]),_:2},1024),d(I,{placement:"bottom",mouseEnterDelay:1},{title:i(()=>[R(k(c.name),1)]),default:i(()=>[u("div",ht,k(c.name),1)]),_:2},1024)],42,bt))),128))])])]),_:1},8,["onVisibleChange"])]),_:1}),d($,{width:300,class:"scrollbar",ref:"dragRef"},{default:i(()=>[d(oe,{type:"card",class:"curd-tabs"},{default:i(()=>[d(U,{key:"1",tab:"\u6570\u636E\u5E93",style:{height:"100%"}},{default:i(()=>[d(K,{visible:l.tableVisible,"onUpdate:visible":p[4]||(p[4]=c=>l.tableVisible=c),title:l.tableModalTitle,width:"1000px"},{footer:i(()=>[l.tableModalRender?(v(),w(C,{key:0,data:l.tableModalRender.footer},null,8,["data"])):D("",!0)]),default:i(()=>[d(C,{data:l.tableModalRender,onSuccess:p[3]||(p[3]=c=>l.onLoadTable(l.tableTreeNode))},null,8,["data"])]),_:1},8,["visible","title"]),u("div",gt,[u("div",_t,[d(B,{style:{"margin-bottom":"10px"}},{default:i(()=>[d(y,{onClick:l.addTable},{default:i(()=>[vt]),_:1},8,["onClick"]),d(y,{onClick:l.presetFields},{default:i(()=>[Ft]),_:1},8,["onClick"]),d(y,{shape:"circle",size:"small",onClick:l.getTable},{icon:i(()=>[d(J)]),_:1},8,["onClick"])]),_:1}),d(te,{value:l.searchTable,"onUpdate:value":p[5]||(p[5]=c=>l.searchTable=c),size:"small",placeholder:"\u641C\u7D22\u8868","allow-clear":""},null,8,["value"])]),d(N,{mode:"inline",class:"curd-table-tree",selectable:!1},{default:i(()=>[(v(!0),O(Y,null,X(l.tableMenus,c=>(v(),w(ne,{key:c.id,onTitleClick:f=>l.onLoadTable(c)},{title:i(()=>[u("div",{onMouseenter:f=>l.tableMouseenter(f,c),onMouseleave:f=>l.tableMouseLeave(f,c)},[u("div",yt,[d(P),u("div",{class:"field-title",title:c.name},k(c.name),9,Ct),c.mouseenter?(v(),O("div",xt,[d(y,{shape:"circle",size:"small",onClick:V(f=>l.onLoadTable(c),["stop"])},{icon:i(()=>[d(J)]),_:2},1032,["onClick"]),d(y,{shape:"circle",size:"small",onClick:V(f=>l.addTableField(c.id),["stop"])},{icon:i(()=>[d(j)]),_:2},1032,["onClick"]),d(y,{shape:"circle",size:"small",onClick:V(f=>l.editTable(c.id),["stop"])},{icon:i(()=>[d(L)]),_:2},1032,["onClick"]),d(y,{shape:"circle",size:"small",onClick:V(f=>l.relationTable(c.id),["stop"])},{icon:i(()=>[d(ae)]),_:2},1032,["onClick"]),d(y,{shape:"circle",size:"small",onClick:V(f=>l.deleteTable(c.id),["stop"])},{icon:i(()=>[d(z)]),_:2},1032,["onClick"])])):D("",!0)]),u("div",{class:"field-title-desc",title:c.comment},k(c.comment),9,kt)],40,Mt)]),default:i(()=>[d(S,{style:{width:"100%"},list:c.children,onSort:l.onFieldSort,clone:l.onClone,move:l.onFieldMove,onEnd:l.onEnd,group:{pull:"clone",put:!1},"item-key":"id"},{item:i(({element:f})=>[u("div",{onMouseenter:T=>l.tableMouseenter(T,f),onMouseleave:T=>l.tableMouseLeave(T,f)},[(v(),w(E,{key:f.id},{default:i(()=>[u("div",At,[d(Q),u("div",{class:"field-title",title:f.name},k(f.name),9,wt),f.mouseenter?(v(),O("div",It,[d(y,{shape:"circle",size:"small",onClick:V(T=>l.editTableField(c.id,f.field,c),["stop"])},{icon:i(()=>[d(L)]),_:2},1032,["onClick"]),d(y,{shape:"circle",size:"small",onClick:V(T=>l.deleteTableField(c.id,f.field,c),["stop"])},{icon:i(()=>[d(z)]),_:2},1032,["onClick"])])):D("",!0)]),u("div",{class:"field-title-desc",title:f.comment},k(f.comment),9,Et)]),_:2},1024))],40,Rt)]),_:2},1032,["list","onSort","clone","move","onEnd"])]),_:2},1032,["onTitleClick"]))),128))]),_:1})])]),_:1}),d(U,{key:"2",tab:"\u8868\u5355\u8BBE\u8BA1",forceRender:""},{default:i(()=>[(v(!0),O(Y,null,X(l.componentList,c=>(v(),O("div",Tt,[u("div",Dt,[Ot,u("div",Vt,k(c.label),1)]),u("div",Lt,[d(S,{list:c.options,sort:!1,clone:l.onClone,onEnd:l.onEnd,move:l.onCloneMove,"chosen-class":"chosen-class",group:{name:"components",pull:"clone",put:!1}},{item:i(({element:f})=>[u("div",$t,[u("div",St,[u("i",{class:le(f.icon)},null,2),R(" "+k(f.label),1)])])]),_:2},1032,["list","clone","onEnd","move"])])]))),256))]),_:1})]),_:1})]),_:1},512),d(de,{class:"main"},{default:i(()=>[u("div",zt,[d(B,null,{default:i(()=>[d(y,{onClick:l.dragSave},{default:i(()=>[u("span",{style:je(l.isSave?"":"color: red;")},"\u4FDD\u5B58",4),Nt]),_:1},8,["onClick"])]),_:1})]),u("div",Bt,[d(C,{ref:c=>l.setRef(c),data:l.drawingMain.component},null,8,["data"])],512)]),_:1}),u("div",{class:"collapse",onClick:p[6]||(p[6]=c=>l.settingFormVisible=!l.settingFormVisible)},[u("i",{class:le(l.settingFormVisible?"fas fa-angle-double-right":"fas fa-angle-double-left")},null,2)]),l.settingFormVisible?(v(),w($,{key:0,width:360,class:"settingForm scrollbar"},{default:i(()=>[d(oe,{type:"card",class:"curd-tabs"},{default:i(()=>[l.settingForm?(v(),w(U,{key:"1",tab:"\u7EC4\u4EF6\u5C5E\u6027"},{default:i(()=>[d(C,{data:l.settingForm,onWatchModel:l.watchModel},null,8,["data","onWatchModel"])]),_:1})):D("",!0),d(U,{key:"2",tab:"\u5C5E\u6027",forceRender:""},{default:i(()=>[l.drawingMain.component?(v(),w(C,{key:0,data:l.drawingMain.component.attribute.drawingForm,onWatchModel:l.watchModel},null,8,["data","onWatchModel"])):D("",!0)]),_:1})]),_:1})]),_:1})):D("",!0),u("div",Pt,[(v(!0),O(Y,null,X(l.settingFormList,c=>(v(),w(C,{data:c,onWatchModel:l.watchModel},null,8,["data","onWatchModel"]))),256))])]),_:1})}var On=$e(Qe,[["render",Ut],["__scopeId","data-v-18921aa6"]]);export{On as default}; diff --git a/public/exadmin/assets/js-cookie.31874410.js b/public/exadmin/assets/js-cookie.31874410.js new file mode 100644 index 0000000..10c4507 --- /dev/null +++ b/public/exadmin/assets/js-cookie.31874410.js @@ -0,0 +1 @@ +/*! js-cookie v3.0.1 | MIT */function d(r){for(var t=1;t>2]|=t[s]<>6,a[o++]=128|r&63):r<55296||r>=57344?(a[o++]=224|r>>12,a[o++]=128|r>>6&63,a[o++]=128|r&63):(r=65536+((r&1023)<<10|t.charCodeAt(++s)&1023),a[o++]=240|r>>18,a[o++]=128|r>>12&63,a[o++]=128|r>>6&63,a[o++]=128|r&63);else for(o=this.start;s>2]|=r<>2]|=(192|r>>6)<>2]|=(128|r&63)<=57344?(h[o>>2]|=(224|r>>12)<>2]|=(128|r>>6&63)<>2]|=(128|r&63)<>2]|=(240|r>>18)<>2]|=(128|r>>12&63)<>2]|=(128|r>>6&63)<>2]|=(128|r&63)<=64?(this.start=o-64,this.hash(),this.hashed=!0):this.start=o}return this.bytes>4294967295&&(this.hBytes+=this.bytes/4294967296<<0,this.bytes=this.bytes%4294967296),this}},Md5.prototype.finalize=function(){if(!this.finalized){this.finalized=!0;var t=this.blocks,e=this.lastByteIndex;t[e>>2]|=EXTRA[e&3],e>=56&&(this.hashed||this.hash(),t[0]=t[16],t[16]=t[1]=t[2]=t[3]=t[4]=t[5]=t[6]=t[7]=t[8]=t[9]=t[10]=t[11]=t[12]=t[13]=t[14]=t[15]=0),t[14]=this.bytes<<3,t[15]=this.hBytes<<3|this.bytes>>>29,this.hash()}},Md5.prototype.hash=function(){var t,e,i,r,s,o,f=this.blocks;this.first?(t=f[0]-680876937,t=(t<<7|t>>>25)-271733879<<0,r=(-1732584194^t&2004318071)+f[1]-117830708,r=(r<<12|r>>>20)+t<<0,i=(-271733879^r&(t^-271733879))+f[2]-1126478375,i=(i<<17|i>>>15)+r<<0,e=(t^i&(r^t))+f[3]-1316259209,e=(e<<22|e>>>10)+i<<0):(t=this.h0,e=this.h1,i=this.h2,r=this.h3,t+=(r^e&(i^r))+f[0]-680876936,t=(t<<7|t>>>25)+e<<0,r+=(i^t&(e^i))+f[1]-389564586,r=(r<<12|r>>>20)+t<<0,i+=(e^r&(t^e))+f[2]+606105819,i=(i<<17|i>>>15)+r<<0,e+=(t^i&(r^t))+f[3]-1044525330,e=(e<<22|e>>>10)+i<<0),t+=(r^e&(i^r))+f[4]-176418897,t=(t<<7|t>>>25)+e<<0,r+=(i^t&(e^i))+f[5]+1200080426,r=(r<<12|r>>>20)+t<<0,i+=(e^r&(t^e))+f[6]-1473231341,i=(i<<17|i>>>15)+r<<0,e+=(t^i&(r^t))+f[7]-45705983,e=(e<<22|e>>>10)+i<<0,t+=(r^e&(i^r))+f[8]+1770035416,t=(t<<7|t>>>25)+e<<0,r+=(i^t&(e^i))+f[9]-1958414417,r=(r<<12|r>>>20)+t<<0,i+=(e^r&(t^e))+f[10]-42063,i=(i<<17|i>>>15)+r<<0,e+=(t^i&(r^t))+f[11]-1990404162,e=(e<<22|e>>>10)+i<<0,t+=(r^e&(i^r))+f[12]+1804603682,t=(t<<7|t>>>25)+e<<0,r+=(i^t&(e^i))+f[13]-40341101,r=(r<<12|r>>>20)+t<<0,i+=(e^r&(t^e))+f[14]-1502002290,i=(i<<17|i>>>15)+r<<0,e+=(t^i&(r^t))+f[15]+1236535329,e=(e<<22|e>>>10)+i<<0,t+=(i^r&(e^i))+f[1]-165796510,t=(t<<5|t>>>27)+e<<0,r+=(e^i&(t^e))+f[6]-1069501632,r=(r<<9|r>>>23)+t<<0,i+=(t^e&(r^t))+f[11]+643717713,i=(i<<14|i>>>18)+r<<0,e+=(r^t&(i^r))+f[0]-373897302,e=(e<<20|e>>>12)+i<<0,t+=(i^r&(e^i))+f[5]-701558691,t=(t<<5|t>>>27)+e<<0,r+=(e^i&(t^e))+f[10]+38016083,r=(r<<9|r>>>23)+t<<0,i+=(t^e&(r^t))+f[15]-660478335,i=(i<<14|i>>>18)+r<<0,e+=(r^t&(i^r))+f[4]-405537848,e=(e<<20|e>>>12)+i<<0,t+=(i^r&(e^i))+f[9]+568446438,t=(t<<5|t>>>27)+e<<0,r+=(e^i&(t^e))+f[14]-1019803690,r=(r<<9|r>>>23)+t<<0,i+=(t^e&(r^t))+f[3]-187363961,i=(i<<14|i>>>18)+r<<0,e+=(r^t&(i^r))+f[8]+1163531501,e=(e<<20|e>>>12)+i<<0,t+=(i^r&(e^i))+f[13]-1444681467,t=(t<<5|t>>>27)+e<<0,r+=(e^i&(t^e))+f[2]-51403784,r=(r<<9|r>>>23)+t<<0,i+=(t^e&(r^t))+f[7]+1735328473,i=(i<<14|i>>>18)+r<<0,e+=(r^t&(i^r))+f[12]-1926607734,e=(e<<20|e>>>12)+i<<0,s=e^i,t+=(s^r)+f[5]-378558,t=(t<<4|t>>>28)+e<<0,r+=(s^t)+f[8]-2022574463,r=(r<<11|r>>>21)+t<<0,o=r^t,i+=(o^e)+f[11]+1839030562,i=(i<<16|i>>>16)+r<<0,e+=(o^i)+f[14]-35309556,e=(e<<23|e>>>9)+i<<0,s=e^i,t+=(s^r)+f[1]-1530992060,t=(t<<4|t>>>28)+e<<0,r+=(s^t)+f[4]+1272893353,r=(r<<11|r>>>21)+t<<0,o=r^t,i+=(o^e)+f[7]-155497632,i=(i<<16|i>>>16)+r<<0,e+=(o^i)+f[10]-1094730640,e=(e<<23|e>>>9)+i<<0,s=e^i,t+=(s^r)+f[13]+681279174,t=(t<<4|t>>>28)+e<<0,r+=(s^t)+f[0]-358537222,r=(r<<11|r>>>21)+t<<0,o=r^t,i+=(o^e)+f[3]-722521979,i=(i<<16|i>>>16)+r<<0,e+=(o^i)+f[6]+76029189,e=(e<<23|e>>>9)+i<<0,s=e^i,t+=(s^r)+f[9]-640364487,t=(t<<4|t>>>28)+e<<0,r+=(s^t)+f[12]-421815835,r=(r<<11|r>>>21)+t<<0,o=r^t,i+=(o^e)+f[15]+530742520,i=(i<<16|i>>>16)+r<<0,e+=(o^i)+f[2]-995338651,e=(e<<23|e>>>9)+i<<0,t+=(i^(e|~r))+f[0]-198630844,t=(t<<6|t>>>26)+e<<0,r+=(e^(t|~i))+f[7]+1126891415,r=(r<<10|r>>>22)+t<<0,i+=(t^(r|~e))+f[14]-1416354905,i=(i<<15|i>>>17)+r<<0,e+=(r^(i|~t))+f[5]-57434055,e=(e<<21|e>>>11)+i<<0,t+=(i^(e|~r))+f[12]+1700485571,t=(t<<6|t>>>26)+e<<0,r+=(e^(t|~i))+f[3]-1894986606,r=(r<<10|r>>>22)+t<<0,i+=(t^(r|~e))+f[10]-1051523,i=(i<<15|i>>>17)+r<<0,e+=(r^(i|~t))+f[1]-2054922799,e=(e<<21|e>>>11)+i<<0,t+=(i^(e|~r))+f[8]+1873313359,t=(t<<6|t>>>26)+e<<0,r+=(e^(t|~i))+f[15]-30611744,r=(r<<10|r>>>22)+t<<0,i+=(t^(r|~e))+f[6]-1560198380,i=(i<<15|i>>>17)+r<<0,e+=(r^(i|~t))+f[13]+1309151649,e=(e<<21|e>>>11)+i<<0,t+=(i^(e|~r))+f[4]-145523070,t=(t<<6|t>>>26)+e<<0,r+=(e^(t|~i))+f[11]-1120210379,r=(r<<10|r>>>22)+t<<0,i+=(t^(r|~e))+f[2]+718787259,i=(i<<15|i>>>17)+r<<0,e+=(r^(i|~t))+f[9]-343485551,e=(e<<21|e>>>11)+i<<0,this.first?(this.h0=t+1732584193<<0,this.h1=e-271733879<<0,this.h2=i-1732584194<<0,this.h3=r+271733878<<0,this.first=!1):(this.h0=this.h0+t<<0,this.h1=this.h1+e<<0,this.h2=this.h2+i<<0,this.h3=this.h3+r<<0)},Md5.prototype.hex=function(){this.finalize();var t=this.h0,e=this.h1,i=this.h2,r=this.h3;return HEX_CHARS[t>>4&15]+HEX_CHARS[t&15]+HEX_CHARS[t>>12&15]+HEX_CHARS[t>>8&15]+HEX_CHARS[t>>20&15]+HEX_CHARS[t>>16&15]+HEX_CHARS[t>>28&15]+HEX_CHARS[t>>24&15]+HEX_CHARS[e>>4&15]+HEX_CHARS[e&15]+HEX_CHARS[e>>12&15]+HEX_CHARS[e>>8&15]+HEX_CHARS[e>>20&15]+HEX_CHARS[e>>16&15]+HEX_CHARS[e>>28&15]+HEX_CHARS[e>>24&15]+HEX_CHARS[i>>4&15]+HEX_CHARS[i&15]+HEX_CHARS[i>>12&15]+HEX_CHARS[i>>8&15]+HEX_CHARS[i>>20&15]+HEX_CHARS[i>>16&15]+HEX_CHARS[i>>28&15]+HEX_CHARS[i>>24&15]+HEX_CHARS[r>>4&15]+HEX_CHARS[r&15]+HEX_CHARS[r>>12&15]+HEX_CHARS[r>>8&15]+HEX_CHARS[r>>20&15]+HEX_CHARS[r>>16&15]+HEX_CHARS[r>>28&15]+HEX_CHARS[r>>24&15]},Md5.prototype.toString=Md5.prototype.hex,Md5.prototype.digest=function(){this.finalize();var t=this.h0,e=this.h1,i=this.h2,r=this.h3;return[t&255,t>>8&255,t>>16&255,t>>24&255,e&255,e>>8&255,e>>16&255,e>>24&255,i&255,i>>8&255,i>>16&255,i>>24&255,r&255,r>>8&255,r>>16&255,r>>24&255]},Md5.prototype.array=Md5.prototype.digest,Md5.prototype.arrayBuffer=function(){this.finalize();var t=new ArrayBuffer(16),e=new Uint32Array(t);return e[0]=this.h0,e[1]=this.h1,e[2]=this.h2,e[3]=this.h3,t},Md5.prototype.buffer=Md5.prototype.arrayBuffer,Md5.prototype.base64=function(){for(var t,e,i,r="",s=this.array(),o=0;o<15;)t=s[o++],e=s[o++],i=s[o++],r+=BASE64_ENCODE_CHAR[t>>>2]+BASE64_ENCODE_CHAR[(t<<4|e>>>4)&63]+BASE64_ENCODE_CHAR[(e<<2|i>>>6)&63]+BASE64_ENCODE_CHAR[i&63];return t=s[o],r+=BASE64_ENCODE_CHAR[t>>>2]+BASE64_ENCODE_CHAR[t<<4&63]+"==",r};var exports=createMethod();COMMON_JS?module.exports=exports:root.md5=exports})()})(md5$1);var md5=md5$1.exports;export{md5 as m}; diff --git a/public/exadmin/assets/linkify-it.92c30060.js b/public/exadmin/assets/linkify-it.92c30060.js new file mode 100644 index 0000000..d8d9459 --- /dev/null +++ b/public/exadmin/assets/linkify-it.92c30060.js @@ -0,0 +1 @@ +import{r as y,a as g,b as v,c as C}from"./uc.micro.981ceb7b.js";var k=function(_){var t={};_=_||{},t.src_Any=y.source,t.src_Cc=g.source,t.src_Z=v.source,t.src_P=C.source,t.src_ZPCc=[t.src_Z,t.src_P,t.src_Cc].join("|"),t.src_ZCc=[t.src_Z,t.src_Cc].join("|");var r="[><\uFF5C]";return t.src_pseudo_letter="(?:(?!"+r+"|"+t.src_ZPCc+")"+t.src_Any+")",t.src_ip4="(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)",t.src_auth="(?:(?:(?!"+t.src_ZCc+"|[@/\\[\\]()]).)+@)?",t.src_port="(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?",t.src_host_terminator="(?=$|"+r+"|"+t.src_ZPCc+")(?!"+(_["---"]?"-(?!--)|":"-|")+"_|:\\d|\\.-|\\.(?!$|"+t.src_ZPCc+"))",t.src_path="(?:[/?#](?:(?!"+t.src_ZCc+"|"+r+`|[()[\\]{}.,"'?!\\-;]).|\\[(?:(?!`+t.src_ZCc+"|\\]).)*\\]|\\((?:(?!"+t.src_ZCc+"|[)]).)*\\)|\\{(?:(?!"+t.src_ZCc+'|[}]).)*\\}|\\"(?:(?!'+t.src_ZCc+`|["]).)+\\"|\\'(?:(?!`+t.src_ZCc+"|[']).)+\\'|\\'(?="+t.src_pseudo_letter+"|[-])|\\.{2,}[a-zA-Z0-9%/&]|\\.(?!"+t.src_ZCc+"|[.]|$)|"+(_["---"]?"\\-(?!--(?:[^-]|$))(?:-*)|":"\\-+|")+",(?!"+t.src_ZCc+"|$)|;(?!"+t.src_ZCc+"|$)|\\!+(?!"+t.src_ZCc+"|[!]|$)|\\?(?!"+t.src_ZCc+"|[?]|$))+|\\/)?",t.src_email_name='[\\-;:&=\\+\\$,\\.a-zA-Z0-9_][\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]*',t.src_xn="xn--[a-z0-9\\-]{1,59}",t.src_domain_root="(?:"+t.src_xn+"|"+t.src_pseudo_letter+"{1,63})",t.src_domain="(?:"+t.src_xn+"|(?:"+t.src_pseudo_letter+")|(?:"+t.src_pseudo_letter+"(?:-|"+t.src_pseudo_letter+"){0,61}"+t.src_pseudo_letter+"))",t.src_host="(?:(?:(?:(?:"+t.src_domain+")\\.)*"+t.src_domain+"))",t.tpl_host_fuzzy="(?:"+t.src_ip4+"|(?:(?:(?:"+t.src_domain+")\\.)+(?:%TLDS%)))",t.tpl_host_no_ip_fuzzy="(?:(?:(?:"+t.src_domain+")\\.)+(?:%TLDS%))",t.src_host_strict=t.src_host+t.src_host_terminator,t.tpl_host_fuzzy_strict=t.tpl_host_fuzzy+t.src_host_terminator,t.src_host_port_strict=t.src_host+t.src_port+t.src_host_terminator,t.tpl_host_port_fuzzy_strict=t.tpl_host_fuzzy+t.src_port+t.src_host_terminator,t.tpl_host_port_no_ip_fuzzy_strict=t.tpl_host_no_ip_fuzzy+t.src_port+t.src_host_terminator,t.tpl_host_fuzzy_test="localhost|www\\.|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:"+t.src_ZPCc+"|>|$))",t.tpl_email_fuzzy="(^|"+r+'|"|\\(|'+t.src_ZCc+")("+t.src_email_name+"@"+t.tpl_host_fuzzy_strict+")",t.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`|\uFF5C]|"+t.src_ZPCc+"))((?![$+<=>^`|\uFF5C])"+t.tpl_host_port_fuzzy_strict+t.src_path+")",t.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`|\uFF5C]|"+t.src_ZPCc+"))((?![$+<=>^`|\uFF5C])"+t.tpl_host_port_no_ip_fuzzy_strict+t.src_path+")",t};function p(_){var t=Array.prototype.slice.call(arguments,1);return t.forEach(function(r){!r||Object.keys(r).forEach(function(e){_[e]=r[e]})}),_}function l(_){return Object.prototype.toString.call(_)}function w(_){return l(_)==="[object String]"}function Z(_){return l(_)==="[object Object]"}function E(_){return l(_)==="[object RegExp]"}function f(_){return l(_)==="[object Function]"}function j(_){return _.replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}var x={fuzzyLink:!0,fuzzyEmail:!0,fuzzyIP:!1};function $(_){return Object.keys(_||{}).reduce(function(t,r){return t||x.hasOwnProperty(r)},!1)}var b={"http:":{validate:function(_,t,r){var e=_.slice(t);return r.re.http||(r.re.http=new RegExp("^\\/\\/"+r.re.src_auth+r.re.src_host_port_strict+r.re.src_path,"i")),r.re.http.test(e)?e.match(r.re.http)[0].length:0}},"https:":"http:","ftp:":"http:","//":{validate:function(_,t,r){var e=_.slice(t);return r.re.no_http||(r.re.no_http=new RegExp("^"+r.re.src_auth+"(?:localhost|(?:(?:"+r.re.src_domain+")\\.)+"+r.re.src_domain_root+")"+r.re.src_port+r.re.src_host_terminator+r.re.src_path,"i")),r.re.no_http.test(e)?t>=3&&_[t-3]===":"||t>=3&&_[t-3]==="/"?0:e.match(r.re.no_http)[0].length:0}},"mailto:":{validate:function(_,t,r){var e=_.slice(t);return r.re.mailto||(r.re.mailto=new RegExp("^"+r.re.src_email_name+"@"+r.re.src_host_strict,"i")),r.re.mailto.test(e)?e.match(r.re.mailto)[0].length:0}}},S="a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]",A="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|\u0440\u0444".split("|");function P(_){_.__index__=-1,_.__text_cache__=""}function R(_){return function(t,r){var e=t.slice(r);return _.test(e)?e.match(_)[0].length:0}}function z(){return function(_,t){t.normalize(_)}}function u(_){var t=_.re=k(_.__opts__),r=_.__tlds__.slice();_.onCompile(),_.__tlds_replaced__||r.push(S),r.push(t.src_xn),t.src_tlds=r.join("|");function e(i){return i.replace("%TLDS%",t.src_tlds)}t.email_fuzzy=RegExp(e(t.tpl_email_fuzzy),"i"),t.link_fuzzy=RegExp(e(t.tpl_link_fuzzy),"i"),t.link_no_ip_fuzzy=RegExp(e(t.tpl_link_no_ip_fuzzy),"i"),t.host_fuzzy_test=RegExp(e(t.tpl_host_fuzzy_test),"i");var c=[];_.__compiled__={};function a(i,s){throw new Error('(LinkifyIt) Invalid schema "'+i+'": '+s)}Object.keys(_.__schemas__).forEach(function(i){var s=_.__schemas__[i];if(s!==null){var h={validate:null,link:null};if(_.__compiled__[i]=h,Z(s)){E(s.validate)?h.validate=R(s.validate):f(s.validate)?h.validate=s.validate:a(i,s),f(s.normalize)?h.normalize=s.normalize:s.normalize?a(i,s):h.normalize=z();return}if(w(s)){c.push(i);return}a(i,s)}}),c.forEach(function(i){!_.__compiled__[_.__schemas__[i]]||(_.__compiled__[i].validate=_.__compiled__[_.__schemas__[i]].validate,_.__compiled__[i].normalize=_.__compiled__[_.__schemas__[i]].normalize)}),_.__compiled__[""]={validate:null,normalize:z()};var o=Object.keys(_.__compiled__).filter(function(i){return i.length>0&&_.__compiled__[i]}).map(j).join("|");_.re.schema_test=RegExp("(^|(?!_)(?:[><\uFF5C]|"+t.src_ZPCc+"))("+o+")","i"),_.re.schema_search=RegExp("(^|(?!_)(?:[><\uFF5C]|"+t.src_ZPCc+"))("+o+")","ig"),_.re.schema_at_start=RegExp("^"+_.re.schema_search.source,"i"),_.re.pretest=RegExp("("+_.re.schema_test.source+")|("+_.re.host_fuzzy_test.source+")|@","i"),P(_)}function O(_,t){var r=_.__index__,e=_.__last_index__,c=_.__text_cache__.slice(r,e);this.schema=_.__schema__.toLowerCase(),this.index=r+t,this.lastIndex=e+t,this.raw=c,this.text=c,this.url=c}function d(_,t){var r=new O(_,t);return _.__compiled__[r.schema].normalize(r,_),r}function n(_,t){if(!(this instanceof n))return new n(_,t);t||$(_)&&(t=_,_={}),this.__opts__=p({},x,t),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=p({},b,_),this.__compiled__={},this.__tlds__=A,this.__tlds_replaced__=!1,this.re={},u(this)}n.prototype.add=function(t,r){return this.__schemas__[t]=r,u(this),this};n.prototype.set=function(t){return this.__opts__=p(this.__opts__,t),this};n.prototype.test=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return!1;var r,e,c,a,o,i,s,h,m;if(this.re.schema_test.test(t)){for(s=this.re.schema_search,s.lastIndex=0;(r=s.exec(t))!==null;)if(a=this.testSchemaAt(t,r[2],s.lastIndex),a){this.__schema__=r[2],this.__index__=r.index+r[1].length,this.__last_index__=r.index+r[0].length+a;break}}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(h=t.search(this.re.host_fuzzy_test),h>=0&&(this.__index__<0||h=0&&(c=t.match(this.re.email_fuzzy))!==null&&(o=c.index+c[1].length,i=c.index+c[0].length,(this.__index__<0||othis.__last_index__)&&(this.__schema__="mailto:",this.__index__=o,this.__last_index__=i))),this.__index__>=0};n.prototype.pretest=function(t){return this.re.pretest.test(t)};n.prototype.testSchemaAt=function(t,r,e){return this.__compiled__[r.toLowerCase()]?this.__compiled__[r.toLowerCase()].validate(t,e,this):0};n.prototype.match=function(t){var r=0,e=[];this.__index__>=0&&this.__text_cache__===t&&(e.push(d(this,r)),r=this.__last_index__);for(var c=r?t.slice(r):t;this.test(c);)e.push(d(this,r)),c=c.slice(this.__last_index__),r+=this.__last_index__;return e.length?e:null};n.prototype.matchAtStart=function(t){if(this.__text_cache__=t,this.__index__=-1,!t.length)return null;var r=this.re.schema_at_start.exec(t);if(!r)return null;var e=this.testSchemaAt(t,r[2],r[0].length);return e?(this.__schema__=r[2],this.__index__=r.index+r[1].length,this.__last_index__=r.index+r[0].length+e,d(this,0)):null};n.prototype.tlds=function(t,r){return t=Array.isArray(t)?t:[t],r?(this.__tlds__=this.__tlds__.concat(t).sort().filter(function(e,c,a){return e!==a[c-1]}).reverse(),u(this),this):(this.__tlds__=t.slice(),this.__tlds_replaced__=!0,u(this),this)};n.prototype.normalize=function(t){t.schema||(t.url="http://"+t.url),t.schema==="mailto:"&&!/^mailto:/i.test(t.url)&&(t.url="mailto:"+t.url)};n.prototype.onCompile=function(){};var I=n;export{I as l}; diff --git a/public/exadmin/assets/lodash-es.0ea26897.js b/public/exadmin/assets/lodash-es.0ea26897.js new file mode 100644 index 0000000..0b7b4e6 --- /dev/null +++ b/public/exadmin/assets/lodash-es.0ea26897.js @@ -0,0 +1 @@ +var be=typeof global=="object"&&global&&global.Object===Object&&global,Sn=be,$e=typeof self=="object"&&self&&self.Object===Object&&self,ye=Sn||$e||Function("return this")(),w=ye,_e=w.Symbol,T=_e,Pn=Object.prototype,Te=Pn.hasOwnProperty,Ae=Pn.toString,K=T?T.toStringTag:void 0;function Oe(r){var n=Te.call(r,K),e=r[K];try{r[K]=void 0;var t=!0}catch{}var i=Ae.call(r);return t&&(n?r[K]=e:delete r[K]),i}var me=Object.prototype,we=me.toString;function Se(r){return we.call(r)}var Pe="[object Null]",xe="[object Undefined]",qr=T?T.toStringTag:void 0;function M(r){return r==null?r===void 0?xe:Pe:qr&&qr in Object(r)?Oe(r):Se(r)}function xn(r,n){return function(e){return r(n(e))}}var Ee=xn(Object.getPrototypeOf,Object),wr=Ee;function O(r){return r!=null&&typeof r=="object"}var Ie="[object Object]",Ce=Function.prototype,Me=Object.prototype,En=Ce.toString,Re=Me.hasOwnProperty,je=En.call(Object);function Le(r){if(!O(r)||M(r)!=Ie)return!1;var n=wr(r);if(n===null)return!0;var e=Re.call(n,"constructor")&&n.constructor;return typeof e=="function"&&e instanceof e&&En.call(e)==je}function Fe(){this.__data__=[],this.size=0}function Sr(r,n){return r===n||r!==r&&n!==n}function ar(r,n){for(var e=r.length;e--;)if(Sr(r[e][0],n))return e;return-1}var Ne=Array.prototype,De=Ne.splice;function Ue(r){var n=this.__data__,e=ar(n,r);if(e<0)return!1;var t=n.length-1;return e==t?n.pop():De.call(n,e,1),--this.size,!0}function Ge(r){var n=this.__data__,e=ar(n,r);return e<0?void 0:n[e][1]}function Be(r){return ar(this.__data__,r)>-1}function He(r,n){var e=this.__data__,t=ar(e,r);return t<0?(++this.size,e.push([r,n])):e[t][1]=n,this}function x(r){var n=-1,e=r==null?0:r.length;for(this.clear();++nu))return!1;var s=a.get(r),c=a.get(n);if(s&&c)return s==n&&c==r;var l=-1,g=!0,h=e&Ft?new U:void 0;for(a.set(r,n),a.set(n,r);++l-1&&r%1==0&&r-1&&r%1==0&&r<=hi}var vi="[object Arguments]",bi="[object Array]",$i="[object Boolean]",yi="[object Date]",_i="[object Error]",Ti="[object Function]",Ai="[object Map]",Oi="[object Number]",mi="[object Object]",wi="[object RegExp]",Si="[object Set]",Pi="[object String]",xi="[object WeakMap]",Ei="[object ArrayBuffer]",Ii="[object DataView]",Ci="[object Float32Array]",Mi="[object Float64Array]",Ri="[object Int8Array]",ji="[object Int16Array]",Li="[object Int32Array]",Fi="[object Uint8Array]",Ni="[object Uint8ClampedArray]",Di="[object Uint16Array]",Ui="[object Uint32Array]",p={};p[Ci]=p[Mi]=p[Ri]=p[ji]=p[Li]=p[Fi]=p[Ni]=p[Di]=p[Ui]=!0;p[vi]=p[bi]=p[Ei]=p[$i]=p[Ii]=p[yi]=p[_i]=p[Ti]=p[Ai]=p[Oi]=p[mi]=p[wi]=p[Si]=p[Pi]=p[xi]=!1;function Gi(r){return O(r)&&Mr(r.length)&&!!p[M(r)]}function ur(r){return function(n){return r(n)}}var Fn=typeof exports=="object"&&exports&&!exports.nodeType&&exports,Y=Fn&&typeof module=="object"&&module&&!module.nodeType&&module,Bi=Y&&Y.exports===Fn,pr=Bi&&Sn.process,Hi=function(){try{var r=Y&&Y.require&&Y.require("util").types;return r||pr&&pr.binding&&pr.binding("util")}catch{}}(),G=Hi,rn=G&&G.isTypedArray,zi=rn?ur(rn):Gi,Nn=zi,Wi=Object.prototype,Ki=Wi.hasOwnProperty;function Dn(r,n){var e=A(r),t=!e&&Ir(r),i=!e&&!t&&tr(r),a=!e&&!t&&!i&&Nn(r),o=e||t||i||a,u=o?ii(r.length,String):[],f=u.length;for(var s in r)(n||Ki.call(r,s))&&!(o&&(s=="length"||i&&(s=="offset"||s=="parent")||a&&(s=="buffer"||s=="byteLength"||s=="byteOffset")||Cr(s,f)))&&u.push(s);return u}var Yi=Object.prototype;function Rr(r){var n=r&&r.constructor,e=typeof n=="function"&&n.prototype||Yi;return r===e}var qi=xn(Object.keys,Object),Ji=qi,Xi=Object.prototype,Zi=Xi.hasOwnProperty;function Qi(r){if(!Rr(r))return Ji(r);var n=[];for(var e in Object(r))Zi.call(r,e)&&e!="constructor"&&n.push(e);return n}function Q(r){return r!=null&&Mr(r.length)&&!In(r)}function B(r){return Q(r)?Dn(r):Qi(r)}function vr(r){return Mn(r,B,Er)}var Vi=1,ki=Object.prototype,ra=ki.hasOwnProperty;function na(r,n,e,t,i,a){var o=e&Vi,u=vr(r),f=u.length,s=vr(n),c=s.length;if(f!=c&&!o)return!1;for(var l=f;l--;){var g=u[l];if(!(o?g in n:ra.call(n,g)))return!1}var h=a.get(r),v=a.get(n);if(h&&v)return h==n&&v==r;var y=!0;a.set(r,n),a.set(n,r);for(var b=o;++l-1}function Bn(r,n,e){for(var t=-1,i=r==null?0:r.length;++t=Aa){var s=n?null:Ta(r);if(s)return Pr(s);o=!1,i=nr,f=new U}else f=n?[]:u;r:for(;++tma)return e;do n%2&&(e+=r),n=wa(n/2),n&&(r+=r);while(n);return e}function sr(r,n){for(var e=-1,t=r==null?0:r.length,i=Array(t);++ei?0:i+n),e=e>i?i:e,e<0&&(e+=i),i=n>e?0:e-n>>>0,n>>>=0;for(var a=Array(i);++t=t?r:Hn(r,n,e)}var Ea="\\ud800-\\udfff",Ia="\\u0300-\\u036f",Ca="\\ufe20-\\ufe2f",Ma="\\u20d0-\\u20ff",Ra=Ia+Ca+Ma,ja="\\ufe0e\\ufe0f",La="\\u200d",Fa=RegExp("["+La+Ea+Ra+ja+"]");function Lr(r){return Fa.test(r)}function zn(r){return function(n){return n==null?void 0:n[r]}}var Na=zn("length"),Da=Na,Wn="\\ud800-\\udfff",Ua="\\u0300-\\u036f",Ga="\\ufe20-\\ufe2f",Ba="\\u20d0-\\u20ff",Ha=Ua+Ga+Ba,za="\\ufe0e\\ufe0f",Wa="["+Wn+"]",_r="["+Ha+"]",Tr="\\ud83c[\\udffb-\\udfff]",Ka="(?:"+_r+"|"+Tr+")",Kn="[^"+Wn+"]",Yn="(?:\\ud83c[\\udde6-\\uddff]){2}",qn="[\\ud800-\\udbff][\\udc00-\\udfff]",Ya="\\u200d",Jn=Ka+"?",Xn="["+za+"]?",qa="(?:"+Ya+"(?:"+[Kn,Yn,qn].join("|")+")"+Xn+Jn+")*",Ja=Xn+Jn+qa,Xa="(?:"+[Kn+_r+"?",_r,Yn,qn,Wa].join("|")+")",dn=RegExp(Tr+"(?="+Tr+")|"+Xa+Ja,"g");function Za(r){for(var n=dn.lastIndex=0;dn.test(r);)++n;return n}function Fr(r){return Lr(r)?Za(r):Da(r)}function Qa(r){return r.split("")}var Zn="\\ud800-\\udfff",Va="\\u0300-\\u036f",ka="\\ufe20-\\ufe2f",ro="\\u20d0-\\u20ff",no=Va+ka+ro,eo="\\ufe0e\\ufe0f",to="["+Zn+"]",Ar="["+no+"]",Or="\\ud83c[\\udffb-\\udfff]",io="(?:"+Ar+"|"+Or+")",Qn="[^"+Zn+"]",Vn="(?:\\ud83c[\\udde6-\\uddff]){2}",kn="[\\ud800-\\udbff][\\udc00-\\udfff]",ao="\\u200d",re=io+"?",ne="["+eo+"]?",oo="(?:"+ao+"(?:"+[Qn,Vn,kn].join("|")+")"+ne+re+")*",uo=ne+re+oo,fo="(?:"+[Qn+Ar+"?",Ar,Vn,kn,to].join("|")+")",so=RegExp(Or+"(?="+Or+")|"+fo+uo,"g");function co(r){return r.match(so)||[]}function lo(r){return Lr(r)?co(r):Qa(r)}var go=Math.ceil;function ee(r,n){n=n===void 0?" ":jr(n);var e=n.length;if(e<2)return e?cn(n,r):n;var t=cn(n,go(r/Fr(n)));return Lr(n)?xa(lo(t),0,r).join(""):t.slice(0,r)}var po=/\s/;function ho(r){for(var n=r.length;n--&&po.test(r.charAt(n)););return n}var vo=/^\s+/;function bo(r){return r&&r.slice(0,ho(r)+1).replace(vo,"")}var pn=0/0,$o=/^[-+]0x[0-9a-f]+$/i,yo=/^0b[01]+$/i,_o=/^0o[0-7]+$/i,To=parseInt;function mr(r){if(typeof r=="number")return r;if(cr(r))return pn;if(m(r)){var n=typeof r.valueOf=="function"?r.valueOf():r;r=m(n)?n+"":n}if(typeof r!="string")return r===0?r:+r;r=bo(r);var e=yo.test(r);return e||_o.test(r)?To(r.slice(2),e?2:8):$o.test(r)?pn:+r}var hn=1/0,Ao=17976931348623157e292;function Oo(r){if(!r)return r===0?r:0;if(r=mr(r),r===hn||r===-hn){var n=r<0?-1:1;return n*Ao}return r===r?r:0}function Nr(r){var n=Oo(r),e=n%1;return n===n?e?n-e:n:0}function Dr(r){return r==null?"":jr(r)}function Ts(r,n,e){r=Dr(r),n=Nr(n);var t=n?Fr(r):0;return n&&t0&&e(u)?n>1?ae(u,n-1,e,t,i):xr(i,u):t||(i[i.length]=u)}return i}function zo(r){var n=r==null?0:r.length;return n?ae(r,1):[]}function Wo(r,n,e){switch(e.length){case 0:return r.call(n);case 1:return r.call(n,e[0]);case 2:return r.call(n,e[0],e[1]);case 3:return r.call(n,e[0],e[1],e[2])}return r.apply(n,e)}var bn=Math.max;function oe(r,n,e){return n=bn(n===void 0?r.length-1:n,0),function(){for(var t=arguments,i=-1,a=bn(t.length-n,0),o=Array(a);++i0){if(++n>=Jo)return arguments[0]}else n=0;return r.apply(void 0,arguments)}}var Vo=Qo(qo),ue=Vo;function fe(r){return ue(oe(r,void 0,zo),r+"")}var ko=fe(function(r,n){return r==null?{}:Bo(r,n)}),As=ko,ru=function(){return w.Date.now()},hr=ru,nu="Expected a function",eu=Math.max,tu=Math.min;function Os(r,n,e){var t,i,a,o,u,f,s=0,c=!1,l=!1,g=!0;if(typeof r!="function")throw new TypeError(nu);n=mr(n)||0,m(e)&&(c=!!e.leading,l="maxWait"in e,a=l?eu(mr(e.maxWait)||0,n):a,g="trailing"in e?!!e.trailing:g);function h(_){var C=t,W=i;return t=i=void 0,s=_,o=r.apply(W,C),o}function v(_){return s=_,u=setTimeout($,n),c?h(_):o}function y(_){var C=_-f,W=_-s,Yr=n-C;return l?tu(Yr,a-W):Yr}function b(_){var C=_-f,W=_-s;return f===void 0||C>=n||C<0||l&&W>=a}function $(){var _=hr();if(b(_))return S(_);u=setTimeout($,y(_))}function S(_){return u=void 0,g&&t?h(_):(t=i=void 0,o)}function k(){u!==void 0&&clearTimeout(u),s=0,t=f=i=u=void 0}function N(){return u===void 0?o:S(hr())}function I(){var _=hr(),C=b(_);if(t=arguments,i=this,f=_,C){if(u===void 0)return v(f);if(l)return clearTimeout(u),u=setTimeout($,n),h(f)}return u===void 0&&(u=setTimeout($,n)),o}return I.cancel=k,I.flush=N,I}function iu(r,n){for(var e=-1,t=r==null?0:r.length;++e-1?i[a?n[o]:o]:void 0}}var Wf=Math.max;function Kf(r,n,e){var t=r==null?0:r.length;if(!t)return-1;var i=e==null?0:Nr(e);return i<0&&(i=Wf(t+i,0)),Un(r,Kr(n),i)}var Yf=zf(Kf),ws=Yf,qf=Math.min;function Jf(r,n,e){for(var t=e?Bn:Gn,i=r[0].length,a=r.length,o=a,u=Array(a),f=1/0,s=[];o--;){var c=r[o];o&&n&&(c=sr(c,ur(n))),f=qf(c.length,f),u[o]=!e&&(n||i>=120&&c.length>=120)?new U(o&&c):void 0}c=r[0];var l=-1,g=u[0];r:for(;++l1),a}),V(r,le(r),e),t&&(e=q(e,ts|is|as,es));for(var i=n.length;i--;)ns(e,n[i]);return e}),Ps=os,us="[object Number]";function xs(r){return typeof r=="number"||O(r)&&M(r)==us}function Es(r,n,e){r=Dr(r),n=Nr(n);var t=n?Fr(r):0;return n&&t + * Copyright OpenJS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */(function(Je,Qe){(function(){var o,rl="4.17.21",Ve=200,il="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",sn="Expected a function",ul="Invalid `variable` option passed into `_.template`",ke="__lodash_hash_undefined__",fl=500,ne="__lodash_placeholder__",qn=1,Ri=2,at=4,ct=1,te=2,an=1,jn=2,Ii=4,Tn=8,ht=16,Ln=32,gt=64,Wn=128,Ot=256,je=512,ll=30,ol="...",sl=800,al=16,Si=1,cl=2,hl=3,nt=1/0,Kn=9007199254740991,gl=17976931348623157e292,ee=0/0,yn=4294967295,_l=yn-1,pl=yn>>>1,vl=[["ary",Wn],["bind",an],["bindKey",jn],["curry",Tn],["curryRight",ht],["flip",je],["partial",Ln],["partialRight",gt],["rearg",Ot]],_t="[object Arguments]",re="[object Array]",dl="[object AsyncFunction]",Wt="[object Boolean]",Pt="[object Date]",wl="[object DOMException]",ie="[object Error]",ue="[object Function]",Ei="[object GeneratorFunction]",xn="[object Map]",Bt="[object Number]",xl="[object Null]",Pn="[object Object]",Ti="[object Promise]",Al="[object Proxy]",bt="[object RegExp]",An="[object Set]",Ft="[object String]",fe="[object Symbol]",Rl="[object Undefined]",Mt="[object WeakMap]",Il="[object WeakSet]",Ut="[object ArrayBuffer]",pt="[object DataView]",nr="[object Float32Array]",tr="[object Float64Array]",er="[object Int8Array]",rr="[object Int16Array]",ir="[object Int32Array]",ur="[object Uint8Array]",fr="[object Uint8ClampedArray]",lr="[object Uint16Array]",or="[object Uint32Array]",Sl=/\b__p \+= '';/g,El=/\b(__p \+=) '' \+/g,Tl=/(__e\(.*?\)|\b__t\)) \+\n'';/g,Li=/&(?:amp|lt|gt|quot|#39);/g,yi=/[&<>"']/g,Ll=RegExp(Li.source),yl=RegExp(yi.source),Cl=/<%-([\s\S]+?)%>/g,ml=/<%([\s\S]+?)%>/g,Ci=/<%=([\s\S]+?)%>/g,Ol=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Wl=/^\w*$/,Pl=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,sr=/[\\^$.*+?()[\]{}|]/g,Bl=RegExp(sr.source),ar=/^\s+/,bl=/\s/,Fl=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Ml=/\{\n\/\* \[wrapped with (.+)\] \*/,Ul=/,? & /,Dl=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Nl=/[()=,{}\[\]\/\s]/,Gl=/\\(\\)?/g,Hl=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,mi=/\w*$/,ql=/^[-+]0x[0-9a-f]+$/i,Kl=/^0b[01]+$/i,$l=/^\[object .+?Constructor\]$/,zl=/^0o[0-7]+$/i,Zl=/^(?:0|[1-9]\d*)$/,Yl=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,le=/($^)/,Xl=/['\n\r\u2028\u2029\\]/g,oe="\\ud800-\\udfff",Jl="\\u0300-\\u036f",Ql="\\ufe20-\\ufe2f",Vl="\\u20d0-\\u20ff",Oi=Jl+Ql+Vl,Wi="\\u2700-\\u27bf",Pi="a-z\\xdf-\\xf6\\xf8-\\xff",kl="\\xac\\xb1\\xd7\\xf7",jl="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",no="\\u2000-\\u206f",to=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Bi="A-Z\\xc0-\\xd6\\xd8-\\xde",bi="\\ufe0e\\ufe0f",Fi=kl+jl+no+to,cr="['\u2019]",eo="["+oe+"]",Mi="["+Fi+"]",se="["+Oi+"]",Ui="\\d+",ro="["+Wi+"]",Di="["+Pi+"]",Ni="[^"+oe+Fi+Ui+Wi+Pi+Bi+"]",hr="\\ud83c[\\udffb-\\udfff]",io="(?:"+se+"|"+hr+")",Gi="[^"+oe+"]",gr="(?:\\ud83c[\\udde6-\\uddff]){2}",_r="[\\ud800-\\udbff][\\udc00-\\udfff]",vt="["+Bi+"]",Hi="\\u200d",qi="(?:"+Di+"|"+Ni+")",uo="(?:"+vt+"|"+Ni+")",Ki="(?:"+cr+"(?:d|ll|m|re|s|t|ve))?",$i="(?:"+cr+"(?:D|LL|M|RE|S|T|VE))?",zi=io+"?",Zi="["+bi+"]?",fo="(?:"+Hi+"(?:"+[Gi,gr,_r].join("|")+")"+Zi+zi+")*",lo="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",oo="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",Yi=Zi+zi+fo,so="(?:"+[ro,gr,_r].join("|")+")"+Yi,ao="(?:"+[Gi+se+"?",se,gr,_r,eo].join("|")+")",co=RegExp(cr,"g"),ho=RegExp(se,"g"),pr=RegExp(hr+"(?="+hr+")|"+ao+Yi,"g"),go=RegExp([vt+"?"+Di+"+"+Ki+"(?="+[Mi,vt,"$"].join("|")+")",uo+"+"+$i+"(?="+[Mi,vt+qi,"$"].join("|")+")",vt+"?"+qi+"+"+Ki,vt+"+"+$i,oo,lo,Ui,so].join("|"),"g"),_o=RegExp("["+Hi+oe+Oi+bi+"]"),po=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,vo=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],wo=-1,M={};M[nr]=M[tr]=M[er]=M[rr]=M[ir]=M[ur]=M[fr]=M[lr]=M[or]=!0,M[_t]=M[re]=M[Ut]=M[Wt]=M[pt]=M[Pt]=M[ie]=M[ue]=M[xn]=M[Bt]=M[Pn]=M[bt]=M[An]=M[Ft]=M[Mt]=!1;var F={};F[_t]=F[re]=F[Ut]=F[pt]=F[Wt]=F[Pt]=F[nr]=F[tr]=F[er]=F[rr]=F[ir]=F[xn]=F[Bt]=F[Pn]=F[bt]=F[An]=F[Ft]=F[fe]=F[ur]=F[fr]=F[lr]=F[or]=!0,F[ie]=F[ue]=F[Mt]=!1;var xo={\u00C0:"A",\u00C1:"A",\u00C2:"A",\u00C3:"A",\u00C4:"A",\u00C5:"A",\u00E0:"a",\u00E1:"a",\u00E2:"a",\u00E3:"a",\u00E4:"a",\u00E5:"a",\u00C7:"C",\u00E7:"c",\u00D0:"D",\u00F0:"d",\u00C8:"E",\u00C9:"E",\u00CA:"E",\u00CB:"E",\u00E8:"e",\u00E9:"e",\u00EA:"e",\u00EB:"e",\u00CC:"I",\u00CD:"I",\u00CE:"I",\u00CF:"I",\u00EC:"i",\u00ED:"i",\u00EE:"i",\u00EF:"i",\u00D1:"N",\u00F1:"n",\u00D2:"O",\u00D3:"O",\u00D4:"O",\u00D5:"O",\u00D6:"O",\u00D8:"O",\u00F2:"o",\u00F3:"o",\u00F4:"o",\u00F5:"o",\u00F6:"o",\u00F8:"o",\u00D9:"U",\u00DA:"U",\u00DB:"U",\u00DC:"U",\u00F9:"u",\u00FA:"u",\u00FB:"u",\u00FC:"u",\u00DD:"Y",\u00FD:"y",\u00FF:"y",\u00C6:"Ae",\u00E6:"ae",\u00DE:"Th",\u00FE:"th",\u00DF:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010A:"C",\u010C:"C",\u0107:"c",\u0109:"c",\u010B:"c",\u010D:"c",\u010E:"D",\u0110:"D",\u010F:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011A:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011B:"e",\u011C:"G",\u011E:"G",\u0120:"G",\u0122:"G",\u011D:"g",\u011F:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012A:"I",\u012C:"I",\u012E:"I",\u0130:"I",\u0129:"i",\u012B:"i",\u012D:"i",\u012F:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013B:"L",\u013D:"L",\u013F:"L",\u0141:"L",\u013A:"l",\u013C:"l",\u013E:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014A:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014B:"n",\u014C:"O",\u014E:"O",\u0150:"O",\u014D:"o",\u014F:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015A:"S",\u015C:"S",\u015E:"S",\u0160:"S",\u015B:"s",\u015D:"s",\u015F:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016A:"U",\u016C:"U",\u016E:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016B:"u",\u016D:"u",\u016F:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017B:"Z",\u017D:"Z",\u017A:"z",\u017C:"z",\u017E:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017F:"s"},Ao={"&":"&","<":"<",">":">",'"':""","'":"'"},Ro={"&":"&","<":"<",">":">",""":'"',"'":"'"},Io={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},So=parseFloat,Eo=parseInt,Xi=typeof jt=="object"&&jt&&jt.Object===Object&&jt,To=typeof self=="object"&&self&&self.Object===Object&&self,z=Xi||To||Function("return this")(),vr=Qe&&!Qe.nodeType&&Qe,tt=vr&&!0&&Je&&!Je.nodeType&&Je,Ji=tt&&tt.exports===vr,dr=Ji&&Xi.process,cn=function(){try{var a=tt&&tt.require&&tt.require("util").types;return a||dr&&dr.binding&&dr.binding("util")}catch{}}(),Qi=cn&&cn.isArrayBuffer,Vi=cn&&cn.isDate,ki=cn&&cn.isMap,ji=cn&&cn.isRegExp,nu=cn&&cn.isSet,tu=cn&&cn.isTypedArray;function en(a,g,h){switch(h.length){case 0:return a.call(g);case 1:return a.call(g,h[0]);case 2:return a.call(g,h[0],h[1]);case 3:return a.call(g,h[0],h[1],h[2])}return a.apply(g,h)}function Lo(a,g,h,w){for(var S=-1,W=a==null?0:a.length;++S-1}function wr(a,g,h){for(var w=-1,S=a==null?0:a.length;++w-1;);return h}function su(a,g){for(var h=a.length;h--&&dt(g,a[h],0)>-1;);return h}function Fo(a,g){for(var h=a.length,w=0;h--;)a[h]===g&&++w;return w}var Mo=Ir(xo),Uo=Ir(Ao);function Do(a){return"\\"+Io[a]}function No(a,g){return a==null?o:a[g]}function wt(a){return _o.test(a)}function Go(a){return po.test(a)}function Ho(a){for(var g,h=[];!(g=a.next()).done;)h.push(g.value);return h}function Lr(a){var g=-1,h=Array(a.size);return a.forEach(function(w,S){h[++g]=[S,w]}),h}function au(a,g){return function(h){return a(g(h))}}function Zn(a,g){for(var h=-1,w=a.length,S=0,W=[];++h-1}function Cs(n,t){var e=this.__data__,r=ye(e,n);return r<0?(++this.size,e.push([n,t])):e[r][1]=t,this}Bn.prototype.clear=Es,Bn.prototype.delete=Ts,Bn.prototype.get=Ls,Bn.prototype.has=ys,Bn.prototype.set=Cs;function bn(n){var t=-1,e=n==null?0:n.length;for(this.clear();++t=t?n:t)),n}function pn(n,t,e,r,i,f){var l,s=t&qn,c=t&Ri,_=t&at;if(e&&(l=i?e(n,r,i,f):e(n)),l!==o)return l;if(!D(n))return n;var p=E(n);if(p){if(l=Pa(n),!s)return k(n,l)}else{var v=X(n),d=v==ue||v==Ei;if(kn(n))return Zu(n,s);if(v==Pn||v==_t||d&&!i){if(l=c||d?{}:hf(n),!s)return c?Ra(n,$s(l,n)):Aa(n,Iu(l,n))}else{if(!F[v])return i?n:{};l=Ba(n,v,s)}}f||(f=new In);var x=f.get(n);if(x)return x;f.set(n,l),Hf(n)?n.forEach(function(I){l.add(pn(I,t,e,I,n,f))}):Nf(n)&&n.forEach(function(I,C){l.set(C,pn(I,t,e,C,n,f))});var R=_?c?kr:Vr:c?nn:$,L=p?o:R(n);return hn(L||n,function(I,C){L&&(C=I,I=n[C]),$t(l,C,pn(I,t,e,C,n,f))}),l}function zs(n){var t=$(n);return function(e){return Su(e,n,t)}}function Su(n,t,e){var r=e.length;if(n==null)return!r;for(n=b(n);r--;){var i=e[r],f=t[i],l=n[i];if(l===o&&!(i in n)||!f(l))return!1}return!0}function Eu(n,t,e){if(typeof n!="function")throw new gn(sn);return Vt(function(){n.apply(o,e)},t)}function zt(n,t,e,r){var i=-1,f=ae,l=!0,s=n.length,c=[],_=t.length;if(!s)return c;e&&(t=U(t,rn(e))),r?(f=wr,l=!1):t.length>=Ve&&(f=Dt,l=!1,t=new it(t));n:for(;++ii?0:i+e),r=r===o||r>i?i:T(r),r<0&&(r+=i),r=e>r?0:Kf(r);e0&&e(s)?t>1?Z(s,t-1,e,r,i):zn(i,s):r||(i[i.length]=s)}return i}var Br=ku(),yu=ku(!0);function Cn(n,t){return n&&Br(n,t,$)}function br(n,t){return n&&yu(n,t,$)}function me(n,t){return $n(t,function(e){return Nn(n[e])})}function ft(n,t){t=Qn(t,n);for(var e=0,r=t.length;n!=null&&et}function Xs(n,t){return n!=null&&B.call(n,t)}function Js(n,t){return n!=null&&t in b(n)}function Qs(n,t,e){return n>=Y(t,e)&&n=120&&p.length>=120)?new it(l&&p):o}p=n[0];var v=-1,d=s[0];n:for(;++v-1;)s!==n&&Ae.call(s,c,1),Ae.call(n,c,1);return n}function Du(n,t){for(var e=n?t.length:0,r=e-1;e--;){var i=t[e];if(e==r||i!==f){var f=i;Dn(i)?Ae.call(n,i,1):$r(n,i)}}return n}function Hr(n,t){return n+Se(wu()*(t-n+1))}function sa(n,t,e,r){for(var i=-1,f=K(Ie((t-n)/(e||1)),0),l=h(f);f--;)l[r?f:++i]=n,n+=e;return l}function qr(n,t){var e="";if(!n||t<1||t>Kn)return e;do t%2&&(e+=n),t=Se(t/2),t&&(n+=n);while(t);return e}function y(n,t){return ui(pf(n,t,tn),n+"")}function aa(n){return Ru(mt(n))}function ca(n,t){var e=mt(n);return Ge(e,ut(t,0,e.length))}function Xt(n,t,e,r){if(!D(n))return n;t=Qn(t,n);for(var i=-1,f=t.length,l=f-1,s=n;s!=null&&++ii?0:i+t),e=e>i?i:e,e<0&&(e+=i),i=t>e?0:e-t>>>0,t>>>=0;for(var f=h(i);++r>>1,l=n[f];l!==null&&!fn(l)&&(e?l<=t:l=Ve){var _=t?null:Ta(n);if(_)return he(_);l=!1,i=Dt,c=new it}else c=t?[]:s;n:for(;++r=r?n:vn(n,t,e)}var zu=es||function(n){return z.clearTimeout(n)};function Zu(n,t){if(t)return n.slice();var e=n.length,r=gu?gu(e):new n.constructor(e);return n.copy(r),r}function Xr(n){var t=new n.constructor(n.byteLength);return new we(t).set(new we(n)),t}function va(n,t){var e=t?Xr(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.byteLength)}function da(n){var t=new n.constructor(n.source,mi.exec(n));return t.lastIndex=n.lastIndex,t}function wa(n){return Kt?b(Kt.call(n)):{}}function Yu(n,t){var e=t?Xr(n.buffer):n.buffer;return new n.constructor(e,n.byteOffset,n.length)}function Xu(n,t){if(n!==t){var e=n!==o,r=n===null,i=n===n,f=fn(n),l=t!==o,s=t===null,c=t===t,_=fn(t);if(!s&&!_&&!f&&n>t||f&&l&&c&&!s&&!_||r&&l&&c||!e&&c||!i)return 1;if(!r&&!f&&!_&&n=s)return c;var _=e[r];return c*(_=="desc"?-1:1)}}return n.index-t.index}function Ju(n,t,e,r){for(var i=-1,f=n.length,l=e.length,s=-1,c=t.length,_=K(f-l,0),p=h(c+_),v=!r;++s1?e[i-1]:o,l=i>2?e[2]:o;for(f=n.length>3&&typeof f=="function"?(i--,f):o,l&&Q(e[0],e[1],l)&&(f=i<3?o:f,i=1),t=b(t);++r-1?i[f?t[l]:l]:o}}function tf(n){return Un(function(t){var e=t.length,r=e,i=_n.prototype.thru;for(n&&t.reverse();r--;){var f=t[r];if(typeof f!="function")throw new gn(sn);if(i&&!l&&De(f)=="wrapper")var l=new _n([],!0)}for(r=l?r:e;++r1&&O.reverse(),p&&cs))return!1;var _=f.get(n),p=f.get(t);if(_&&p)return _==t&&p==n;var v=-1,d=!0,x=e&te?new it:o;for(f.set(n,t),f.set(t,n);++v1?"& ":"")+t[r],t=t.join(e>2?", ":" "),n.replace(Fl,`{ +/* [wrapped with `+t+`] */ +`)}function Fa(n){return E(n)||st(n)||!!(vu&&n&&n[vu])}function Dn(n,t){var e=typeof n;return t=t==null?Kn:t,!!t&&(e=="number"||e!="symbol"&&Zl.test(n))&&n>-1&&n%1==0&&n0){if(++t>=sl)return arguments[0]}else t=0;return n.apply(o,arguments)}}function Ge(n,t){var e=-1,r=n.length,i=r-1;for(t=t===o?r:t;++e1?n[t-1]:o;return e=typeof e=="function"?(n.pop(),e):o,yf(n,e)});function Cf(n){var t=u(n);return t.__chain__=!0,t}function Zc(n,t){return t(n),n}function He(n,t){return t(n)}var Yc=Un(function(n){var t=n.length,e=t?n[0]:0,r=this.__wrapped__,i=function(f){return Pr(f,n)};return t>1||this.__actions__.length||!(r instanceof m)||!Dn(e)?this.thru(i):(r=r.slice(e,+e+(t?1:0)),r.__actions__.push({func:He,args:[i],thisArg:o}),new _n(r,this.__chain__).thru(function(f){return t&&!f.length&&f.push(o),f}))});function Xc(){return Cf(this)}function Jc(){return new _n(this.value(),this.__chain__)}function Qc(){this.__values__===o&&(this.__values__=qf(this.value()));var n=this.__index__>=this.__values__.length,t=n?o:this.__values__[this.__index__++];return{done:n,value:t}}function Vc(){return this}function kc(n){for(var t,e=this;e instanceof Le;){var r=Rf(e);r.__index__=0,r.__values__=o,t?i.__wrapped__=r:t=r;var i=r;e=e.__wrapped__}return i.__wrapped__=n,t}function jc(){var n=this.__wrapped__;if(n instanceof m){var t=n;return this.__actions__.length&&(t=new m(this)),t=t.reverse(),t.__actions__.push({func:He,args:[fi],thisArg:o}),new _n(t,this.__chain__)}return this.thru(fi)}function nh(){return Ku(this.__wrapped__,this.__actions__)}var th=Be(function(n,t,e){B.call(n,e)?++n[e]:Fn(n,e,1)});function eh(n,t,e){var r=E(n)?eu:Zs;return e&&Q(n,t,e)&&(t=o),r(n,A(t,3))}function rh(n,t){var e=E(n)?$n:Lu;return e(n,A(t,3))}var ih=nf(If),uh=nf(Sf);function fh(n,t){return Z(qe(n,t),1)}function lh(n,t){return Z(qe(n,t),nt)}function oh(n,t,e){return e=e===o?1:T(e),Z(qe(n,t),e)}function mf(n,t){var e=E(n)?hn:Xn;return e(n,A(t,3))}function Of(n,t){var e=E(n)?yo:Tu;return e(n,A(t,3))}var sh=Be(function(n,t,e){B.call(n,e)?n[e].push(t):Fn(n,e,[t])});function ah(n,t,e,r){n=j(n)?n:mt(n),e=e&&!r?T(e):0;var i=n.length;return e<0&&(e=K(i+e,0)),Ye(n)?e<=i&&n.indexOf(t,e)>-1:!!i&&dt(n,t,e)>-1}var ch=y(function(n,t,e){var r=-1,i=typeof t=="function",f=j(n)?h(n.length):[];return Xn(n,function(l){f[++r]=i?en(t,l,e):Zt(l,t,e)}),f}),hh=Be(function(n,t,e){Fn(n,e,t)});function qe(n,t){var e=E(n)?U:Pu;return e(n,A(t,3))}function gh(n,t,e,r){return n==null?[]:(E(t)||(t=t==null?[]:[t]),e=r?o:e,E(e)||(e=e==null?[]:[e]),Mu(n,t,e))}var _h=Be(function(n,t,e){n[e?0:1].push(t)},function(){return[[],[]]});function ph(n,t,e){var r=E(n)?xr:fu,i=arguments.length<3;return r(n,A(t,4),e,i,Xn)}function vh(n,t,e){var r=E(n)?Co:fu,i=arguments.length<3;return r(n,A(t,4),e,i,Tu)}function dh(n,t){var e=E(n)?$n:Lu;return e(n,ze(A(t,3)))}function wh(n){var t=E(n)?Ru:aa;return t(n)}function xh(n,t,e){(e?Q(n,t,e):t===o)?t=1:t=T(t);var r=E(n)?Hs:ca;return r(n,t)}function Ah(n){var t=E(n)?qs:ga;return t(n)}function Rh(n){if(n==null)return 0;if(j(n))return Ye(n)?xt(n):n.length;var t=X(n);return t==xn||t==An?n.size:Dr(n).length}function Ih(n,t,e){var r=E(n)?Ar:_a;return e&&Q(n,t,e)&&(t=o),r(n,A(t,3))}var Sh=y(function(n,t){if(n==null)return[];var e=t.length;return e>1&&Q(n,t[0],t[1])?t=[]:e>2&&Q(t[0],t[1],t[2])&&(t=[t[0]]),Mu(n,Z(t,1),[])}),Ke=rs||function(){return z.Date.now()};function Eh(n,t){if(typeof t!="function")throw new gn(sn);return n=T(n),function(){if(--n<1)return t.apply(this,arguments)}}function Wf(n,t,e){return t=e?o:t,t=n&&t==null?n.length:t,Mn(n,Wn,o,o,o,o,t)}function Pf(n,t){var e;if(typeof t!="function")throw new gn(sn);return n=T(n),function(){return--n>0&&(e=t.apply(this,arguments)),n<=1&&(t=o),e}}var oi=y(function(n,t,e){var r=an;if(e.length){var i=Zn(e,yt(oi));r|=Ln}return Mn(n,r,t,e,i)}),Bf=y(function(n,t,e){var r=an|jn;if(e.length){var i=Zn(e,yt(Bf));r|=Ln}return Mn(t,r,n,e,i)});function bf(n,t,e){t=e?o:t;var r=Mn(n,Tn,o,o,o,o,o,t);return r.placeholder=bf.placeholder,r}function Ff(n,t,e){t=e?o:t;var r=Mn(n,ht,o,o,o,o,o,t);return r.placeholder=Ff.placeholder,r}function Mf(n,t,e){var r,i,f,l,s,c,_=0,p=!1,v=!1,d=!0;if(typeof n!="function")throw new gn(sn);t=wn(t)||0,D(e)&&(p=!!e.leading,v="maxWait"in e,f=v?K(wn(e.maxWait)||0,t):f,d="trailing"in e?!!e.trailing:d);function x(H){var En=r,Hn=i;return r=i=o,_=H,l=n.apply(Hn,En),l}function R(H){return _=H,s=Vt(C,t),p?x(H):l}function L(H){var En=H-c,Hn=H-_,tl=t-En;return v?Y(tl,f-Hn):tl}function I(H){var En=H-c,Hn=H-_;return c===o||En>=t||En<0||v&&Hn>=f}function C(){var H=Ke();if(I(H))return O(H);s=Vt(C,L(H))}function O(H){return s=o,d&&r?x(H):(r=i=o,l)}function ln(){s!==o&&zu(s),_=0,r=c=i=s=o}function V(){return s===o?l:O(Ke())}function on(){var H=Ke(),En=I(H);if(r=arguments,i=this,c=H,En){if(s===o)return R(c);if(v)return zu(s),s=Vt(C,t),x(c)}return s===o&&(s=Vt(C,t)),l}return on.cancel=ln,on.flush=V,on}var Th=y(function(n,t){return Eu(n,1,t)}),Lh=y(function(n,t,e){return Eu(n,wn(t)||0,e)});function yh(n){return Mn(n,je)}function $e(n,t){if(typeof n!="function"||t!=null&&typeof t!="function")throw new gn(sn);var e=function(){var r=arguments,i=t?t.apply(this,r):r[0],f=e.cache;if(f.has(i))return f.get(i);var l=n.apply(this,r);return e.cache=f.set(i,l)||f,l};return e.cache=new($e.Cache||bn),e}$e.Cache=bn;function ze(n){if(typeof n!="function")throw new gn(sn);return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}function Ch(n){return Pf(2,n)}var mh=pa(function(n,t){t=t.length==1&&E(t[0])?U(t[0],rn(A())):U(Z(t,1),rn(A()));var e=t.length;return y(function(r){for(var i=-1,f=Y(r.length,e);++i=t}),st=mu(function(){return arguments}())?mu:function(n){return N(n)&&B.call(n,"callee")&&!pu.call(n,"callee")},E=h.isArray,$h=Qi?rn(Qi):ks;function j(n){return n!=null&&Ze(n.length)&&!Nn(n)}function G(n){return N(n)&&j(n)}function zh(n){return n===!0||n===!1||N(n)&&J(n)==Wt}var kn=us||Ai,Zh=Vi?rn(Vi):js;function Yh(n){return N(n)&&n.nodeType===1&&!kt(n)}function Xh(n){if(n==null)return!0;if(j(n)&&(E(n)||typeof n=="string"||typeof n.splice=="function"||kn(n)||Ct(n)||st(n)))return!n.length;var t=X(n);if(t==xn||t==An)return!n.size;if(Qt(n))return!Dr(n).length;for(var e in n)if(B.call(n,e))return!1;return!0}function Jh(n,t){return Yt(n,t)}function Qh(n,t,e){e=typeof e=="function"?e:o;var r=e?e(n,t):o;return r===o?Yt(n,t,o,e):!!r}function ai(n){if(!N(n))return!1;var t=J(n);return t==ie||t==wl||typeof n.message=="string"&&typeof n.name=="string"&&!kt(n)}function Vh(n){return typeof n=="number"&&du(n)}function Nn(n){if(!D(n))return!1;var t=J(n);return t==ue||t==Ei||t==dl||t==Al}function Df(n){return typeof n=="number"&&n==T(n)}function Ze(n){return typeof n=="number"&&n>-1&&n%1==0&&n<=Kn}function D(n){var t=typeof n;return n!=null&&(t=="object"||t=="function")}function N(n){return n!=null&&typeof n=="object"}var Nf=ki?rn(ki):ta;function kh(n,t){return n===t||Ur(n,t,ni(t))}function jh(n,t,e){return e=typeof e=="function"?e:o,Ur(n,t,ni(t),e)}function ng(n){return Gf(n)&&n!=+n}function tg(n){if(Da(n))throw new S(il);return Ou(n)}function eg(n){return n===null}function rg(n){return n==null}function Gf(n){return typeof n=="number"||N(n)&&J(n)==Bt}function kt(n){if(!N(n)||J(n)!=Pn)return!1;var t=xe(n);if(t===null)return!0;var e=B.call(t,"constructor")&&t.constructor;return typeof e=="function"&&e instanceof e&&pe.call(e)==jo}var ci=ji?rn(ji):ea;function ig(n){return Df(n)&&n>=-Kn&&n<=Kn}var Hf=nu?rn(nu):ra;function Ye(n){return typeof n=="string"||!E(n)&&N(n)&&J(n)==Ft}function fn(n){return typeof n=="symbol"||N(n)&&J(n)==fe}var Ct=tu?rn(tu):ia;function ug(n){return n===o}function fg(n){return N(n)&&X(n)==Mt}function lg(n){return N(n)&&J(n)==Il}var og=Ue(Nr),sg=Ue(function(n,t){return n<=t});function qf(n){if(!n)return[];if(j(n))return Ye(n)?Rn(n):k(n);if(Nt&&n[Nt])return Ho(n[Nt]());var t=X(n),e=t==xn?Lr:t==An?he:mt;return e(n)}function Gn(n){if(!n)return n===0?n:0;if(n=wn(n),n===nt||n===-nt){var t=n<0?-1:1;return t*gl}return n===n?n:0}function T(n){var t=Gn(n),e=t%1;return t===t?e?t-e:t:0}function Kf(n){return n?ut(T(n),0,yn):0}function wn(n){if(typeof n=="number")return n;if(fn(n))return ee;if(D(n)){var t=typeof n.valueOf=="function"?n.valueOf():n;n=D(t)?t+"":t}if(typeof n!="string")return n===0?n:+n;n=lu(n);var e=Kl.test(n);return e||zl.test(n)?Eo(n.slice(2),e?2:8):ql.test(n)?ee:+n}function $f(n){return mn(n,nn(n))}function ag(n){return n?ut(T(n),-Kn,Kn):n===0?n:0}function P(n){return n==null?"":un(n)}var cg=Tt(function(n,t){if(Qt(t)||j(t)){mn(t,$(t),n);return}for(var e in t)B.call(t,e)&&$t(n,e,t[e])}),zf=Tt(function(n,t){mn(t,nn(t),n)}),Xe=Tt(function(n,t,e,r){mn(t,nn(t),n,r)}),hg=Tt(function(n,t,e,r){mn(t,$(t),n,r)}),gg=Un(Pr);function _g(n,t){var e=Et(n);return t==null?e:Iu(e,t)}var pg=y(function(n,t){n=b(n);var e=-1,r=t.length,i=r>2?t[2]:o;for(i&&Q(t[0],t[1],i)&&(r=1);++e1),f}),mn(n,kr(n),e),r&&(e=pn(e,qn|Ri|at,La));for(var i=t.length;i--;)$r(e,t[i]);return e});function Bg(n,t){return Yf(n,ze(A(t)))}var bg=Un(function(n,t){return n==null?{}:la(n,t)});function Yf(n,t){if(n==null)return{};var e=U(kr(n),function(r){return[r]});return t=A(t),Uu(n,e,function(r,i){return t(r,i[0])})}function Fg(n,t,e){t=Qn(t,n);var r=-1,i=t.length;for(i||(i=1,n=o);++rt){var r=n;n=t,t=r}if(e||n%1||t%1){var i=wu();return Y(n+i*(t-n+So("1e-"+((i+"").length-1))),t)}return Hr(n,t)}var Zg=Lt(function(n,t,e){return t=t.toLowerCase(),n+(e?Qf(t):t)});function Qf(n){return _i(P(n).toLowerCase())}function Vf(n){return n=P(n),n&&n.replace(Yl,Mo).replace(ho,"")}function Yg(n,t,e){n=P(n),t=un(t);var r=n.length;e=e===o?r:ut(T(e),0,r);var i=e;return e-=t.length,e>=0&&n.slice(e,i)==t}function Xg(n){return n=P(n),n&&yl.test(n)?n.replace(yi,Uo):n}function Jg(n){return n=P(n),n&&Bl.test(n)?n.replace(sr,"\\$&"):n}var Qg=Lt(function(n,t,e){return n+(e?"-":"")+t.toLowerCase()}),Vg=Lt(function(n,t,e){return n+(e?" ":"")+t.toLowerCase()}),kg=ju("toLowerCase");function jg(n,t,e){n=P(n),t=T(t);var r=t?xt(n):0;if(!t||r>=t)return n;var i=(t-r)/2;return Me(Se(i),e)+n+Me(Ie(i),e)}function n_(n,t,e){n=P(n),t=T(t);var r=t?xt(n):0;return t&&r>>0,e?(n=P(n),n&&(typeof t=="string"||t!=null&&!ci(t))&&(t=un(t),!t&&wt(n))?Vn(Rn(n),0,e):n.split(t,e)):[]}var l_=Lt(function(n,t,e){return n+(e?" ":"")+_i(t)});function o_(n,t,e){return n=P(n),e=e==null?0:ut(T(e),0,n.length),t=un(t),n.slice(e,e+t.length)==t}function s_(n,t,e){var r=u.templateSettings;e&&Q(n,t,e)&&(t=o),n=P(n),t=Xe({},t,r,lf);var i=Xe({},t.imports,r.imports,lf),f=$(i),l=Tr(i,f),s,c,_=0,p=t.interpolate||le,v="__p += '",d=yr((t.escape||le).source+"|"+p.source+"|"+(p===Ci?Hl:le).source+"|"+(t.evaluate||le).source+"|$","g"),x="//# sourceURL="+(B.call(t,"sourceURL")?(t.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++wo+"]")+` +`;n.replace(d,function(I,C,O,ln,V,on){return O||(O=ln),v+=n.slice(_,on).replace(Xl,Do),C&&(s=!0,v+=`' + +__e(`+C+`) + +'`),V&&(c=!0,v+=`'; +`+V+`; +__p += '`),O&&(v+=`' + +((__t = (`+O+`)) == null ? '' : __t) + +'`),_=on+I.length,I}),v+=`'; +`;var R=B.call(t,"variable")&&t.variable;if(!R)v=`with (obj) { +`+v+` +} +`;else if(Nl.test(R))throw new S(ul);v=(c?v.replace(Sl,""):v).replace(El,"$1").replace(Tl,"$1;"),v="function("+(R||"obj")+`) { +`+(R?"":`obj || (obj = {}); +`)+"var __t, __p = ''"+(s?", __e = _.escape":"")+(c?`, __j = Array.prototype.join; +function print() { __p += __j.call(arguments, '') } +`:`; +`)+v+`return __p +}`;var L=jf(function(){return W(f,x+"return "+v).apply(o,l)});if(L.source=v,ai(L))throw L;return L}function a_(n){return P(n).toLowerCase()}function c_(n){return P(n).toUpperCase()}function h_(n,t,e){if(n=P(n),n&&(e||t===o))return lu(n);if(!n||!(t=un(t)))return n;var r=Rn(n),i=Rn(t),f=ou(r,i),l=su(r,i)+1;return Vn(r,f,l).join("")}function g_(n,t,e){if(n=P(n),n&&(e||t===o))return n.slice(0,cu(n)+1);if(!n||!(t=un(t)))return n;var r=Rn(n),i=su(r,Rn(t))+1;return Vn(r,0,i).join("")}function __(n,t,e){if(n=P(n),n&&(e||t===o))return n.replace(ar,"");if(!n||!(t=un(t)))return n;var r=Rn(n),i=ou(r,Rn(t));return Vn(r,i).join("")}function p_(n,t){var e=ll,r=ol;if(D(t)){var i="separator"in t?t.separator:i;e="length"in t?T(t.length):e,r="omission"in t?un(t.omission):r}n=P(n);var f=n.length;if(wt(n)){var l=Rn(n);f=l.length}if(e>=f)return n;var s=e-xt(r);if(s<1)return r;var c=l?Vn(l,0,s).join(""):n.slice(0,s);if(i===o)return c+r;if(l&&(s+=c.length-s),ci(i)){if(n.slice(s).search(i)){var _,p=c;for(i.global||(i=yr(i.source,P(mi.exec(i))+"g")),i.lastIndex=0;_=i.exec(p);)var v=_.index;c=c.slice(0,v===o?s:v)}}else if(n.indexOf(un(i),s)!=s){var d=c.lastIndexOf(i);d>-1&&(c=c.slice(0,d))}return c+r}function v_(n){return n=P(n),n&&Ll.test(n)?n.replace(Li,zo):n}var d_=Lt(function(n,t,e){return n+(e?" ":"")+t.toUpperCase()}),_i=ju("toUpperCase");function kf(n,t,e){return n=P(n),t=e?o:t,t===o?Go(n)?Xo(n):Wo(n):n.match(t)||[]}var jf=y(function(n,t){try{return en(n,o,t)}catch(e){return ai(e)?e:new S(e)}}),w_=Un(function(n,t){return hn(t,function(e){e=On(e),Fn(n,e,oi(n[e],n))}),n});function x_(n){var t=n==null?0:n.length,e=A();return n=t?U(n,function(r){if(typeof r[1]!="function")throw new gn(sn);return[e(r[0]),r[1]]}):[],y(function(r){for(var i=-1;++iKn)return[];var e=yn,r=Y(n,yn);t=A(t),n-=yn;for(var i=Er(r,t);++e0||t<0)?new m(e):(n<0?e=e.takeRight(-n):n&&(e=e.drop(n)),t!==o&&(t=T(t),e=t<0?e.dropRight(-t):e.take(t-n)),e)},m.prototype.takeRightWhile=function(n){return this.reverse().takeWhile(n).reverse()},m.prototype.toArray=function(){return this.take(yn)},Cn(m.prototype,function(n,t){var e=/^(?:filter|find|map|reject)|While$/.test(t),r=/^(?:head|last)$/.test(t),i=u[r?"take"+(t=="last"?"Right":""):t],f=r||/^find/.test(t);!i||(u.prototype[t]=function(){var l=this.__wrapped__,s=r?[1]:arguments,c=l instanceof m,_=s[0],p=c||E(l),v=function(C){var O=i.apply(u,zn([C],s));return r&&d?O[0]:O};p&&e&&typeof _=="function"&&_.length!=1&&(c=p=!1);var d=this.__chain__,x=!!this.__actions__.length,R=f&&!d,L=c&&!x;if(!f&&p){l=L?l:new m(this);var I=n.apply(l,s);return I.__actions__.push({func:He,args:[v],thisArg:o}),new _n(I,d)}return R&&L?n.apply(this,s):(I=this.thru(v),R?r?I.value()[0]:I.value():I)})}),hn(["pop","push","shift","sort","splice","unshift"],function(n){var t=ge[n],e=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",r=/^(?:pop|shift)$/.test(n);u.prototype[n]=function(){var i=arguments;if(r&&!this.__chain__){var f=this.value();return t.apply(E(f)?f:[],i)}return this[e](function(l){return t.apply(E(l)?l:[],i)})}}),Cn(m.prototype,function(n,t){var e=u[t];if(e){var r=e.name+"";B.call(St,r)||(St[r]=[]),St[r].push({name:t,func:e})}}),St[be(o,jn).name]=[{name:"wrapper",func:o}],m.prototype.clone=vs,m.prototype.reverse=ds,m.prototype.value=ws,u.prototype.at=Yc,u.prototype.chain=Xc,u.prototype.commit=Jc,u.prototype.next=Qc,u.prototype.plant=kc,u.prototype.reverse=jc,u.prototype.toJSON=u.prototype.valueOf=u.prototype.value=nh,u.prototype.first=u.prototype.head,Nt&&(u.prototype[Nt]=Vc),u},At=Jo();tt?((tt.exports=At)._=At,vr._=At):z._=At}).call(jt)})(el,el.exports);export{el as l}; diff --git a/public/exadmin/assets/markdown-it-anchor.c88e5394.js b/public/exadmin/assets/markdown-it-anchor.c88e5394.js new file mode 100644 index 0000000..2d1b91b --- /dev/null +++ b/public/exadmin/assets/markdown-it-anchor.c88e5394.js @@ -0,0 +1,3 @@ +var w=!1,u={false:"push",true:"unshift",after:"push",before:"unshift"},m={isPermalinkSymbol:!0};function g(t,e,s,n){var a;if(!w){var r="Using deprecated markdown-it-anchor permalink option, see https://github.com/valeriangalliat/markdown-it-anchor#todo-anchor-or-file";typeof process=="object"&&process&&process.emitWarning?process.emitWarning(r):console.warn(r),w=!0}var o=[Object.assign(new s.Token("link_open","a",1),{attrs:[].concat(e.permalinkClass?[["class",e.permalinkClass]]:[],[["href",e.permalinkHref(t,s)]],Object.entries(e.permalinkAttrs(t,s)))}),Object.assign(new s.Token("html_block","",0),{content:e.permalinkSymbol,meta:m}),new s.Token("link_close","a",-1)];e.permalinkSpace&&s.tokens[n+1].children[u[e.permalinkBefore]](Object.assign(new s.Token("text","",0),{content:" "})),(a=s.tokens[n+1].children)[u[e.permalinkBefore]].apply(a,o)}function T(t){return"#"+t}function j(t){return{}}var x={class:"header-anchor",symbol:"#",renderHref:T,renderAttrs:j};function k(t){function e(s){return s=Object.assign({},e.defaults,s),function(n,a,r,o){return t(n,s,a,r,o)}}return e.defaults=Object.assign({},x),e.renderPermalinkImpl=t,e}var h=k(function(t,e,s,n,a){var r,o=[Object.assign(new n.Token("link_open","a",1),{attrs:[].concat(e.class?[["class",e.class]]:[],[["href",e.renderHref(t,n)]],e.ariaHidden?[["aria-hidden","true"]]:[],Object.entries(e.renderAttrs(t,n)))}),Object.assign(new n.Token("html_inline","",0),{content:e.symbol,meta:m}),new n.Token("link_close","a",-1)];if(e.space){var l=typeof e.space=="string"?e.space:" ";n.tokens[a+1].children[u[e.placement]](Object.assign(new n.Token(typeof e.space=="string"?"html_inline":"text","",0),{content:l}))}(r=n.tokens[a+1].children)[u[e.placement]].apply(r,o)});Object.assign(h.defaults,{space:!0,placement:"after",ariaHidden:!1});var d=k(h.renderPermalinkImpl);d.defaults=Object.assign({},h.defaults,{ariaHidden:!0});var _=k(function(t,e,s,n,a){var r=[Object.assign(new n.Token("link_open","a",1),{attrs:[].concat(e.class?[["class",e.class]]:[],[["href",e.renderHref(t,n)]],Object.entries(e.renderAttrs(t,n)))})].concat(e.safariReaderFix?[new n.Token("span_open","span",1)]:[],n.tokens[a+1].children,e.safariReaderFix?[new n.Token("span_close","span",-1)]:[],[new n.Token("link_close","a",-1)]);n.tokens[a+1]=Object.assign(new n.Token("inline","",0),{children:r})});Object.assign(_.defaults,{safariReaderFix:!1});var v=k(function(t,e,s,n,a){var r;if(!["visually-hidden","aria-label","aria-describedby","aria-labelledby"].includes(e.style))throw new Error("`permalink.linkAfterHeader` called with unknown style option `"+e.style+"`");if(!["aria-describedby","aria-labelledby"].includes(e.style)&&!e.assistiveText)throw new Error("`permalink.linkAfterHeader` called without the `assistiveText` option in `"+e.style+"` style");if(e.style==="visually-hidden"&&!e.visuallyHiddenClass)throw new Error("`permalink.linkAfterHeader` called without the `visuallyHiddenClass` option in `visually-hidden` style");var o=n.tokens[a+1].children.filter(function(p){return p.type==="text"||p.type==="code_inline"}).reduce(function(p,y){return p+y.content},""),l=[],i=[];if(e.class&&i.push(["class",e.class]),i.push(["href",e.renderHref(t,n)]),i.push.apply(i,Object.entries(e.renderAttrs(t,n))),e.style==="visually-hidden"){if(l.push(Object.assign(new n.Token("span_open","span",1),{attrs:[["class",e.visuallyHiddenClass]]}),Object.assign(new n.Token("text","",0),{content:e.assistiveText(o)}),new n.Token("span_close","span",-1)),e.space){var b=typeof e.space=="string"?e.space:" ";l[u[e.placement]](Object.assign(new n.Token(typeof e.space=="string"?"html_inline":"text","",0),{content:b}))}l[u[e.placement]](Object.assign(new n.Token("span_open","span",1),{attrs:[["aria-hidden","true"]]}),Object.assign(new n.Token("html_inline","",0),{content:e.symbol,meta:m}),new n.Token("span_close","span",-1))}else l.push(Object.assign(new n.Token("html_inline","",0),{content:e.symbol,meta:m}));e.style==="aria-label"?i.push(["aria-label",e.assistiveText(o)]):["aria-describedby","aria-labelledby"].includes(e.style)&&i.push([e.style,t]);var c=[Object.assign(new n.Token("link_open","a",1),{attrs:i})].concat(l,[new n.Token("link_close","a",-1)]);(r=n.tokens).splice.apply(r,[a+3,0].concat(c)),e.wrapper&&(n.tokens.splice(a,0,Object.assign(new n.Token("html_block","",0),{content:e.wrapper[0]+` +`})),n.tokens.splice(a+3+c.length+1,0,Object.assign(new n.Token("html_block","",0),{content:e.wrapper[1]+` +`})))});function O(t,e,s,n){var a=t,r=n;if(s&&Object.prototype.hasOwnProperty.call(e,a))throw new Error("User defined `id` attribute `"+t+"` is not unique. Please fix it in your Markdown to continue.");for(;Object.prototype.hasOwnProperty.call(e,a);)a=t+"-"+r,r+=1;return e[a]=!0,a}function f(t,e){e=Object.assign({},f.defaults,e),t.core.ruler.push("anchor",function(s){for(var n,a={},r=s.tokens,o=Array.isArray(e.level)?(n=e.level,function(p){return n.includes(p)}):function(p){return function(y){return y>=p}}(e.level),l=0;l"'=]/,s=" ",l="=",i=".",a="#",c=[];let o="",h="",u=!0,y=!1;for(let d=r+e.leftDelimiter.length;d=n+1:h.length>=n}let l,i,a,c;const o=n-r.rightDelimiter.length;switch(t){case"start":a=e.slice(0,r.leftDelimiter.length),l=a===r.leftDelimiter?0:-1,i=l===-1?-1:e.indexOf(r.rightDelimiter,o),c=e.charAt(i+r.rightDelimiter.length),c&&r.rightDelimiter.indexOf(c)!==-1&&(i=-1);break;case"end":l=e.lastIndexOf(r.leftDelimiter),i=l===-1?-1:e.indexOf(r.rightDelimiter,l+o),i=i===e.length-r.rightDelimiter.length?i:-1;break;case"only":a=e.slice(0,r.leftDelimiter.length),l=a===r.leftDelimiter?0:-1,a=e.slice(e.length-r.rightDelimiter.length),i=a===r.rightDelimiter?e.length-r.rightDelimiter.length:-1;break;default:throw new Error(`Unexpected case ${t}, expected 'start', 'end' or 'only'`)}return l!==-1&&i!==-1&&s(e.substring(l,i+r.rightDelimiter.length))}};m.removeDelimiter=function(t,r){const e=D(r.leftDelimiter),n=D(r.rightDelimiter),s=new RegExp("[ \\n]?"+e+"[^"+e+n+"]+"+n+"$"),l=t.search(s);return l!==-1?t.slice(0,l):t};function D(t){return t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")}m.escapeRegExp=D;m.getMatchingOpeningToken=function(t,r){if(t[r].type==="softbreak")return!1;if(t[r].nesting===0)return t[r];const e=t[r].level,n=t[r].type.replace("_close","_open");for(;r>=0;--r)if(t[r].type===n&&t[r].level===e)return t[r];return!1};const O=/[&<>"]/,E=/[&<>"]/g,k={"&":"&","<":"<",">":">",'"':"""};function w(t){return k[t]}m.escapeHtml=function(t){return O.test(t)?t.replace(E,w):t};const f=m;var T=t=>{const r=new RegExp("^ {0,3}[-*_]{3,} ?"+f.escapeRegExp(t.leftDelimiter)+"[^"+f.escapeRegExp(t.rightDelimiter)+"]");return[{name:"fenced code blocks",tests:[{shift:0,block:!0,info:f.hasDelimiters("end",t)}],transform:(e,n)=>{const s=e[n],l=s.info.lastIndexOf(t.leftDelimiter),i=f.getAttrs(s.info,l,t);f.addAttrs(i,s),s.info=f.removeDelimiter(s.info,t)}},{name:"inline nesting 0",tests:[{shift:0,type:"inline",children:[{shift:-1,type:e=>e==="image"||e==="code_inline"},{shift:0,type:"text",content:f.hasDelimiters("start",t)}]}],transform:(e,n,s)=>{const l=e[n].children[s],i=l.content.indexOf(t.rightDelimiter),a=e[n].children[s-1],c=f.getAttrs(l.content,0,t);f.addAttrs(c,a),l.content.length===i+t.rightDelimiter.length?e[n].children.splice(s,1):l.content=l.content.slice(i+t.rightDelimiter.length)}},{name:"tables",tests:[{shift:0,type:"table_close"},{shift:1,type:"paragraph_open"},{shift:2,type:"inline",content:f.hasDelimiters("only",t)}],transform:(e,n)=>{const s=e[n+2],l=f.getMatchingOpeningToken(e,n),i=f.getAttrs(s.content,0,t);f.addAttrs(i,l),e.splice(n+1,3)}},{name:"inline attributes",tests:[{shift:0,type:"inline",children:[{shift:-1,nesting:-1},{shift:0,type:"text",content:f.hasDelimiters("start",t)}]}],transform:(e,n,s)=>{const l=e[n].children[s],i=l.content,a=f.getAttrs(i,0,t),c=f.getMatchingOpeningToken(e[n].children,s-1);f.addAttrs(a,c),l.content=i.slice(i.indexOf(t.rightDelimiter)+t.rightDelimiter.length)}},{name:"list softbreak",tests:[{shift:-2,type:"list_item_open"},{shift:0,type:"inline",children:[{position:-2,type:"softbreak"},{position:-1,type:"text",content:f.hasDelimiters("only",t)}]}],transform:(e,n,s)=>{const i=e[n].children[s].content,a=f.getAttrs(i,0,t);let c=n-2;for(;e[c-1]&&e[c-1].type!=="ordered_list_open"&&e[c-1].type!=="bullet_list_open";)c--;f.addAttrs(a,e[c-1]),e[n].children=e[n].children.slice(0,-2)}},{name:"list double softbreak",tests:[{shift:0,type:e=>e==="bullet_list_close"||e==="ordered_list_close"},{shift:1,type:"paragraph_open"},{shift:2,type:"inline",content:f.hasDelimiters("only",t),children:e=>e.length===1},{shift:3,type:"paragraph_close"}],transform:(e,n)=>{const l=e[n+2].content,i=f.getAttrs(l,0,t),a=f.getMatchingOpeningToken(e,n);f.addAttrs(i,a),e.splice(n+1,3)}},{name:"list item end",tests:[{shift:-2,type:"list_item_open"},{shift:0,type:"inline",children:[{position:-1,type:"text",content:f.hasDelimiters("end",t)}]}],transform:(e,n,s)=>{const l=e[n].children[s],i=l.content,a=f.getAttrs(i,i.lastIndexOf(t.leftDelimiter),t);f.addAttrs(a,e[n-2]);const c=i.slice(0,i.lastIndexOf(t.leftDelimiter));l.content=_(c)!==" "?c:c.slice(0,-1)}},{name:` +{.a} softbreak then curly in start`,tests:[{shift:0,type:"inline",children:[{position:-2,type:"softbreak"},{position:-1,type:"text",content:f.hasDelimiters("only",t)}]}],transform:(e,n,s)=>{const l=e[n].children[s],i=f.getAttrs(l.content,0,t);let a=n+1;for(;e[a+1]&&e[a+1].nesting===-1;)a++;const c=f.getMatchingOpeningToken(e,a);f.addAttrs(i,c),e[n].children=e[n].children.slice(0,-2)}},{name:"horizontal rule",tests:[{shift:0,type:"paragraph_open"},{shift:1,type:"inline",children:e=>e.length===1,content:e=>e.match(r)!==null},{shift:2,type:"paragraph_close"}],transform:(e,n)=>{const s=e[n];s.type="hr",s.tag="hr",s.nesting=0;const l=e[n+1].content,i=l.lastIndexOf(t.leftDelimiter),a=f.getAttrs(l,i,t);f.addAttrs(a,s),s.markup=l,e.splice(n+1,2)}},{name:"end of block",tests:[{shift:0,type:"inline",children:[{position:-1,content:f.hasDelimiters("end",t),type:e=>e!=="code_inline"&&e!=="math_inline"}]}],transform:(e,n,s)=>{const l=e[n].children[s],i=l.content,a=f.getAttrs(i,i.lastIndexOf(t.leftDelimiter),t);let c=n+1;for(;e[c+1]&&e[c+1].nesting===-1;)c++;const o=f.getMatchingOpeningToken(e,c);f.addAttrs(a,o);const h=i.slice(0,i.lastIndexOf(t.leftDelimiter));l.content=_(h)!==" "?h:h.slice(0,-1)}}]};function _(t){return t.slice(-1)[0]}const v=T,C={leftDelimiter:"{",rightDelimiter:"}",allowedAttributes:[]};var S=function(r,e){let n=Object.assign({},C);n=Object.assign(n,e);const s=v(n);function l(i){const a=i.tokens;for(let c=0;c{const g=b(a,c,d);return g.j!==null&&(u=g.j),g.match})&&(h.transform(a,c,u),(h.name==="inline attributes"||h.name==="inline nesting 0")&&o--)}}r.core.ruler.before("linkify","curly_attributes",l)};function b(t,r,e){const n={match:!1,j:null},s=e.shift!==void 0?r+e.shift:e.position;if(e.shift!==void 0&&s<0)return n;const l=R(t,s);if(l===void 0)return n;for(const i of Object.keys(e))if(!(i==="shift"||i==="position")){if(l[i]===void 0)return n;if(i==="children"&&j(e.children)){if(l.children.length===0)return n;let a;const c=e.children,o=l.children;if(c.every(h=>h.position!==void 0)){if(a=c.every(h=>b(o,h.position,h).match),a){const h=I(c).position;n.j=h>=0?h:o.length+h}}else for(let h=0;hb(o,h,u).match),a){n.j=h;break}if(a===!1)return n;continue}switch(typeof e[i]){case"boolean":case"number":case"string":if(l[i]!==e[i])return n;break;case"function":if(!e[i](l[i]))return n;break;case"object":if(M(e[i])){if(e[i].every(c=>c(l[i]))===!1)return n;break}default:throw new Error(`Unknown type of pattern test (key: ${i}). Test should be of type boolean, number, string, function or array of functions.`)}}return n.match=!0,n}function j(t){return Array.isArray(t)&&t.length&&t.every(r=>typeof r=="object")}function M(t){return Array.isArray(t)&&t.length&&t.every(r=>typeof r=="function")}function R(t,r){return r>=0?t[r]:t[t.length+r]}function I(t){return t.slice(-1)[0]||{}}export{S as m}; diff --git a/public/exadmin/assets/markdown-it-container.512a5043.js b/public/exadmin/assets/markdown-it-container.512a5043.js new file mode 100644 index 0000000..5c9b60d --- /dev/null +++ b/public/exadmin/assets/markdown-it-container.512a5043.js @@ -0,0 +1 @@ +var q=function(p,l,a){function T(r){return r.trim().split(" ",2)[0]===l}function y(r,c,_,d,e){return r[c].nesting===1&&r[c].attrJoin("class",l),e.renderToken(r,c,_,d,e)}a=a||{};var A=3,k=a.marker||":",M=k.charCodeAt(0),u=k.length,I=a.validate||T,v=a.render||y;function S(r,c,_,d){var e,i,b,h,m,o,C,x,g=!1,n=r.bMarks[c]+r.tShift[c],f=r.eMarks[c];if(M!==r.src.charCodeAt(n))return!1;for(e=n+1;e<=f&&k[(e-n)%u]===r.src[e];e++);if(b=Math.floor((e-n)/u),b=_||(n=r.bMarks[i]+r.tShift[i],f=r.eMarks[i],n=4)){for(e=n+1;e<=f&&k[(e-n)%u]===r.src[e];e++);if(!(Math.floor((e-n)/u):(",">:-("],blush:[':")',':-")'],broken_heart:["0&&!s.test(h[e-1])||e+t.lengthm&&(o=new l("text","",0),o.content=g.slice(m,e),r.push(o)),o=new l("emoji","",0),o.markup=b,o.content=a[b],r.push(o),m=e+t.length}),m=0;l--)t=r[l],(t.type==="link_open"||t.type==="link_close")&&t.info==="auto"&&(h-=t.nesting),t.type==="text"&&h===0&&i.test(t.content)&&(e[o].children=r=w(r,l,c(t.content,t.level,f.Token)))}};function pO(u){return u.replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}var bO=function(n){var a=n.defs,_;n.enabled.length&&(a=Object.keys(a).reduce(function(s,c){return n.enabled.indexOf(c)>=0&&(s[c]=a[c]),s},{})),_=Object.keys(n.shortcuts).reduce(function(s,c){return a[c]?Array.isArray(n.shortcuts[c])?(n.shortcuts[c].forEach(function(g){s[g]=c}),s):(s[n.shortcuts[c]]=c,s):s},{});var i=Object.keys(a),d;i.length===0?d="^$":d=i.map(function(s){return":"+s+":"}).concat(Object.keys(_)).sort().reverse().map(function(s){return pO(s)}).join("|");var w=RegExp(d),p=RegExp(d,"g");return{defs:a,shortcuts:_,scanRE:w,replaceRE:p}},wO=dO,fO=hO,kO=bO,yO=function(n,a){var _={defs:{},shortcuts:{},enabled:[]},i=kO(n.utils.assign({},_,a||{}));n.renderer.rules.emoji=wO,n.core.ruler.after("linkify","emoji",fO(n,i.defs,i.shortcuts,i.scanRE,i.replaceRE))},vO=gO,xO=uO,zO=yO,jO=function(n,a){var _={defs:vO,shortcuts:xO,enabled:[]},i=n.utils.assign({},_,a||{});zO(n,i)};export{jO as m,gO as r}; diff --git a/public/exadmin/assets/markdown-it-table-of-contents.8a4ce16f.js b/public/exadmin/assets/markdown-it-table-of-contents.8a4ce16f.js new file mode 100644 index 0000000..0e0727d --- /dev/null +++ b/public/exadmin/assets/markdown-it-table-of-contents.8a4ce16f.js @@ -0,0 +1,2 @@ +const d=function(t){return encodeURIComponent(String(t).trim().toLowerCase().replace(/\s+/g,"-"))},h={includeLevel:[1,2],containerClass:"table-of-contents",slugify:d,markerPattern:/^\[\[toc\]\]/im,listType:"ul",format:function(t,o){return o.renderInline(t)},forceFullToc:!1,containerHeaderHtml:void 0,containerFooterHtml:void 0,transformLink:void 0};function g(t,o,n){const r=[];let e=null;return o.forEach(c=>{if(c.type==="heading_open"){const l=x(c),s=parseInt(c.tag.toLowerCase().replace("h",""),10);t.indexOf(s)>=0&&(e={level:s,text:null,anchor:l||null})}else if(e&&c.type==="inline"){const l=c.children.filter(s=>s.type==="text"||s.type==="code_inline").reduce((s,i)=>s+i.content,"");e.text=l,e.anchor||(e.anchor=n.slugify(l,c.content))}else c.type==="heading_close"&&(e&&r.push(e),e=null)}),r}function x(t){if(t&&t.attrs&&t.attrs.length>0){const o=t.attrs.find(n=>Array.isArray(n)&&n.length>=2?n[0]==="id":!1);if(o&&Array.isArray(o)&&o.length>=2){const[n,r]=o;return r}}return null}function y(t){return Math.min(...t.map(o=>o.level))}function a(t,o,n,r){const e={level:t,text:o,anchor:n,children:[],parent:r};return r.children.push(e),e}function m(t){const o={level:y(t)-1,anchor:null,text:null,children:[],parent:null};let n=o,r=n;return t.forEach(e=>{if(e.level>r.level)Array.from({length:e.level-r.level}).forEach(c=>{n=r,r=a(e.level,null,null,n)}),r.text=e.text,r.anchor=e.anchor;else if(e.level===r.level)r=a(e.level,e.text,e.anchor,n);else if(e.level"+t.children.map(r=>{let e="
    "}).join("")+""}var H=function(t,o){const n=Object.assign({},h,o),r=n.markerPattern;let e;function c(l,s){let i,u;if(l.src.charCodeAt(l.pos)!==91||s||(u=r.exec(l.src.substr(l.pos)),u=u?u.filter(function(v){return v}):[],u.length<1))return!1;i=l.push("toc_open","toc",1),i.markup="[[toc]]",i=l.push("toc_body","",0),i=l.push("toc_close","toc",-1);var f=l.src.indexOf(` +`,l.pos);return f!==-1?l.pos=f:l.pos=l.pos+l.posMax+1,!0}t.renderer.rules.toc_open=function(l,s){var i='
    ';return n.containerHeaderHtml&&(i+=n.containerHeaderHtml),i},t.renderer.rules.toc_close=function(l,s){var i="";return n.containerFooterHtml&&(i=n.containerFooterHtml),i+"
    "},t.renderer.rules.toc_body=function(l,s){if(n.forceFullToc)throw"forceFullToc was removed in version 0.5.0. For more information, see https://github.com/Oktavilla/markdown-it-table-of-contents/pull/41";{const i=g(n.includeLevel,e.tokens,n),u=m(i);return p(u,n,t)}},t.core.ruler.push("grab_state",function(l){e=l}),t.inline.ruler.after("emphasis","toc",c)};export{H as m}; diff --git a/public/exadmin/assets/markdown-it.80c3a67b.js b/public/exadmin/assets/markdown-it.80c3a67b.js new file mode 100644 index 0000000..84dcdb0 --- /dev/null +++ b/public/exadmin/assets/markdown-it.80c3a67b.js @@ -0,0 +1,15 @@ +import{r as Ue}from"./entities.0d2c0164.js";import{u as We,c as Qe}from"./uc.micro.981ceb7b.js";import{m as De}from"./mdurl.ef76b4dc.js";import{l as Ve}from"./linkify-it.92c30060.js";import{n as Je}from"./@babel.6cd0804c.js";var E={},Fe=Ue;(function(n){function e(d){return Object.prototype.toString.call(d)}function r(d){return e(d)==="[object String]"}var i=Object.prototype.hasOwnProperty;function l(d,w){return i.call(d,w)}function o(d){var w=Array.prototype.slice.call(arguments,1);return w.forEach(function(y){if(!!y){if(typeof y!="object")throw new TypeError(y+"must be object");Object.keys(y).forEach(function(O){d[O]=y[O]})}}),d}function t(d,w,y){return[].concat(d.slice(0,w),y,d.slice(w+1))}function c(d){return!(d>=55296&&d<=57343||d>=64976&&d<=65007||(d&65535)===65535||(d&65535)===65534||d>=0&&d<=8||d===11||d>=14&&d<=31||d>=127&&d<=159||d>1114111)}function f(d){if(d>65535){d-=65536;var w=55296+(d>>10),y=56320+(d&1023);return String.fromCharCode(w,y)}return String.fromCharCode(d)}var u=/\\([!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])/g,s=/&([a-z#][a-z0-9]{1,31});/gi,p=new RegExp(u.source+"|"+s.source,"gi"),h=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i,a=Fe;function x(d,w){var y=0;return l(a,w)?a[w]:w.charCodeAt(0)===35&&h.test(w)&&(y=w[1].toLowerCase()==="x"?parseInt(w.slice(2),16):parseInt(w.slice(1),10),c(y))?f(y):d}function g(d){return d.indexOf("\\")<0?d:d.replace(u,"$1")}function b(d){return d.indexOf("\\")<0&&d.indexOf("&")<0?d:d.replace(p,function(w,y,O){return y||x(w,O)})}var _=/[&<>"]/,k=/[&<>"]/g,v={"&":"&","<":"<",">":">",'"':"""};function C(d){return v[d]}function S(d){return _.test(d)?d.replace(k,C):d}var m=/[.?*+^$[\]\\(){}|-]/g;function M(d){return d.replace(m,"\\$&")}function I(d){switch(d){case 9:case 32:return!0}return!1}function B(d){if(d>=8192&&d<=8202)return!0;switch(d){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1}var A=Qe;function T(d){return A.test(d)}function H(d){switch(d){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}}function q(d){return d=d.trim().replace(/\s+/g," "),"\u1E9E".toLowerCase()==="\u1E7E"&&(d=d.replace(/ẞ/g,"\xDF")),d.toLowerCase().toUpperCase()}n.lib={},n.lib.mdurl=De,n.lib.ucmicro=We,n.assign=o,n.isString=r,n.has=l,n.unescapeMd=g,n.unescapeAll=b,n.isValidEntityCode=c,n.fromCodePoint=f,n.escapeHtml=S,n.arrayReplaceAt=t,n.isSpace=I,n.isWhiteSpace=B,n.isMdAsciiPunct=H,n.isPunctChar=T,n.escapeRE=M,n.normalizeReference=q})(E);var J={},Ye=function(e,r,i){var l,o,t,c,f=-1,u=e.posMax,s=e.pos;for(e.pos=r+1,l=1;e.pos32))return f;if(l===41){if(o===0)break;o--}r++}return c===r||o!==0||(f.str=ke(e.slice(c,r)),f.lines=t,f.pos=r,f.ok=!0),f},Xe=E.unescapeAll,er=function(e,r,i){var l,o,t=0,c=r,f={ok:!1,pos:0,lines:0,str:""};if(r>=i||(o=e.charCodeAt(r),o!==34&&o!==39&&o!==40))return f;for(r++,o===40&&(o=41);r"+F(n[e].content)+""};$.code_block=function(n,e,r,i,l){var o=n[e];return""+F(n[e].content)+` +`};$.fence=function(n,e,r,i,l){var o=n[e],t=o.info?nr(o.info).trim():"",c="",f="",u,s,p,h,a;return t&&(p=t.split(/(\s+)/g),c=p[0],f=p.slice(2).join("")),r.highlight?u=r.highlight(o.content,c,f)||F(o.content):u=F(o.content),u.indexOf(""+u+` +`):"
    "+u+`
    +`};$.image=function(n,e,r,i,l){var o=n[e];return o.attrs[o.attrIndex("alt")][1]=l.renderInlineAsText(o.children,r,i),l.renderToken(n,e,r)};$.hardbreak=function(n,e,r){return r.xhtmlOut?`
    +`:`
    +`};$.softbreak=function(n,e,r){return r.breaks?r.xhtmlOut?`
    +`:`
    +`:` +`};$.text=function(n,e){return F(n[e].content)};$.html_block=function(n,e){return n[e].content};$.html_inline=function(n,e){return n[e].content};function N(){this.rules=rr({},$)}N.prototype.renderAttrs=function(e){var r,i,l;if(!e.attrs)return"";for(l="",r=0,i=e.attrs.length;r +`:">",o)};N.prototype.renderInline=function(n,e,r){for(var i,l="",o=this.rules,t=0,c=n.length;t\s]/i.test(n)}function ar(n){return/^<\/a\s*>/i.test(n)}var hr=function(e){var r,i,l,o,t,c,f,u,s,p,h,a,x,g,b,_,k=e.tokens,v;if(!!e.md.options.linkify){for(i=0,l=k.length;i=0;r--){if(c=o[r],c.type==="link_close"){for(r--;o[r].level!==c.level&&o[r].type!=="link_open";)r--;continue}if(c.type==="html_inline"&&(sr(c.content)&&x>0&&x--,ar(c.content)&&x++),!(x>0)&&c.type==="text"&&e.md.linkify.test(c.content)){for(s=c.content,v=e.md.linkify.match(s),f=[],a=c.level,h=0,v.length>0&&v[0].index===0&&r>0&&o[r-1].type==="text_special"&&(v=v.slice(1)),u=0;uh&&(t=new e.Token("text","",0),t.content=s.slice(h,p),t.level=a,f.push(t)),t=new e.Token("link_open","a",1),t.attrs=[["href",b]],t.level=a++,t.markup="linkify",t.info="auto",f.push(t),t=new e.Token("text","",0),t.content=_,t.level=a,f.push(t),t=new e.Token("link_close","a",-1),t.level=--a,t.markup="linkify",t.info="auto",f.push(t),h=v[u].lastIndex);h=0;e--)r=n[e],r.type==="text"&&!i&&(r.content=r.content.replace(dr,mr)),r.type==="link_open"&&r.info==="auto"&&i--,r.type==="link_close"&&r.info==="auto"&&i++}function gr(n){var e,r,i=0;for(e=n.length-1;e>=0;e--)r=n[e],r.type==="text"&&!i&&Be.test(r.content)&&(r.content=r.content.replace(/\+-/g,"\xB1").replace(/\.{2,}/g,"\u2026").replace(/([?!])…/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---(?=[^-]|$)/mg,"$1\u2014").replace(/(^|\s)--(?=\s|$)/mg,"$1\u2013").replace(/(^|[^-\s])--(?=[^-\s]|$)/mg,"$1\u2013")),r.type==="link_open"&&r.info==="auto"&&i--,r.type==="link_close"&&r.info==="auto"&&i++}var _r=function(e){var r;if(!!e.md.options.typographer)for(r=e.tokens.length-1;r>=0;r--)e.tokens[r].type==="inline"&&(pr.test(e.tokens[r].content)&&xr(e.tokens[r].children),Be.test(e.tokens[r].content)&&gr(e.tokens[r].children))},me=E.isWhiteSpace,xe=E.isPunctChar,ge=E.isMdAsciiPunct,vr=/['"]/,_e=/['"]/g,ve="\u2019";function W(n,e,r){return n.slice(0,e)+r+n.slice(e+1)}function br(n,e){var r,i,l,o,t,c,f,u,s,p,h,a,x,g,b,_,k,v,C,S,m;for(C=[],r=0;r=0&&!(C[k].level<=f);k--);if(C.length=k+1,i.type!=="text")continue;l=i.content,t=0,c=l.length;e:for(;t=0)s=l.charCodeAt(o.index-1);else for(k=r-1;k>=0&&!(n[k].type==="softbreak"||n[k].type==="hardbreak");k--)if(!!n[k].content){s=n[k].content.charCodeAt(n[k].content.length-1);break}if(p=32,t=48&&s<=57&&(_=b=!1),b&&_&&(b=h,_=a),!b&&!_){v&&(i.content=W(i.content,o.index,ve));continue}if(_){for(k=C.length-1;k>=0&&(u=C[k],!(C[k].level=0;r--)e.tokens[r].type!=="inline"||!vr.test(e.tokens[r].content)||br(e.tokens[r].children,e)},Ar=function(e){var r,i,l,o,t,c,f=e.tokens;for(r=0,i=f.length;r=0&&(i=this.attrs[r][1]),i};L.prototype.attrJoin=function(e,r){var i=this.attrIndex(e);i<0?this.attrPush([e,r]):this.attrs[i][1]=this.attrs[i][1]+" "+r};var se=L,yr=se;function qe(n,e,r){this.src=n,this.env=r,this.tokens=[],this.inlineMode=!1,this.md=e}qe.prototype.Token=yr;var Er=qe,Sr=ue,ne=[["normalize",tr],["block",fr],["inline",cr],["linkify",hr],["replacements",_r],["smartquotes",Cr],["text_join",Ar]];function ae(){this.ruler=new Sr;for(var n=0;ni||(s=r+1,e.sCount[s]=4||(c=e.bMarks[s]+e.tShift[s],c>=e.eMarks[s])||(S=e.src.charCodeAt(c++),S!==124&&S!==45&&S!==58)||c>=e.eMarks[s]||(m=e.src.charCodeAt(c++),m!==124&&m!==45&&m!==58&&!ie(m))||S===45&&ie(m))return!1;for(;c=4||(p=be(t),p.length&&p[0]===""&&p.shift(),p.length&&p[p.length-1]===""&&p.pop(),h=p.length,h===0||h!==x.length))return!1;if(l)return!0;for(k=e.parentType,e.parentType="table",C=e.md.block.ruler.getRules("blockquote"),a=e.push("table_open","table",1),a.map=b=[r,0],a=e.push("thead_open","thead",1),a.map=[r,r+1],a=e.push("tr_open","tr",1),a.map=[r,r+1],f=0;f=4)break;for(p=be(t),p.length&&p[0]===""&&p.shift(),p.length&&p[p.length-1]===""&&p.pop(),s===r+2&&(a=e.push("tbody_open","tbody",1),a.map=_=[r+2,0]),a=e.push("tr_open","tr",1),a.map=[s,s+1],f=0;f=4){l++,o=l;continue}break}return e.line=o,t=e.push("code_block","code",0),t.content=e.getLines(r,o,4+e.blkIndent,!1)+` +`,t.map=[r,e.line],!0},Ir=function(e,r,i,l){var o,t,c,f,u,s,p,h=!1,a=e.bMarks[r]+e.tShift[r],x=e.eMarks[r];if(e.sCount[r]-e.blkIndent>=4||a+3>x||(o=e.src.charCodeAt(a),o!==126&&o!==96)||(u=a,a=e.skipChars(a,o),t=a-u,t<3)||(p=e.src.slice(u,a),c=e.src.slice(a,x),o===96&&c.indexOf(String.fromCharCode(o))>=0))return!1;if(l)return!0;for(f=r;f++,!(f>=i||(a=u=e.bMarks[f]+e.tShift[f],x=e.eMarks[f],a=4)&&(a=e.skipChars(a,o),!(a-u=4||e.src.charCodeAt(A++)!==62)return!1;if(l)return!0;for(f=a=e.sCount[r]+1,e.src.charCodeAt(A)===32?(A++,f++,a++,o=!1,C=!0):e.src.charCodeAt(A)===9?(C=!0,(e.bsCount[r]+a)%4===3?(A++,f++,a++,o=!1):o=!0):C=!1,x=[e.bMarks[r]],e.bMarks[r]=A;A=T,k=[e.sCount[r]],e.sCount[r]=a-f,v=[e.tShift[r]],e.tShift[r]=A-e.bMarks[r],m=e.md.block.ruler.getRules("blockquote"),_=e.parentType,e.parentType="blockquote",h=r+1;h=T));h++){if(e.src.charCodeAt(A++)===62&&!I){for(f=a=e.sCount[h]+1,e.src.charCodeAt(A)===32?(A++,f++,a++,o=!1,C=!0):e.src.charCodeAt(A)===9?(C=!0,(e.bsCount[h]+a)%4===3?(A++,f++,a++,o=!1):o=!0):C=!1,x.push(e.bMarks[h]),e.bMarks[h]=A;A=T,g.push(e.bsCount[h]),e.bsCount[h]=e.sCount[h]+1+(C?1:0),k.push(e.sCount[h]),e.sCount[h]=a-f,v.push(e.tShift[h]),e.tShift[h]=A-e.bMarks[h];continue}if(s)break;for(S=!1,c=0,u=m.length;c",M.map=p=[r,0],e.md.block.tokenize(e,r,h),M=e.push("blockquote_close","blockquote",-1),M.markup=">",e.lineMax=B,e.parentType=_,p[1]=e.line,c=0;c=4||(o=e.src.charCodeAt(u++),o!==42&&o!==45&&o!==95))return!1;for(t=1;u=o||(r=n.src.charCodeAt(l++),r<48||r>57))return-1;for(;;){if(l>=o)return-1;if(r=n.src.charCodeAt(l++),r>=48&&r<=57){if(l-i>=10)return-1;continue}if(r===41||r===46)break;return-1}return l=4||e.listIndent>=0&&e.sCount[r]-e.listIndent>=4&&e.sCount[r]=e.blkIndent&&(O=!0),(T=ye(e,r))>=0){if(p=!0,q=e.bMarks[r]+e.tShift[r],_=Number(e.src.slice(q,T-1)),O&&_!==1)return!1}else if((T=Ae(e,r))>=0)p=!1;else return!1;if(O&&e.skipSpaces(T)>=e.eMarks[r])return!1;if(b=e.src.charCodeAt(T-1),l)return!0;for(g=e.tokens.length,p?(y=e.push("ordered_list_open","ol",1),_!==1&&(y.attrs=[["start",_]])):y=e.push("bullet_list_open","ul",1),y.map=x=[r,0],y.markup=String.fromCharCode(b),v=r,H=!1,w=e.md.block.ruler.getRules("list"),m=e.parentType,e.parentType="list";v=k?u=1:u=C-s,u>4&&(u=1),f=s+u,y=e.push("list_item_open","li",1),y.markup=String.fromCharCode(b),y.map=h=[r,0],p&&(y.info=e.src.slice(q,T-1)),B=e.tight,I=e.tShift[r],M=e.sCount[r],S=e.listIndent,e.listIndent=e.blkIndent,e.blkIndent=f,e.tight=!0,e.tShift[r]=t-e.bMarks[r],e.sCount[r]=C,t>=k&&e.isEmpty(r+1)?e.line=Math.min(e.line+2,i):e.md.block.tokenize(e,r,i,!0),(!e.tight||H)&&(de=!1),H=e.line-r>1&&e.isEmpty(e.line-1),e.blkIndent=e.listIndent,e.listIndent=S,e.tShift[r]=I,e.sCount[r]=M,e.tight=B,y=e.push("list_item_close","li",-1),y.markup=String.fromCharCode(b),v=r=e.line,h[1]=v,t=e.bMarks[r],v>=i||e.sCount[v]=4)break;for(d=!1,c=0,a=w.length;c=4||e.src.charCodeAt(m)!==91)return!1;for(;++m3)&&!(e.sCount[I]<0)){for(k=!1,s=0,p=v.length;s`\\x00-\\x20]+",Nr="'[^']*'",Lr='"[^"]*"',Hr="(?:"+jr+"|"+Nr+"|"+Lr+")",Zr="(?:\\s+"+qr+"(?:\\s*=\\s*"+Hr+")?)",Ne="<[A-Za-z][A-Za-z0-9\\-]*"+Zr+"*\\s*\\/?>",Le="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",Gr="|",Ur="<[?][\\s\\S]*?[?]>",Wr="]*>",Qr="",Vr=new RegExp("^(?:"+Ne+"|"+Le+"|"+Gr+"|"+Ur+"|"+Wr+"|"+Qr+")"),Jr=new RegExp("^(?:"+Ne+"|"+Le+")");Y.HTML_TAG_RE=Vr;var fi=Y.HTML_OPEN_CLOSE_TAG_RE=Jr,Yr=Br,Kr=Y.HTML_OPEN_CLOSE_TAG_RE,j=[[/^<(script|pre|style|textarea)(?=(\s|>|$))/i,/<\/(script|pre|style|textarea)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(Kr.source+"\\s*$"),/^$/,!1]],Xr=function(e,r,i,l){var o,t,c,f,u=e.bMarks[r]+e.tShift[r],s=e.eMarks[r];if(e.sCount[r]-e.blkIndent>=4||!e.md.options.html||e.src.charCodeAt(u)!==60)return!1;for(f=e.src.slice(u,s),o=0;o=4||(o=e.src.charCodeAt(u),o!==35||u>=s))return!1;for(t=1,o=e.src.charCodeAt(++u);o===35&&u6||uu&&Ee(e.src.charCodeAt(c-1))&&(s=c),e.line=r+1,f=e.push("heading_open","h"+String(t),1),f.markup="########".slice(0,t),f.map=[r,e.line],f=e.push("inline","",0),f.content=e.src.slice(u,s).trim(),f.map=[r,e.line],f.children=[],f=e.push("heading_close","h"+String(t),-1),f.markup="########".slice(0,t)),!0)},rn=function(e,r,i){var l,o,t,c,f,u,s,p,h,a=r+1,x,g=e.md.block.ruler.getRules("paragraph");if(e.sCount[r]-e.blkIndent>=4)return!1;for(x=e.parentType,e.parentType="paragraph";a3)){if(e.sCount[a]>=e.blkIndent&&(u=e.bMarks[a]+e.tShift[a],s=e.eMarks[a],u=s)))){p=h===61?1:2;break}if(!(e.sCount[a]<0)){for(o=!1,t=0,c=g.length;t3)&&!(e.sCount[u]<0)){for(l=!1,o=0,t=s.length;o0&&this.level++,this.tokens.push(i),i};z.prototype.isEmpty=function(e){return this.bMarks[e]+this.tShift[e]>=this.eMarks[e]};z.prototype.skipEmptyLines=function(e){for(var r=this.lineMax;er;)if(!K(this.src.charCodeAt(--e)))return e+1;return e};z.prototype.skipChars=function(e,r){for(var i=this.src.length;ei;)if(r!==this.src.charCodeAt(--e))return e+1;return e};z.prototype.getLines=function(e,r,i,l){var o,t,c,f,u,s,p,h=e;if(e>=r)return"";for(s=new Array(r-e),o=0;hi?s[o]=new Array(t-i+1).join(" ")+this.src.slice(f,u):s[o]=this.src.slice(f,u)}return s.join("")};z.prototype.Token=He;var on=z,ln=ue,V=[["table",Tr,["paragraph","reference"]],["code",wr],["fence",Ir,["paragraph","reference","blockquote","list"]],["blockquote",Rr,["paragraph","reference","blockquote","list"]],["hr",$r,["paragraph","reference","blockquote","list"]],["list",Or,["paragraph","reference","blockquote"]],["reference",Fr],["html_block",Xr,["paragraph","reference","blockquote"]],["heading",en,["paragraph","reference","blockquote"]],["lheading",rn],["paragraph",nn]];function X(){this.ruler=new ln;for(var n=0;n=r||n.sCount[c]=u){n.line=r;break}for(l=0;l0||(i=e.pos,l=e.posMax,i+3>l)||e.src.charCodeAt(i)!==58||e.src.charCodeAt(i+1)!==47||e.src.charCodeAt(i+2)!==47||(o=e.pending.match(un),!o)||(t=o[1],c=e.md.linkify.matchAtStart(e.src.slice(i-t.length)),!c)||(f=c.url,f=f.replace(/\*+$/,""),u=e.md.normalizeLink(f),!e.md.validateLink(u))?!1:(r||(e.pending=e.pending.slice(0,-t.length),s=e.push("link_open","a",1),s.attrs=[["href",u]],s.markup="linkify",s.info="auto",s=e.push("text","",0),s.content=e.md.normalizeLinkText(f),s=e.push("link_close","a",-1),s.markup="linkify",s.info="auto"),e.pos+=f.length-t.length,!0)},an=E.isSpace,hn=function(e,r){var i,l,o,t=e.pos;if(e.src.charCodeAt(t)!==10)return!1;if(i=e.pending.length-1,l=e.posMax,!r)if(i>=0&&e.pending.charCodeAt(i)===32)if(i>=1&&e.pending.charCodeAt(i-1)===32){for(o=i-1;o>=1&&e.pending.charCodeAt(o-1)===32;)o--;e.pending=e.pending.slice(0,o),e.push("hardbreak","br",0)}else e.pending=e.pending.slice(0,-1),e.push("softbreak","br",0);else e.push("softbreak","br",0);for(t++;t?@[]^_`{|}~-".split("").forEach(function(n){he[n.charCodeAt(0)]=1});var dn=function(e,r){var i,l,o,t,c,f=e.pos,u=e.posMax;if(e.src.charCodeAt(f)!==92||(f++,f>=u))return!1;if(i=e.src.charCodeAt(f),i===10){for(r||e.push("hardbreak","br",0),f++;f=55296&&i<=56319&&f+1=56320&&l<=57343&&(t+=e.src[f+1],f++)),o="\\"+t,r||(c=e.push("text_special","",0),i<256&&he[i]!==0?c.content=t:c.content=o,c.markup=o,c.info="escape"),e.pos=f+1,!0},kn=function(e,r){var i,l,o,t,c,f,u,s,p=e.pos,h=e.src.charCodeAt(p);if(h!==96)return!1;for(i=p,p++,l=e.posMax;p=0;r--)i=e[r],!(i.marker!==95&&i.marker!==42)&&i.end!==-1&&(l=e[i.end],c=r>0&&e[r-1].end===i.end+1&&e[r-1].marker===i.marker&&e[r-1].token===i.token-1&&e[i.end+1].token===l.token+1,t=String.fromCharCode(i.marker),o=n.tokens[i.token],o.type=c?"strong_open":"em_open",o.tag=c?"strong":"em",o.nesting=1,o.markup=c?t+t:t,o.content="",o=n.tokens[l.token],o.type=c?"strong_close":"em_close",o.tag=c?"strong":"em",o.nesting=-1,o.markup=c?t+t:t,o.content="",c&&(n.tokens[e[r-1].token].content="",n.tokens[e[i.end+1].token].content="",r--))}re.postProcess=function(e){var r,i=e.tokens_meta,l=e.tokens_meta.length;for(Te(e,e.delimiters),r=0;r=g)return!1;if(b=f,u=e.md.helpers.parseLinkDestination(e.src,f,e.posMax),u.ok){for(h=e.md.normalizeLink(u.str),e.md.validateLink(h)?f=u.pos:h="",b=f;f=g||e.src.charCodeAt(f)!==41)&&(_=!0),f++}if(_){if(typeof e.env.references=="undefined")return!1;if(f=0?o=e.src.slice(b,f++):f=t+1):f=t+1,o||(o=e.src.slice(c,t)),s=e.env.references[mn(o)],!s)return e.pos=x,!1;h=s.href,a=s.title}return r||(e.pos=c,e.posMax=t,p=e.push("link_open","a",1),p.attrs=i=[["href",h]],a&&i.push(["title",a]),e.linkLevel++,e.md.inline.tokenize(e),e.linkLevel--,p=e.push("link_close","a",-1)),e.pos=f,e.posMax=g,!0},gn=E.normalizeReference,te=E.isSpace,_n=function(e,r){var i,l,o,t,c,f,u,s,p,h,a,x,g,b="",_=e.pos,k=e.posMax;if(e.src.charCodeAt(e.pos)!==33||e.src.charCodeAt(e.pos+1)!==91||(f=e.pos+2,c=e.md.helpers.parseLinkLabel(e,e.pos+1,!1),c<0))return!1;if(u=c+1,u=k)return!1;for(g=u,p=e.md.helpers.parseLinkDestination(e.src,u,e.posMax),p.ok&&(b=e.md.normalizeLink(p.str),e.md.validateLink(b)?u=p.pos:b=""),g=u;u=k||e.src.charCodeAt(u)!==41)return e.pos=_,!1;u++}else{if(typeof e.env.references=="undefined")return!1;if(u=0?t=e.src.slice(g,u++):u=c+1):u=c+1,t||(t=e.src.slice(f,c)),s=e.env.references[gn(t)],!s)return e.pos=_,!1;b=s.href,h=s.title}return r||(o=e.src.slice(f,c),e.md.inline.parse(o,e.md,e.env,x=[]),a=e.push("image","img",0),a.attrs=i=[["src",b],["alt",""]],a.children=x,a.content=o,h&&i.push(["title",h])),e.pos=u,e.posMax=k,!0},vn=/^([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)$/,bn=/^([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)$/,Cn=function(e,r){var i,l,o,t,c,f,u=e.pos;if(e.src.charCodeAt(u)!==60)return!1;for(c=e.pos,f=e.posMax;;){if(++u>=f||(t=e.src.charCodeAt(u),t===60))return!1;if(t===62)break}return i=e.src.slice(c+1,u),bn.test(i)?(l=e.md.normalizeLink(i),e.md.validateLink(l)?(r||(o=e.push("link_open","a",1),o.attrs=[["href",l]],o.markup="autolink",o.info="auto",o=e.push("text","",0),o.content=e.md.normalizeLinkText(i),o=e.push("link_close","a",-1),o.markup="autolink",o.info="auto"),e.pos+=i.length+2,!0):!1):vn.test(i)?(l=e.md.normalizeLink("mailto:"+i),e.md.validateLink(l)?(r||(o=e.push("link_open","a",1),o.attrs=[["href",l]],o.markup="autolink",o.info="auto",o=e.push("text","",0),o.content=e.md.normalizeLinkText(i),o=e.push("link_close","a",-1),o.markup="autolink",o.info="auto"),e.pos+=i.length+2,!0):!1):!1},An=Y.HTML_TAG_RE;function yn(n){return/^\s]/i.test(n)}function En(n){return/^<\/a\s*>/i.test(n)}function Sn(n){var e=n|32;return e>=97&&e<=122}var Mn=function(e,r){var i,l,o,t,c=e.pos;return!e.md.options.html||(o=e.posMax,e.src.charCodeAt(c)!==60||c+2>=o)||(i=e.src.charCodeAt(c+1),i!==33&&i!==63&&i!==47&&!Sn(i))||(l=e.src.slice(c).match(An),!l)?!1:(r||(t=e.push("html_inline","",0),t.content=e.src.slice(c,c+l[0].length),yn(t.content)&&e.linkLevel++,En(t.content)&&e.linkLevel--),e.pos+=l[0].length,!0)},we=Fe,Tn=E.has,wn=E.isValidEntityCode,Ie=E.fromCodePoint,In=/^&#((?:x[a-f0-9]{1,6}|[0-9]{1,7}));/i,Rn=/^&([a-z][a-z0-9]{1,31});/i,Pn=function(e,r){var i,l,o,t,c=e.pos,f=e.posMax;if(e.src.charCodeAt(c)!==38||c+1>=f)return!1;if(i=e.src.charCodeAt(c+1),i===35){if(o=e.src.slice(c).match(In),o)return r||(l=o[1][0].toLowerCase()==="x"?parseInt(o[1].slice(1),16):parseInt(o[1],10),t=e.push("text_special","",0),t.content=wn(l)?Ie(l):Ie(65533),t.markup=o[0],t.info="entity"),e.pos+=o[0].length,!0}else if(o=e.src.slice(c).match(Rn),o&&Tn(we,o[1]))return r||(t=e.push("text_special","",0),t.content=we[o[1]],t.markup=o[0],t.info="entity"),e.pos+=o[0].length,!0;return!1};function Re(n,e){var r,i,l,o,t,c,f,u,s={},p=e.length;if(!!p){var h=0,a=-2,x=[];for(r=0;rt;i-=x[i]+1)if(o=e[i],o.marker===l.marker&&o.open&&o.end<0&&(f=!1,(o.close||l.open)&&(o.length+l.length)%3===0&&(o.length%3!==0||l.length%3!==0)&&(f=!0),!f)){u=i>0&&!e[i-1].open?x[i-1]+1:0,x[r]=r-i+u,x[i]=u,l.open=!1,o.end=r,o.close=!1,c=-1,a=-2;break}c!==-1&&(s[l.marker][(l.open?3:0)+(l.length||0)%3]=c)}}}var $n=function(e){var r,i=e.tokens_meta,l=e.tokens_meta.length;for(Re(e,e.delimiters),r=0;r0&&l++,o[r].type==="text"&&r+10&&(this.level++,this._prev_delimiters.push(this.delimiters),this.delimiters=[],l={delimiters:this.delimiters}),this.pendingLevel=this.level,this.tokens.push(i),this.tokens_meta.push(l),i};G.prototype.scanDelims=function(n,e){var r=n,i,l,o,t,c,f,u,s,p,h=!0,a=!0,x=this.posMax,g=this.src.charCodeAt(n);for(i=n>0?this.src.charCodeAt(n-1):32;r=o)break;continue}n.pending+=n.src[n.pos++]}n.pending&&n.pushPending()};U.prototype.parse=function(n,e,r,i){var l,o,t,c=new this.State(n,e,r,i);for(this.tokenize(c),o=this.ruler2.getRules(""),t=o.length,l=0;l=0))try{e.hostname=Ze.toASCII(e.hostname)}catch{}return D.encode(D.format(e))}function ei(n){var e=D.parse(n,!0);if(e.hostname&&(!e.protocol||Ge.indexOf(e.protocol)>=0))try{e.hostname=Ze.toUnicode(e.hostname)}catch{}return D.decode(D.format(e),D.decode.defaultChars+"%")}function R(n,e){if(!(this instanceof R))return new R(n,e);e||Z.isString(n)||(e=n||{},n="default"),this.inline=new Wn,this.block=new Un,this.core=new Gn,this.renderer=new Zn,this.linkify=new Qn,this.validateLink=Kn,this.normalizeLink=Xn,this.normalizeLinkText=ei,this.utils=Z,this.helpers=Z.assign({},Hn),this.options={},this.configure(n),e&&this.set(e)}R.prototype.set=function(n){return Z.assign(this.options,n),this};R.prototype.configure=function(n){var e=this,r;if(Z.isString(n)&&(r=n,n=Vn[r],!n))throw new Error('Wrong `markdown-it` preset "'+r+'", check name');if(!n)throw new Error("Wrong `markdown-it` preset, can't be empty");return n.options&&e.set(n.options),n.components&&Object.keys(n.components).forEach(function(i){n.components[i].rules&&e[i].ruler.enableOnly(n.components[i].rules),n.components[i].rules2&&e[i].ruler2.enableOnly(n.components[i].rules2)}),this};R.prototype.enable=function(n,e){var r=[];Array.isArray(n)||(n=[n]),["core","block","inline"].forEach(function(l){r=r.concat(this[l].ruler.enable(n,!0))},this),r=r.concat(this.inline.ruler2.enable(n,!0));var i=n.filter(function(l){return r.indexOf(l)<0});if(i.length&&!e)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+i);return this};R.prototype.disable=function(n,e){var r=[];Array.isArray(n)||(n=[n]),["core","block","inline"].forEach(function(l){r=r.concat(this[l].ruler.disable(n,!0))},this),r=r.concat(this.inline.ruler2.disable(n,!0));var i=n.filter(function(l){return r.indexOf(l)<0});if(i.length&&!e)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+i);return this};R.prototype.use=function(n){var e=[this].concat(Array.prototype.slice.call(arguments,1));return n.apply(n,e),this};R.prototype.parse=function(n,e){if(typeof n!="string")throw new Error("Input data should be a String");var r=new this.core.State(n,this,e);return this.core.process(r),r.tokens};R.prototype.render=function(n,e){return e=e||{},this.renderer.render(this.parse(n,e),this.options,e)};R.prototype.parseInline=function(n,e){var r=new this.core.State(n,this,e);return r.inlineMode=!0,this.core.process(r),r.tokens};R.prototype.renderInline=function(n,e){return e=e||{},this.renderer.render(this.parseInline(n,e),this.options,e)};var ri=R,ci=ri;export{fi as H,Fn as f,Br as h,ci as m}; diff --git a/public/exadmin/assets/mdurl.ef76b4dc.js b/public/exadmin/assets/mdurl.ef76b4dc.js new file mode 100644 index 0000000..0cee97a --- /dev/null +++ b/public/exadmin/assets/mdurl.ef76b4dc.js @@ -0,0 +1,2 @@ +var v={},P={};function R(a){var t,r,i=P[a];if(i)return i;for(i=P[a]=[],t=0;t<128;t++)r=String.fromCharCode(t),/^[0-9a-z]$/i.test(r)?i.push(r):i.push("%"+("0"+t.toString(16).toUpperCase()).slice(-2));for(t=0;t=55296&&s<=57343){if(s>=55296&&s<=56319&&i+1=56320&&o<=57343)){h+=encodeURIComponent(a[i]+a[i+1]),i++;continue}h+="%EF%BF%BD";continue}h+=encodeURIComponent(a[i])}return h}F.defaultChars=";/?:@&=+$,-_.!~*'()#";F.componentChars="-_.!~*'()";var Z=F,_={};function j(a){var t,r,i=_[a];if(i)return i;for(i=_[a]=[],t=0;t<128;t++)r=String.fromCharCode(t),i.push(r);for(t=0;t=55296&&n<=57343?u+="\uFFFD\uFFFD\uFFFD":u+=String.fromCharCode(n),f+=6;continue}if((o&248)===240&&f+91114111?u+="\uFFFD\uFFFD\uFFFD\uFFFD":(n-=65536,u+=String.fromCharCode(55296+(n>>10),56320+(n&1023))),f+=9;continue}u+="\uFFFD"}return u})}d.defaultChars=";/?:@&=+$,#";d.componentChars="";var M=d,G=function(t){var r="";return r+=t.protocol||"",r+=t.slashes?"//":"",r+=t.auth?t.auth+"@":"",t.hostname&&t.hostname.indexOf(":")!==-1?r+="["+t.hostname+"]":r+=t.hostname||"",r+=t.port?":"+t.port:"",r+=t.pathname||"",r+=t.search||"",r+=t.hash||"",r};function p(){this.protocol=null,this.slashes=null,this.auth=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.pathname=null}var J=/^([a-z0-9.+-]+:)/i,K=/:[0-9]*$/,N=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,Q=["<",">",'"',"`"," ","\r",` +`," "],T=["{","}","|","\\","^","`"].concat(Q),V=["'"].concat(T),y=["%","/","?",";","#"].concat(V),U=["/","?","#"],W=255,z=/^[+a-z0-9A-Z_-]{0,63}$/,X=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,S={javascript:!0,"javascript:":!0},B={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};function Y(a,t){if(a&&a instanceof p)return a;var r=new p;return r.parse(a,t),r}p.prototype.parse=function(a,t){var r,i,f,s,o,e=a;if(e=e.trim(),!t&&a.split("#").length===1){var h=N.exec(e);if(h)return this.pathname=h[1],h[2]&&(this.search=h[2]),this}var c=J.exec(e);if(c&&(c=c[0],f=c.toLowerCase(),this.protocol=c,e=e.substr(c.length)),(t||c||e.match(/^\/\/[^@\/]+@[^@\/]+/))&&(o=e.substr(0,2)==="//",o&&!(c&&S[c])&&(e=e.substr(2),this.slashes=!0)),!S[c]&&(o||c&&!B[c])){var n=-1;for(r=0;r127?g+="x":g+=l[C];if(!g.match(z)){var O=m.slice(0,r),b=m.slice(r+1),D=l.match(X);D&&(O.push(D[1]),b.unshift(D[2])),b.length&&(e=b.join(".")+e),this.hostname=O.join(".");break}}}}this.hostname.length>W&&(this.hostname=""),A&&(this.hostname=this.hostname.substr(1,this.hostname.length-2))}var I=e.indexOf("#");I!==-1&&(this.hash=e.substr(I),e=e.slice(0,I));var $=e.indexOf("?");return $!==-1&&(this.search=e.substr($),e=e.slice(0,$)),e&&(this.pathname=e),B[f]&&this.hostname&&!this.pathname&&(this.pathname=""),this};p.prototype.parseHost=function(a){var t=K.exec(a);t&&(t=t[0],t!==":"&&(this.port=t.substr(1)),a=a.substr(0,a.length-t.length)),a&&(this.hostname=a)};var H=Y;v.encode=Z;v.decode=M;v.format=G;v.parse=H;export{v as m}; diff --git a/public/exadmin/assets/numberRange.355eb997.js b/public/exadmin/assets/numberRange.355eb997.js new file mode 100644 index 0000000..0a6bc2b --- /dev/null +++ b/public/exadmin/assets/numberRange.355eb997.js @@ -0,0 +1 @@ +import"./vue.db505ee4.js";import{r as m,V as w,w as D,p as d,aW as g,aR as H,ar as M,bd as O,c as _,aM as V,u as x,S as T,ai as k}from"./@vue.cb43a243.js";import"./@babel.6cd0804c.js";import"./regenerator-runtime.8e24db72.js";const A={name:"ExNumberRange"},$=Object.assign(A,{props:{value:Array,separator:{type:String,default:"-"}},emits:["update:value"],setup(i,{emit:f}){const s=i,e=m(null),a=m(null),t=w();p(),D(()=>s.value,(l,u)=>{JSON.stringify(l)!=JSON.stringify(u)&&p()});function p(){s.value.length>0?(e.value=s.value[0],a.value=s.value[1]):(e.value=null,a.value=null),n()}function n(){e.value===null&&a.value===null?f("update:value",[]):f("update:value",[e.value,a.value])}let r=!1;function b(){r=!1}function S(l){e.value===null&&(a.value=null),setTimeout(()=>{e.value!==null&&!a.value&&(a.value=o()),e.value!==null&&e.value===a.value&&(a.value=o()),n()},500)}function y(){r=!0,e.value===null&&a.value!==null&&(e.value=N()),setTimeout(()=>{a.value===null&&r&&(e.value=null),n()},300)}function o(){const l=t.step||1;return e.value+l}function N(){const l=t.step||1;return a.value-l}const B=d(()=>o()),C=d(()=>{if(t.max){const l=t.step||1;return t.max-l}return null});return(l,u)=>{const c=g("a-input-number"),h=g("a-form-item-rest");return H(),M(h,null,{default:O(()=>[_(c,V(l.$attrs,{max:x(C),value:e.value,"onUpdate:value":u[0]||(u[0]=v=>e.value=v),onChange:n,onFocus:b,onBlur:S}),null,16,["max","value"]),T(" "+k(i.separator)+" ",1),_(c,V(l.$attrs,{min:x(B),value:a.value,"onUpdate:value":u[1]||(u[1]=v=>a.value=v),onChange:n,onBlur:y}),null,16,["min","value"])]),_:1})}}});export{$ as default}; diff --git a/public/exadmin/assets/prismjs.c97a8414.js b/public/exadmin/assets/prismjs.c97a8414.js new file mode 100644 index 0000000..36d852a --- /dev/null +++ b/public/exadmin/assets/prismjs.c97a8414.js @@ -0,0 +1,9 @@ +import{c as W}from"./@babel.6cd0804c.js";var Y={exports:{}};(function(d){var w=typeof window!="undefined"?window:typeof WorkerGlobalScope!="undefined"&&self instanceof WorkerGlobalScope?self:{};/** + * Prism: Lightweight, robust, elegant syntax highlighting + * + * @license MIT + * @author Lea Verou + * @namespace + * @public + */var a=function(o){var c=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,h=0,m={},i={manual:o.Prism&&o.Prism.manual,disableWorkerMessageHandler:o.Prism&&o.Prism.disableWorkerMessageHandler,util:{encode:function e(t){return t instanceof p?new p(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/"+s.content+""};function y(e,t,n,r){e.lastIndex=t;var s=e.exec(n);if(s&&r&&s[1]){var l=s[1].length;s.index+=l,s[0]=s[0].slice(l)}return s}function j(e,t,n,r,s,l){for(var g in n)if(!(!n.hasOwnProperty(g)||!n[g])){var u=n[g];u=Array.isArray(u)?u:[u];for(var b=0;b=l.reach);_+=x.value.length,x=x.next){var C=x.value;if(t.length>e.length)return;if(!(C instanceof p)){var I=1,A;if(G){if(A=y(H,_,e,B),!A||A.index>=e.length)break;var q=A.index,N=A.index+A[0].length,E=_;for(E+=x.value.length;q>=E;)x=x.next,E+=x.value.length;if(E-=x.value.length,_=E,x.value instanceof p)continue;for(var D=x;D!==t.tail&&(El.reach&&(l.reach=Z);var L=x.prev;R&&(L=$(t,L,R),_+=R.length),T(t,L,I);var K=new p(g,z?i.tokenize(O,z):O,X,O);if(x=$(t,L,K),U&&$(t,x,U),I>1){var M={cause:g+","+b,reach:Z};j(e,t,n,x.prev,_,M),l&&M.reach>l.reach&&(l.reach=M.reach)}}}}}}function S(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function $(e,t,n){var r=t.next,s={value:n,prev:t,next:r};return t.next=s,r.prev=s,e.length++,s}function T(e,t,n){for(var r=t.next,s=0;s/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",function(o){o.type==="entity"&&(o.attributes.title=o.content.replace(/&/,"&"))}),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(c,h){var m={};m["language-"+h]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[h]},m.cdata=/^$/i;var i={"included-cdata":{pattern://i,inside:m}};i["language-"+h]={pattern:/[\s\S]+/,inside:a.languages[h]};var p={};p[c]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return c}),"i"),lookbehind:!0,greedy:!0,inside:i},a.languages.insertBefore("markup","cdata",p)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(o,c){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+o+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[c,"language-"+c],inside:a.languages[c]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(o){var c=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;o.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+c.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+c.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+c.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:c,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},o.languages.css.atrule.inside.rest=o.languages.css;var h=o.languages.markup;h&&(h.tag.addInlined("style","css"),h.tag.addAttribute("style","css"))}(a),a.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(){if(typeof a=="undefined"||typeof document=="undefined")return;Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var o="Loading\u2026",c=function(v,f){return"\u2716 Error "+v+" while fetching file: "+f},h="\u2716 Error: File does not exist or is empty",m={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},i="data-src-status",p="loading",y="loaded",j="failed",S="pre[data-src]:not(["+i+'="'+y+'"]):not(['+i+'="'+p+'"])';function $(v,f,F){var e=new XMLHttpRequest;e.open("GET",v,!0),e.onreadystatechange=function(){e.readyState==4&&(e.status<400&&e.responseText?f(e.responseText):e.status>=400?F(c(e.status,e.statusText)):F(h))},e.send(null)}function T(v){var f=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(v||"");if(f){var F=Number(f[1]),e=f[2],t=f[3];return e?t?[F,Number(t)]:[F,void 0]:[F,F]}}a.hooks.add("before-highlightall",function(v){v.selector+=", "+S}),a.hooks.add("before-sanity-check",function(v){var f=v.element;if(f.matches(S)){v.code="",f.setAttribute(i,p);var F=f.appendChild(document.createElement("CODE"));F.textContent=o;var e=f.getAttribute("data-src"),t=v.language;if(t==="none"){var n=(/\.(\w+)$/.exec(e)||[,"none"])[1];t=m[n]||n}a.util.setLanguage(F,t),a.util.setLanguage(f,t);var r=a.plugins.autoloader;r&&r.loadLanguages(t),$(e,function(s){f.setAttribute(i,y);var l=T(f.getAttribute("data-range"));if(l){var g=s.split(/\r\n?|\n/g),u=l[0],b=l[1]==null?g.length:l[1];u<0&&(u+=g.length),u=Math.max(0,Math.min(u-1,g.length)),b<0&&(b+=g.length),b=Math.max(0,Math.min(b,g.length)),s=g.slice(u,b).join(` +`),f.hasAttribute("data-start")||f.setAttribute("data-start",String(u+1))}F.textContent=s,a.highlightElement(F)},function(s){f.setAttribute(i,j),F.textContent=s})}}),a.plugins.fileHighlight={highlight:function(f){for(var F=(f||document).querySelectorAll(S),e=0,t;t=F[e++];)a.highlightElement(t)}};var P=!1;a.fileHighlight=function(){P||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),P=!0),a.plugins.fileHighlight.highlight.apply(this,arguments)}}()})(Y);var V=Y.exports;(function(d){var w=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,a=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],o=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,c=/|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,h=/[{}\[\](),:;]/;d.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:w,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:a,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:o,operator:c,punctuation:h};var m={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:d.languages.php},i=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:m}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:m}}];d.languages.insertBefore("php","variable",{string:i,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:w,string:i,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:a,number:o,operator:c,punctuation:h}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),d.hooks.add("before-tokenize",function(p){if(!!/<\?/.test(p.code)){var y=/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g;d.languages["markup-templating"].buildPlaceholders(p,"php",y)}}),d.hooks.add("after-tokenize",function(p){d.languages["markup-templating"].tokenizePlaceholders(p,"php")})})(Prism);(function(d){function w(a,o){return"___"+a.toUpperCase()+o+"___"}Object.defineProperties(d.languages["markup-templating"]={},{buildPlaceholders:{value:function(a,o,c,h){if(a.language===o){var m=a.tokenStack=[];a.code=a.code.replace(c,function(i){if(typeof h=="function"&&!h(i))return i;for(var p=m.length,y;a.code.indexOf(y=w(o,p))!==-1;)++p;return m[p]=i,y}),a.grammar=d.languages.markup}}},tokenizePlaceholders:{value:function(a,o){if(a.language!==o||!a.tokenStack)return;a.grammar=d.languages[o];var c=0,h=Object.keys(a.tokenStack);function m(i){for(var p=0;p=h.length);p++){var y=i[p];if(typeof y=="string"||y.content&&typeof y.content=="string"){var j=h[c],S=a.tokenStack[j],$=typeof y=="string"?y:y.content,T=w(o,j),P=$.indexOf(T);if(P>-1){++c;var v=$.substring(0,P),f=new d.Token(o,d.tokenize(S,a.grammar),"language-"+o,S),F=$.substring(P+T.length),e=[];v&&e.push.apply(e,m([v])),e.push(f),F&&e.push.apply(e,m([F])),typeof y=="string"?i.splice.apply(i,[p,1].concat(e)):y.content=e}}else y.content&&m(y.content)}return i}m(a.tokens)}}})})(Prism);Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+(/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source)+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/});Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:Prism.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/});Prism.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}});Prism.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}});Prism.languages.markup&&(Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript"));Prism.languages.js=Prism.languages.javascript;(function(d){var w=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;d.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+w.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+w.source+"$"),alias:"url"}}},selector:{pattern:RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|`+w.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:w,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},d.languages.css.atrule.inside.rest=d.languages.css;var a=d.languages.markup;a&&(a.tag.addInlined("style","css"),a.tag.addAttribute("style","css"))})(Prism);Prism.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}};Prism.languages.webmanifest=Prism.languages.json;Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]};Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity;Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup;Prism.hooks.add("wrap",function(d){d.type==="entity"&&(d.attributes.title=d.content.replace(/&/,"&"))});Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(w,a){var o={};o["language-"+a]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[a]},o.cdata=/^$/i;var c={"included-cdata":{pattern://i,inside:o}};c["language-"+a]={pattern:/[\s\S]+/,inside:Prism.languages[a]};var h={};h[w]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,function(){return w}),"i"),lookbehind:!0,greedy:!0,inside:c},Prism.languages.insertBefore("markup","cdata",h)}});Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(d,w){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+d+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[w,"language-"+w],inside:Prism.languages[w]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}});Prism.languages.html=Prism.languages.markup;Prism.languages.mathml=Prism.languages.markup;Prism.languages.svg=Prism.languages.markup;Prism.languages.xml=Prism.languages.extend("markup",{});Prism.languages.ssml=Prism.languages.xml;Prism.languages.atom=Prism.languages.xml;Prism.languages.rss=Prism.languages.xml;export{V as P}; diff --git a/public/exadmin/assets/qiniu-js.8b174ca3.js b/public/exadmin/assets/qiniu-js.8b174ca3.js new file mode 100644 index 0000000..3b040ab --- /dev/null +++ b/public/exadmin/assets/qiniu-js.8b174ca3.js @@ -0,0 +1 @@ +import{S as Y}from"./spark-md5.2cc5764b.js";import{s as Q}from"./querystring.62f12500.js";var G=globalThis&&globalThis.__extends||function(){var o=function(r,t){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,i){n.__proto__=i}||function(n,i){for(var e in i)i.hasOwnProperty(e)&&(n[e]=i[e])},o(r,t)};return function(r,t){o(r,t);function n(){this.constructor=r}r.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),f;(function(o){o.InvalidFile="InvalidFile",o.InvalidToken="InvalidToken",o.InvalidMetadata="InvalidMetadata",o.InvalidChunkSize="InvalidChunkSize",o.InvalidCustomVars="InvalidCustomVars",o.NotAvailableUploadHost="NotAvailableUploadHost",o.ReadCacheFailed="ReadCacheFailed",o.InvalidCacheData="InvalidCacheData",o.WriteCacheFailed="WriteCacheFailed",o.RemoveCacheFailed="RemoveCacheFailed",o.GetCanvasContextFailed="GetCanvasContextFailed",o.UnsupportedFileType="UnsupportedFileType",o.FileReaderReadFailed="FileReaderReadFailed",o.NotAvailableXMLHttpRequest="NotAvailableXMLHttpRequest",o.InvalidProgressEventTarget="InvalidProgressEventTarget",o.RequestError="RequestError"})(f||(f={}));var d=function(){function o(r,t){this.name=r,this.message=t,this.stack=new Error().stack}return o}(),x=function(o){G(r,o);function r(t,n,i,e){var s=o.call(this,f.RequestError,i)||this;return s.code=t,s.reqId=n,s.isRequestError=!0,s.data=e,s}return r}(d),tt=function(o){G(r,o);function r(t,n){return n===void 0&&(n=""),o.call(this,0,n,t)||this}return r}(x),et=function(){function o(r,t){this.runTask=r,this.limit=t,this.queue=[],this.processing=[]}return o.prototype.enqueue=function(r){var t=this;return new Promise(function(n,i){t.queue.push({task:r,resolve:n,reject:i}),t.check()})},o.prototype.run=function(r){var t=this;this.queue=this.queue.filter(function(n){return n!==r}),this.processing.push(r),this.runTask(r.task).then(function(){t.processing=t.processing.filter(function(n){return n!==r}),r.resolve(),t.check()},function(n){return r.reject(n)})},o.prototype.check=function(){var r=this,t=this.processing.length,n=this.limit-t;this.queue.slice(0,n).forEach(function(i){r.run(i)})},o}(),rt=globalThis&&globalThis.__extends||function(){var o=function(r,t){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,i){n.__proto__=i}||function(n,i){for(var e in i)i.hasOwnProperty(e)&&(n[e]=i[e])},o(r,t)};return function(r,t){o(r,t);function n(){this.constructor=r}r.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),_=globalThis&&globalThis.__assign||function(){return _=Object.assign||function(o){for(var r,t=1,n=arguments.length;t127&&u<2048)c=String.fromCharCode(u>>6|192,u&63|128);else if((u&63488^55296)>0)c=String.fromCharCode(u>>12|224,u>>6&63|128,u&63|128);else{if((u&64512^55296)>0)throw new RangeError("Unmatched trail surrogate at "+s);var a=r.charCodeAt(++s);if((a&64512^56320)>0)throw new RangeError("Unmatched lead surrogate at "+(s-1));u=((u&1023)<<10)+(a&1023)+65536,c=String.fromCharCode(u>>18|240,u>>12&63|128,u>>6&63|128,u&63|128)}c!==null&&(i>n&&(t+=r.slice(n,i)),t+=c,n=i=s+1)}return i>n&&(t+=r.slice(n,e)),t}function st(o){var r=[],t=0,n=0,i=0;for(o+="";t>10&1023)),r.push(String.fromCharCode(56320|n&1023))):r.push(String.fromCharCode(n)),t+=i}return r.join("")}function ut(o){var r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",t,n,i,e,s,u,c,a,l=0,h=0,p="",g=[];if(!o)return o;o=at(o+"");do t=o.charCodeAt(l++),n=o.charCodeAt(l++),i=o.charCodeAt(l++),a=t<<16|n<<8|i,e=a>>18&63,s=a>>12&63,u=a>>6&63,c=a&63,g[h++]=r.charAt(e)+r.charAt(s)+r.charAt(u)+r.charAt(c);while(l>16&255,n=a>>8&255,i=a&255,u===64?g[h++]=String.fromCharCode(t):c===64?g[h++]=String.fromCharCode(t,n):g[h++]=String.fromCharCode(t,n,i);while(l0&&e[e.length-1])&&(a[0]===6||a[0]===2)){t=0;continue}if(a[0]===3&&(!e||a[1]>e[0]&&a[1]o.size)t=o.size;else for(;o.size>t*1e4;)t*=2;for(var n=[],i=Math.ceil(o.size/t),e=0;e3?r[1]:r[0];if(!t)throw new d(f.InvalidToken,"missing assess key field.");var n=null;try{n=JSON.parse(ct(r[r.length-1]))}catch{throw new d(f.InvalidToken,"token parse failed.")}if(n==null)throw new d(f.InvalidToken,"putPolicy is null.");if(n.scope==null)throw new d(f.InvalidToken,"scope field is null.");var i=n.scope.split(":")[0];if(!i)throw new d(f.InvalidToken,"resolve bucketName failed.");return{assessKey:t,bucketName:i,scope:n.scope}}var v,b={z0:"z0",z1:"z1",z2:"z2",na0:"na0",as0:"as0",cnEast2:"cn-east-2"},St=(v={},v[b.z0]={srcUphost:["up.qiniup.com"],cdnUphost:["upload.qiniup.com"]},v[b.z1]={srcUphost:["up-z1.qiniup.com"],cdnUphost:["upload-z1.qiniup.com"]},v[b.z2]={srcUphost:["up-z2.qiniup.com"],cdnUphost:["upload-z2.qiniup.com"]},v[b.na0]={srcUphost:["up-na0.qiniup.com"],cdnUphost:["upload-na0.qiniup.com"]},v[b.as0]={srcUphost:["up-as0.qiniup.com"],cdnUphost:["upload-as0.qiniup.com"]},v[b.cnEast2]={srcUphost:["up-cn-east-2.qiniup.com"],cdnUphost:["upload-cn-east-2.qiniup.com"]},v),y=globalThis&&globalThis.__assign||function(){return y=Object.assign||function(o){for(var r,t=1,n=arguments.length;t0&&e[e.length-1])&&(a[0]===6||a[0]===2)){t=0;continue}if(a[0]===3&&(!e||a[1]>e[0]&&a[1]0&&e[e.length-1])&&(a[0]===6||a[0]===2)){t=0;continue}if(a[0]===3&&(!e||a[1]>e[0]&&a[1]0)&&!(i=n.next()).done;)e.push(i.value)}catch(u){s={error:u}}finally{try{i&&!i.done&&(t=n.return)&&t.call(n)}finally{if(s)throw s.error}}return e},Rt=globalThis&&globalThis.__spread||function(){for(var o=[],r=0;r1e4*qt)return this.handleError(new d(f.InvalidFile,"file size exceed maximum value 10000G")),[2];if(this.putExtra.customVars&&!gt(this.putExtra.customVars))return this.handleError(new d(f.InvalidCustomVars,"customVars key should start width x:")),[2];if(this.putExtra.metadata&&!pt(this.putExtra.metadata))return this.handleError(new d(f.InvalidMetadata,"metadata key should start with x-qn-meta-")),[2];u.label=1;case 1:return u.trys.push([1,4,,5]),this.uploadAt=new Date().getTime(),[4,this.checkAndUpdateUploadHost()];case 2:return u.sent(),[4,this.run()];case 3:return r=u.sent(),this.onComplete(r.data),this.checkAndUnfreezeHost(),this.sendLog(r.reqId,200),[2];case 4:return t=u.sent(),this.logger.error(t),this.clear(),t instanceof x&&(n=this.aborted?"":t.reqId,i=this.aborted?-2:t.code,this.sendLog(n,i),this.checkAndFreezeHost(t),e=++this.retryCount<=this.config.retryCount,s=!this.aborted&&Ht.includes(t.code),s&&e)?(this.logger.warn("error auto retry: "+this.retryCount+"/"+this.config.retryCount+"."),this.putFile(),[2]):(this.onError(t),[3,5]);case 5:return[2]}})})},o.prototype.clear=function(){this.logger.info("start cleaning all xhr."),this.xhrList.forEach(function(r){r.onreadystatechange=null,r.abort()}),this.logger.info("cleanup completed."),this.xhrList=[]},o.prototype.stop=function(){this.logger.info("stop."),this.clear(),this.aborted=!0},o.prototype.addXhr=function(r){this.xhrList.push(r)},o.prototype.sendLog=function(r,t){var n,i;this.logger.report({code:t,reqId:r,remoteIp:"",upType:"jssdk-h5",size:this.file.size,time:Math.floor(this.uploadAt/1e3),port:Tt((n=this.uploadHost)===null||n===void 0?void 0:n.getUrl()),host:Ct((i=this.uploadHost)===null||i===void 0?void 0:i.getUrl()),bytesSent:this.progress?this.progress.total.loaded:0,duration:Math.floor((new Date().getTime()-this.uploadAt)/1e3)})},o.prototype.getProgressInfoItem=function(r,t,n){return O({size:t,loaded:r,percent:r/t*100},n==null?{}:{fromCache:n})},o}(),Dt=globalThis&&globalThis.__extends||function(){var o=function(r,t){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,i){n.__proto__=i}||function(n,i){for(var e in i)i.hasOwnProperty(e)&&(n[e]=i[e])},o(r,t)};return function(r,t){o(r,t);function n(){this.constructor=r}r.prototype=t===null?Object.create(t):(n.prototype=t.prototype,new n)}}(),k=globalThis&&globalThis.__assign||function(){return k=Object.assign||function(o){for(var r,t=1,n=arguments.length;t0&&e[e.length-1])&&(a[0]===6||a[0]===2)){t=0;continue}if(a[0]===3&&(!e||a[1]>e[0]&&a[1]1024)throw new d(f.InvalidChunkSize,"chunkSize maximum value is 1024");return[4,this.initBeforeUploadChunks()];case 1:c.sent(),t=new et(function(a){return u.uploadChunk(a)},this.config.concurrentRequestLimit),n=null,i=this.getLocalKey(),e=this.chunks.map(function(a,l){return t.enqueue({chunk:a,index:l})}),c.label=2;case 2:return c.trys.push([2,5,,6]),[4,Promise.all(e)];case 3:return c.sent(),[4,this.mkFileReq()];case 4:return n=c.sent(),[3,6];case 5:throw s=c.sent(),s instanceof x&&(s.code===612||s.code===400)&&A(i,this.logger),s;case 6:return A(i,this.logger),[2,n]}})})},r.prototype.uploadChunk=function(t){return C(this,void 0,void 0,function(){var n,i,e,s,u,c,a,l,h,p=this;return S(this,function(g){switch(g.label){case 0:return n=t.index,i=t.chunk,e=this.cachedUploadedList[n],this.logger.info("upload part "+n+", cache:",e),s=this.config.checkByMD5,u=function(){p.usedCacheList[n]=!0,p.updateChunkProgress(i.size,n),p.uploadedList[n]=e,p.updateLocalCache()},e&&!s?(u(),[2]):[4,kt(i)];case 1:return c=g.sent(),this.logger.info("computed part md5.",c),e&&c===e.md5?(u(),[2]):(this.usedCacheList[n]=!1,a=function(P){p.updateChunkProgress(P.loaded,n)},l={body:i,md5:this.config.checkByServer?c:void 0,onProgress:a,onCreate:function(P){return p.addXhr(P)}},this.logger.info("part "+n+" start uploading."),[4,Pt(this.token,this.key,t.index+1,this.getUploadInfo(),l)]);case 2:return h=g.sent(),this.logger.info("part "+n+" upload completed."),a({loaded:i.size,total:i.size}),this.uploadedList[n]={etag:h.data.etag,md5:h.data.md5,size:i.size},this.updateLocalCache(),[2]}})})},r.prototype.mkFileReq=function(){return C(this,void 0,void 0,function(){var t,n,i=this;return S(this,function(e){switch(e.label){case 0:return t=k(k(k({parts:this.uploadedList.map(function(s,u){return{etag:s.etag,partNumber:u+1}}),fname:this.putExtra.fname},this.putExtra.mimeType&&{mimeType:this.putExtra.mimeType}),this.putExtra.customVars&&{customVars:this.putExtra.customVars}),this.putExtra.metadata&&{metadata:this.putExtra.metadata}),this.logger.info("parts upload completed, make file.",t),[4,Et(this.token,this.key,this.getUploadInfo(),{onCreate:function(s){return i.addXhr(s)},body:JSON.stringify(t)})];case 1:return n=e.sent(),this.logger.info("finish Resume Progress."),this.updateMkFileProgress(1),[2,n]}})})},r.prototype.initBeforeUploadChunks=function(){return C(this,void 0,void 0,function(){var t,n,i;return S(this,function(e){switch(e.label){case 0:return this.uploadedList=[],this.usedCacheList=[],t=mt(this.getLocalKey(),this.logger),t?[3,2]:(this.logger.info("init upload parts from api."),[4,Ft(this.token,this.bucketName,this.key,this.uploadHost.getUrl())]);case 1:return n=e.sent(),this.logger.info("initd upload parts of id: "+n.data.uploadId+"."),this.uploadId=n.data.uploadId,this.cachedUploadedList=[],[3,3];case 2:i=["resume upload parts from local cache,","total "+t.data.length+" part,","id is "+t.id+"."],this.logger.info(i.join(" ")),this.cachedUploadedList=t.data,this.uploadId=t.id,e.label=3;case 3:return this.chunks=dt(this.file,this.config.chunkSize),this.loaded={mkFileProgress:0,chunks:this.chunks.map(function(s){return 0})},this.notifyResumeProgress(),[2]}})})},r.prototype.getUploadInfo=function(){return{id:this.uploadId,url:this.uploadHost.getUrl()}},r.prototype.getLocalKey=function(){return bt(this.file.name,this.key,this.file.size)},r.prototype.updateLocalCache=function(){yt(this.getLocalKey(),{id:this.uploadId,data:this.uploadedList},this.logger)},r.prototype.updateChunkProgress=function(t,n){this.loaded.chunks[n]=t,this.notifyResumeProgress()},r.prototype.updateMkFileProgress=function(t){this.loaded.mkFileProgress=t,this.notifyResumeProgress()},r.prototype.notifyResumeProgress=function(){var t=this;this.progress={total:this.getProgressInfoItem(vt(this.loaded.chunks)+this.loaded.mkFileProgress,this.file.size+1),chunks:this.chunks.map(function(n,i){var e=t.usedCacheList[i];return t.getProgressInfoItem(t.loaded.chunks[i],n.size,e)}),uploadInfo:{id:this.uploadId,url:this.uploadHost.getUrl()}},this.onData(this.progress)},r}(K),D=globalThis&&globalThis.__awaiter||function(o,r,t,n){function i(e){return e instanceof t?e:new t(function(s){s(e)})}return new(t||(t=Promise))(function(e,s){function u(l){try{a(n.next(l))}catch(h){s(h)}}function c(l){try{a(n.throw(l))}catch(h){s(h)}}function a(l){l.done?e(l.value):i(l.value).then(u,c)}a((n=n.apply(o,r||[])).next())})},j=globalThis&&globalThis.__generator||function(o,r){var t={label:0,sent:function(){if(e[0]&1)throw e[1];return e[1]},trys:[],ops:[]},n,i,e,s;return s={next:u(0),throw:u(1),return:u(2)},typeof Symbol=="function"&&(s[Symbol.iterator]=function(){return this}),s;function u(a){return function(l){return c([a,l])}}function c(a){if(n)throw new TypeError("Generator is already executing.");for(;t;)try{if(n=1,i&&(e=a[0]&2?i.return:a[0]?i.throw||((e=i.return)&&e.call(i),0):i.next)&&!(e=e.call(i,a[1])).done)return e;switch(i=0,e&&(a=[a[0]&2,e.value]),a[0]){case 0:case 1:e=a;break;case 4:return t.label++,{value:a[1],done:!1};case 5:t.label++,i=a[1],a=[0];continue;case 7:a=t.ops.pop(),t.trys.pop();continue;default:if(e=t.trys,!(e=e.length>0&&e[e.length-1])&&(a[0]===6||a[0]===2)){t=0;continue}if(a[0]===3&&(!e||a[1]>e[0]&&a[1]>>1^3988292384:n>>>=1;r[t]=n}return r},o.prototype.append=function(r){for(var t=this.crc,n=0;n>>8^this.table[(t^r[n])&255];this.crc=t},o.prototype.compute=function(){return(this.crc^-1)>>>0},o.prototype.readAsUint8Array=function(r){return D(this,void 0,void 0,function(){var t;return j(this,function(n){switch(n.label){case 0:return typeof r.arrayBuffer!="function"?[3,2]:(t=Uint8Array.bind,[4,r.arrayBuffer()]);case 1:return[2,new(t.apply(Uint8Array,[void 0,n.sent()]))];case 2:return[2,new Promise(function(i,e){var s=new FileReader;s.onload=function(){if(s.result==null){e();return}if(typeof s.result=="string"){e();return}i(new Uint8Array(s.result))},s.readAsArrayBuffer(r)})]}})})},o.prototype.file=function(r){return D(this,void 0,void 0,function(){var t,n,i,e,s,u;return j(this,function(c){switch(c.label){case 0:return r.size<=m?(t=this.append,[4,this.readAsUint8Array(r)]):[3,2];case 1:return t.apply(this,[c.sent()]),[2,this.compute()];case 2:n=Math.ceil(r.size/m),i=0,c.label=3;case 3:return i0&&e[e.length-1])&&(a[0]===6||a[0]===2)){t=0;continue}if(a[0]===3&&(!e||a[1]>e[0]&&a[1]0&&Z(o,r,t-1)};var i=[r.code||"",r.reqId||"",r.host||"",r.remoteIp||"",r.port||"",r.duration||"",r.time||"",r.bytesSent||"",r.upType||"",r.size||""].join(",");n.send(i)}var Nt=globalThis&&globalThis.__read||function(o,r){var t=typeof Symbol=="function"&&o[Symbol.iterator];if(!t)return o;var n=t.call(o),i,e=[],s;try{for(;(r===void 0||r-- >0)&&!(i=n.next()).done;)e.push(i.value)}catch(u){s={error:u}}finally{try{i&&!i.done&&(t=n.return)&&t.call(n)}finally{if(s)throw s.error}}return e},E=globalThis&&globalThis.__spread||function(){for(var o=[],r=0;r0&&e[e.length-1])&&(a[0]===6||a[0]===2)){t=0;continue}if(a[0]===3&&(!e||a[1]>e[0]&&a[1]0)&&!(i=n.next()).done;)e.push(i.value)}catch(u){s={error:u}}finally{try{i&&!i.done&&(t=n.return)&&t.call(n)}finally{if(s)throw s.error}}return e},Wt=globalThis&&globalThis.__spread||function(){for(var o=[],r=0;r=r},o.prototype.freeze=function(r){r===void 0&&(r=20);var t=new Date().getTime()+r*1e3;I.set(this.host,t)},o.prototype.unfreeze=function(){I.delete(this.host)},o.prototype.getUrl=function(){return this.protocol+"://"+this.host},o.prototype.getUnfreezeTime=function(){return I.get(this.host)},o}(),Zt=function(){function o(r){r===void 0&&(r=[]),this.initHosts=r,this.cachedHostsMap=new Map}return o.prototype.register=function(r,t,n,i){this.cachedHostsMap.set(r+"@"+t,n.map(function(e){return new Kt(e,i)}))},o.prototype.refresh=function(r,t,n){var i,e,s,u;return $(this,void 0,void 0,function(){var c,a,l;return B(this,function(h){switch(h.label){case 0:return c=this.cachedHostsMap.get(r+"@"+t)||[],c.length>0?[2]:this.initHosts.length>0?(this.register(r,t,this.initHosts,n),[2]):[4,Ot(r,t,n)];case 1:return a=h.sent(),(a==null?void 0:a.data)!=null&&(l=Wt(((e=(i=a.data.up)===null||i===void 0?void 0:i.acc)===null||e===void 0?void 0:e.main)||[],((u=(s=a.data.up)===null||s===void 0?void 0:s.acc)===null||u===void 0?void 0:u.backup)||[]),this.register(r,t,l,n)),[2]}})})},o.prototype.getUp=function(r,t,n){return $(this,void 0,void 0,function(){var i,e,s;return B(this,function(u){switch(u.label){case 0:return[4,this.refresh(r,t,n)];case 1:return u.sent(),i=this.cachedHostsMap.get(r+"@"+t)||[],i.length===0?[2,null]:(e=i.filter(function(c){return!c.isFrozen()}),e.length>0?[2,e[0]]:(s=i.slice().sort(function(c,a){return(c.getUnfreezeTime()||0)-(a.getUnfreezeTime()||0)}),[2,s[0]]))}})})},o}();function Yt(o,r,t,n){return o.config&&o.config.forceDirect?(n.info("ues forceDirect mode."),new M(o,r,t,n)):o.file.size>4*m?(n.info("file size over 4M, use Resume."),new Mt(o,r,t,n)):(n.info("file size less or equal than 4M, use Direct."),new M(o,r,t,n))}function ie(o,r,t,n,i){var e=new Xt(t,i==null?void 0:i.disableStatisticsReport,i==null?void 0:i.debugLogLevel,o.name),s={file:o,key:r,token:t,putExtra:n,config:ee(i,e)},u=new Zt(s.config.uphost);return new ot(function(c){var a=Yt(s,{onData:function(l){return c.next(l)},onError:function(l){return c.error(l)},onComplete:function(l){return c.complete(l)}},u,e);return a.putFile(),a.stop.bind(a)})}var w=globalThis&&globalThis.__assign||function(){return w=Object.assign||function(o){for(var r,t=1,n=arguments.length;t0)&&!(i=n.next()).done;)e.push(i.value)}catch(u){s={error:u}}finally{try{i&&!i.done&&(t=n.return)&&t.call(n)}finally{if(s)throw s.error}}return e},U=globalThis&&globalThis.__spread||function(){for(var o=[],r=0;r=0;--o){var n=this.tryEntries[o],i=n.completion;if(n.tryLoc==="root")return e("end");if(n.tryLoc<=this.prev){var a=p.call(n,"catchLoc"),u=p.call(n,"finallyLoc");if(a&&u){if(this.prev=0;--e){var o=this.tryEntries[e];if(o.tryLoc<=this.prev&&p.call(o,"finallyLoc")&&this.prev=0;--t){var e=this.tryEntries[t];if(e.finallyLoc===r)return this.complete(e.completion,e.afterLoc),I(e),l}},catch:function(r){for(var t=this.tryEntries.length-1;t>=0;--t){var e=this.tryEntries[t];if(e.tryLoc===r){var o=e.completion;if(o.type==="throw"){var n=o.arg;I(e)}return n}}throw new Error("illegal catch attempt")},delegateYield:function(r,t,e){return this.delegate={iterator:A(r),resultName:t,nextLoc:e},this.method==="next"&&(this.arg=v),l}},s}(z.exports);try{regeneratorRuntime=G}catch{typeof globalThis=="object"?globalThis.regeneratorRuntime=G:Function("r","regeneratorRuntime = r")(G)}})(Q);export{Q as r}; diff --git a/public/exadmin/assets/remoteOptions.c846a4ad.js b/public/exadmin/assets/remoteOptions.c846a4ad.js new file mode 100644 index 0000000..84cc07d --- /dev/null +++ b/public/exadmin/assets/remoteOptions.c846a4ad.js @@ -0,0 +1 @@ +import{w as c}from"./index.b35f53c6.js";import{l as f}from"./lodash.c9cf1bdb.js";import{a as d}from"./context.6c9ae94a.js";function x(e,a){const s=f.exports.debounce(r,300);let o=d();function r(u){return new Promise((m,i)=>{if(e.remote){let t=e.remote;t.data.search=u,o&&(t.data.data=o.submitData()),c(t).then(n=>{a.value=n.data,m(n.data)}).catch(()=>{i()})}else m(a.value)})}return{remoteOptionsDebounce:s,remoteOptions:r}}export{x as u}; diff --git a/public/exadmin/assets/resize-observer-polyfill.8deb1e21.js b/public/exadmin/assets/resize-observer-polyfill.8deb1e21.js new file mode 100644 index 0000000..48ed81c --- /dev/null +++ b/public/exadmin/assets/resize-observer-polyfill.8deb1e21.js @@ -0,0 +1 @@ +var _=function(){if(typeof Map!="undefined")return Map;function e(t,n){var r=-1;return t.some(function(i,o){return i[0]===n?(r=o,!0):!1}),r}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(n){var r=e(this.__entries__,n),i=this.__entries__[r];return i&&i[1]},t.prototype.set=function(n,r){var i=e(this.__entries__,n);~i?this.__entries__[i][1]=r:this.__entries__.push([n,r])},t.prototype.delete=function(n){var r=this.__entries__,i=e(r,n);~i&&r.splice(i,1)},t.prototype.has=function(n){return!!~e(this.__entries__,n)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(n,r){r===void 0&&(r=null);for(var i=0,o=this.__entries__;i0},e.prototype.connect_=function(){!v||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),A?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!v||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var n=t.propertyName,r=n===void 0?"":n,i=x.some(function(o){return!!~r.indexOf(o)});i&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),m=function(e,t){for(var n=0,r=Object.keys(t);n0},e}(),g=typeof WeakMap!="undefined"?new WeakMap:new _,w=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var n=z.getInstance(),r=new F(t,n,this);g.set(this,r)}return e}();["observe","unobserve","disconnect"].forEach(function(e){w.prototype[e]=function(){var t;return(t=g.get(this))[e].apply(t,arguments)}});var H=function(){return typeof f.ResizeObserver!="undefined"?f.ResizeObserver:w}();export{H as i}; diff --git a/public/exadmin/assets/scroll-into-view-if-needed.5191fdbf.js b/public/exadmin/assets/scroll-into-view-if-needed.5191fdbf.js new file mode 100644 index 0000000..9cc5565 --- /dev/null +++ b/public/exadmin/assets/scroll-into-view-if-needed.5191fdbf.js @@ -0,0 +1 @@ +import{c as i}from"./compute-scroll-into-view.6058b3be.js";function u(e){return e===Object(e)&&Object.keys(e).length!==0}function f(e,t){t===void 0&&(t="auto");var r="scrollBehavior"in document.body.style;e.forEach(function(n){var c=n.el,l=n.top,o=n.left;c.scroll&&r?c.scroll({top:l,left:o,behavior:t}):(c.scrollTop=l,c.scrollLeft=o)})}function a(e){return e===!1?{block:"end",inline:"nearest"}:u(e)?e:{block:"start",inline:"nearest"}}function m(e,t){var r=e.isConnected||e.ownerDocument.documentElement.contains(e);if(u(t)&&typeof t.behavior=="function")return t.behavior(r?i(e,t):[]);if(!!r){var n=a(t);return f(i(e,n),n.behavior)}}export{m as s}; diff --git a/public/exadmin/assets/select.4753e345.js b/public/exadmin/assets/select.4753e345.js new file mode 100644 index 0000000..a5ab20c --- /dev/null +++ b/public/exadmin/assets/select.4753e345.js @@ -0,0 +1 @@ +import"./vue.db505ee4.js";import{w as u,x as l}from"./index.b35f53c6.js";import{c as h}from"./@vueuse.952f4739.js";import{u as O}from"./remoteOptions.c846a4ad.js";import{a as b}from"./context.6c9ae94a.js";import{S as g}from"./ant-design-vue.6b10f349.js";import{d as j,h as S}from"./@vue.cb43a243.js";import"./@babel.6cd0804c.js";import"./regenerator-runtime.8e24db72.js";import"./js-md5.5179c6be.js";import"./vue-router.a08742b9.js";import"./js-cookie.31874410.js";import"./lodash.c9cf1bdb.js";import"./spark-md5.2cc5764b.js";import"./axios.e3200588.js";import"./@ant-design.bcfb08ae.js";import"./@ctrl.fa7cbd46.js";/* empty css */import"./dayjs.38e390ea.js";import"./sortablejs.412b554c.js";import"./clipboard.099d05c9.js";import"./markdown-it.80c3a67b.js";import"./entities.0d2c0164.js";import"./uc.micro.981ceb7b.js";import"./mdurl.ef76b4dc.js";import"./linkify-it.92c30060.js";import"./markdown-it-emoji.e3e91710.js";import"./escape-html.e5dfadb9.js";import"./prismjs.c97a8414.js";import"./diacritics.6be19c75.js";import"./markdown-it-container.512a5043.js";import"./markdown-it-anchor.c88e5394.js";import"./markdown-it-attrs.3af5ab50.js";import"./markdown-it-table-of-contents.8a4ce16f.js";import"./@kangc.86f7507c.js";import"./resize-observer-polyfill.8deb1e21.js";import"./vue-types.6e6d84ba.js";import"./dom-align.f1b5d360.js";import"./lodash-es.0ea26897.js";import"./async-validator.5d25c98b.js";import"./scroll-into-view-if-needed.5191fdbf.js";import"./compute-scroll-into-view.6058b3be.js";import"./vue-demi.5fb18120.js";var ct=j({name:"ExSelect",props:{changeLoadOptions:{type:Array,default:[]},remote:Object,options:Array},emits:["update:options"],setup(t,o){const i=b(),e=h(t,"options",o.emit),{remoteOptionsDebounce:n,remoteOptions:m}=O(t,e);s(),m(o.attrs.value);function s(){t.changeLoadOptions.forEach(r=>{c(r.params,r.updateObject,o.attrs.value)})}function c(r,d,f){r.data.value=f,i&&(r.data.data=i.submitData()),u(r).then(p=>{if(p.data)for(let a in p.data)l(d,a,p.data[a])})}return{remoteOptionsDebounce:n,remoteOptions:m,options:e}},render(t){let o=Object.assign({onDropdownVisibleChange:i=>{i&&this.remoteOptions("")}},t.$attrs);return o.showSearch&&(o.onSearch=i=>{this.remoteOptionsDebounce(i)}),!t.$attrs.options&&t.options&&(o.options=t.options),S(g,o,t.$slots)}});export{ct as default}; diff --git a/public/exadmin/assets/selectIcon.7cb44740.js b/public/exadmin/assets/selectIcon.7cb44740.js new file mode 100644 index 0000000..3083212 --- /dev/null +++ b/public/exadmin/assets/selectIcon.7cb44740.js @@ -0,0 +1 @@ +import"./vue.db505ee4.js";import{a0 as S}from"./@ant-design.bcfb08ae.js";import{_ as D}from"./index.b35f53c6.js";import{r as s,w as L,o as U,a as A,aW as d,aR as r,at as i,c as u,bd as f,au as l,ar as _,H as m,R as j,N as F,Q as H,aV as z,af as M,aX as R,S as $}from"./@vue.cb43a243.js";import"./@babel.6cd0804c.js";import"./regenerator-runtime.8e24db72.js";import"./@ctrl.fa7cbd46.js";import"./js-md5.5179c6be.js";import"./vue-router.a08742b9.js";import"./js-cookie.31874410.js";import"./ant-design-vue.6b10f349.js";import"./resize-observer-polyfill.8deb1e21.js";import"./vue-types.6e6d84ba.js";import"./dom-align.f1b5d360.js";import"./lodash-es.0ea26897.js";import"./dayjs.38e390ea.js";import"./async-validator.5d25c98b.js";import"./scroll-into-view-if-needed.5191fdbf.js";import"./compute-scroll-into-view.6058b3be.js";import"./lodash.c9cf1bdb.js";import"./spark-md5.2cc5764b.js";import"./@vueuse.952f4739.js";import"./vue-demi.5fb18120.js";import"./axios.e3200588.js";/* empty css */import"./sortablejs.412b554c.js";import"./clipboard.099d05c9.js";import"./markdown-it.80c3a67b.js";import"./entities.0d2c0164.js";import"./uc.micro.981ceb7b.js";import"./mdurl.ef76b4dc.js";import"./linkify-it.92c30060.js";import"./markdown-it-emoji.e3e91710.js";import"./escape-html.e5dfadb9.js";import"./prismjs.c97a8414.js";import"./diacritics.6be19c75.js";import"./markdown-it-container.512a5043.js";import"./markdown-it-anchor.c88e5394.js";import"./markdown-it-attrs.3af5ab50.js";import"./markdown-it-table-of-contents.8a4ce16f.js";import"./@kangc.86f7507c.js";var Q=["500px","accessible-icon","accusoft","adn","adversal","affiliatetheme","airbnb","algolia","alipay","amazon","amazon-pay","amilia","android","angellist","angrycreative","angular","app-store","app-store-ios","apper","apple","apple-pay","artstation","asymmetrik","atlassian","audible","autoprefixer","avianex","aviato","aws","bandcamp","battle-net","behance","behance-square","bimobject","bitbucket","bitcoin","bity","black-tie","blackberry","blogger","blogger-b","bluetooth","bluetooth-b","bootstrap","btc","buffer","buromobelexperte","buy-n-large","buysellads","canadian-maple-leaf","cc-amazon-pay","cc-amex","cc-apple-pay","cc-diners-club","cc-discover","cc-jcb","cc-mastercard","cc-paypal","cc-stripe","cc-visa","centercode","centos","chrome","chromecast","cloudflare","cloudscale","cloudsmith","cloudversify","codepen","codiepie","confluence","connectdevelop","contao","cotton-bureau","cpanel","creative-commons","creative-commons-by","creative-commons-nc","creative-commons-nc-eu","creative-commons-nc-jp","creative-commons-nd","creative-commons-pd","creative-commons-pd-alt","creative-commons-remix","creative-commons-sa","creative-commons-sampling","creative-commons-sampling-plus","creative-commons-share","creative-commons-zero","critical-role","css3","css3-alt","cuttlefish","d-and-d","d-and-d-beyond","dailymotion","dashcube","deezer","delicious","deploydog","deskpro","dev","deviantart","dhl","diaspora","digg","digital-ocean","discord","discourse","dochub","docker","draft2digital","dribbble","dribbble-square","dropbox","drupal","dyalog","earlybirds","ebay","edge","edge-legacy","elementor","ello","ember","empire","envira","erlang","ethereum","etsy","evernote","expeditedssl","facebook","facebook-f","facebook-messenger","facebook-square","fantasy-flight-games","fedex","fedora","figma","firefox","firefox-browser","first-order","first-order-alt","firstdraft","flickr","flipboard","fly","font-awesome","font-awesome-alt","font-awesome-flag","fonticons","fonticons-fi","fort-awesome","fort-awesome-alt","forumbee","foursquare","free-code-camp","freebsd","fulcrum","galactic-republic","galactic-senate","get-pocket","gg","gg-circle","git","git-alt","git-square","github","github-alt","github-square","gitkraken","gitlab","gitter","glide","glide-g","gofore","goodreads","goodreads-g","google","google-drive","google-pay","google-play","google-plus","google-plus-g","google-plus-square","google-wallet","gratipay","grav","gripfire","grunt","guilded","gulp","hacker-news","hacker-news-square","hackerrank","hips","hire-a-helper","hive","hooli","hornbill","hotjar","houzz","html5","hubspot","ideal","imdb","innosoft","instagram","instagram-square","instalod","intercom","internet-explorer","invision","ioxhost","itch-io","itunes","itunes-note","java","jedi-order","jenkins","jira","joget","joomla","js","js-square","jsfiddle","kaggle","keybase","keycdn","kickstarter","kickstarter-k","korvue","laravel","lastfm","lastfm-square","leanpub","less","line","linkedin","linkedin-in","linode","linux","lyft","magento","mailchimp","mandalorian","markdown","mastodon","maxcdn","mdb","medapps","medium","medium-m","medrt","meetup","megaport","mendeley","microblog","microsoft","mix","mixcloud","mixer","mizuni","modx","monero","napster","neos","nimblr","node","node-js","npm","ns8","nutritionix","octopus-deploy","odnoklassniki","odnoklassniki-square","old-republic","opencart","openid","opera","optin-monster","orcid","osi","page4","pagelines","palfed","patreon","paypal","perbyte","periscope","phabricator","phoenix-framework","phoenix-squadron","php","pied-piper","pied-piper-alt","pied-piper-hat","pied-piper-pp","pied-piper-square","pinterest","pinterest-p","pinterest-square","playstation","product-hunt","pushed","python","qq","quinscape","quora","r-project","raspberry-pi","ravelry","react","reacteurope","readme","rebel","red-river","reddit","reddit-alien","reddit-square","redhat","renren","replyd","researchgate","resolving","rev","rocketchat","rockrms","rust","safari","salesforce","sass","schlix","scribd","searchengin","sellcast","sellsy","servicestack","shirtsinbulk","shopify","shopware","simplybuilt","sistrix","sith","sketch","skyatlas","skype","slack","slack-hash","slideshare","snapchat","snapchat-ghost","snapchat-square","soundcloud","sourcetree","speakap","speaker-deck","spotify","squarespace","stack-exchange","stack-overflow","stackpath","staylinked","steam","steam-square","steam-symbol","sticker-mule","strava","stripe","stripe-s","studiovinari","stumbleupon","stumbleupon-circle","superpowers","supple","suse","swift","symfony","teamspeak","telegram","telegram-plane","tencent-weibo","the-red-yeti","themeco","themeisle","think-peaks","tiktok","trade-federation","trello","tumblr","tumblr-square","twitch","twitter","twitter-square","typo3","uber","ubuntu","uikit","umbraco","uncharted","uniregistry","unity","unsplash","untappd","ups","usb","usps","ussunnah","vaadin","viacoin","viadeo","viadeo-square","viber","vimeo","vimeo-square","vimeo-v","vine","vk","vnv","vuejs","watchman-monitoring","waze","weebly","weibo","weixin","whatsapp","whatsapp-square","whmcs","wikipedia-w","windows","wix","wizards-of-the-coast","wodu","wolf-pack-battalion","wordpress","wordpress-simple","wpbeginner","wpexplorer","wpforms","wpressr","xbox","xing","xing-square","y-combinator","yahoo","yammer","yandex","yandex-international","yarn","yelp","yoast","youtube","youtube-square","zhihu"],W=["address-book","address-card","angry","arrow-alt-circle-down","arrow-alt-circle-left","arrow-alt-circle-right","arrow-alt-circle-up","bell","bell-slash","bookmark","building","calendar","calendar-alt","calendar-check","calendar-minus","calendar-plus","calendar-times","caret-square-down","caret-square-left","caret-square-right","caret-square-up","chart-bar","check-circle","check-square","circle","clipboard","clock","clone","closed-captioning","comment","comment-alt","comment-dots","comments","compass","copy","copyright","credit-card","dizzy","dot-circle","edit","envelope","envelope-open","eye","eye-slash","file","file-alt","file-archive","file-audio","file-code","file-excel","file-image","file-pdf","file-powerpoint","file-video","file-word","flag","flushed","folder","folder-open","frown","frown-open","futbol","gem","grimace","grin","grin-alt","grin-beam","grin-beam-sweat","grin-hearts","grin-squint","grin-squint-tears","grin-stars","grin-tears","grin-tongue","grin-tongue-squint","grin-tongue-wink","grin-wink","hand-lizard","hand-paper","hand-peace","hand-point-down","hand-point-left","hand-point-right","hand-point-up","hand-pointer","hand-rock","hand-scissors","hand-spock","handshake","hdd","heart","hospital","hourglass","id-badge","id-card","image","images","keyboard","kiss","kiss-beam","kiss-wink-heart","laugh","laugh-beam","laugh-squint","laugh-wink","lemon","life-ring","lightbulb","list-alt","map","meh","meh-blank","meh-rolling-eyes","minus-square","money-bill-alt","moon","newspaper","object-group","object-ungroup","paper-plane","pause-circle","play-circle","plus-square","question-circle","registered","sad-cry","sad-tear","save","share-square","smile","smile-beam","smile-wink","snowflake","square","star","star-half","sticky-note","stop-circle","sun","surprise","thumbs-down","thumbs-up","times-circle","tired","trash-alt","user","user-circle","window-close","window-maximize","window-minimize","window-restore"],X=["ad","address-book","address-card","adjust","air-freshener","align-center","align-justify","align-left","align-right","allergies","ambulance","american-sign-language-interpreting","anchor","angle-double-down","angle-double-left","angle-double-right","angle-double-up","angle-down","angle-left","angle-right","angle-up","angry","ankh","apple-alt","archive","archway","arrow-alt-circle-down","arrow-alt-circle-left","arrow-alt-circle-right","arrow-alt-circle-up","arrow-circle-down","arrow-circle-left","arrow-circle-right","arrow-circle-up","arrow-down","arrow-left","arrow-right","arrow-up","arrows-alt","arrows-alt-h","arrows-alt-v","assistive-listening-systems","asterisk","at","atlas","atom","audio-description","award","baby","baby-carriage","backspace","backward","bacon","bacteria","bacterium","bahai","balance-scale","balance-scale-left","balance-scale-right","ban","band-aid","barcode","bars","baseball-ball","basketball-ball","bath","battery-empty","battery-full","battery-half","battery-quarter","battery-three-quarters","bed","beer","bell","bell-slash","bezier-curve","bible","bicycle","biking","binoculars","biohazard","birthday-cake","blender","blender-phone","blind","blog","bold","bolt","bomb","bone","bong","book","book-dead","book-medical","book-open","book-reader","bookmark","border-all","border-none","border-style","bowling-ball","box","box-open","box-tissue","boxes","braille","brain","bread-slice","briefcase","briefcase-medical","broadcast-tower","broom","brush","bug","building","bullhorn","bullseye","burn","bus","bus-alt","business-time","calculator","calendar","calendar-alt","calendar-check","calendar-day","calendar-minus","calendar-plus","calendar-times","calendar-week","camera","camera-retro","campground","candy-cane","cannabis","capsules","car","car-alt","car-battery","car-crash","car-side","caravan","caret-down","caret-left","caret-right","caret-square-down","caret-square-left","caret-square-right","caret-square-up","caret-up","carrot","cart-arrow-down","cart-plus","cash-register","cat","certificate","chair","chalkboard","chalkboard-teacher","charging-station","chart-area","chart-bar","chart-line","chart-pie","check","check-circle","check-double","check-square","cheese","chess","chess-bishop","chess-board","chess-king","chess-knight","chess-pawn","chess-queen","chess-rook","chevron-circle-down","chevron-circle-left","chevron-circle-right","chevron-circle-up","chevron-down","chevron-left","chevron-right","chevron-up","child","church","circle","circle-notch","city","clinic-medical","clipboard","clipboard-check","clipboard-list","clock","clone","closed-captioning","cloud","cloud-download-alt","cloud-meatball","cloud-moon","cloud-moon-rain","cloud-rain","cloud-showers-heavy","cloud-sun","cloud-sun-rain","cloud-upload-alt","cocktail","code","code-branch","coffee","cog","cogs","coins","columns","comment","comment-alt","comment-dollar","comment-dots","comment-medical","comment-slash","comments","comments-dollar","compact-disc","compass","compress","compress-alt","compress-arrows-alt","concierge-bell","cookie","cookie-bite","copy","copyright","couch","credit-card","crop","crop-alt","cross","crosshairs","crow","crown","crutch","cube","cubes","cut","database","deaf","democrat","desktop","dharmachakra","diagnoses","dice","dice-d20","dice-d6","dice-five","dice-four","dice-one","dice-six","dice-three","dice-two","digital-tachograph","directions","disease","divide","dizzy","dna","dog","dollar-sign","dolly","dolly-flatbed","donate","door-closed","door-open","dot-circle","dove","download","drafting-compass","dragon","draw-polygon","drum","drum-steelpan","drumstick-bite","dumbbell","dumpster","dumpster-fire","dungeon","edit","egg","eject","ellipsis-h","ellipsis-v","envelope","envelope-open","envelope-open-text","envelope-square","equals","eraser","ethernet","euro-sign","exchange-alt","exclamation","exclamation-circle","exclamation-triangle","expand","expand-alt","expand-arrows-alt","external-link-alt","external-link-square-alt","eye","eye-dropper","eye-slash","fan","fast-backward","fast-forward","faucet","fax","feather","feather-alt","female","fighter-jet","file","file-alt","file-archive","file-audio","file-code","file-contract","file-csv","file-download","file-excel","file-export","file-image","file-import","file-invoice","file-invoice-dollar","file-medical","file-medical-alt","file-pdf","file-powerpoint","file-prescription","file-signature","file-upload","file-video","file-word","fill","fill-drip","film","filter","fingerprint","fire","fire-alt","fire-extinguisher","first-aid","fish","fist-raised","flag","flag-checkered","flag-usa","flask","flushed","folder","folder-minus","folder-open","folder-plus","font","football-ball","forward","frog","frown","frown-open","funnel-dollar","futbol","gamepad","gas-pump","gavel","gem","genderless","ghost","gift","gifts","glass-cheers","glass-martini","glass-martini-alt","glass-whiskey","glasses","globe","globe-africa","globe-americas","globe-asia","globe-europe","golf-ball","gopuram","graduation-cap","greater-than","greater-than-equal","grimace","grin","grin-alt","grin-beam","grin-beam-sweat","grin-hearts","grin-squint","grin-squint-tears","grin-stars","grin-tears","grin-tongue","grin-tongue-squint","grin-tongue-wink","grin-wink","grip-horizontal","grip-lines","grip-lines-vertical","grip-vertical","guitar","h-square","hamburger","hammer","hamsa","hand-holding","hand-holding-heart","hand-holding-medical","hand-holding-usd","hand-holding-water","hand-lizard","hand-middle-finger","hand-paper","hand-peace","hand-point-down","hand-point-left","hand-point-right","hand-point-up","hand-pointer","hand-rock","hand-scissors","hand-sparkles","hand-spock","hands","hands-helping","hands-wash","handshake","handshake-alt-slash","handshake-slash","hanukiah","hard-hat","hashtag","hat-cowboy","hat-cowboy-side","hat-wizard","hdd","head-side-cough","head-side-cough-slash","head-side-mask","head-side-virus","heading","headphones","headphones-alt","headset","heart","heart-broken","heartbeat","helicopter","highlighter","hiking","hippo","history","hockey-puck","holly-berry","home","horse","horse-head","hospital","hospital-alt","hospital-symbol","hospital-user","hot-tub","hotdog","hotel","hourglass","hourglass-end","hourglass-half","hourglass-start","house-damage","house-user","hryvnia","i-cursor","ice-cream","icicles","icons","id-badge","id-card","id-card-alt","igloo","image","images","inbox","indent","industry","infinity","info","info-circle","italic","jedi","joint","journal-whills","kaaba","key","keyboard","khanda","kiss","kiss-beam","kiss-wink-heart","kiwi-bird","landmark","language","laptop","laptop-code","laptop-house","laptop-medical","laugh","laugh-beam","laugh-squint","laugh-wink","layer-group","leaf","lemon","less-than","less-than-equal","level-down-alt","level-up-alt","life-ring","lightbulb","link","lira-sign","list","list-alt","list-ol","list-ul","location-arrow","lock","lock-open","long-arrow-alt-down","long-arrow-alt-left","long-arrow-alt-right","long-arrow-alt-up","low-vision","luggage-cart","lungs","lungs-virus","magic","magnet","mail-bulk","male","map","map-marked","map-marked-alt","map-marker","map-marker-alt","map-pin","map-signs","marker","mars","mars-double","mars-stroke","mars-stroke-h","mars-stroke-v","mask","medal","medkit","meh","meh-blank","meh-rolling-eyes","memory","menorah","mercury","meteor","microchip","microphone","microphone-alt","microphone-alt-slash","microphone-slash","microscope","minus","minus-circle","minus-square","mitten","mobile","mobile-alt","money-bill","money-bill-alt","money-bill-wave","money-bill-wave-alt","money-check","money-check-alt","monument","moon","mortar-pestle","mosque","motorcycle","mountain","mouse","mouse-pointer","mug-hot","music","network-wired","neuter","newspaper","not-equal","notes-medical","object-group","object-ungroup","oil-can","om","otter","outdent","pager","paint-brush","paint-roller","palette","pallet","paper-plane","paperclip","parachute-box","paragraph","parking","passport","pastafarianism","paste","pause","pause-circle","paw","peace","pen","pen-alt","pen-fancy","pen-nib","pen-square","pencil-alt","pencil-ruler","people-arrows","people-carry","pepper-hot","percent","percentage","person-booth","phone","phone-alt","phone-slash","phone-square","phone-square-alt","phone-volume","photo-video","piggy-bank","pills","pizza-slice","place-of-worship","plane","plane-arrival","plane-departure","plane-slash","play","play-circle","plug","plus","plus-circle","plus-square","podcast","poll","poll-h","poo","poo-storm","poop","portrait","pound-sign","power-off","pray","praying-hands","prescription","prescription-bottle","prescription-bottle-alt","print","procedures","project-diagram","pump-medical","pump-soap","puzzle-piece","qrcode","question","question-circle","quidditch","quote-left","quote-right","quran","radiation","radiation-alt","rainbow","random","receipt","record-vinyl","recycle","redo","redo-alt","registered","remove-format","reply","reply-all","republican","restroom","retweet","ribbon","ring","road","robot","rocket","route","rss","rss-square","ruble-sign","ruler","ruler-combined","ruler-horizontal","ruler-vertical","running","rupee-sign","sad-cry","sad-tear","satellite","satellite-dish","save","school","screwdriver","scroll","sd-card","search","search-dollar","search-location","search-minus","search-plus","seedling","server","shapes","share","share-alt","share-alt-square","share-square","shekel-sign","shield-alt","shield-virus","ship","shipping-fast","shoe-prints","shopping-bag","shopping-basket","shopping-cart","shower","shuttle-van","sign","sign-in-alt","sign-language","sign-out-alt","signal","signature","sim-card","sink","sitemap","skating","skiing","skiing-nordic","skull","skull-crossbones","slash","sleigh","sliders-h","smile","smile-beam","smile-wink","smog","smoking","smoking-ban","sms","snowboarding","snowflake","snowman","snowplow","soap","socks","solar-panel","sort","sort-alpha-down","sort-alpha-down-alt","sort-alpha-up","sort-alpha-up-alt","sort-amount-down","sort-amount-down-alt","sort-amount-up","sort-amount-up-alt","sort-down","sort-numeric-down","sort-numeric-down-alt","sort-numeric-up","sort-numeric-up-alt","sort-up","spa","space-shuttle","spell-check","spider","spinner","splotch","spray-can","square","square-full","square-root-alt","stamp","star","star-and-crescent","star-half","star-half-alt","star-of-david","star-of-life","step-backward","step-forward","stethoscope","sticky-note","stop","stop-circle","stopwatch","stopwatch-20","store","store-alt","store-alt-slash","store-slash","stream","street-view","strikethrough","stroopwafel","subscript","subway","suitcase","suitcase-rolling","sun","superscript","surprise","swatchbook","swimmer","swimming-pool","synagogue","sync","sync-alt","syringe","table","table-tennis","tablet","tablet-alt","tablets","tachometer-alt","tag","tags","tape","tasks","taxi","teeth","teeth-open","temperature-high","temperature-low","tenge","terminal","text-height","text-width","th","th-large","th-list","theater-masks","thermometer","thermometer-empty","thermometer-full","thermometer-half","thermometer-quarter","thermometer-three-quarters","thumbs-down","thumbs-up","thumbtack","ticket-alt","times","times-circle","tint","tint-slash","tired","toggle-off","toggle-on","toilet","toilet-paper","toilet-paper-slash","toolbox","tools","tooth","torah","torii-gate","tractor","trademark","traffic-light","trailer","train","tram","transgender","transgender-alt","trash","trash-alt","trash-restore","trash-restore-alt","tree","trophy","truck","truck-loading","truck-monster","truck-moving","truck-pickup","tshirt","tty","tv","umbrella","umbrella-beach","underline","undo","undo-alt","universal-access","university","unlink","unlock","unlock-alt","upload","user","user-alt","user-alt-slash","user-astronaut","user-check","user-circle","user-clock","user-cog","user-edit","user-friends","user-graduate","user-injured","user-lock","user-md","user-minus","user-ninja","user-nurse","user-plus","user-secret","user-shield","user-slash","user-tag","user-tie","user-times","users","users-cog","users-slash","utensil-spoon","utensils","vector-square","venus","venus-double","venus-mars","vest","vest-patches","vial","vials","video","video-slash","vihara","virus","virus-slash","viruses","voicemail","volleyball-ball","volume-down","volume-mute","volume-off","volume-up","vote-yea","vr-cardboard","walking","wallet","warehouse","water","wave-square","weight","weight-hanging","wheelchair","wifi","wind","window-close","window-maximize","window-minimize","window-restore","wine-bottle","wine-glass","wine-glass-alt","won-sign","wrench","x-ray","yen-sign","yin-yang"];const G=["onClick"],J=$("\u8BF7\u9009\u62E9"),K={class:"search"},P={class:"iconCollection"},Y=["onClick"],Z=["onClick"],ee={name:"ExSelectIcon"},ae=Object.assign(ee,{props:{value:String},emits:["update:value"],setup(C,{emit:I}){const E=C,h=[];for(const e in S)["createFromIconfontCN","default","getTwoToneColor","setTwoToneColor"].indexOf(e)>-1||h.push(e);let o=X.map(e=>"fas fa-"+e);o=o.concat(W.map(e=>"far fa-"+e)),o=o.concat(Q.map(e=>"fab fa-"+e));const g=s([]),b=s([]);let k=!1;const w=s(),n=s(),c=s(!1),t=s(E.value);L(t,e=>{I("update:value",e)});function v(e){if(w.value.contains(e.target))return!1;c.value=!1}U(()=>{document.addEventListener("click",v)}),A(()=>{document.removeEventListener("click",v)});function y(e){t.value=e,c.value=!1}function q(){k||(b.value=h,g.value=o,k=!0),c.value=!0}function B(){b.value=h.filter(e=>e.indexOf(n.value)>=0),g.value=o.filter(e=>e.indexOf(n.value)>=0)}return(e,p)=>{const N=d("ExIcon"),x=d("a-input"),T=d("search-outlined"),V=d("a-form-item-rest");return r(),i(m,null,[u(x,{value:t.value,"onUpdate:value":p[0]||(p[0]=a=>t.value=a),allowClear:"",onClick:j(q,["stop"])},{addonAfter:f(()=>[l("span",{onClick:j(q,["stop"]),style:{cursor:"pointer"}},[t.value?(r(),_(N,{key:0,icon:t.value},null,8,["icon"])):(r(),i(m,{key:1},[J],64))],8,G)]),_:1},8,["value","onClick"]),F(l("div",{class:"icons",ref_key:"el",ref:w},[l("div",K,[u(V,null,{default:f(()=>[u(x,{value:n.value,"onUpdate:value":p[1]||(p[1]=a=>n.value=a),placeholder:"\u8F93\u5165\u5173\u952E\u8BCD\u8FDB\u884C\u641C\u7D22",onChange:B},{suffix:f(()=>[u(T)]),_:1},8,["value"])]),_:1})]),l("ul",P,[(r(!0),i(m,null,z(g.value,a=>(r(),i("li",{onClick:O=>y(a),key:a},[l("i",{class:M(a)},null,2)],8,Y))),128)),(r(!0),i(m,null,z(b.value,a=>(r(),i("li",{onClick:O=>y(a),key:a},[(r(),_(R(a)))],8,Z))),128))])],512),[[H,c.value]])],64)}}});var Re=D(ae,[["__scopeId","data-v-7f3b26e3"]]);export{Re as default}; diff --git a/public/exadmin/assets/selectIcon.fecf68db.css b/public/exadmin/assets/selectIcon.fecf68db.css new file mode 100644 index 0000000..0245685 --- /dev/null +++ b/public/exadmin/assets/selectIcon.fecf68db.css @@ -0,0 +1 @@ +.icons[data-v-7f3b26e3]{position:fixed;z-index:1000;background-color:#fff;background-clip:padding-box;border-radius:2px;box-shadow:0 3px 6px -4px #0000001f,0 6px 16px #00000014,0 9px 28px 8px #0000000d}.icons .search[data-v-7f3b26e3]{padding:10px 10px 0}.iconCollection[data-v-7f3b26e3]{padding:0;list-style:none;display:flex;flex-wrap:wrap;width:910px;height:400px;overflow-y:auto;margin:10px}.iconCollection li[data-v-7f3b26e3]{cursor:pointer;width:40px;height:40px;border:1px solid #ededed;line-height:40px;text-align:center}.iconCollection li[data-v-7f3b26e3]:hover{background:#1890ff;color:#fff}.iconCollection span[data-v-7f3b26e3],.iconCollection i[data-v-7f3b26e3]{font-size:20px}.dark-theme .icons[data-v-7f3b26e3]{background:#1f1f1f}.dark-theme .iconCollection li[data-v-7f3b26e3]{border:1px dashed #434343} diff --git a/public/exadmin/assets/selectTable.0026a80b.js b/public/exadmin/assets/selectTable.0026a80b.js new file mode 100644 index 0000000..cb7b302 --- /dev/null +++ b/public/exadmin/assets/selectTable.0026a80b.js @@ -0,0 +1 @@ +import{a as N}from"./context.6c9ae94a.js";import{_ as A,t as z}from"./index.b35f53c6.js";import"./vue.db505ee4.js";import{u as w}from"./use-http.ec808253.js";import{d as E,r as m,w as j,aW as u,aR as c,at as g,au as U,c as o,bd as i,S as y,ai as p,ar as H,as as B,aM as R,af as D,H as F}from"./@vue.cb43a243.js";import"./js-md5.5179c6be.js";import"./@babel.6cd0804c.js";import"./regenerator-runtime.8e24db72.js";import"./vue-router.a08742b9.js";import"./js-cookie.31874410.js";import"./ant-design-vue.6b10f349.js";import"./@ant-design.bcfb08ae.js";import"./@ctrl.fa7cbd46.js";import"./resize-observer-polyfill.8deb1e21.js";import"./vue-types.6e6d84ba.js";import"./dom-align.f1b5d360.js";import"./lodash-es.0ea26897.js";import"./dayjs.38e390ea.js";import"./async-validator.5d25c98b.js";import"./scroll-into-view-if-needed.5191fdbf.js";import"./compute-scroll-into-view.6058b3be.js";import"./lodash.c9cf1bdb.js";import"./spark-md5.2cc5764b.js";import"./@vueuse.952f4739.js";import"./vue-demi.5fb18120.js";import"./axios.e3200588.js";/* empty css */import"./sortablejs.412b554c.js";import"./clipboard.099d05c9.js";import"./markdown-it.80c3a67b.js";import"./entities.0d2c0164.js";import"./uc.micro.981ceb7b.js";import"./mdurl.ef76b4dc.js";import"./linkify-it.92c30060.js";import"./markdown-it-emoji.e3e91710.js";import"./escape-html.e5dfadb9.js";import"./prismjs.c97a8414.js";import"./diacritics.6be19c75.js";import"./markdown-it-container.512a5043.js";import"./markdown-it-anchor.c88e5394.js";import"./markdown-it-attrs.3af5ab50.js";import"./markdown-it-table-of-contents.8a4ce16f.js";import"./@kangc.86f7507c.js";const I=E({name:"ExSelectTable",props:{value:[String,Array,Number],params:Object,gridUrl:String,submitUrl:String,remoteParams:{type:Object,default:{}},submitParams:{type:Object,default:{}},custom:Boolean,multiple:Boolean},inheritAttrs:!1,emits:["update:value"],setup(e,a){const _=N(),h=m(!0),s=m(e.value),f=m(!1),v=m([]),r=m(null),t=m(e.value||[]),d=m("");Array.isArray(t.value)||(t.value=[t.value]);const{loading:k,http:C}=w(),S={x:"max-content",y:window.innerHeight/2};e.submitUrl&&O(),j(()=>e.value,l=>{s.value=l}),j(s,l=>{e.multiple?t.value=l:l?t.value=[l]:t.value=[],a.emit("update:value",l)});function n(){e.gridUrl&&(d.value=null,f.value=!0,C({url:e.gridUrl,method:"POST",data:e.params}).then(l=>{Object.assign(l.attribute.params,e.params),d.value=l}))}function O(){const{http:l}=w();let V=Object.assign(e.submitParams,{ex_eadmin_select_id:t.value});_&&(V.data=_.submitData()),l({url:e.submitUrl,method:"POST",data:V}).then($=>{e.custom?r.value=$.data:v.value=$.data,f.value=!1;const T=[];if(t.value.forEach(b=>{T.push(b)}),e.multiple)s.value=T;else{let b=T.pop();typeof b!="undefined"&&(s.value=b)}}).finally(()=>{h.value=!1})}function P(){e.multiple?s.value=[]:s.value=null}return{clear:P,trans:z,selectLoading:h,loading:k,submit:O,open:n,content:d,options:v,selectValue:s,selection:t,visible:f,height:S,customRender:r}}}),L={key:0},M={class:"action"},W={key:1},q={key:0};function G(e,a,_,h,s,f){const v=u("plus-outlined"),r=u("a-button"),t=u("delete-outlined"),d=u("render"),k=u("a-select"),C=u("a-form-item-rest"),S=u("a-modal");return c(),g(F,null,[e.custom?(c(),g("div",L,[U("div",M,[o(r,{size:"small",onClick:e.open,disabled:e.$attrs.disabled},{icon:i(()=>[o(v)]),default:i(()=>[y(" "+p(e.trans("SelectTable.select")),1)]),_:1},8,["onClick","disabled"]),e.selectValue?(c(),H(r,{key:0,size:"small",onClick:e.clear,disabled:e.$attrs.disabled},{icon:i(()=>[o(t)]),default:i(()=>[y(" "+p(e.trans("SelectTable.clear")),1)]),_:1},8,["onClick","disabled"])):B("",!0)]),o(d,{data:e.customRender},null,8,["data"])])):(c(),g("div",W,[o(k,R(e.$attrs,{value:e.selectValue,"onUpdate:value":a[0]||(a[0]=n=>e.selectValue=n),options:e.options,"allow-clear":"",open:!1,onClick:e.open}),null,16,["value","options","onClick"])])),o(S,{visible:e.visible,"onUpdate:visible":a[3]||(a[3]=n=>e.visible=n),width:"80%",destroyOnClose:""},{footer:i(()=>[U("div",{class:D(e.multiple&&e.selection.length>0?"footer":"")},[e.multiple&&e.selection.length>0?(c(),g("div",q,p(e.trans("SelectTable.selected"))+": "+p(e.selection.length),1)):B("",!0),U("div",null,[o(r,{type:"primary",onClick:e.submit},{default:i(()=>[y(p(e.trans("SelectTable.confirm")),1)]),_:1},8,["onClick"]),o(r,{onClick:a[2]||(a[2]=n=>e.visible=!1)},{default:i(()=>[y(p(e.trans("SelectTable.cancel")),1)]),_:1})])],2)]),default:i(()=>[o(C,null,{default:i(()=>[o(d,{data:e.content,selection:e.selection,"onUpdate:selection":a[1]||(a[1]=n=>e.selection=n),scroll:e.height,"selection-type":e.multiple?"checkbox":"radio"},null,8,["data","selection","scroll","selection-type"])]),_:1})]),_:1},8,["visible"])],64)}var Ee=A(I,[["render",G],["__scopeId","data-v-29cc7068"]]);export{Ee as default}; diff --git a/public/exadmin/assets/selectTable.3743dfd0.css b/public/exadmin/assets/selectTable.3743dfd0.css new file mode 100644 index 0000000..7f9959d --- /dev/null +++ b/public/exadmin/assets/selectTable.3743dfd0.css @@ -0,0 +1 @@ +.flex[data-v-29cc7068]{display:flex;align-items:center;justify-content:space-between}.action[data-v-29cc7068]{display:flex;align-items:center;margin:5px 0}.footer[data-v-29cc7068]{display:flex;align-items:center;justify-content:space-between} diff --git a/public/exadmin/assets/sidebar.8f138590.css b/public/exadmin/assets/sidebar.8f138590.css new file mode 100644 index 0000000..8235ea7 --- /dev/null +++ b/public/exadmin/assets/sidebar.8f138590.css @@ -0,0 +1 @@ +.flex[data-v-5bf1faca]{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap}.action[data-v-5bf1faca]{margin-left:10px} diff --git a/public/exadmin/assets/sidebar.da9c6767.js b/public/exadmin/assets/sidebar.da9c6767.js new file mode 100644 index 0000000..2a71796 --- /dev/null +++ b/public/exadmin/assets/sidebar.da9c6767.js @@ -0,0 +1 @@ +import"./vue.db505ee4.js";import{u as R}from"./use-http.ec808253.js";import{_ as W,f as q,t as G}from"./index.b35f53c6.js";import{r as v,w as J,aW as p,aR as l,ar as m,bd as y,as as c,c as b,au as K,u as f,at as k,S as V,ai as F}from"./@vue.cb43a243.js";import"./@babel.6cd0804c.js";import"./regenerator-runtime.8e24db72.js";import"./js-md5.5179c6be.js";import"./vue-router.a08742b9.js";import"./js-cookie.31874410.js";import"./ant-design-vue.6b10f349.js";import"./@ant-design.bcfb08ae.js";import"./@ctrl.fa7cbd46.js";import"./resize-observer-polyfill.8deb1e21.js";import"./vue-types.6e6d84ba.js";import"./dom-align.f1b5d360.js";import"./lodash-es.0ea26897.js";import"./dayjs.38e390ea.js";import"./async-validator.5d25c98b.js";import"./scroll-into-view-if-needed.5191fdbf.js";import"./compute-scroll-into-view.6058b3be.js";import"./lodash.c9cf1bdb.js";import"./spark-md5.2cc5764b.js";import"./@vueuse.952f4739.js";import"./vue-demi.5fb18120.js";import"./axios.e3200588.js";/* empty css */import"./sortablejs.412b554c.js";import"./clipboard.099d05c9.js";import"./markdown-it.80c3a67b.js";import"./entities.0d2c0164.js";import"./uc.micro.981ceb7b.js";import"./mdurl.ef76b4dc.js";import"./linkify-it.92c30060.js";import"./markdown-it-emoji.e3e91710.js";import"./escape-html.e5dfadb9.js";import"./prismjs.c97a8414.js";import"./diacritics.6be19c75.js";import"./markdown-it-container.512a5043.js";import"./markdown-it-anchor.c88e5394.js";import"./markdown-it-attrs.3af5ab50.js";import"./markdown-it-table-of-contents.8a4ce16f.js";import"./@kangc.86f7507c.js";const Q={class:"scrollbar"},X={key:0,class:"flex"},Y={style:{color:"#f50"}},Z={key:0,class:"action"},$={key:1,class:"flex"},ee={key:0,class:"action"},te={name:"ExSidebar",inheritAttrs:!1},ae=Object.assign(te,{props:{hideAll:Boolean,hideAdd:Boolean,hideEdit:Boolean,hideDel:Boolean,hideFilter:Boolean,hideTools:Boolean,isTree:Boolean,tools:[Object,Boolean],value:[String,Number],sourceList:{type:Array,default:[]},default:{type:[String,Number],default:void 0},field:{type:String,default:"group_id"},selectedField:String,fieldNames:Object,url:String,params:{type:Object,default:{}}},emits:["update:value"],setup(d,{emit:x}){const o=d,{loading:oe,http:j}=R();let S,h=o.fieldNames.children,r=o.fieldNames.key,i=o.fieldNames.title;o.default!==void 0&&x("update:value",o.default);const N=v([o.default]),s=v(""),g=v(-1),B=v(o.sourceList.map(t=>t[r])),O=v(!0),D=v(T(o.sourceList)),E=(t,e)=>{for(let n=0;nA[r]===t)?S=u[r]:E(t,u[h])&&(S=E(t,u[h])))}return S},C=t=>{B.value=t,O.value=!1};J(s,t=>{B.value=o.sourceList.map(e=>e[i].indexOf(t)>-1?E(e[r],D.value):null).filter((e,n,u)=>e&&u.indexOf(e)===n),s.value=t,O.value=!0});const L=(t,e)=>{if(e.selected){const n=t[0];o.selectedField?x("update:value",e.node[o.selectedField]):x("update:value",n)}else x("update:value",null)};function T(t){if(o.isTree&&(t=q(t,r,o.fieldNames.pid,h)),t.length==0&&(N.value=[""],x("update:value","")),!o.hideAll){const e={};e[r]="",e[i]=G("Sidebar.all"),e.ex_admin_render={name:"html",attribute:{"data-tag":"span"},content:{default:[e[i]]}},t.unshift(e)}return t}function _(){j({url:o.url,method:"post",data:o.params}).then(t=>{D.value=T(t)})}function M(t){let e=t.node[r];e&&(g.value=e)}function w(){g.value=-1}return(t,e)=>{const n=p("render"),u=p("reload-outlined"),A=p("a-button"),z=p("a-space"),I=p("search-outlined"),P=p("a-input"),U=p("a-tree"),H=p("a-card");return l(),m(H,{style:{height:"100%"},bodyStyle:{padding:"10px",height:"100%",display:"flex",flexDirection:"column"}},{default:y(()=>[d.hideTools?c("",!0):(l(),m(z,{key:0,style:{"margin-bottom":"10px"},size:10},{default:y(()=>[d.hideAdd?c("",!0):(l(),m(n,{key:0,data:d.tools.add,onSuccess:_},null,8,["data"])),b(A,{shape:"circle",size:"small",onClick:_},{icon:y(()=>[b(u)]),_:1})]),_:1})),d.hideFilter?c("",!0):(l(),m(P,{key:1,value:s.value,"onUpdate:value":e[0]||(e[0]=a=>s.value=a),style:{"margin-bottom":"8px"}},{prefix:y(()=>[b(I,{style:{color:"#c0c4cc"}})]),_:1},8,["value"])),K("div",Q,[b(U,{"expanded-keys":B.value,"tree-data":D.value,"auto-expand-parent":O.value,fieldNames:d.fieldNames,onExpand:C,onSelect:L,onMouseenter:M,onMouseleave:w,"block-node":"",selectedKeys:N.value,"onUpdate:selectedKeys":e[1]||(e[1]=a=>N.value=a)},{title:y(a=>[s.value&&a[f(i)]&&a[f(i)].indexOf(s.value)>-1?(l(),k("span",X,[K("span",null,[V(F(a[f(i)].substr(0,a[f(i)].indexOf(s.value)))+" ",1),K("span",Y,F(s.value),1),V(" "+F(a[f(i)].substr(a[f(i)].indexOf(s.value)+s.value.length)),1)]),g.value==a[f(r)]&&(a.ex_admin_edit||a.ex_admin_delete)?(l(),k("span",Z,[d.hideEdit?c("",!0):(l(),m(n,{key:0,data:a.ex_admin_edit,onSuccess:_},null,8,["data"])),d.hideDel?c("",!0):(l(),m(n,{key:1,data:a.ex_admin_delete,onSuccess:_},null,8,["data"]))])):c("",!0)])):(l(),k("span",$,[b(n,{data:a.ex_admin_render},null,8,["data"]),g.value==a[f(r)]&&(a.ex_admin_edit||a.ex_admin_delete)?(l(),k("span",ee,[d.hideEdit?c("",!0):(l(),m(n,{key:0,data:a.ex_admin_edit,onSuccess:_},null,8,["data"])),d.hideDel?c("",!0):(l(),m(n,{key:1,data:a.ex_admin_delete,onSuccess:_},null,8,["data"]))])):c("",!0)]))]),_:1},8,["expanded-keys","tree-data","auto-expand-parent","fieldNames","selectedKeys"])])]),_:1})}}});var qe=W(ae,[["__scopeId","data-v-5bf1faca"]]);export{qe as default}; diff --git a/public/exadmin/assets/simple-uploader.js.04c42387.js b/public/exadmin/assets/simple-uploader.js.04c42387.js new file mode 100644 index 0000000..67bc047 --- /dev/null +++ b/public/exadmin/assets/simple-uploader.js.04c42387.js @@ -0,0 +1,7 @@ +import{a as x}from"./@babel.6cd0804c.js";var P={exports:{}};/*! + * Uploader - Uploader library implements html5 file upload and provides multiple simultaneous, stable, fault tolerant and resumable uploads + * @version v0.6.0 + * @author dolymood + * @link https://github.com/simple-uploader/Uploader + * @license MIT + */(function(D,w){(function(_){D.exports=_()})(function(){return function _(y,R,n){function g(e,t){if(!R[e]){if(!y[e]){var h=typeof x=="function"&&x;if(!t&&h)return h(e,!0);if(l)return l(e,!0);throw new Error("Cannot find module '"+e+"'")}var r=R[e]={exports:{}};y[e][0].call(r.exports,function(i){var o=y[e][1][i];return g(o||i)},r,r.exports,_,y,R,n)}return R[e].exports}for(var l=typeof x=="function"&&x,u=0;u-1?e=l.SUCCESS:this.uploader.opts.permanentErrors.indexOf(this.xhr.status)>-1||!u&&this.retries>=this.uploader.opts.maxChunkRetries?e=l.ERROR:(this.abort(),e=l.PENDING);var t=this.processedState;return t&&t.err&&(e=l.ERROR),e}else return l.PENDING},message:function(){return this.xhr?this.xhr.responseText:""},progress:function(){if(this.pendingRetry)return 0;var u=this.status();return u===l.SUCCESS||u===l.ERROR?1:u===l.PENDING?0:this.total>0?this.loaded/this.total:0},sizeUploaded:function(){var u=this.endByte-this.startByte;return this.status()!==l.SUCCESS&&(u=this.progress()*u),u},prepareXhrRequest:function(u,e,t,h){var r=n.evalOpts(this.uploader.opts.query,this.file,this,e);r=n.extend(this.getParams(),r),r=this.uploader.opts.processParams(r,this.file,this,e);var i=n.evalOpts(this.uploader.opts.target,this.file,this,e),o=null;if(u==="GET"||t==="octet"){var d=[];n.each(r,function(s,a){d.push([encodeURIComponent(a),encodeURIComponent(s)].join("="))}),i=this.getTarget(i,d),o=h||null}else o=new FormData,n.each(r,function(s,a){o.append(a,s)}),typeof h!="undefined"&&o.append(this.uploader.opts.fileParameterName,h,this.file.name);return this.xhr.open(u,i,!0),this.xhr.withCredentials=this.uploader.opts.withCredentials,n.each(n.evalOpts(this.uploader.opts.headers,this.file,this,e),function(s,a){this.xhr.setRequestHeader(a,s)},this),o}}),y.exports=g},{"./utils":5}],2:[function(_,y,R){var n=_("./utils").each,g={_eventData:null,on:function(l,u){this._eventData||(this._eventData={}),this._eventData[l]||(this._eventData[l]=[]);var e=!1;n(this._eventData[l],function(t){if(t===u)return e=!0,!1}),e||this._eventData[l].push(u)},off:function(l,u){this._eventData||(this._eventData={}),!(!this._eventData[l]||!this._eventData[l].length)&&(u?n(this._eventData[l],function(e,t){if(e===u)return this._eventData[l].splice(t,1),!1},this):this._eventData[l]=[])},trigger:function(l){if(this._eventData||(this._eventData={}),!this._eventData[l])return!0;var u=this._eventData[l].slice.call(arguments,1),e=!1;return n(this._eventData[l],function(t){e=t.apply(this,u)===!1||e},this),!e}};y.exports=g},{"./utils":5}],3:[function(_,y,R){var n=_("./utils"),g=_("./event"),l=_("./file"),u=_("./chunk"),e="0.6.0",t=typeof window=="undefined",h=t?!1:window.navigator.msPointerEnabled,r=function(){if(t)return!1;var s="slice",a=n.isDefined(window.File)&&n.isDefined(window.Blob)&&n.isDefined(window.FileList),p=null;return a&&(p=window.Blob.prototype,n.each(["slice","webkitSlice","mozSlice"],function(c){if(p[c])return s=c,!1}),a=!!p[s]),a&&(o.sliceName=s),p=null,a}(),i=function(){if(t)return!1;var s=window.document.createElement("input");s.type="file";var a="webkitdirectory"in s||"directory"in s;return s=null,a}();function o(s){this.support=r,!!this.support&&(this.supportDirectory=i,n.defineNonEnumerable(this,"filePaths",{}),this.opts=n.extend({},o.defaults,s||{}),this.preventEvent=n.bind(this._preventEvent,this),l.call(this,this))}var d=function(s,a,p,c,v){v.readFinished(s.file[o.sliceName](p,c,a))};o.version=e,o.defaults={chunkSize:1024*1024,forceChunkSize:!1,simultaneousUploads:3,singleFile:!1,fileParameterName:"file",progressCallbacksInterval:500,speedSmoothingFactor:.1,query:{},headers:{},withCredentials:!1,preprocess:null,method:"multipart",testMethod:"GET",uploadMethod:"POST",prioritizeFirstAndLastChunk:!1,allowDuplicateUploads:!1,target:"/",testChunks:!0,generateUniqueIdentifier:null,maxChunkRetries:0,chunkRetryInterval:null,permanentErrors:[404,415,500,501],successStatuses:[200,201,202],onDropStopPropagation:!1,initFileFn:null,readFileFn:d,checkChunkUploadedByResponse:null,initialPaused:!1,processResponse:function(s,a){a(null,s)},processParams:function(s){return s}},o.utils=n,o.event=g,o.File=l,o.Chunk=u,o.prototype=n.extend({},l.prototype),n.extend(o.prototype,g),n.extend(o.prototype,{constructor:o,_trigger:function(s){var a=n.toArray(arguments),p=!this.trigger.apply(this,arguments);return s!=="catchAll"&&(a.unshift("catchAll"),p=!this.trigger.apply(this,a)||p),!p},_triggerAsync:function(){var s=arguments;n.nextTick(function(){this._trigger.apply(this,s)},this)},addFiles:function(s,a){var p=[],c=this.fileList.length;n.each(s,function(f){if((!h||h&&f.size>0)&&!(f.size%4096===0&&(f.name==="."||f.fileName==="."))){var m=this.generateUniqueIdentifier(f);if(this.opts.allowDuplicateUploads||!this.getFromUniqueIdentifier(m)){var S=new l(this,f,this);S.uniqueIdentifier=m,this._trigger("fileAdded",S,a)?p.push(S):l.prototype.removeFile.call(this,S)}}},this);var v=this.fileList.slice(c);this._trigger("filesAdded",p,v,a)?(n.each(p,function(f){this.opts.singleFile&&this.files.length>0&&this.removeFile(this.files[0]),this.files.push(f)},this),this._trigger("filesSubmitted",p,v,a)):n.each(v,function(f){l.prototype.removeFile.call(this,f)},this)},addFile:function(s,a){this.addFiles([s],a)},cancel:function(){for(var s=this.fileList.length-1;s>=0;s--)this.fileList[s].cancel()},removeFile:function(s){l.prototype.removeFile.call(this,s),this._trigger("fileRemoved",s)},generateUniqueIdentifier:function(s){var a=this.opts.generateUniqueIdentifier;if(n.isFunction(a))return a(s);var p=s.relativePath||s.webkitRelativePath||s.fileName||s.name;return s.size+"-"+p.replace(/[^0-9a-zA-Z_-]/img,"")},getFromUniqueIdentifier:function(s){var a=!1;return n.each(this.files,function(p){if(p.uniqueIdentifier===s)return a=p,!1}),a},uploadNextChunk:function(s){var a=!1,p=u.STATUS.PENDING,c=this.uploader.opts.checkChunkUploadedByResponse;if(this.opts.prioritizeFirstAndLastChunk&&(n.each(this.files,function(f){if(!f.paused&&!(c&&!f._firstResponse&&f.isUploading())){if(f.chunks.length&&f.chunks[0].status()===p)return f.chunks[0].send(),a=!0,!1;if(f.chunks.length>1&&f.chunks[f.chunks.length-1].status()===p)return f.chunks[f.chunks.length-1].send(),a=!0,!1}}),a))return a;if(n.each(this.files,function(f){if(!f.paused){if(c&&!f._firstResponse&&f.isUploading())return;n.each(f.chunks,function(m){if(m.status()===p)return m.send(),a=!0,!1})}if(a)return!1}),a)return!0;var v=!1;return n.each(this.files,function(f){if(!f.isComplete())return v=!0,!1}),!v&&!s&&this.files.length&&this._triggerAsync("complete"),v},upload:function(s){var a=this._shouldUploadNext();if(a!==!1){!s&&this._trigger("uploadStart");for(var p=!1,c=1;c<=this.opts.simultaneousUploads-a&&(p=this.uploadNextChunk(!s)||p,!(!p&&s));c++);!p&&!s&&this._triggerAsync("complete")}},_shouldUploadNext:function(){var s=0,a=!0,p=this.opts.simultaneousUploads,c=u.STATUS.UPLOADING;return n.each(this.files,function(v){return n.each(v.chunks,function(f){if(f.status()===c&&(s++,s>=p))return a=!1,!1}),a}),a&&s},assignBrowse:function(s,a,p,c){typeof s.length=="undefined"&&(s=[s]),n.each(s,function(v){var f;v.tagName==="INPUT"&&v.type==="file"?f=v:(f=document.createElement("input"),f.setAttribute("type","file"),n.extend(f.style,{visibility:"hidden",position:"absolute",width:"1px",height:"1px"}),v.appendChild(f),v.addEventListener("click",function(S){v.tagName.toLowerCase()!=="label"&&f.click()},!1)),!this.opts.singleFile&&!p&&f.setAttribute("multiple","multiple"),a&&f.setAttribute("webkitdirectory","webkitdirectory"),c&&n.each(c,function(S,F){f.setAttribute(F,S)});var m=this;f.addEventListener("change",function(S){m._trigger(S.type,S),S.target.value&&(m.addFiles(S.target.files,S),S.target.value="")},!1)},this)},onDrop:function(s){this._trigger(s.type,s),this.opts.onDropStopPropagation&&s.stopPropagation(),s.preventDefault(),this._parseDataTransfer(s.dataTransfer,s)},_parseDataTransfer:function(s,a){s.items&&s.items[0]&&s.items[0].webkitGetAsEntry?this.webkitReadDataTransfer(s,a):this.addFiles(s.files,a)},webkitReadDataTransfer:function(s,a){var p=this,c=s.items.length,v=[];n.each(s.items,function(b){var k=b.webkitGetAsEntry();if(!k){F();return}k.isFile?m(b.getAsFile(),k.fullPath):f(k.createReader())});function f(b){b.readEntries(function(k){k.length?(c+=k.length,n.each(k,function(E){if(E.isFile){var C=E.fullPath;E.file(function(U){m(U,C)},S)}else E.isDirectory&&f(E.createReader())}),f(b)):F()},S)}function m(b,k){b.relativePath=k.substring(1),v.push(b),F()}function S(b){throw b}function F(){--c===0&&p.addFiles(v,a)}},_assignHelper:function(s,a,p){typeof s.length=="undefined"&&(s=[s]);var c=p?"removeEventListener":"addEventListener";n.each(s,function(v){n.each(a,function(f,m){v[c](m,f,!1)},this)},this)},_preventEvent:function(s){n.preventEvent(s),this._trigger(s.type,s)},assignDrop:function(s){this._onDrop=n.bind(this.onDrop,this),this._assignHelper(s,{dragover:this.preventEvent,dragenter:this.preventEvent,dragleave:this.preventEvent,drop:this._onDrop})},unAssignDrop:function(s){this._assignHelper(s,{dragover:this.preventEvent,dragenter:this.preventEvent,dragleave:this.preventEvent,drop:this._onDrop},!0),this._onDrop=null}}),y.exports=o},{"./chunk":1,"./event":2,"./file":4,"./utils":5}],4:[function(_,y,R){var n=_("./utils"),g=_("./chunk");function l(e,t,h){n.defineNonEnumerable(this,"uploader",e),this.isRoot=this.isFolder=e===this,n.defineNonEnumerable(this,"parent",h||null),n.defineNonEnumerable(this,"files",[]),n.defineNonEnumerable(this,"fileList",[]),n.defineNonEnumerable(this,"chunks",[]),n.defineNonEnumerable(this,"_errorFiles",[]),n.defineNonEnumerable(this,"file",null),this.id=n.uid(),this.isRoot||!t?this.file=null:n.isString(t)?(this.isFolder=!0,this.file=null,this.path=t,this.parent.path&&(t=t.substr(this.parent.path.length)),this.name=t.charAt(t.length-1)==="/"?t.substr(0,t.length-1):t):(this.file=t,this.fileType=this.file.type,this.name=t.fileName||t.name,this.size=t.size,this.relativePath=t.relativePath||t.webkitRelativePath||this.name,this._parseFile()),this.paused=e.opts.initialPaused,this.error=!1,this.allError=!1,this.aborted=!1,this.completed=!1,this.averageSpeed=0,this.currentSpeed=0,this._lastProgressCallback=Date.now(),this._prevUploadedSize=0,this._prevProgress=0,this.bootstrap()}n.extend(l.prototype,{_parseFile:function(){var e=u(this.relativePath);if(e.length){var t=this.uploader.filePaths;n.each(e,function(h,r){var i=t[h];i||(i=new l(this.uploader,h,this.parent),t[h]=i,this._updateParentFileList(i)),this.parent=i,i.files.push(this),e[r+1]||i.fileList.push(this)},this)}else this._updateParentFileList()},_updateParentFileList:function(e){e||(e=this);var t=this.parent;t&&t.fileList.push(e)},_eachAccess:function(e,t){if(this.isFolder){n.each(this.files,function(h,r){return e.call(this,h,r)},this);return}t.call(this,this)},bootstrap:function(){if(!this.isFolder){var e=this.uploader.opts;n.isFunction(e.initFileFn)&&e.initFileFn.call(this,this),this.abort(!0),this._resetError(),this._prevProgress=0;for(var t=e.forceChunkSize?Math.ceil:Math.floor,h=Math.max(t(this.size/e.chunkSize),1),r=0;r=this.uploader.opts.progressCallbacksInterval},_chunkEvent:function(e,t,h){var r=this.uploader,i=g.STATUS,o=this,d=this.getRoot(),s=function(){o._measureSpeed(),r._trigger("fileProgress",d,o,e),o._lastProgressCallback=Date.now()};switch(t){case i.PROGRESS:this._checkProgress()&&s();break;case i.ERROR:this._error(),this.abort(!0),r._trigger("fileError",d,this,h,e);break;case i.SUCCESS:if(this._updateUploadedChunks(h,e),this.error)return;clearTimeout(this._progeressId),this._progeressId=0;var a=Date.now()-this._lastProgressCallback;a0?e/t:this.isComplete()?1:0)},function(){if(this.error){h=1;return}if(this.chunks.length===1){this._prevProgress=Math.max(this._prevProgress,this.chunks[0].progress()),h=this._prevProgress;return}var r=0;n.each(this.chunks,function(o){r+=o.progress()*(o.endByte-o.startByte)});var i=r/this.size;this._prevProgress=Math.max(this._prevProgress,i>.9999?1:i),h=this._prevProgress}),h},getSize:function(){var e=0;return this._eachAccess(function(t){e+=t.size},function(){e+=this.size}),e},getFormatSize:function(){var e=this.getSize();return n.formatSize(e)},getRoot:function(){if(this.isRoot)return this;for(var e=this.parent;e;){if(e.parent===this.uploader)return e;e=e.parent}return this},sizeUploaded:function(){var e=0;return this._eachAccess(function(t){e+=t.sizeUploaded()},function(){n.each(this.chunks,function(t){e+=t.sizeUploaded()})}),e},timeRemaining:function(){var e=0,t=0,h=0;return this._eachAccess(function(i,o){!i.paused&&!i.error&&(t+=i.size-i.sizeUploaded(),h+=i.averageSpeed),o===this.files.length-1&&(e=r(t,h))},function(){if(this.paused||this.error){e=0;return}var i=this.size-this.sizeUploaded();e=r(i,this.averageSpeed)}),e;function r(i,o){return i&&!o?Number.POSITIVE_INFINITY:!i&&!o?0:Math.floor(i/o)}},removeFile:function(e){if(e.isFolder)for(;e.files.length;){var t=e.files[e.files.length-1];this._removeFile(t)}this._removeFile(e)},_delFilePath:function(e){e.path&&this.filePaths&&delete this.filePaths[e.path],n.each(e.fileList,function(t){this._delFilePath(t)},this)},_removeFile:function(e){if(!e.isFolder){n.each(this.files,function(r,i){if(r===e)return this.files.splice(i,1),!1},this),e.abort();for(var t=e.parent,h;t&&t!==this;)h=t.parent,t._removeFile(e),t=h}e.parent===this&&n.each(this.fileList,function(r,i){if(r===e)return this.fileList.splice(i,1),!1},this),!this.isRoot&&this.isFolder&&!this.files.length&&(this.parent._removeFile(this),this.uploader._delFilePath(this)),e.parent=null},getType:function(){return this.isFolder?"folder":this.file.type&&this.file.type.split("/")[1]},getExtension:function(){return this.isFolder?"":this.name.substr((~-this.name.lastIndexOf(".")>>>0)+2).toLowerCase()}}),y.exports=l;function u(e){var t=[],h=e.split("/"),r=h.length,i=1;if(h.splice(r-1,1),r--,h.length)for(;i<=r;)t.push(h.slice(0,i++).join("/")+"/");return t}},{"./chunk":1,"./utils":5}],5:[function(_,y,R){var n=Object.prototype,g=Array.prototype,l=n.toString,u=function(i){return l.call(i)==="[object Function]"},e=Array.isArray||function(i){return l.call(i)==="[object Array]"},t=function(i){return l.call(i)==="[object Object]"&&Object.getPrototypeOf(i)===n},h=0,r={uid:function(){return++h},noop:function(){},bind:function(i,o){return function(){return i.apply(o,arguments)}},preventEvent:function(i){i.preventDefault()},stop:function(i){i.preventDefault(),i.stopPropagation()},nextTick:function(i,o){setTimeout(r.bind(i,o),0)},toArray:function(i,o,d){return o===void 0&&(o=0),d===void 0&&(d=i.length),g.slice.call(i,o,d)},isPlainObject:t,isFunction:u,isArray:e,isObject:function(i){return Object(i)===i},isString:function(i){return typeof i=="string"},isUndefined:function(i){return typeof i=="undefined"},isDefined:function(i){return typeof i!="undefined"},each:function(i,o,d){if(r.isDefined(i.length))for(var s=0,a=i.length;s + * @author owenm + * @license MIT + */function lt(n,e){var t=Object.keys(n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(n);e&&(o=o.filter(function(i){return Object.getOwnPropertyDescriptor(n,i).enumerable})),t.push.apply(t,o)}return t}function z(n){for(var e=1;e=0)&&(t[i]=n[i]);return t}function Mt(n,e){if(n==null)return{};var t=xt(n,e),o,i;if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(n);for(i=0;i=0)&&(!Object.prototype.propertyIsEnumerable.call(n,o)||(t[o]=n[o]))}return t}var Ft="1.15.0";function q(n){if(typeof window!="undefined"&&window.navigator)return!!navigator.userAgent.match(n)}var V=q(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i),Ce=q(/Edge/i),st=q(/firefox/i),ye=q(/safari/i)&&!q(/chrome/i)&&!q(/android/i),mt=q(/iP(ad|od|hone)/i),vt=q(/chrome/i)&&q(/android/i),bt={capture:!1,passive:!1};function E(n,e,t){n.addEventListener(e,t,!V&&bt)}function b(n,e,t){n.removeEventListener(e,t,!V&&bt)}function Re(n,e){if(!!e){if(e[0]===">"&&(e=e.substring(1)),n)try{if(n.matches)return n.matches(e);if(n.msMatchesSelector)return n.msMatchesSelector(e);if(n.webkitMatchesSelector)return n.webkitMatchesSelector(e)}catch{return!1}return!1}}function Xt(n){return n.host&&n!==document&&n.host.nodeType?n.host:n.parentNode}function G(n,e,t,o){if(n){t=t||document;do{if(e!=null&&(e[0]===">"?n.parentNode===t&&Re(n,e):Re(n,e))||o&&n===t)return n;if(n===t)break}while(n=Xt(n))}return null}var ut=/\s+/g;function F(n,e,t){if(n&&e)if(n.classList)n.classList[t?"add":"remove"](e);else{var o=(" "+n.className+" ").replace(ut," ").replace(" "+e+" "," ");n.className=(o+(t?" "+e:"")).replace(ut," ")}}function h(n,e,t){var o=n&&n.style;if(o){if(t===void 0)return document.defaultView&&document.defaultView.getComputedStyle?t=document.defaultView.getComputedStyle(n,""):n.currentStyle&&(t=n.currentStyle),e===void 0?t:t[e];!(e in o)&&e.indexOf("webkit")===-1&&(e="-webkit-"+e),o[e]=t+(typeof t=="string"?"":"px")}}function ce(n,e){var t="";if(typeof n=="string")t=n;else do{var o=h(n,"transform");o&&o!=="none"&&(t=o+" "+t)}while(!e&&(n=n.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(t)}function Et(n,e,t){if(n){var o=n.getElementsByTagName(e),i=0,r=o.length;if(t)for(;i=r:a=i<=r,!a)return o;if(o===L())break;o=ee(o,!1)}return!1}function de(n,e,t,o){for(var i=0,r=0,a=n.children;r2&&arguments[2]!==void 0?arguments[2]:{},i=o.evt,r=Mt(o,Lt);Oe.pluginEvent.bind(p)(e,t,z({dragEl:f,parentEl:S,ghostEl:g,rootEl:_,nextEl:ae,lastDownEl:Fe,cloneEl:D,cloneHidden:J,dragStarted:be,putSortable:O,activeSortable:p.active,originalEvent:i,oldIndex:fe,oldDraggableIndex:De,newIndex:X,newDraggableIndex:Q,hideGhostForTarget:Ct,unhideGhostForTarget:Ot,cloneNowHidden:function(){J=!0},cloneNowShown:function(){J=!1},dispatchSortableEvent:function(l){P({sortable:t,name:l,originalEvent:i})}},r))};function P(n){Gt(z({putSortable:O,cloneEl:D,targetEl:f,rootEl:_,oldIndex:fe,oldDraggableIndex:De,newIndex:X,newDraggableIndex:Q},n))}var f,S,g,_,ae,Fe,D,J,fe,X,De,Q,Ae,O,ue=!1,Be=!1,He=[],ie,H,Ue,qe,dt,ht,be,se,Se,Te=!1,Pe=!1,Xe,I,$e=[],Je=!1,We=[],Le=typeof document!="undefined",Ne=mt,pt=Ce||V?"cssFloat":"float",zt=Le&&!vt&&!mt&&"draggable"in document.createElement("div"),Dt=function(){if(!!Le){if(V)return!1;var n=document.createElement("x");return n.style.cssText="pointer-events:auto",n.style.pointerEvents==="auto"}}(),St=function(e,t){var o=h(e),i=parseInt(o.width)-parseInt(o.paddingLeft)-parseInt(o.paddingRight)-parseInt(o.borderLeftWidth)-parseInt(o.borderRightWidth),r=de(e,0,t),a=de(e,1,t),l=r&&h(r),s=a&&h(a),u=l&&parseInt(l.marginLeft)+parseInt(l.marginRight)+C(r).width,d=s&&parseInt(s.marginLeft)+parseInt(s.marginRight)+C(a).width;if(o.display==="flex")return o.flexDirection==="column"||o.flexDirection==="column-reverse"?"vertical":"horizontal";if(o.display==="grid")return o.gridTemplateColumns.split(" ").length<=1?"vertical":"horizontal";if(r&&l.float&&l.float!=="none"){var c=l.float==="left"?"left":"right";return a&&(s.clear==="both"||s.clear===c)?"vertical":"horizontal"}return r&&(l.display==="block"||l.display==="flex"||l.display==="table"||l.display==="grid"||u>=i&&o[pt]==="none"||a&&o[pt]==="none"&&u+d>i)?"vertical":"horizontal"},jt=function(e,t,o){var i=o?e.left:e.top,r=o?e.right:e.bottom,a=o?e.width:e.height,l=o?t.left:t.top,s=o?t.right:t.bottom,u=o?t.width:t.height;return i===l||r===s||i+a/2===l+u/2},Ut=function(e,t){var o;return He.some(function(i){var r=i[Y].options.emptyInsertThreshold;if(!(!r||ot(i))){var a=C(i),l=e>=a.left-r&&e<=a.right+r,s=t>=a.top-r&&t<=a.bottom+r;if(l&&s)return o=i}}),o},Tt=function(e){function t(r,a){return function(l,s,u,d){var c=l.options.group.name&&s.options.group.name&&l.options.group.name===s.options.group.name;if(r==null&&(a||c))return!0;if(r==null||r===!1)return!1;if(a&&r==="clone")return r;if(typeof r=="function")return t(r(l,s,u,d),a)(l,s,u,d);var m=(a?l:s).options.group.name;return r===!0||typeof r=="string"&&r===m||r.join&&r.indexOf(m)>-1}}var o={},i=e.group;(!i||Me(i)!="object")&&(i={name:i}),o.name=i.name,o.checkPull=t(i.pull,!0),o.checkPut=t(i.put),o.revertClone=i.revertClone,e.group=o},Ct=function(){!Dt&&g&&h(g,"display","none")},Ot=function(){!Dt&&g&&h(g,"display","")};Le&&!vt&&document.addEventListener("click",function(n){if(Be)return n.preventDefault(),n.stopPropagation&&n.stopPropagation(),n.stopImmediatePropagation&&n.stopImmediatePropagation(),Be=!1,!1},!0);var re=function(e){if(f){e=e.touches?e.touches[0]:e;var t=Ut(e.clientX,e.clientY);if(t){var o={};for(var i in e)e.hasOwnProperty(i)&&(o[i]=e[i]);o.target=o.rootEl=t,o.preventDefault=void 0,o.stopPropagation=void 0,t[Y]._onDragOver(o)}}},qt=function(e){f&&f.parentNode[Y]._isOutsideThisEl(e.target)};function p(n,e){if(!(n&&n.nodeType&&n.nodeType===1))throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(n));this.el=n,this.options=e=$({},e),n[Y]=this;var t={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(n.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return St(n,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(a,l){a.setData("Text",l.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:p.supportPointer!==!1&&"PointerEvent"in window&&!ye,emptyInsertThreshold:5};Oe.initializePlugins(this,n,t);for(var o in t)!(o in e)&&(e[o]=t[o]);Tt(e);for(var i in this)i.charAt(0)==="_"&&typeof this[i]=="function"&&(this[i]=this[i].bind(this));this.nativeDraggable=e.forceFallback?!1:zt,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?E(n,"pointerdown",this._onTapStart):(E(n,"mousedown",this._onTapStart),E(n,"touchstart",this._onTapStart)),this.nativeDraggable&&(E(n,"dragover",this),E(n,"dragenter",this)),He.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[]),$(this,Bt())}p.prototype={constructor:p,_isOutsideThisEl:function(e){!this.el.contains(e)&&e!==this.el&&(se=null)},_getDirection:function(e,t){return typeof this.options.direction=="function"?this.options.direction.call(this,e,t,f):this.options.direction},_onTapStart:function(e){if(!!e.cancelable){var t=this,o=this.el,i=this.options,r=i.preventOnFilter,a=e.type,l=e.touches&&e.touches[0]||e.pointerType&&e.pointerType==="touch"&&e,s=(l||e).target,u=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||s,d=i.filter;if(tn(o),!f&&!(/mousedown|pointerdown/.test(a)&&e.button!==0||i.disabled)&&!u.isContentEditable&&!(!this.nativeDraggable&&ye&&s&&s.tagName.toUpperCase()==="SELECT")&&(s=G(s,i.draggable,o,!1),!(s&&s.animated)&&Fe!==s)){if(fe=k(s),De=k(s,i.draggable),typeof d=="function"){if(d.call(this,e,s,this)){P({sortable:t,rootEl:u,name:"filter",targetEl:s,toEl:o,fromEl:o}),N("filter",t,{evt:e}),r&&e.cancelable&&e.preventDefault();return}}else if(d&&(d=d.split(",").some(function(c){if(c=G(u,c.trim(),o,!1),c)return P({sortable:t,rootEl:c,name:"filter",targetEl:s,fromEl:o,toEl:o}),N("filter",t,{evt:e}),!0}),d)){r&&e.cancelable&&e.preventDefault();return}i.handle&&!G(u,i.handle,o,!1)||this._prepareDragStart(e,l,s)}}},_prepareDragStart:function(e,t,o){var i=this,r=i.el,a=i.options,l=r.ownerDocument,s;if(o&&!f&&o.parentNode===r){var u=C(o);if(_=r,f=o,S=f.parentNode,ae=f.nextSibling,Fe=o,Ae=a.group,p.dragged=f,ie={target:f,clientX:(t||e).clientX,clientY:(t||e).clientY},dt=ie.clientX-u.left,ht=ie.clientY-u.top,this._lastX=(t||e).clientX,this._lastY=(t||e).clientY,f.style["will-change"]="all",s=function(){if(N("delayEnded",i,{evt:e}),p.eventCanceled){i._onDrop();return}i._disableDelayedDragEvents(),!st&&i.nativeDraggable&&(f.draggable=!0),i._triggerDragStart(e,t),P({sortable:i,name:"choose",originalEvent:e}),F(f,a.chosenClass,!0)},a.ignore.split(",").forEach(function(d){Et(f,d.trim(),Ve)}),E(l,"dragover",re),E(l,"mousemove",re),E(l,"touchmove",re),E(l,"mouseup",i._onDrop),E(l,"touchend",i._onDrop),E(l,"touchcancel",i._onDrop),st&&this.nativeDraggable&&(this.options.touchStartThreshold=4,f.draggable=!0),N("delayStart",this,{evt:e}),a.delay&&(!a.delayOnTouchOnly||t)&&(!this.nativeDraggable||!(Ce||V))){if(p.eventCanceled){this._onDrop();return}E(l,"mouseup",i._disableDelayedDrag),E(l,"touchend",i._disableDelayedDrag),E(l,"touchcancel",i._disableDelayedDrag),E(l,"mousemove",i._delayedDragTouchMoveHandler),E(l,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&E(l,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(s,a.delay)}else s()}},_delayedDragTouchMoveHandler:function(e){var t=e.touches?e.touches[0]:e;Math.max(Math.abs(t.clientX-this._lastX),Math.abs(t.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){f&&Ve(f),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var e=this.el.ownerDocument;b(e,"mouseup",this._disableDelayedDrag),b(e,"touchend",this._disableDelayedDrag),b(e,"touchcancel",this._disableDelayedDrag),b(e,"mousemove",this._delayedDragTouchMoveHandler),b(e,"touchmove",this._delayedDragTouchMoveHandler),b(e,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(e,t){t=t||e.pointerType=="touch"&&e,!this.nativeDraggable||t?this.options.supportPointer?E(document,"pointermove",this._onTouchMove):t?E(document,"touchmove",this._onTouchMove):E(document,"mousemove",this._onTouchMove):(E(f,"dragend",this),E(_,"dragstart",this._onDragStart));try{document.selection?Ye(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch{}},_dragStarted:function(e,t){if(ue=!1,_&&f){N("dragStarted",this,{evt:t}),this.nativeDraggable&&E(document,"dragover",qt);var o=this.options;!e&&F(f,o.dragClass,!1),F(f,o.ghostClass,!0),p.active=this,e&&this._appendGhost(),P({sortable:this,name:"start",originalEvent:t})}else this._nulling()},_emulateDragOver:function(){if(H){this._lastX=H.clientX,this._lastY=H.clientY,Ct();for(var e=document.elementFromPoint(H.clientX,H.clientY),t=e;e&&e.shadowRoot&&(e=e.shadowRoot.elementFromPoint(H.clientX,H.clientY),e!==t);)t=e;if(f.parentNode[Y]._isOutsideThisEl(e),t)do{if(t[Y]){var o=void 0;if(o=t[Y]._onDragOver({clientX:H.clientX,clientY:H.clientY,target:e,rootEl:t}),o&&!this.options.dragoverBubble)break}e=t}while(t=t.parentNode);Ot()}},_onTouchMove:function(e){if(ie){var t=this.options,o=t.fallbackTolerance,i=t.fallbackOffset,r=e.touches?e.touches[0]:e,a=g&&ce(g,!0),l=g&&a&&a.a,s=g&&a&&a.d,u=Ne&&I&&ct(I),d=(r.clientX-ie.clientX+i.x)/(l||1)+(u?u[0]-$e[0]:0)/(l||1),c=(r.clientY-ie.clientY+i.y)/(s||1)+(u?u[1]-$e[1]:0)/(s||1);if(!p.active&&!ue){if(o&&Math.max(Math.abs(r.clientX-this._lastX),Math.abs(r.clientY-this._lastY))=0&&(P({rootEl:S,name:"add",toEl:S,fromEl:_,originalEvent:e}),P({sortable:this,name:"remove",toEl:S,originalEvent:e}),P({rootEl:S,name:"sort",toEl:S,fromEl:_,originalEvent:e}),P({sortable:this,name:"sort",toEl:S,originalEvent:e})),O&&O.save()):X!==fe&&X>=0&&(P({sortable:this,name:"update",toEl:S,originalEvent:e}),P({sortable:this,name:"sort",toEl:S,originalEvent:e})),p.active&&((X==null||X===-1)&&(X=fe,Q=De),P({sortable:this,name:"end",toEl:S,originalEvent:e}),this.save()))),this._nulling()},_nulling:function(){N("nulling",this),_=f=S=g=ae=D=Fe=J=ie=H=be=X=Q=fe=De=se=Se=O=Ae=p.dragged=p.ghost=p.clone=p.active=null,We.forEach(function(e){e.checked=!0}),We.length=Ue=qe=0},handleEvent:function(e){switch(e.type){case"drop":case"dragend":this._onDrop(e);break;case"dragenter":case"dragover":f&&(this._onDragOver(e),$t(e));break;case"selectstart":e.preventDefault();break}},toArray:function(){for(var e=[],t,o=this.el.children,i=0,r=o.length,a=this.options;io.right+i||n.clientX<=o.right&&n.clientY>o.bottom&&n.clientX>=o.left:n.clientX>o.right&&n.clientY>o.top||n.clientX<=o.right&&n.clientY>o.bottom+i}function Qt(n,e,t,o,i,r,a,l){var s=o?n.clientY:n.clientX,u=o?t.height:t.width,d=o?t.top:t.left,c=o?t.bottom:t.right,m=!1;if(!a){if(l&&Xed+u*r/2:sc-Xe)return-Se}else if(s>d+u*(1-i)/2&&sc-u*r/2)?s>d+u/2?1:-1:0}function Jt(n){return k(f)>>25)+t|0,e+=(r&t|~r&n)+f[1]-389564586|0,e=(e<<12|e>>>20)+r|0,n+=(e&r|~e&t)+f[2]+606105819|0,n=(n<<17|n>>>15)+e|0,t+=(n&e|~n&r)+f[3]-1044525330|0,t=(t<<22|t>>>10)+n|0,r+=(t&n|~t&e)+f[4]-176418897|0,r=(r<<7|r>>>25)+t|0,e+=(r&t|~r&n)+f[5]+1200080426|0,e=(e<<12|e>>>20)+r|0,n+=(e&r|~e&t)+f[6]-1473231341|0,n=(n<<17|n>>>15)+e|0,t+=(n&e|~n&r)+f[7]-45705983|0,t=(t<<22|t>>>10)+n|0,r+=(t&n|~t&e)+f[8]+1770035416|0,r=(r<<7|r>>>25)+t|0,e+=(r&t|~r&n)+f[9]-1958414417|0,e=(e<<12|e>>>20)+r|0,n+=(e&r|~e&t)+f[10]-42063|0,n=(n<<17|n>>>15)+e|0,t+=(n&e|~n&r)+f[11]-1990404162|0,t=(t<<22|t>>>10)+n|0,r+=(t&n|~t&e)+f[12]+1804603682|0,r=(r<<7|r>>>25)+t|0,e+=(r&t|~r&n)+f[13]-40341101|0,e=(e<<12|e>>>20)+r|0,n+=(e&r|~e&t)+f[14]-1502002290|0,n=(n<<17|n>>>15)+e|0,t+=(n&e|~n&r)+f[15]+1236535329|0,t=(t<<22|t>>>10)+n|0,r+=(t&e|n&~e)+f[1]-165796510|0,r=(r<<5|r>>>27)+t|0,e+=(r&n|t&~n)+f[6]-1069501632|0,e=(e<<9|e>>>23)+r|0,n+=(e&t|r&~t)+f[11]+643717713|0,n=(n<<14|n>>>18)+e|0,t+=(n&r|e&~r)+f[0]-373897302|0,t=(t<<20|t>>>12)+n|0,r+=(t&e|n&~e)+f[5]-701558691|0,r=(r<<5|r>>>27)+t|0,e+=(r&n|t&~n)+f[10]+38016083|0,e=(e<<9|e>>>23)+r|0,n+=(e&t|r&~t)+f[15]-660478335|0,n=(n<<14|n>>>18)+e|0,t+=(n&r|e&~r)+f[4]-405537848|0,t=(t<<20|t>>>12)+n|0,r+=(t&e|n&~e)+f[9]+568446438|0,r=(r<<5|r>>>27)+t|0,e+=(r&n|t&~n)+f[14]-1019803690|0,e=(e<<9|e>>>23)+r|0,n+=(e&t|r&~t)+f[3]-187363961|0,n=(n<<14|n>>>18)+e|0,t+=(n&r|e&~r)+f[8]+1163531501|0,t=(t<<20|t>>>12)+n|0,r+=(t&e|n&~e)+f[13]-1444681467|0,r=(r<<5|r>>>27)+t|0,e+=(r&n|t&~n)+f[2]-51403784|0,e=(e<<9|e>>>23)+r|0,n+=(e&t|r&~t)+f[7]+1735328473|0,n=(n<<14|n>>>18)+e|0,t+=(n&r|e&~r)+f[12]-1926607734|0,t=(t<<20|t>>>12)+n|0,r+=(t^n^e)+f[5]-378558|0,r=(r<<4|r>>>28)+t|0,e+=(r^t^n)+f[8]-2022574463|0,e=(e<<11|e>>>21)+r|0,n+=(e^r^t)+f[11]+1839030562|0,n=(n<<16|n>>>16)+e|0,t+=(n^e^r)+f[14]-35309556|0,t=(t<<23|t>>>9)+n|0,r+=(t^n^e)+f[1]-1530992060|0,r=(r<<4|r>>>28)+t|0,e+=(r^t^n)+f[4]+1272893353|0,e=(e<<11|e>>>21)+r|0,n+=(e^r^t)+f[7]-155497632|0,n=(n<<16|n>>>16)+e|0,t+=(n^e^r)+f[10]-1094730640|0,t=(t<<23|t>>>9)+n|0,r+=(t^n^e)+f[13]+681279174|0,r=(r<<4|r>>>28)+t|0,e+=(r^t^n)+f[0]-358537222|0,e=(e<<11|e>>>21)+r|0,n+=(e^r^t)+f[3]-722521979|0,n=(n<<16|n>>>16)+e|0,t+=(n^e^r)+f[6]+76029189|0,t=(t<<23|t>>>9)+n|0,r+=(t^n^e)+f[9]-640364487|0,r=(r<<4|r>>>28)+t|0,e+=(r^t^n)+f[12]-421815835|0,e=(e<<11|e>>>21)+r|0,n+=(e^r^t)+f[15]+530742520|0,n=(n<<16|n>>>16)+e|0,t+=(n^e^r)+f[2]-995338651|0,t=(t<<23|t>>>9)+n|0,r+=(n^(t|~e))+f[0]-198630844|0,r=(r<<6|r>>>26)+t|0,e+=(t^(r|~n))+f[7]+1126891415|0,e=(e<<10|e>>>22)+r|0,n+=(r^(e|~t))+f[14]-1416354905|0,n=(n<<15|n>>>17)+e|0,t+=(e^(n|~r))+f[5]-57434055|0,t=(t<<21|t>>>11)+n|0,r+=(n^(t|~e))+f[12]+1700485571|0,r=(r<<6|r>>>26)+t|0,e+=(t^(r|~n))+f[3]-1894986606|0,e=(e<<10|e>>>22)+r|0,n+=(r^(e|~t))+f[10]-1051523|0,n=(n<<15|n>>>17)+e|0,t+=(e^(n|~r))+f[1]-2054922799|0,t=(t<<21|t>>>11)+n|0,r+=(n^(t|~e))+f[8]+1873313359|0,r=(r<<6|r>>>26)+t|0,e+=(t^(r|~n))+f[15]-30611744|0,e=(e<<10|e>>>22)+r|0,n+=(r^(e|~t))+f[6]-1560198380|0,n=(n<<15|n>>>17)+e|0,t+=(e^(n|~r))+f[13]+1309151649|0,t=(t<<21|t>>>11)+n|0,r+=(n^(t|~e))+f[4]-145523070|0,r=(r<<6|r>>>26)+t|0,e+=(t^(r|~n))+f[11]-1120210379|0,e=(e<<10|e>>>22)+r|0,n+=(r^(e|~t))+f[2]+718787259|0,n=(n<<15|n>>>17)+e|0,t+=(e^(n|~r))+f[9]-343485551|0,t=(t<<21|t>>>11)+n|0,i[0]=r+i[0]|0,i[1]=t+i[1]|0,i[2]=n+i[2]|0,i[3]=e+i[3]|0}function l(i){var f=[],r;for(r=0;r<64;r+=4)f[r>>2]=i.charCodeAt(r)+(i.charCodeAt(r+1)<<8)+(i.charCodeAt(r+2)<<16)+(i.charCodeAt(r+3)<<24);return f}function b(i){var f=[],r;for(r=0;r<64;r+=4)f[r>>2]=i[r]+(i[r+1]<<8)+(i[r+2]<<16)+(i[r+3]<<24);return f}function _(i){var f=i.length,r=[1732584193,-271733879,-1732584194,271733878],t,n,e,u,a,s;for(t=64;t<=f;t+=64)o(r,l(i.substring(t-64,t)));for(i=i.substring(t-64),n=i.length,e=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],t=0;t>2]|=i.charCodeAt(t)<<(t%4<<3);if(e[t>>2]|=128<<(t%4<<3),t>55)for(o(r,e),t=0;t<16;t+=1)e[t]=0;return u=f*8,u=u.toString(16).match(/(.*?)(.{0,8})$/),a=parseInt(u[2],16),s=parseInt(u[1],16)||0,e[14]=a,e[15]=s,o(r,e),r}function v(i){var f=i.length,r=[1732584193,-271733879,-1732584194,271733878],t,n,e,u,a,s;for(t=64;t<=f;t+=64)o(r,b(i.subarray(t-64,t)));for(i=t-64>2]|=i[t]<<(t%4<<3);if(e[t>>2]|=128<<(t%4<<3),t>55)for(o(r,e),t=0;t<16;t+=1)e[t]=0;return u=f*8,u=u.toString(16).match(/(.*?)(.{0,8})$/),a=parseInt(u[2],16),s=parseInt(u[1],16)||0,e[14]=a,e[15]=s,o(r,e),r}function S(i){var f="",r;for(r=0;r<4;r+=1)f+=g[i>>r*8+4&15]+g[i>>r*8&15];return f}function p(i){var f;for(f=0;fe?new ArrayBuffer(0):(u=e-n,a=new ArrayBuffer(u),s=new Uint8Array(a),d=new Uint8Array(this,n,u),s.set(d),a)}}();function A(i){return/[\u0080-\uFFFF]/.test(i)&&(i=unescape(encodeURIComponent(i))),i}function w(i,f){var r=i.length,t=new ArrayBuffer(r),n=new Uint8Array(t),e;for(e=0;e>2]|=f.charCodeAt(t)<<(t%4<<3);return this._finish(n,r),e=p(this._hash),i&&(e=y(e)),this.reset(),e},h.prototype.reset=function(){return this._buff="",this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},h.prototype.getState=function(){return{buff:this._buff,length:this._length,hash:this._hash.slice()}},h.prototype.setState=function(i){return this._buff=i.buff,this._length=i.length,this._hash=i.hash,this},h.prototype.destroy=function(){delete this._hash,delete this._buff,delete this._length},h.prototype._finish=function(i,f){var r=f,t,n,e;if(i[r>>2]|=128<<(r%4<<3),r>55)for(o(this._hash,i),r=0;r<16;r+=1)i[r]=0;t=this._length*8,t=t.toString(16).match(/(.*?)(.{0,8})$/),n=parseInt(t[2],16),e=parseInt(t[1],16)||0,i[14]=n,i[15]=e,o(this._hash,i)},h.hash=function(i,f){return h.hashBinary(A(i),f)},h.hashBinary=function(i,f){var r=_(i),t=p(r);return f?y(t):t},h.ArrayBuffer=function(){this.reset()},h.ArrayBuffer.prototype.append=function(i){var f=C(this._buff.buffer,i,!0),r=f.length,t;for(this._length+=i.byteLength,t=64;t<=r;t+=64)o(this._hash,b(f.subarray(t-64,t)));return this._buff=t-64>2]|=f[n]<<(n%4<<3);return this._finish(t,r),e=p(this._hash),i&&(e=y(e)),this.reset(),e},h.ArrayBuffer.prototype.reset=function(){return this._buff=new Uint8Array(0),this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},h.ArrayBuffer.prototype.getState=function(){var i=h.prototype.getState.call(this);return i.buff=U(i.buff),i},h.ArrayBuffer.prototype.setState=function(i){return i.buff=w(i.buff,!0),h.prototype.setState.call(this,i)},h.ArrayBuffer.prototype.destroy=h.prototype.destroy,h.ArrayBuffer.prototype._finish=h.prototype._finish,h.ArrayBuffer.hash=function(i,f){var r=v(new Uint8Array(i)),t=p(r);return f?y(t):t},h})})(B);var F=B.exports;export{F as S}; diff --git a/public/exadmin/assets/switch.4512364b.js b/public/exadmin/assets/switch.4512364b.js new file mode 100644 index 0000000..e4b0e7b --- /dev/null +++ b/public/exadmin/assets/switch.4512364b.js @@ -0,0 +1 @@ +import{u as s}from"./use-http.ec808253.js";import"./vue.db505ee4.js";import{c}from"./@vueuse.952f4739.js";import{_ as h}from"./index.b35f53c6.js";import{d as f,aW as k,aR as g,ar as v}from"./@vue.cb43a243.js";import"./@babel.6cd0804c.js";import"./regenerator-runtime.8e24db72.js";import"./vue-demi.5fb18120.js";import"./js-md5.5179c6be.js";import"./vue-router.a08742b9.js";import"./js-cookie.31874410.js";import"./ant-design-vue.6b10f349.js";import"./@ant-design.bcfb08ae.js";import"./@ctrl.fa7cbd46.js";import"./resize-observer-polyfill.8deb1e21.js";import"./vue-types.6e6d84ba.js";import"./dom-align.f1b5d360.js";import"./lodash-es.0ea26897.js";import"./dayjs.38e390ea.js";import"./async-validator.5d25c98b.js";import"./scroll-into-view-if-needed.5191fdbf.js";import"./compute-scroll-into-view.6058b3be.js";import"./lodash.c9cf1bdb.js";import"./spark-md5.2cc5764b.js";import"./axios.e3200588.js";/* empty css */import"./sortablejs.412b554c.js";import"./clipboard.099d05c9.js";import"./markdown-it.80c3a67b.js";import"./entities.0d2c0164.js";import"./uc.micro.981ceb7b.js";import"./mdurl.ef76b4dc.js";import"./linkify-it.92c30060.js";import"./markdown-it-emoji.e3e91710.js";import"./escape-html.e5dfadb9.js";import"./prismjs.c97a8414.js";import"./diacritics.6be19c75.js";import"./markdown-it-container.512a5043.js";import"./markdown-it-anchor.c88e5394.js";import"./markdown-it-attrs.3af5ab50.js";import"./markdown-it-table-of-contents.8a4ce16f.js";import"./@kangc.86f7507c.js";const C=f({name:"ExSwitch",props:{checked:[Number,String,Boolean],url:String,params:{type:Object,default:{}},field:String},emits:["update:checked"],setup(t,e){const{loading:l,http:u}=s(),o=c(t,"checked",e.emit),r=e.attrs.checkedValue===void 0?!0:e.attrs.checkedValue,a=e.attrs.unCheckedValue===void 0?!1:e.attrs.unCheckedValue;o.value===!1?o.value=a:o.value===!0&&(o.value=r);function n(i){let m;i==r?m=a:m=r;let p=t.params;p.data||(p.data={}),p.data[t.field]=i,t.url?u({url:t.url,method:"put",data:p}).then(d=>{e.emit("update:checked",i)}).catch(d=>{o.value=m,e.emit("update:checked",m)}):e.emit("update:checked",i)}return{handleChange:n,loading:l,value:o}}});function V(t,e,l,u,o,r){const a=k("a-switch");return g(),v(a,{checked:t.value,"onUpdate:checked":e[0]||(e[0]=n=>t.value=n),loading:t.loading,onChange:t.handleChange},null,8,["checked","loading","onChange"])}var le=h(C,[["render",V]]);export{le as default}; diff --git a/public/exadmin/assets/tinymce.140b5d43.js b/public/exadmin/assets/tinymce.140b5d43.js new file mode 100644 index 0000000..0ac311e --- /dev/null +++ b/public/exadmin/assets/tinymce.140b5d43.js @@ -0,0 +1,65 @@ +import{c as hB}from"./@babel.6cd0804c.js";var K6={exports:{}};(function(Le){(function(){var qn=function(e){if(e===null)return"null";if(e===void 0)return"undefined";var n=typeof e;return n==="object"&&(Array.prototype.isPrototypeOf(e)||e.constructor&&e.constructor.name==="Array")?"array":n==="object"&&(String.prototype.isPrototypeOf(e)||e.constructor&&e.constructor.name==="String")?"string":n},tn=function(e){return["undefined","boolean","number","string","function","xml","null"].indexOf(e)!==-1},bt=function(e,n){var a=Array.prototype.slice.call(e);return a.sort(n)},ve=function(e,n){return rt(function(a,i){return e.eq(n(a),n(i))})},rt=function(e){return{eq:e}},gn=rt(function(e,n){return e===n}),vn=gn,Ct=function(e){return rt(function(n,a){if(n.length!==a.length)return!1;for(var i=n.length,s=0;s-1},ee=function(e,n){for(var a=0,i=e.length;a=0;a--){var i=e[a];n(i,a)}},pn=function(e,n){for(var a=[],i=[],s=0,f=e.length;s=0&&n=n.length&&e.substr(a,a+n.length)===n},De=function(e,n){return tt(e,n)?W(e,n.length):e},Pe=function(e,n){return e.indexOf(n)!==-1},tt=function(e,n){return le(e,n,0)},$=function(e){return function(n){return n.replace(e,"")}},Z=$(/^\s+|\s+$/g),ye=$(/^\s+/g),ue=$(/\s+$/g),Ge=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,Je=function(e){return function(n){return Pe(n,e)}},yn=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:function(e){return Pe(e,"edge/")&&Pe(e,"chrome")&&Pe(e,"safari")&&Pe(e,"applewebkit")}},{name:"Chrome",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,Ge],search:function(e){return Pe(e,"chrome")&&!Pe(e,"chromeframe")}},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:function(e){return Pe(e,"msie")||Pe(e,"trident")}},{name:"Opera",versionRegexes:[Ge,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:Je("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:Je("firefox")},{name:"Safari",versionRegexes:[Ge,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:function(e){return(Pe(e,"safari")||Pe(e,"mobile/"))&&Pe(e,"applewebkit")}}],Jn=[{name:"Windows",search:Je("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:function(e){return Pe(e,"iphone")||Pe(e,"ipad")},versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:Je("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"OSX",search:Je("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:Je("linux"),versionRegexes:[]},{name:"Solaris",search:Je("sunos"),versionRegexes:[]},{name:"FreeBSD",search:Je("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:Je("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}],$t={browsers:We(yn),oses:We(Jn)},Zn="Edge",K="Chrome",xe="IE",Oe="Opera",at="Firefox",kn="Safari",Dn=function(){return re({current:void 0,version:Vo.unknown()})},re=function(e){var n=e.current,a=e.version,i=function(s){return function(){return n===s}};return{current:n,version:a,isEdge:i(Zn),isChrome:i(K),isIE:i(xe),isOpera:i(Oe),isFirefox:i(at),isSafari:i(kn)}},_e={unknown:Dn,nu:re,edge:We(Zn),chrome:We(K),ie:We(xe),opera:We(Oe),firefox:We(at),safari:We(kn)},ct="Windows",Qt="iOS",Sn="Android",Ut="Linux",vr="OSX",gr="Solaris",Fr="FreeBSD",wa="ChromeOS",j=function(){return Fe({current:void 0,version:Vo.unknown()})},Fe=function(e){var n=e.current,a=e.version,i=function(s){return function(){return n===s}};return{current:n,version:a,isWindows:i(ct),isiOS:i(Qt),isAndroid:i(Sn),isOSX:i(vr),isLinux:i(Ut),isSolaris:i(gr),isFreeBSD:i(Fr),isChromeOS:i(wa)}},Ie={unknown:j,nu:Fe,windows:We(ct),ios:We(Qt),android:We(Sn),linux:We(Ut),osx:We(vr),solaris:We(gr),freebsd:We(Fr),chromeos:We(wa)},Be=function(e,n){var a=$t.browsers(),i=$t.oses(),s=I.detectBrowser(a,e).fold(_e.unknown,_e.nu),f=I.detectOs(i,e).fold(Ie.unknown,Ie.nu),g=yo(f,s,e,n);return{browser:s,os:f,deviceType:g}},qt={detect:Be},mr=function(e){return window.matchMedia(e).matches},sa=Po(function(){return qt.detect(navigator.userAgent,mr)}),la=function(){return sa()},Qr=navigator.userAgent,uo=la(),oa=uo.browser,ra=uo.os,bi=uo.deviceType,Yl=/WebKit/.test(Qr)&&!oa.isEdge(),Jl="FormData"in window&&"FileReader"in window&&"URL"in window&&!!URL.createObjectURL,bd=Qr.indexOf("Windows Phone")!==-1,Ln={opera:oa.isOpera(),webkit:Yl,ie:oa.isIE()||oa.isEdge()?oa.version.major:!1,gecko:oa.isFirefox(),mac:ra.isOSX()||ra.isiOS(),iOS:bi.isiPad()||bi.isiPhone(),android:ra.isAndroid(),contentEditable:!0,transparentSrc:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",caretAfter:!0,range:window.getSelection&&"Range"in window,documentMode:oa.isIE()?document.documentMode||7:10,fileApi:Jl,ceFalse:!0,cacheSuffix:null,container:null,experimentalShadowDom:!1,canHaveCSP:!oa.isIE(),desktop:bi.isDesktop(),windowsPhone:bd,browser:{current:oa.current,version:oa.version,isChrome:oa.isChrome,isEdge:oa.isEdge,isFirefox:oa.isFirefox,isIE:oa.isIE,isOpera:oa.isOpera,isSafari:oa.isSafari},os:{current:ra.current,version:ra.version,isAndroid:ra.isAndroid,isChromeOS:ra.isChromeOS,isFreeBSD:ra.isFreeBSD,isiOS:ra.isiOS,isLinux:ra.isLinux,isOSX:ra.isOSX,isSolaris:ra.isSolaris,isWindows:ra.isWindows},deviceType:{isDesktop:bi.isDesktop,isiPad:bi.isiPad,isiPhone:bi.isiPhone,isPhone:bi.isPhone,isTablet:bi.isTablet,isTouch:bi.isTouch,isWebView:bi.isWebView}},Kf=/^\s*|\s*$/g,Oi=function(e){return e==null?"":(""+e).replace(Kf,"")},Zl=function(e,n){return n?n==="array"&&Ta(e)?!0:typeof e===n:e!==void 0},Ls=function(e,n,a){var i;for(e=e||[],n=n||",",typeof e=="string"&&(e=e.split(n)),a=a||{},i=e.length;i--;)a[e[i]]={};return a},Ba=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},ju=function(e,n,a){var i=this,s,f,g,b=0;e=/^((static) )?([\w.]+)(:([\w.]+))?/.exec(e);var y=e[3].match(/(^|\.)(\w+)$/i)[2],E=i.createNS(e[3].replace(/\.\w+$/,""),a);if(!E[y]){if(e[2]==="static"){E[y]=n,this.onCreate&&this.onCreate(e[2],e[3],E[y]);return}n[y]||(n[y]=te,b=1),E[y]=n[y],i.extend(E[y].prototype,n),e[5]&&(s=i.resolve(e[5]).prototype,f=e[5].match(/\.(\w+)$/i)[1],g=E[y],b?E[y]=function(){return s[f].apply(this,arguments)}:E[y]=function(){return this.parent=s[f],g.apply(this,arguments)},E[y].prototype[y]=E[y],i.each(s,function(P,R){E[y].prototype[R]=s[R]}),i.each(n,function(P,R){s[R]?E[y].prototype[R]=function(){return this.parent=s[R],P.apply(this,arguments)}:R!==y&&(E[y].prototype[R]=P)})),i.each(n.static,function(P,R){E[y][R]=P})}},Uo=function(e){for(var n=[],a=1;a1)throw console.error("HTML does not have a single root node",e),new Error("HTML must have a single root node");return B(i.childNodes[0])},bo=function(e,n){var a=n||document,i=a.createElement(e);return B(i)},fc=function(e,n){var a=n||document,i=a.createTextNode(e);return B(i)},B=function(e){if(e==null)throw new Error("Node cannot be null or undefined");return{dom:e}},oe=function(e,n,a){return z.from(e.dom.elementFromPoint(n,a)).map(B)},L={fromHtml:Xf,fromTag:bo,fromText:fc,fromDom:B,fromPoint:oe},st=function(e,n){var a=[],i=function(f){return a.push(f),n(f)},s=n(e);do s=s.bind(i);while(s.isSome());return a},Ee=function(e,n,a){return(e.compareDocumentPosition(n)&a)!==0},sr=function(e,n){return Ee(e,n,Node.DOCUMENT_POSITION_CONTAINED_BY)},Da=8,nr=9,ai=11,vu=1,Eo=3,_i=function(e,n){var a=e.dom;if(a.nodeType!==vu)return!1;var i=a;if(i.matches!==void 0)return i.matches(n);if(i.msMatchesSelector!==void 0)return i.msMatchesSelector(n);if(i.webkitMatchesSelector!==void 0)return i.webkitMatchesSelector(n);if(i.mozMatchesSelector!==void 0)return i.mozMatchesSelector(n);throw new Error("Browser lacks native selectors")},ms=function(e){return e.nodeType!==vu&&e.nodeType!==nr&&e.nodeType!==ai||e.childElementCount===0},Yf=function(e,n){var a=n===void 0?document:n.dom;return ms(a)?[]:ke(a.querySelectorAll(e),L.fromDom)},du=function(e,n){var a=n===void 0?document:n.dom;return ms(a)?z.none():z.from(a.querySelector(e)).map(L.fromDom)},xr=function(e,n){return e.dom===n.dom},oi=function(e,n){var a=e.dom,i=n.dom;return a===i?!1:a.contains(i)},Nc=function(e,n){return sr(e.dom,n.dom)},ia=function(e,n){return la().browser.isIE()?Nc(e,n):oi(e,n)};typeof window!="undefined"||Function("return this;")();var Na=function(e){var n=e.dom.nodeName;return n.toLowerCase()},Im=function(e){return e.dom.nodeType},Xo=function(e){return function(n){return Im(n)===e}},yd=function(e){return Im(e)===Da||Na(e)==="#comment"},$e=Xo(vu),Ao=Xo(Eo),vc=Xo(nr),dl=Xo(ai),Eu=function(e){return L.fromDom(e.dom.ownerDocument)},fa=function(e){return vc(e)?e:Eu(e)},no=function(e){return L.fromDom(fa(e).dom.documentElement)},Mo=function(e){return L.fromDom(fa(e).dom.defaultView)},ii=function(e){return z.from(e.dom.parentNode).map(L.fromDom)},qu=function(e,n){for(var a=kt(n)?n:hn,i=e.dom,s=[];i.parentNode!==null&&i.parentNode!==void 0;){var f=i.parentNode,g=L.fromDom(f);if(s.push(g),a(g)===!0)break;i=f}return s},Co=function(e){var n=function(a){return St(a,function(i){return!xr(e,i)})};return ii(e).map(Yo).map(n).getOr([])},Zt=function(e){return z.from(e.dom.previousSibling).map(L.fromDom)},gs=function(e){return z.from(e.dom.nextSibling).map(L.fromDom)},hs=function(e){return Kt(st(e,Zt))},ml=function(e){return st(e,gs)},Yo=function(e){return ke(e.dom.childNodes,L.fromDom)},Oo=function(e,n){var a=e.dom.childNodes;return z.from(a[n]).map(L.fromDom)},_n=function(e){return Oo(e,0)},ps=function(e){return Oo(e,e.dom.childNodes.length-1)},zm=function(e){return e.dom.childNodes.length},Hs=function(e){var n=e.dom.head;if(n==null)throw new Error("Head is not available yet");return L.fromDom(n)},Gu=function(e){return dl(e)&&ut(e.dom.host)},Lm=kt(Element.prototype.attachShadow)&&kt(Node.prototype.getRootNode),bs=We(Lm),Au=Lm?function(e){return L.fromDom(e.dom.getRootNode())}:fa,wd=function(e){return Gu(e)?e:Hs(fa(e))},Hm=function(e){var n=Au(e);return Gu(n)?z.some(n):z.none()},Cd=function(e){return L.fromDom(e.dom.host)},Ql=function(e){if(bs()&&ut(e.target)){var n=L.fromDom(e.target);if($e(n)&&Vm(n)&&e.composed&&e.composedPath){var a=e.composedPath();if(a)return lt(a)}}return z.from(e.target)},Vm=function(e){return ut(e.dom.shadowRoot)},Ya=function(e,n){var a=ii(e);a.each(function(i){i.dom.insertBefore(n.dom,e.dom)})},Vs=function(e,n){var a=gs(e);a.fold(function(){var i=ii(e);i.each(function(s){Jo(s,n)})},function(i){Ya(i,n)})},Oh=function(e,n){var a=_n(e);a.fold(function(){Jo(e,n)},function(i){e.dom.insertBefore(n.dom,i.dom)})},Jo=function(e,n){e.dom.appendChild(n.dom)},dc=function(e,n){Ya(e,n),Jo(n,e)},ys=function(e,n){he(n,function(a){Ya(e,a)})},io=function(e,n){he(n,function(a){Jo(e,a)})},ef=function(e){e.dom.textContent="",he(Yo(e),function(n){Zo(n)})},Zo=function(e){var n=e.dom;n.parentNode!==null&&n.parentNode.removeChild(n)},xd=function(e){var n=Yo(e);n.length>0&&ys(e,n),Zo(e)},gl=function(e){var n=Ao(e)?e.dom.parentNode:e.dom;if(n==null||n.ownerDocument===null)return!1;var a=n.ownerDocument;return Hm(L.fromDom(n)).fold(function(){return a.body.contains(n)},q(gl,Cd))},Jf=function(e,n){var a=function(i,s){return Jf(e+i,n+s)};return{left:e,top:n,translate:a}},hl=Jf,Sd=function(e){var n=e.getBoundingClientRect();return hl(n.left,n.top)},Mc=function(e,n){return e!==void 0?e:n!==void 0?n:0},Zf=function(e){var n=e.dom.ownerDocument,a=n.body,i=n.defaultView,s=n.documentElement;if(a===e.dom)return hl(a.offsetLeft,a.offsetTop);var f=Mc(i==null?void 0:i.pageYOffset,s.scrollTop),g=Mc(i==null?void 0:i.pageXOffset,s.scrollLeft),b=Mc(s.clientTop,a.clientTop),y=Mc(s.clientLeft,a.clientLeft);return Qf(e).translate(g-y,f-b)},Qf=function(e){var n=e.dom,a=n.ownerDocument,i=a.body;return i===n?hl(i.offsetLeft,i.offsetTop):gl(e)?Sd(n):hl(0,0)},ev=function(e){var n=e!==void 0?e.dom:document,a=n.body.scrollLeft||n.documentElement.scrollLeft,i=n.body.scrollTop||n.documentElement.scrollTop;return hl(a,i)},Ou=function(e,n,a){var i=a!==void 0?a.dom:document,s=i.defaultView;s&&s.scrollTo(e,n)},Wi=function(e,n){var a=la().browser.isSafari();a&&kt(e.dom.scrollIntoViewIfNeeded)?e.dom.scrollIntoViewIfNeeded(!1):e.dom.scrollIntoView(n)},Du=function(e){var n=e===void 0?window:e;return z.from(n.visualViewport)},Bi=function(e,n,a,i){return{x:e,y:n,width:a,height:i,right:e+a,bottom:n+i}},tf=function(e){var n=e===void 0?window:e,a=n.document,i=ev(L.fromDom(a));return Du(n).fold(function(){var s=n.document.documentElement,f=s.clientWidth,g=s.clientHeight;return Bi(i.left,i.top,f,g)},function(s){return Bi(Math.max(s.pageLeft,i.left),Math.max(s.pageTop,i.top),s.width,s.height)})},Fc=function(e){return function(n){return!!n&&n.nodeType===e}},ws=function(e){return!!e&&!Object.getPrototypeOf(e)},Hr=Fc(1),Ku=function(e){var n=e.map(function(a){return a.toLowerCase()});return function(a){if(a&&a.nodeName){var i=a.nodeName.toLowerCase();return Ue(n,i)}return!1}},pl=function(e,n){var a=n.toLowerCase().split(" ");return function(i){var s,f;if(Hr(i))for(s=0;s0})},rf=function(e){var n={},a=e.dom;if(ji(a))for(var i=0;i1)for(var nn=1;nn=0&&(Q._idleTimeoutId=setTimeout(function(){Q._onTimeout&&Q._onTimeout()},G))},g.setImmediate=typeof b=="function"?b:function(Q){var G=X++,me=arguments.length<2?!1:R.call(arguments,1);return N[G]=!0,E(function(){N[G]&&(me?Q.apply(null,me):Q.call(null),g.clearImmediate(G))}),G},g.clearImmediate=typeof y=="function"?y:function(Q){delete N[Q]}}).call(this,s("timers").setImmediate,s("timers").clearImmediate)},{"process/browser.js":1,timers:3}],4:[function(s,f,g){var b=s("promise-polyfill"),y=function(){return typeof window!="undefined"?window:Function("return this;")()}();f.exports={boltExport:y.Promise||b}},{"promise-polyfill":2}]},{},[4])(4)})})(void 0,wl,Cl,void 0);var Wm=Cl.exports.boltExport,Od=function(e){var n=z.none(),a=[],i=function(E){return Od(function(P){s(function(R){P(E(R))})})},s=function(E){g()?y(E):a.push(E)},f=function(E){g()||(n=z.some(E),b(a),a=[])},g=function(){return n.isSome()},b=function(E){he(E,y)},y=function(E){n.each(function(P){setTimeout(function(){E(P)},0)})};return e(f),{get:s,map:i,isReady:g}},Qx=function(e){return Od(function(n){n(e)})},Dd={nu:Od,pure:Qx},jm=function(e){setTimeout(function(){throw e},0)},$c=function(e){var n=function(y){e().then(y,jm)},a=function(y){return $c(function(){return e().then(y)})},i=function(y){return $c(function(){return e().then(function(E){return y(E).toPromise()})})},s=function(y){return $c(function(){return e().then(function(){return y.toPromise()})})},f=function(){return Dd.nu(n)},g=function(){var y=null;return $c(function(){return y===null&&(y=e()),y})},b=e;return{map:a,bind:i,anonBind:s,toLazy:f,toCached:g,toPromise:b,get:n}},H1=function(e){return $c(function(){return new Wm(e)})},eS=function(e){return $c(function(){return Wm.resolve(e)})},xo={nu:H1,pure:eS},Jy=function(e,n){return n(function(a){var i=[],s=0,f=function(g){return function(b){i[g]=b,s++,s>=e.length&&a(i)}};e.length===0?a([]):he(e,function(g,b){g.get(f(b))})})},Ic=function(e){return Jy(e,xo.nu)},af=function(e){var n=function(N){return e===N},a=function(N){return af(e)},i=function(N){return af(e)},s=function(N){return af(N(e))},f=function(N){return af(e)},g=function(N){N(e)},b=function(N){return N(e)},y=function(N,X){return X(e)},E=function(N){return N(e)},P=function(N){return N(e)},R=function(){return z.some(e)};return{is:n,isValue:an,isError:hn,getOr:We(e),getOrThunk:We(e),getOrDie:We(e),or:a,orThunk:i,fold:y,map:s,mapError:f,each:g,bind:b,exists:E,forall:P,toOptional:R}},xl=function(e){var n=function(E){return E()},a=function(){return S(String(e))()},i=function(E){return E},s=function(E){return E()},f=function(E){return xl(e)},g=function(E){return xl(E(e))},b=function(E){return xl(e)},y=function(E,P){return E(e)};return{is:hn,isValue:hn,isError:an,getOr:dn,getOrThunk:n,getOrDie:a,or:i,orThunk:s,fold:y,map:f,mapError:g,each:te,bind:b,exists:hn,forall:an,toOptional:z.none}},zc=function(e,n){return e.fold(function(){return xl(n)},af)},ru={value:af,error:xl,fromOption:zc},qm=function(e){if(!mt(e))throw new Error("cases must be an array");if(e.length===0)throw new Error("there must be at least one case");var n=[],a={};return he(e,function(i,s){var f=Pr(i);if(f.length!==1)throw new Error("one and only one name per case");var g=f[0],b=i[g];if(a[g]!==void 0)throw new Error("duplicate key detected:"+g);if(g==="cata")throw new Error("cannot have a case named cata (sorry)");if(!mt(b))throw new Error("case arguments must be an array");n.push(g),a[g]=function(){for(var y=[],E=0;E0?fe(Te.fail.map(Zy)):me(Te.pass.map(Zy))})},J=function(G){var me=dt._addCacheSuffix(G);Nr(i,me).each(function(fe){var be=--fe.count;be===0&&(delete i[me],E(fe.id))})},Q=function(G){he(G,function(me){J(me)})};return{load:R,loadAll:X,unload:J,unloadAll:Q,_setReferrerPolicy:b}},av=function(){var e=new WeakMap,n=function(a,i){var s=Au(a),f=s.dom;return z.from(e.get(f)).getOrThunk(function(){var g=Sr(f,i);return e.set(f,g),g})};return{forElement:n}},Xm=av(),jo=function(){function e(n,a){this.node=n,this.rootNode=a,this.current=this.current.bind(this),this.next=this.next.bind(this),this.prev=this.prev.bind(this),this.prev2=this.prev2.bind(this)}return e.prototype.current=function(){return this.node},e.prototype.next=function(n){return this.node=this.findSibling(this.node,"firstChild","nextSibling",n),this.node},e.prototype.prev=function(n){return this.node=this.findSibling(this.node,"lastChild","previousSibling",n),this.node},e.prototype.prev2=function(n){return this.node=this.findPreviousNode(this.node,"lastChild","previousSibling",n),this.node},e.prototype.findSibling=function(n,a,i,s){var f,g;if(n){if(!s&&n[a])return n[a];if(n!==this.rootNode){if(f=n[i],f)return f;for(g=n.parentNode;g&&g!==this.rootNode;g=g.parentNode)if(f=g[i],f)return f}}},e.prototype.findPreviousNode=function(n,a,i,s){var f,g,b;if(n){if(f=n[i],this.rootNode&&f===this.rootNode)return;if(f){if(!s){for(b=f[a];b;b=b[a])if(!b[a])return b}return f}if(g=n.parentNode,g&&g!==this.rootNode)return g}},e}(),V1=["article","aside","details","div","dt","figcaption","footer","form","fieldset","header","hgroup","html","main","nav","section","summary","body","p","dl","multicol","dd","figure","address","center","blockquote","h1","h2","h3","h4","h5","h6","listing","xmp","pre","plaintext","menu","dir","ul","ol","li","hr","table","tbody","thead","tfoot","th","tr","td","caption"],ma=["td","th"],Nh=["thead","tbody","tfoot"],U1=["h1","h2","h3","h4","h5","h6","p","div","address","pre","form","blockquote","center","dir","fieldset","header","footer","article","section","hgroup","aside","nav","figure"],W1=["h1","h2","h3","h4","h5","h6"],_t=["li","dd","dt"],j1=["ul","ol","dl"],tw=["pre","script","textarea","style"],gc=function(e){var n;return function(a){return n=n||Nn(e,an),n.hasOwnProperty(Na(a))}},nw=gc(W1),Gi=gc(V1),Mh=function(e){return Na(e)==="table"},Lc=function(e){return $e(e)&&!Gi(e)},Yu=function(e){return $e(e)&&Na(e)==="br"},ov=gc(U1),so=gc(j1),au=gc(_t),nS=gc(Nh),Ss=gc(ma),Ju=gc(tw),rw=function(e,n,a){return uf(e,n,a).isSome()},iv="\uFEFF",ui="\xA0",uv=function(e){return e===iv},q1=function(e){return e.replace(/\uFEFF/g,"")},Pi=iv,Ts=uv,ks=q1,G1=Hr,hc=M,wi=function(e){return hc(e)&&(e=e.parentNode),G1(e)&&e.hasAttribute("data-mce-caret")},Bd=function(e){return hc(e)&&Ts(e.data)},gu=function(e){return wi(e)||Bd(e)},Ym=function(e){return e.firstChild!==e.lastChild||!Dt(e.firstChild)},pc=function(e,n){var a,i=e.ownerDocument,s=i.createTextNode(Pi),f=e.parentNode;if(n){if(a=e.previousSibling,hc(a)){if(gu(a))return a;if(qo(a))return a.splitText(a.data.length-1)}f.insertBefore(s,e)}else{if(a=e.nextSibling,hc(a)){if(gu(a))return a;if(Fh(a))return a.splitText(1),a}e.nextSibling?f.insertBefore(s,e.nextSibling):f.appendChild(s)}return s},Jm=function(e){var n=e.container();return M(n)?n.data.charAt(e.offset())===Pi||e.isAtStart()&&Bd(n.previousSibling):!1},K1=function(e){var n=e.container();return M(n)?n.data.charAt(e.offset()-1)===Pi||e.isAtEnd()&&Bd(n.nextSibling):!1},X1=function(){var e=document.createElement("br");return e.setAttribute("data-mce-bogus","1"),e},Y1=function(e,n,a){var i=n.ownerDocument,s=i.createElement(e);s.setAttribute("data-mce-caret",a?"before":"after"),s.setAttribute("data-mce-bogus","all"),s.appendChild(X1());var f=n.parentNode;return a?f.insertBefore(s,n):n.nextSibling?f.insertBefore(s,n.nextSibling):f.appendChild(s),s},Fh=function(e){return hc(e)&&e.data[0]===Pi},qo=function(e){return hc(e)&&e.data[e.data.length-1]===Pi},$h=function(e){var n=e.getElementsByTagName("br"),a=n[n.length-1];bl(a)&&a.parentNode.removeChild(a)},J1=function(e){return e&&e.hasAttribute("data-mce-caret")?($h(e),e.removeAttribute("data-mce-caret"),e.removeAttribute("data-mce-bogus"),e.removeAttribute("style"),e.removeAttribute("_moz_abspos"),e):null},aw=function(e){return wi(e.startContainer)},Ih=Rr,zh=_r,Z1=Dt,Lh=M,ow=Ku(["script","style","textarea"]),Q1=Ku(["img","input","textarea","hr","iframe","video","audio","object","embed"]),_u=Ku(["table"]),rS=gu,Hc=function(e){return rS(e)?!1:Lh(e)?!ow(e.parentNode):Q1(e)||Z1(e)||_u(e)||Zm(e)},iw=function(e){return Hr(e)&&e.getAttribute("unselectable")==="true"},Zm=function(e){return iw(e)===!1&&zh(e)},sf=function(e,n){for(e=e.parentNode;e&&e!==n;e=e.parentNode){if(Zm(e))return!1;if(Ih(e))return!0}return!0},sv=function(e){return Zm(e)?Rn(or(e.getElementsByTagName("*")),function(n,a){return n||Ih(a)},!1)!==!0:!1},uw=function(e){return Q1(e)||sv(e)},Rd=function(e,n){return Hc(e)&&sf(e,n)},Qm=/^[ \t\r\n]*$/,cv=function(e){return Qm.test(e)},sw=function(e,n){var a=L.fromDom(n),i=L.fromDom(e);return rw(i,"pre,code",Xe(xr,a))},ga=function(e,n){return M(e)&&cv(e.data)&&sw(e,n)===!1},cw=function(e){return Hr(e)&&e.nodeName==="A"&&!e.hasAttribute("href")&&(e.hasAttribute("name")||e.hasAttribute("id"))},Ci=function(e,n){return Hc(e)&&ga(e,n)===!1||cw(e)||lv(e)},lv=Td("data-mce-bookmark"),lw=Td("data-mce-bogus"),Bu=I1("data-mce-bogus","all"),aS=function(e,n){var a,i=0;if(Ci(e,e))return!1;if(a=e.firstChild,!a)return!0;var s=new jo(a,e);do{if(n){if(Bu(a)){a=s.next(!0);continue}if(lw(a)){a=s.next();continue}}if(Dt(a)){i++,a=s.next();continue}if(Ci(a,e))return!1;a=s.next()}while(a);return i<=1},Zu=function(e,n){return n===void 0&&(n=!0),aS(e.dom,n)},oS=function(e){return e.nodeName.toLowerCase()==="span"},El=function(e,n){return ut(e)&&(Ci(e,n)||Lc(L.fromDom(e)))},iS=function(e,n){var a=new jo(e,n).prev(!1),i=new jo(e,n).next(!1),s=yr(a)||El(a,n),f=yr(i)||El(i,n);return s&&f},eb=function(e){return oS(e)&&e.getAttribute("data-mce-type")==="bookmark"},fw=function(e,n){return M(e)&&e.data.length>0&&iS(e,n)},vw=function(e){return Hr(e)?e.childNodes.length>0:!1},Qn=function(e){return He(e)||ge(e)},tb=function(e,n,a){var i=a||n;if(Hr(n)&&eb(n))return n;for(var s=n.childNodes,f=s.length-1;f>=0;f--)tb(e,s[f],i);if(Hr(n)){var g=n.childNodes;g.length===1&&eb(g[0])&&n.parentNode.insertBefore(g[0],n)}return!Qn(n)&&!Ci(n,i)&&!vw(n)&&!fw(n,i)&&e.remove(n),n},dw=dt.makeMap,Hh=/[&<>\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,fv=/[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,nb=/[<>&\"\']/g,Vh=/&#([a-z0-9]+);?|&([a-z0-9]+);/gi,eg={128:"\u20AC",130:"\u201A",131:"\u0192",132:"\u201E",133:"\u2026",134:"\u2020",135:"\u2021",136:"\u02C6",137:"\u2030",138:"\u0160",139:"\u2039",140:"\u0152",142:"\u017D",145:"\u2018",146:"\u2019",147:"\u201C",148:"\u201D",149:"\u2022",150:"\u2013",151:"\u2014",152:"\u02DC",153:"\u2122",154:"\u0161",155:"\u203A",156:"\u0153",158:"\u017E",159:"\u0178"},bc={'"':""","'":"'","<":"<",">":">","&":"&","`":"`"},rb={"<":"<",">":">","&":"&",""":'"',"'":"'"},tg=function(e){var n=L.fromTag("div").dom;return n.innerHTML=e,n.textContent||n.innerText||e},mw=function(e,n){var a,i,s,f={};if(e){for(e=e.split(","),n=n||10,a=0;a1?"&#"+((a.charCodeAt(0)-55296)*1024+(a.charCodeAt(1)-56320)+65536)+";":bc[a]||"&#"+a.charCodeAt(0)+";"})},Pd=function(e,n,a){return a=a||ab,e.replace(n?Hh:fv,function(i){return bc[i]||a[i]||i})},gw=function(e,n){var a=mw(n)||ab,i=function(g,b){return g.replace(b?Hh:fv,function(y){return bc[y]!==void 0?bc[y]:a[y]!==void 0?a[y]:y.length>1?"&#"+((y.charCodeAt(0)-55296)*1024+(y.charCodeAt(1)-56320)+65536)+";":"&#"+y.charCodeAt(0)+";"})},s=function(g,b){return Pd(g,b,a)},f=dw(e.replace(/\+/g,","));return f.named&&f.numeric?i:f.named?n?s:Pd:f.numeric?ob:hu},uS=function(e){return e.replace(Vh,function(n,a){return a?(a.charAt(0).toLowerCase()==="x"?a=parseInt(a.substr(1),16):a=parseInt(a,10),a>65535?(a-=65536,String.fromCharCode(55296+(a>>10),56320+(a&1023))):eg[a]||String.fromCharCode(a)):rb[n]||ab[n]||tg(n)})},Ru={encodeRaw:hu,encodeAllRaw:Uh,encodeNumeric:ob,encodeNamed:Pd,getEncodeFunc:gw,decode:uS},Ki={},Es={},Nd=dt.makeMap,ou=dt.each,ib=dt.extend,ub=dt.explode,Ws=dt.inArray,xi=function(e,n){return e=dt.trim(e),e?e.split(n||" "):[]},cf=function(e){var n={},a,i,s,f,g,b,y=function(P,R,N){var X,J,Q,G=function(fe,be){var Te={},Ve,Tt;for(Ve=0,Tt=fe.length;Ve
  • ",c=r.anchor;o&&o.transformLink&&(c=o.transformLink(c));let l=r.text?o.format(r.text,n,c):null;return e+=c?`${l}`:l||"",e+(r.children.length>0?p(r,o,n):"")+"