yxuse 3.0.68 → 3.0.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/lib/api.cjs.js +0 -1
  2. package/lib/api.es.js +0 -1
  3. package/lib/app.cjs.js +0 -1
  4. package/lib/app.es.js +0 -1
  5. package/lib/components.cjs.js +0 -1
  6. package/lib/components.es.js +0 -1
  7. package/lib/directives.cjs.js +0 -1
  8. package/lib/directives.es.js +0 -1
  9. package/lib/hooks.cjs.js +0 -1
  10. package/lib/hooks.es.js +0 -1
  11. package/lib/index.cjs.js +0 -1
  12. package/lib/index.cjs10.js +0 -1
  13. package/lib/index.cjs11.js +1 -2
  14. package/lib/index.cjs12.js +1 -2
  15. package/lib/index.cjs13.js +1 -2
  16. package/lib/index.cjs14.js +0 -1
  17. package/lib/index.cjs2.js +1 -2
  18. package/lib/index.cjs3.js +0 -1
  19. package/lib/index.cjs4.js +0 -1
  20. package/lib/index.cjs5.js +1 -2
  21. package/lib/index.cjs5.js.gz +0 -0
  22. package/lib/index.cjs6.js +1 -2
  23. package/lib/index.cjs6.js.gz +0 -0
  24. package/lib/index.cjs7.js +0 -1
  25. package/lib/index.cjs8.js +0 -1
  26. package/lib/index.cjs9.js +0 -1
  27. package/lib/index.es.js +0 -1
  28. package/lib/index.es10.js +0 -1
  29. package/lib/index.es11.js +1 -2
  30. package/lib/index.es12.js +1 -2
  31. package/lib/index.es12.js.gz +0 -0
  32. package/lib/index.es13.js +1 -2
  33. package/lib/index.es14.js +0 -1
  34. package/lib/index.es2.js +1 -2
  35. package/lib/index.es3.js +0 -1
  36. package/lib/index.es4.js +0 -1
  37. package/lib/index.es5.js +8 -2
  38. package/lib/index.es5.js.gz +0 -0
  39. package/lib/index.es6.js +8 -6
  40. package/lib/index.es6.js.gz +0 -0
  41. package/lib/index.es7.js +0 -1
  42. package/lib/index.es8.js +0 -1
  43. package/lib/index.es9.js +0 -1
  44. package/lib/theme.cjs.js +1 -2
  45. package/lib/theme.es.js +5 -2
  46. package/lib/translate.cjs.js +1 -2
  47. package/lib/translate.es.js +7 -2
  48. package/lib/utils.cjs.js +0 -1
  49. package/lib/utils.es.js +0 -1
  50. package/lib/vendor-axios.cjs.js +1 -0
  51. package/lib/vendor-axios.cjs.js.gz +0 -0
  52. package/lib/vendor-axios.es.js +2378 -0
  53. package/lib/vendor-axios.es.js.gz +0 -0
  54. package/lib/vendor-dayjs.cjs.js +1 -0
  55. package/lib/vendor-dayjs.es.js +294 -0
  56. package/lib/vendor-dayjs.es.js.gz +0 -0
  57. package/lib/vendor-file-saver.cjs.js +1 -0
  58. package/lib/vendor-file-saver.es.js +77 -0
  59. package/lib/vendor-localforage.cjs.js +7 -0
  60. package/lib/vendor-localforage.cjs.js.gz +0 -0
  61. package/lib/vendor-localforage.es.js +2139 -0
  62. package/lib/vendor-localforage.es.js.gz +0 -0
  63. package/lib/vendor-lodash.cjs.js +9 -0
  64. package/lib/vendor-lodash.cjs.js.gz +0 -0
  65. package/lib/vendor-lodash.es.js +5493 -0
  66. package/lib/vendor-lodash.es.js.gz +0 -0
  67. package/lib/vendor-mqtt.cjs.js +1 -0
  68. package/lib/vendor-mqtt.cjs.js.gz +0 -0
  69. package/lib/vendor-mqtt.es.js +6822 -0
  70. package/lib/vendor-mqtt.es.js.gz +0 -0
  71. package/lib/vendor-sortablejs.cjs.js +7 -0
  72. package/lib/vendor-sortablejs.cjs.js.gz +0 -0
  73. package/lib/vendor-sortablejs.es.js +2160 -0
  74. package/lib/vendor-sortablejs.es.js.gz +0 -0
  75. package/lib/yxIcon.cjs.js +0 -1
  76. package/lib/yxIcon.es.js +0 -1
  77. package/lib/yxi18n.cjs.js +0 -1
  78. package/lib/yxi18n.es.js +0 -1
  79. package/lib/yxuse.css +1 -1
  80. package/lib/yxuse.css.gz +0 -0
  81. package/package.json +1 -1
  82. package/lib/.pnpm.cjs.js +0 -26
  83. package/lib/.pnpm.cjs.js.gz +0 -0
  84. package/lib/.pnpm.cjs.js.map +0 -1
  85. package/lib/.pnpm.es.js +0 -54020
  86. package/lib/.pnpm.es.js.gz +0 -0
  87. package/lib/.pnpm.es.js.map +0 -1
  88. package/lib/api.cjs.js.map +0 -1
  89. package/lib/api.es.js.map +0 -1
  90. package/lib/app.cjs.js.map +0 -1
  91. package/lib/app.es.js.map +0 -1
  92. package/lib/components.cjs.js.map +0 -1
  93. package/lib/components.es.js.map +0 -1
  94. package/lib/directives.cjs.js.map +0 -1
  95. package/lib/directives.es.js.map +0 -1
  96. package/lib/hooks.cjs.js.map +0 -1
  97. package/lib/hooks.es.js.map +0 -1
  98. package/lib/index.cjs.js.map +0 -1
  99. package/lib/index.cjs10.js.map +0 -1
  100. package/lib/index.cjs11.js.map +0 -1
  101. package/lib/index.cjs12.js.map +0 -1
  102. package/lib/index.cjs13.js.map +0 -1
  103. package/lib/index.cjs14.js.map +0 -1
  104. package/lib/index.cjs2.js.map +0 -1
  105. package/lib/index.cjs3.js.map +0 -1
  106. package/lib/index.cjs4.js.map +0 -1
  107. package/lib/index.cjs5.js.map +0 -1
  108. package/lib/index.cjs6.js.map +0 -1
  109. package/lib/index.cjs7.js.map +0 -1
  110. package/lib/index.cjs8.js.map +0 -1
  111. package/lib/index.cjs9.js.map +0 -1
  112. package/lib/index.es.js.map +0 -1
  113. package/lib/index.es10.js.map +0 -1
  114. package/lib/index.es11.js.map +0 -1
  115. package/lib/index.es12.js.map +0 -1
  116. package/lib/index.es13.js.map +0 -1
  117. package/lib/index.es14.js.map +0 -1
  118. package/lib/index.es2.js.map +0 -1
  119. package/lib/index.es3.js.map +0 -1
  120. package/lib/index.es4.js.map +0 -1
  121. package/lib/index.es5.js.map +0 -1
  122. package/lib/index.es6.js.map +0 -1
  123. package/lib/index.es7.js.map +0 -1
  124. package/lib/index.es8.js.map +0 -1
  125. package/lib/index.es9.js.map +0 -1
  126. package/lib/theme.cjs.js.map +0 -1
  127. package/lib/theme.es.js.map +0 -1
  128. package/lib/translate.cjs.js.map +0 -1
  129. package/lib/translate.es.js.map +0 -1
  130. package/lib/utils.cjs.js.map +0 -1
  131. package/lib/utils.es.js.map +0 -1
  132. package/lib/yxIcon.cjs.js.map +0 -1
  133. package/lib/yxIcon.es.js.map +0 -1
  134. package/lib/yxi18n.cjs.js.map +0 -1
  135. package/lib/yxi18n.es.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
package/lib/api.es.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
package/lib/app.es.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"app.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"components.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"components.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"directives.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"directives.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hooks.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hooks.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../packages/index.ts"],"sourcesContent":["/*\n * @Author: WangXin\n * @Date: 2023-08-16 15:38:34\n * @LastEditors: WangXin\n * @LastEditTime: 2025-05-08 15:48:37\n * @FilePath: /yxuse/packages/index.ts\n * @Description:\n *\n * Copyright (c) 2023 by YuXing, All Rights Reserved.\n */\nexport * as utils from \"./utils\";\n\n// export * as icons from \"./icons\";\nexport * as yxIcon from \"./yxIcon\";\nexport * as api from \"./api\";\nexport * as theme from \"./theme\";\nexport * as components from \"./components\";\nexport * as translate from \"./translate\";\nexport * as yxi18n from \"./yxi18n\";\nexport * from \"./directives\";\nexport * from \"./hooks\";\nexport * from \"./app\";\nexport * from \"./bc\";\n//导出类型\nexport * from \"./components/type\";\nimport * as utils from \"./utils\";\n\n// import * as icons from \"./icons\";\nimport * as api from \"./api\";\nimport * as theme from \"./theme\";\nimport * as components from \"./components\";\nimport * as directives from \"./directives\";\nimport * as translate from \"./translate\";\nimport * as yxi18n from \"./yxi18n\";\nimport * as yxHooks from \"./hooks\";\nimport * as yxIcon from \"./yxIcon\";\nimport * as app from \"./app\";\nimport * as BC from \"./bc\";\nexport default {\n\tutils,\n\tapi,\n\tapp,\n\ttheme,\n\tcomponents,\n\tdirectives,\n\tBC,\n\ttranslate,\n\tyxi18n,\n\tyxHooks,\n\tyxIcon\n};\n"],"names":["index","utils","api","app","theme","components","directives","BC","translate","yxi18n","yxHooks","yxIcon"],"mappings":"sZAsCeA,EAAA,CACdC,MAAAA,EAAAA,OACAC,IAAAA,EAAAA,KAAAC,IACAA,EAAAA,IACAC,MAAAA,EAAAA,OACAC,WAAAA,EAAAA,YAAAC,WACAA,EAAAA,WAAAC,GACAA,EAAAA,GACAC,UAAAA,EAAAA,WACAC,OAAAA,EAAAA,QAAAC,QACAA,EAAAA,QACAC,OAAAA,EAAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs10.js","sources":["../packages/app/index.ts"],"sourcesContent":["/*\n * @Author: WangXin\n * @Date: 2024-09-02 14:03:25\n * @LastEditors: WangXin\n * @LastEditTime: 2024-09-02 15:40:00\n * @FilePath: /yxuse/packages/app/index.ts\n * @Description:\n *\n * Copyright (c) ${2024} by YuXing, All Rights Reserved.\n */\n// export const installWebApp = async (systemKey?: string, lang?: string, callback?: Function) => {\n// \twindow.__YUXING_APP_ENVIRONMENT__ = true;\n// \tconsole.log(\"当前的主题是\", getCurThemeCssVar(), getCurTheme());\n// \tinstallCssVarInSystemTheme();\n// \tconst langStr = await getLang();\n// \tawait initTranslate({ to: lang ? langStr : lang || \"zh\", systemKey });\n// \t//注册BC\n// \tBC.onmessage = event => {\n// \t\tconst data = JSON.parse(event.data);\n// \t\tif (data.type === \"theme\") {\n// \t\t\tconsole.log(\"监听到其他系统切换主题收到的信息\", data.data);\n// \t\t\tconst { themeCssVar, themeId, themeUrl } = data.data;\n// \t\t\t// setCssVar(themeUrl);\n// \t\t\tsaveCssVar({ themeCssVar, themeId });\n// \t\t\tinstallCssVarInSystemTheme(themeCssVar);\n// \t\t}\n// \t\tif (data.type === \"lang\") {\n// \t\t\tconsole.log(\"监听到其他系统切换语言\");\n// \t\t\tlocation.reload();\n// \t\t}\n// \t};\n// \tcallback && callback();\n// };\n\nexport const isWebApp = (key = \"isWebApp\") => {\n\tconst url = new URLSearchParams(window.location.href.split(\"?\")[1]);\n\tconst params = Object.fromEntries(url.entries());\n\treturn params[key] && +params[key] ? true : false;\n};\n"],"names":["isWebApp","key","url","URLSearchParams","window","location","href","split","params","Object","fromEntries","entries"],"mappings":"aAkCa,MAAAA,EAAW,CAACC,EAAM,cACxB,MAAAC,EAAM,IAAIC,gBAAgBC,OAAOC,SAASC,KAAKC,MAAM,KAAK,IAC1DC,EAASC,OAAOC,YAAYR,EAAIS,WACtC,SAAOH,EAAOP,MAASO,EAAOP,GAAc"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs11.js","sources":["../packages/hooks/useTime/index.ts"],"sourcesContent":["/*\n * @Author: WangXin\n * @Date: 2024-04-07 09:50:34\n * @LastEditors: WangXin\n * @LastEditTime: 2025-04-25 14:50:40\n * @FilePath: /yxuse/packages/hooks/useTime/index.ts\n * @Description:\n *\n * Copyright (c) 2024 by YuXing, All Rights Reserved.\n */\nimport { ref, reactive, computed } from \"vue\";\nimport dayjs from \"dayjs\";\nconst time = ref(\"\");\nlet _timer: any;\nexport const useTime = () => {\n\tconst timedExecution = () => {\n\t\t_timer = setTimeout(() => {\n\t\t\ttime.value = dayjs().format(\"YYYY-MM-DD HH:mm:ss\");\n\t\t\t_timer && clearTimeout(_timer);\n\t\t\ttimedExecution();\n\t\t}, 1000);\n\t};\n\ttimedExecution();\n\treturn { time };\n};\n"],"names":["time","ref","_timer","timedExecution","setTimeout","value","dayjs","format","clearTimeout"],"mappings":"gEAYMA,EAAOC,MAAI,IACjB,IAAIC,kBACmB,KACtB,MAAMC,EAAiB,KACtBD,EAASE,YAAW,KACnBJ,EAAKK,MAAQC,EAAAA,QAAQC,OAAO,uBAC5BL,GAAUM,aAAaN,GACRC,GAAA,GACb,IAAI,EAGR,OADeA,IACR,CAAEH,OAAK"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs12.js","sources":["../packages/config/index.ts","../packages/api/auth/index.ts","../packages/api/modules/auth/index.ts","../packages/utils/http/config.ts","../packages/utils/http/index.ts"],"sourcesContent":["/*\n * @Author: WangXin\n * @Date: 2023-09-08 10:32:22\n * @LastEditors: WangXin\n * @LastEditTime: 2024-09-24 15:15:41\n * @FilePath: /yxuse/packages/config/index.ts\n * @Description:\n *\n * Copyright (c) 2023 by YuXing, All Rights Reserved.\n */\ntype URL = Record<string, string>;\ntype BASE = Record<string, URL>;\nexport const SYSTEM_HOME_PATH = \"/cloud\";\nexport const ttc: URL = {\n\tLOGIN_URL: `${window.location.origin}/ttc/cloud/#/login`,\n\tHOME_URL: `${window.location.origin}/ttc/cloud/#/cloud`,\n\tINTEGRATED_BASE_URL: `/gateway/integrated-management/api/v1`\n};\nexport const URL: BASE = {\n\tttc\n};\n\nexport const BC_THEME_NAME = \"THEME\"; //主题BC\nexport const BC_LANG_NAME = \"LANG\"; //语言\nexport const BC_SETTINGS_NAME = \"SETTING\"; //系统设置\n","/*\n * @Author: WangXin\n * @Date: 2023-08-17 09:29:40\n * @LastEditors: WangXin\n * @LastEditTime: 2025-04-27 09:53:47\n * @FilePath: /yxuse/packages/api/auth/index.ts\n * @Description:\n *\n * Copyright (c) 2023 by YuXing, All Rights Reserved.\n */\nimport { getAuthRouteList, login, getHomeMenuList } from \"../modules/auth\";\nimport { URL, SYSTEM_HOME_PATH } from \"@packages/config\";\nimport { ElMessage } from \"element-plus\";\nimport http from \"@packages/utils/http\";\n\n/**@description 移除token */\nexport const removeToken = (systemName = \"ttc\") => {\n\t//设置了不需要跳转 则直接return\n\tsetSystemConfig({ token: \"\" });\n\t// if (!JSON.parse(localStorage.getItem(\"jumpLogin\") ?? \"{}\")) return;\n\t// const GlobalStateKey = `${systemName}GlobalState`;\n\t// return localStorage.removeItem(GlobalStateKey);\n};\n\n/**@description 获取token */\nexport const getToken = (systemName = \"ttc\") => {\n\tconst GlobalStateKey = `${systemName}GlobalState`;\n\tconst GlobalState = localStorage.getItem(GlobalStateKey) ?? \"{}\";\n\tconst token = JSON.parse(GlobalState) ? JSON.parse(GlobalState).token : null;\n\treturn token;\n};\ninterface LoginParams {\n\tuserName: string;\n\tpassword: string;\n}\n/**@description 自动登录 */\nexport const autoLogin = async ({ userName, password }: LoginParams, systemName = \"ttc\") => {\n\tconst loginApiUrl = getSystemConfig(\"loginApiUrl\");\n\tconst { data } = await http.post(loginApiUrl, { userName, password });\n\tif (data.tokenValue) {\n\t\tElMessage.success(\"登录成功\");\n\t}\n\tsetSystemConfig({ token: data.tokenValue, userInfo: data });\n};\n\n/**@description 获取用户信息 */\nexport const getUserInfo = (systemName = \"ttc\") => {\n\tconst GlobalStateKey = `${systemName}GlobalState`;\n\tconst GlobalState = localStorage.getItem(GlobalStateKey) ?? \"{}\";\n\tconst userInfo = JSON.parse(GlobalState) ? JSON.parse(GlobalState).userInfo : null;\n\treturn userInfo;\n};\n\nexport const getUserRouteList = async () => {\n\tif (!getToken()) return [];\n\tconst data = await getHomeMenuList();\n\treturn data;\n};\n/**@description 自动跳转登录页 */\nexport const jumpToLogin = () => {\n\t//如果是生产环境,直接跳转至登录页\n\tif (isProduction()) {\n\t\tremoveToken();\n\t\tconst curRoute = location.pathname;\n\t\tconsole.log(\"跳转至登录页\", curRoute, curRoute.includes(getLoginUrl()));\n\t\tif (curRoute.includes(getLoginUrl())) {\n\t\t\treturn;\n\t\t} else {\n\t\t\tconsole.log(\"跳转至登录页\", getLoginUrl());\n\t\t\tlocation.replace(getLoginUrl());\n\t\t}\n\t} else {\n\t\t//开发环境,直接弹窗进行账号密码登录\n\t\tconsole.log(\"开发环境!!!\");\n\t\tconst userName = window.prompt(\"当前系统处于开发环境,当前登录过期,请输入登录账号\", \"\");\n\t\tif (userName !== null) {\n\t\t\tconst password = window.prompt(\"请输入登录密码\", \"\");\n\t\t\tif (password === null || password == \"\") window.prompt(\"请输入登录密码\", \"\");\n\t\t\tautoLogin({ userName, password });\n\t\t}\n\t}\n};\n/**@description 自动跳转home */\nexport const jumpToHome = () => {\n\twindow.location.replace(getHomeUrl());\n};\nexport const getLoginUrl = () => {\n\treturn getSystemConfig(\"loginUrl\");\n};\n/**获取当前部署的系统前缀 */\nexport const getHomeUrl = () => {\n\treturn getSystemConfig(\"homeUrl\");\n\tconst systemName = window.location.pathname.split(\"/\")[1];\n\treturn `/${systemName}${SYSTEM_HOME_PATH}`;\n};\n/**设置系统配置信息 */\nexport const setSystemConfig = (config: any) => {\n\tconst GlobalState = localStorage.getItem(\"ttcGlobalState\") ?? \"{}\";\n\tconst newGlobalState = { ...JSON.parse(GlobalState), ...config };\n\tlocalStorage.setItem(\"ttcGlobalState\", JSON.stringify(newGlobalState));\n};\n/**修改某个系统配置 */\nexport const changeSystemConfig = (key: string, value: any) => {\n\tconst GlobalState = localStorage.getItem(\"ttcGlobalState\") ?? \"{}\";\n\tconst newGlobalState = { ...JSON.parse(GlobalState), [key]: value };\n\tlocalStorage.setItem(\"ttcGlobalState\", JSON.stringify(newGlobalState));\n};\n/**获取系统配置信息 */\nexport const getSystemConfig = (key: string) => {\n\tconst GlobalState = JSON.parse(localStorage.getItem(\"ttcGlobalState\") ?? \"{}\");\n\treturn GlobalState[key] ?? \"\";\n};\n/**当前系统环境是否是生产环境 */\nexport const isProduction = () => {\n\treturn getSystemConfig(\"environment\") === \"production\";\n};\n/**\n *\n * @param systemName 系统名称\n * @description 综合管理分系统->integrated\n * @description 站控分系统->station\n * @description 综合管理->integrated\n * @description 轨道分系统->orbit\n * @description 任务计划分系统->traceplan\n * @description 遥控分系统->telecommand\n * @description 遥测分系统->telemetry\n * @returns 当前分系统的用户菜单列表 userMenuList\n * @returns 当前分系统的用户按钮列表 userBtnList\n */\nexport const getUserPermissions = async (systemName: string, isJumpLogin: boolean = true, serverName?: string) => {\n\tif (!getToken() && isJumpLogin) return jumpToLogin();\n\ttry {\n\t\tconst { data } = await getAuthRouteList(serverName);\n\t\tconst systemPermissionList = data.filter(route => route.routeTag.includes(systemName));\n\t\tconst userMenuList = systemPermissionList.filter(item => item.routeType === \"VIEW\");\n\t\tconst userBtnList = systemPermissionList.filter(item => item.routeType === \"BTN\");\n\t\tsessionStorage.setItem(\"ttcUserBtnList\", JSON.stringify(userBtnList.map(item => item.routeTag)));\n\t\treturn {\n\t\t\tuserMenuList,\n\t\t\tuserBtnList\n\t\t};\n\t} catch (err) {\n\t\t// return jumpToLogin();\n\t}\n};\n/**\n *\n * @param userMenuList 用户路由数据\n * @param viewModules 页面文件\n * @returns UserRouter 用户动态路由\n * @description 综合管理分系统->integrated\n * @description 站控分系统->station\n */\nexport const getUserRouter = (userMenuList, viewModules): any[] => {\n\tlet menuList: any = [];\n\tuserMenuList.forEach((item: any) => {\n\t\tconst viewKey = `/src/views${item.routeView}/index.vue`;\n\t\tif (viewModules[viewKey]) {\n\t\t\tconst pageConfig = item?.reservedRouteInfo && JSON.parse(item?.reservedRouteInfo ?? \"{}\");\n\t\t\tconst routerObject = {\n\t\t\t\tpath: item.routeView,\n\t\t\t\tname: item.routeView.split(\"/\")[1],\n\t\t\t\tmeta: {\n\t\t\t\t\ttitle: item.routeName,\n\t\t\t\t\ticon: pageConfig?.routeIcon\n\t\t\t\t},\n\t\t\t\tcomponent: viewModules[viewKey]\n\t\t\t};\n\t\t\tmenuList.push(routerObject);\n\t\t}\n\t});\n\treturn menuList;\n};\n\n/**\n * @description 判断当前routeTag是否在用户的按钮权限里\n * @param routeTag\n */\nexport const getUserIsHaveBtnPower = (routeTag: string): boolean => {\n\tif (!routeTag) return false;\n\tconst authButtonListGet = sessionStorage.getItem(\"ttcUserBtnList\") ?? \"[]\";\n\treturn JSON.parse(authButtonListGet).includes(routeTag);\n};\n\n// 获取用户配置\nlet userConfig:any = null;\nexport const getUserConfig = async () => {\n\tif (userConfig) return userConfig;\n\tconst { data } = await http.get(getSystemConfig(\"userConfigApiUrl\"), {}, {headers: {noLoading: true}});\n\tuserConfig = data;\n\treturn data;\n}","/*\n * @Author: WangXin\n * @Date: 2023-09-13 13:57:49\n * @LastEditors: WangXin\n * @LastEditTime: 2023-09-13 18:17:29\n * @FilePath: \\yxUse\\packages\\api\\modules\\auth\\index.ts\n * @Description:\n *\n * Copyright (c) 2023 by YuXing, All Rights Reserved.\n */\nimport http from \"@packages/utils/http\";\nimport type { LoginParams } from \"./index.d\";\nimport { URL } from \"@packages/config\";\n\nexport const getAuthRouteList = (systemName = \"ttc\") => {\n\treturn http.get(`${URL[systemName].INTEGRATED_BASE_URL}/account/auth/route/list`);\n};\nexport const login = (data: LoginParams, systemName = \"ttc\") => {\n\treturn http.post(`${URL[systemName].INTEGRATED_BASE_URL}/account/login`, data);\n};\nexport const getHomeMenuList = (systemName = \"ttc\") => {\n\treturn http.get(`${URL[systemName].INTEGRATED_BASE_URL}/account/home/menu`);\n};\n","/*\n * @Author: WangXin\n * @Date: 2023-09-13 13:58:34\n * @LastEditors: WangXin\n * @LastEditTime: 2025-05-08 15:43:32\n * @FilePath: /yxuse/packages/utils/http/config.ts\n * @Description:\n *\n * Copyright (c) 2023 by YuXing, All Rights Reserved.\n */\nimport { ElMessage, ElLoading } from \"element-plus\";\nimport \"element-plus/es/components/message/style/css\";\nimport \"element-plus/es/components/loading/style/css\";\nimport { auth } from \"@packages/api\";\n/* 全局请求 loading(服务方式调用) */\nlet loadingInstance: ReturnType<typeof ElLoading.service>;\nconst loadingOptions = {\n\tlock: true,\n\ttext: \"loading...\",\n\tfullscreen: true,\n\tbackground: \"rgba(0, 0, 0, 0.6)\"\n};\n/**\n * @description 开启 Loading\n * */\nconst startLoading = () => {\n\tloadingInstance = ElLoading.service(loadingOptions);\n};\n/**\n * @description 结束 Loading\n * */\nconst endLoading = () => {\n\tloadingInstance.close();\n};\n/**\n * @description 显示全屏加载\n * */\nlet needLoadingRequestCount = 0;\nexport const showFullScreenLoading = () => {\n\tif (needLoadingRequestCount === 0) {\n\t\tstartLoading();\n\t}\n\tneedLoadingRequestCount++;\n};\n\n/**\n * @description 隐藏全屏加载\n * */\nexport const hideFullScreenLoading = () => {\n\tif (needLoadingRequestCount <= 0) return;\n\tneedLoadingRequestCount--;\n\tif (needLoadingRequestCount === 0) {\n\t\tendLoading();\n\t}\n};\n/**\n * @description:请求配置\n */\nexport enum ResultEnum {\n\tSUCCESS = 200,\n\tERROR = 500,\n\tOVERDUE = 401,\n\tTIMEOUT = 30000\n}\nexport const config = {\n\t// 默认地址请求地址,可在 .env.*** 文件中修改\n\t// 设置超时时间(30s)\n\ttimeout: ResultEnum.TIMEOUT as number,\n\t// 跨域时候允许携带凭证\n\twithCredentials: true\n};\n/**\n * @description: 校验网络请求状态码\n * @param {Number} status\n * @return void\n */\nexport const checkStatus = (status: number, msg?: string): void => {\n\tswitch (status) {\n\t\tcase 400:\n\t\t\tElMessage.error(msg || \"请求失败!请您稍后重试\");\n\t\t\tbreak;\n\t\tcase 401:\n\t\t\tElMessage.error(msg || \"登录失效!请您重新登录\");\n\t\t\tif (!location.href.includes(auth.getLoginUrl())) {\n\t\t\t\tauth.jumpToLogin();\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 403:\n\t\t\tElMessage.error(msg || \"当前账号无权限访问!\");\n\t\t\tbreak;\n\t\tcase 404:\n\t\t\tElMessage.error(\"你所访问的资源不存在\");\n\t\t\tbreak;\n\t\tcase 405:\n\t\t\tElMessage.error(msg || \"请求方式错误!请您稍后重试\");\n\t\t\tbreak;\n\t\tcase 408:\n\t\t\tElMessage.error(msg || \"请求超时!请您稍后重试\");\n\t\t\tbreak;\n\t\tcase 500:\n\t\t\tElMessage.error(msg || \"服务异常!\");\n\t\t\tbreak;\n\t\tcase 502:\n\t\t\tElMessage.error(msg || \"网关错误!\");\n\t\t\tbreak;\n\t\tcase 503:\n\t\t\tElMessage.error(msg || \"服务不可用\");\n\t\t\tbreak;\n\t\tcase 504:\n\t\t\tElMessage.error(msg || \"网关超时!\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tElMessage.error(msg || \"请求失败!请您稍后重试!\");\n\t}\n};\n","import axios from \"axios\";\nimport type { AxiosInstance, AxiosError, AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { ElNotification, ElMessage } from \"element-plus\";\nimport \"element-plus/es/components/message/style/css\";\nimport \"element-plus/es/components/notification/style/css\";\nimport { auth } from \"@packages/api\";\nimport { ResultEnum, checkStatus, showFullScreenLoading, hideFullScreenLoading, config } from \"./config\";\ninterface CustomAxiosRequestConfig extends AxiosRequestConfig {\n\t/** 自定义响应处理 */\n\tcustomResHandler?: (res: any) => void;\n}\nconst isTranslateApi = auth.getSystemConfig(\"isTranslateApi\");\nclass YxHttp {\n\tservice: AxiosInstance;\n\t/** 自定义响应处理map */\n\tcustomResMap: { [key: string]: Function };\n\tconstructor(config: CustomAxiosRequestConfig) {\n\t\tthis.service = axios.create(config);\n\t\tthis.setupInterceptors();\n\t\tthis.customResMap = {};\n\t}\n\tprivate setupInterceptors() {\n\t\tthis.service.interceptors.request.use(\n\t\t\t(config: any) => {\n\t\t\t\t// 默认添加 loading,不需要 loading,则设置 noLoading:true\n\t\t\t\tif (!config.headers?.noLoading) {\n\t\t\t\t\tshowFullScreenLoading();\n\t\t\t\t}\n\t\t\t\tconfig.headers!.token = auth.getToken();\n\t\t\t\tif (config?.customResHandler && config?.url) {\n\t\t\t\t\tthis.customResMap[config?.url] = config.customResHandler;\n\t\t\t\t}\n\t\t\t\treturn config;\n\t\t\t},\n\t\t\t(error: AxiosError) => {\n\t\t\t\treturn Promise.reject(error);\n\t\t\t}\n\t\t);\n\t\t//响应拦截器\n\t\tthis.service.interceptors.response.use(\n\t\t\tasync (response: AxiosResponse) => {\n\t\t\t\tconst { config } = response;\n\t\t\t\tlet data = response.data;\n\t\t\t\tconst code = response.status;\n\t\t\t\thideFullScreenLoading();\n\t\t\t\tif (config.url && this.customResMap[config.url]) {\n\t\t\t\t\treturn this.customResMap[config.url](data);\n\t\t\t\t}\n\t\t\t\tif (code == ResultEnum.OVERDUE || data.code === ResultEnum.OVERDUE) {\n\t\t\t\t\tthis.handleOverdueResponse(data);\n\t\t\t\t} else if (data.code !== ResultEnum.SUCCESS) {\n\t\t\t\t\tthis.handleErrorResponse(data);\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\t\t\t},\n\t\t\t(error: AxiosError) => {\n\t\t\t\thideFullScreenLoading();\n\t\t\t\tconst response = error.response as AxiosResponse;\n\t\t\t\tconst { config } = error;\n\t\t\t\tif (config?.url && this.customResMap[config.url]) {\n\t\t\t\t\tthis.customResMap[config.url](error.response);\n\t\t\t\t}\n\t\t\t\tif (error.message.includes(\"timeout\")) {\n\t\t\t\t\tElMessage.error(\"请求超时!请稍后重试\");\n\t\t\t\t} else if (error.message.includes(\"Network Error\")) {\n\t\t\t\t\tElMessage.error(\"网络错误!请稍后重试\");\n\t\t\t\t}\n\t\t\t\tif (response) {\n\t\t\t\t\tcheckStatus(response.status, response.data?.resultMsg);\n\t\t\t\t}\n\t\t\t\tif (!window.navigator.onLine) {\n\t\t\t\t\tElNotification({\n\t\t\t\t\t\ttitle: \"提示\",\n\t\t\t\t\t\tmessage: \"当前网络似乎开小差了\",\n\t\t\t\t\t\ttype: \"warning\",\n\t\t\t\t\t\tduration: 5000\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn Promise.reject(error);\n\t\t\t}\n\t\t);\n\t}\n\n\tprivate handleOverdueResponse(data: any): Promise<never> {\n\t\tElNotification({\n\t\t\ttitle: \"登录过期提醒\",\n\t\t\tmessage: data.resultMsg || \"当前登录失效\",\n\t\t\ttype: \"warning\",\n\t\t\tduration: 5000\n\t\t});\n\t\tauth.jumpToLogin();\n\t\treturn Promise.reject(data);\n\t}\n\n\tprivate handleErrorResponse(data: any): Promise<never> {\n\t\tif (data?.resultMsg) {\n\t\t\tElMessage.error(data.resultMsg);\n\t\t} else {\n\t\t\tcheckStatus(data.status);\n\t\t}\n\t\treturn Promise.reject(data);\n\t}\n\t/**\n\t *\n\t * @param url\n\t * @param params\n\t * @param options : AxiosRequestConfig\n\t * @description get 请求\n\t */\n\tget<T = any>(url: string, params?: object, options: CustomAxiosRequestConfig = {}): Promise<T> {\n\t\treturn this.service.get(url, { params, ...options });\n\t}\n\t/**\n\t *\n\t * @param url\n\t * @param params\n\t * @param options : AxiosRequestConfig\n\t * @description post 请求\n\t */\n\tpost<T = any>(url: string, params?: object, options: CustomAxiosRequestConfig = {}): Promise<T> {\n\t\treturn this.service.post(url, params, options);\n\t}\n\t/**\n\t *\n\t * @param url\n\t * @param params\n\t * @param options : AxiosRequestConfig\n\t */\n\tput<T = any>(url: string, params?: object, options: CustomAxiosRequestConfig = {}): Promise<T> {\n\t\treturn this.service.put(url, params, options);\n\t}\n\t/**\n\t *\n\t * @param url\n\t * @param params\n\t * @param options : AxiosRequestConfig\n\t */\n\tdelete<T = any>(url: string, params?: any, options: CustomAxiosRequestConfig = {}): Promise<T> {\n\t\treturn this.service.delete(url, { params, ...options });\n\t}\n}\n\nexport default new YxHttp(config);\n"],"names":["URL","ttc","LOGIN_URL","window","location","origin","HOME_URL","INTEGRATED_BASE_URL","removeToken","systemName","setSystemConfig","token","getToken","GlobalStateKey","GlobalState","localStorage","getItem","JSON","parse","autoLogin","async","userName","password","loginApiUrl","getSystemConfig","data","http","post","tokenValue","elementPlus","ElMessage","success","userInfo","jumpToLogin","isProduction","pathname","includes","getLoginUrl","replace","prompt","jumpToHome","getHomeUrl","config","newGlobalState","setItem","stringify","changeSystemConfig","key","value","getUserIsHaveBtnPower","routeTag","authButtonListGet","sessionStorage","userConfig","getUserConfig","get","headers","noLoading","isJumpLogin","serverName","getAuthRouteList","systemPermissionList","filter","route","userMenuList","item","routeType","userBtnList","map","err","getHomeMenuList","viewModules","menuList","forEach","viewKey","routeView","pageConfig","reservedRouteInfo","routerObject","path","name","split","meta","title","routeName","icon","routeIcon","component","push","loadingInstance","loadingOptions","lock","text","fullscreen","background","needLoadingRequestCount","showFullScreenLoading","ElLoading","service","hideFullScreenLoading","close","ResultEnum","checkStatus","status","msg","error","href","auth.getLoginUrl","auth.getSystemConfig","constructor","__publicField","this","axios","create","setupInterceptors","customResMap","interceptors","request","use","config2","auth.getToken","customResHandler","url","Promise","reject","response","code","OVERDUE","handleOverdueResponse","SUCCESS","handleErrorResponse","message","_a","resultMsg","navigator","onLine","ElNotification","type","duration","params","options","put","delete","timeout","withCredentials"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs13.js","sources":["../packages/utils/common/index.ts","../packages/utils/subscribe/index.ts"],"sourcesContent":["/*\n * @Author: WangXin\n * @Date: 2023-09-13 16:21:13\n * @LastEditors: WangXin\n * @LastEditTime: 2025-05-22 11:36:09\n * @FilePath: /yxuse/packages/utils/common/index.ts\n * @Description:\n *\n * Copyright (c) 2023 by YuXing, All Rights Reserved.\n */\nimport { ElMessage, ElMessageBox } from \"element-plus\";\nimport type { ElMessageBoxOptions } from \"element-plus\";\nimport dayjs from \"dayjs\";\n/**\n * @description 给各分系统发送消息\n * @param data 发送的消息\n */\ninterface Message {\n\ttype: string; //消息类型\n\tdata: any; //消息data\n}\nexport const notifyMessageToSystems = (message: Message) => {\n\tconst themeBc = new BroadcastChannel(\"YXUSE_BC\");\n\tthemeBc.postMessage(message);\n};\n/**\n * @description 接收系统消息\n * @param callback 接收后的回调\n */\nexport const receiveMessage = (callback: Function) => {\n\tconst themeBc = new BroadcastChannel(\"YXUSE_BC\");\n\tthemeBc.onmessage = () => {\n\t\tcallback();\n\t};\n};\n\n/**\n * @param arr 处理的参数\n * @param labelKey label的key\n * @param valueKey value的key\n * @param isValueToNumber 是否将value转为number\n * @return [{label:\"\",value:\"\"}]\n */\nexport const getSelectOptions = (\n\tarr: [],\n\tlabelKey: string,\n\tvalueKey: string,\n\tisValueToNumber?: boolean\n): { label: string; value: string | number }[] => {\n\tif (!Array.isArray(arr)) return [];\n\treturn arr.map(item => {\n\t\treturn {\n\t\t\tlabel: item?.[labelKey],\n\t\t\tvalue: isValueToNumber ? +item[valueKey] : item[valueKey]\n\t\t};\n\t});\n};\n\n/**\n * @param enumObject 处理的枚举类\n */\nexport const enumToArray = <T extends Record<string, string | number>>(\n\tenumObject: T\n): { label: string; value: string | number }[] => {\n\tconst result: { label: string; value: string | number }[] = [];\n\tfor (const key in enumObject) {\n\t\tif (isNaN(Number(key))) {\n\t\t\tresult.push({ label: key, value: enumObject[key] });\n\t\t}\n\t}\n\treturn result;\n};\n\n/**\n * @description 判断该色值是否是深色\n * @param color 色值\n */\nexport const isDarkColor = (color: string) => {\n\tconst parseColor = (color: string): [number, number, number, number] | null => {\n\t\tlet r = 0,\n\t\t\tg = 0,\n\t\t\tb = 0,\n\t\t\ta = 1;\n\t\tif (color.startsWith(\"#\")) {\n\t\t\t// 解析十六进制颜色值\n\t\t\tcolor = color.slice(1);\n\t\t\tif (color.length === 3) {\n\t\t\t\tr = parseInt(color[0] + color[0], 16);\n\t\t\t\tg = parseInt(color[1] + color[1], 16);\n\t\t\t\tb = parseInt(color[2] + color[2], 16);\n\t\t\t} else if (color.length === 6) {\n\t\t\t\tr = parseInt(color.slice(0, 2), 16);\n\t\t\t\tg = parseInt(color.slice(2, 4), 16);\n\t\t\t\tb = parseInt(color.slice(4, 6), 16);\n\t\t\t} else {\n\t\t\t\t// 非法的颜色值\n\t\t\t\treturn null;\n\t\t\t}\n\t\t} else if (color.startsWith(\"rgb\")) {\n\t\t\t// 解析 RGB 或 RGBA 格式的颜色值\n\t\t\tconst rgbaMatch = color.match(/(\\d+(\\.\\d+)?)/g);\n\t\t\tif (rgbaMatch) {\n\t\t\t\tr = parseFloat(rgbaMatch[0]);\n\t\t\t\tg = parseFloat(rgbaMatch[1]);\n\t\t\t\tb = parseFloat(rgbaMatch[2]);\n\t\t\t\tif (rgbaMatch.length > 3) {\n\t\t\t\t\ta = parseFloat(rgbaMatch[3]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t} else {\n\t\t\treturn null; // 非法的颜色值\n\t\t}\n\t\treturn [r, g, b, a];\n\t};\n\n\tconst colorComponents = parseColor(color);\n\n\tif (!colorComponents) {\n\t\treturn null; // 非法的颜色值\n\t}\n\n\tconst [r, g, b, _] = colorComponents;\n\n\t// 转换为 HSL 颜色空间\n\tconst normalizedR = r / 255;\n\tconst normalizedG = g / 255;\n\tconst normalizedB = b / 255;\n\tconst max = Math.max(normalizedR, normalizedG, normalizedB);\n\tconst min = Math.min(normalizedR, normalizedG, normalizedB);\n\tlet h,\n\t\ts,\n\t\tl = (max + min) / 2;\n\n\tif (max === min) {\n\t\th = s = 0; // 灰色\n\t} else {\n\t\tconst d = max - min;\n\t\ts = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\t\tswitch (max) {\n\t\t\tcase normalizedR:\n\t\t\t\th = (normalizedG - normalizedB) / d + (normalizedG < normalizedB ? 6 : 0);\n\t\t\t\tbreak;\n\t\t\tcase normalizedG:\n\t\t\t\th = (normalizedB - normalizedR) / d + 2;\n\t\t\t\tbreak;\n\t\t\tcase normalizedB:\n\t\t\t\th = (normalizedR - normalizedG) / d + 4;\n\t\t\t\tbreak;\n\t\t}\n\t\th /= 6;\n\t}\n\n\t// 根据亮度判断是深色还是浅色\n\treturn l < 0.5; // 深色为 true,浅色为 false\n};\n\n/**\n * @description 判断两个色值是否为相近色\n * @param color1 第一个色值\n * @param color2 第二个色值\n * @param threshold 阈值,用于判断两个颜色是否相近\n */\nexport const areColorsSimilar = (color1: string, color2: string, threshold: number = 100): boolean => {\n\tconst getColorComponents = (color: string): [number, number, number, number] | null => {\n\t\tlet r,\n\t\t\tg,\n\t\t\tb,\n\t\t\ta = 1;\n\t\tif (color.startsWith(\"#\")) {\n\t\t\tcolor = color.slice(1);\n\t\t\tif (color.length === 3) {\n\t\t\t\tr = parseInt(color[0] + color[0], 16);\n\t\t\t\tg = parseInt(color[1] + color[1], 16);\n\t\t\t\tb = parseInt(color[2] + color[2], 16);\n\t\t\t} else if (color.length === 6) {\n\t\t\t\tr = parseInt(color.slice(0, 2), 16);\n\t\t\t\tg = parseInt(color.slice(2, 4), 16);\n\t\t\t\tb = parseInt(color.slice(4, 6), 16);\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t} else if (color.startsWith(\"rgb\")) {\n\t\t\tconst rgbaMatch = color.match(/(\\d+(\\.\\d+)?)/g) as string[];\n\t\t\tr = parseFloat(rgbaMatch[0]);\n\t\t\tg = parseFloat(rgbaMatch[1]);\n\t\t\tb = parseFloat(rgbaMatch[2]);\n\t\t\tif (rgbaMatch.length > 3) {\n\t\t\t\ta = parseFloat(rgbaMatch[3]);\n\t\t\t}\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t\treturn [r, g, b, a];\n\t};\n\n\tconst color1Components = getColorComponents(color1);\n\tconst color2Components = getColorComponents(color2);\n\n\tif (!color1Components || !color2Components) {\n\t\treturn false; // 非法的颜色值\n\t}\n\n\tconst euclideanDistance = Math.sqrt(\n\t\tMath.pow(color1Components[0] - color2Components[0], 2) +\n\t\t\tMath.pow(color1Components[1] - color2Components[1], 2) +\n\t\t\tMath.pow(color1Components[2] - color2Components[2], 2) +\n\t\t\tMath.pow(color1Components[3] - color2Components[3], 2)\n\t);\n\tconsole.log(euclideanDistance);\n\n\treturn euclideanDistance <= threshold;\n};\n\n//判断两个色值是否相等\nexport const isColorEqual = (color1: string, color2: string) => {\n\tfunction toRGBA(color: string) {\n\t\tif (color.toLowerCase().startsWith(\"rgba\")) {\n\t\t\t// 如果是 RGBA 格式,则直接返回\n\t\t\treturn color.toLowerCase();\n\t\t} else if (color.toLowerCase().startsWith(\"rgb\")) {\n\t\t\t// 如果是 RGB 格式,则转换为 RGBA 格式,alpha 默认为 1\n\t\t\treturn color.replace(\"rgb\", \"rgba\").replace(\")\", \", 1)\");\n\t\t} else if (color.length === 7) {\n\t\t\t// 如果是十六进制格式,则转换为 RGBA 格式,alpha 默认为 1\n\t\t\tconst r = parseInt(color.substring(1, 3), 16);\n\t\t\tconst g = parseInt(color.substring(3, 5), 16);\n\t\t\tconst b = parseInt(color.substring(5, 7), 16);\n\t\t\treturn `rgba(${r}, ${g}, ${b}, 1)`;\n\t\t} else if (color.length === 9 && color.toLowerCase().startsWith(\"rrggbbaa\")) {\n\t\t\t// 如果是 RRGGBBAA 十六进制格式,则转换为 RGBA 格式\n\t\t\tconst r = parseInt(color.substring(1, 3), 16);\n\t\t\tconst g = parseInt(color.substring(3, 5), 16);\n\t\t\tconst b = parseInt(color.substring(5, 7), 16);\n\t\t\tconst a = Math.round((parseInt(color.substring(7, 9), 16) / 255) * 100) / 100; // 转换 alpha 值\n\t\t\treturn `rgba(${r}, ${g}, ${b}, ${a})`;\n\t\t} else {\n\t\t\t// 其他情况视为无效颜色值\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tconst rgbaColor1 = toRGBA(convertShortHexToLongHex(color1));\n\tconst rgbaColor2 = toRGBA(convertShortHexToLongHex(color2));\n\t// 如果转换失败,则返回 false\n\tif (!rgbaColor1 || !rgbaColor2) {\n\t\treturn false;\n\t}\n\n\t// 比较两个 RGBA 格式的颜色值是否相等\n\treturn rgbaColor1 === rgbaColor2;\n};\n\nconst convertShortHexToLongHex = (shortHex: string) => {\n\tif (shortHex.length === 4 && shortHex[0] === \"#\") {\n\t\t// 提取每个字符\n\t\tconst r = shortHex[1];\n\t\tconst g = shortHex[2];\n\t\tconst b = shortHex[3];\n\t\t// 转换为6位十六进制表示\n\t\tconst longHex = `#${r}${r}${g}${g}${b}${b}`;\n\t\treturn longHex;\n\t} else {\n\t\t// 如果不是3位十六进制表示,直接返回原始值\n\t\treturn shortHex;\n\t}\n};\n\n/**\n * @param data //后端返回的数据\n * @param isShowError //是否显示后端服务的报错信息\n * @param callback //回调\n * @description 消息提示\n */\n\nexport const yxMessage = (data: any, callback?: Function, isShowError = true) => {\n\tif (data.isSuccess) {\n\t\tElMessage.success(data.resultMsg || \"操作成功\");\n\t\tcallback && callback();\n\t} else {\n\t\tif (isShowError) {\n\t\t\tElMessage.error(data.resultMsg || \"操作失败\");\n\t\t}\n\t}\n};\n\n/**\n * @param text 要复制的文本\n * @description 复制文本到剪贴板\n * @return void\n */\nexport const copyText = (text: string) => {\n\tconst textField = document.createElement(\"textarea\");\n\ttextField.innerText = text;\n\tdocument.body.appendChild(textField);\n\ttextField.select();\n\tdocument.execCommand(\"copy\");\n\ttextField.remove();\n\tElMessage.success(\"已成功复制到剪贴板\");\n};\n\n/**\n * @param time 时间\n * @description 将传入的时间转为距离当前时间的 时 分 秒 的字符串\n * @return void\n */\nexport const getCownDownTime = (time: string) => {\n\tconst diffTimeSecond = dayjs(time).diff(dayjs(), \"second\");\n\tlet formattedTime = \"00:00:00\";\n\tif (diffTimeSecond > 0) {\n\t\tconst hours = Math.floor(diffTimeSecond / 3600);\n\t\tconst minutes = Math.floor((diffTimeSecond % 3600) / 60);\n\t\tconst seconds = diffTimeSecond % 60;\n\t\tformattedTime = `${hours.toString().padStart(2, \"0\")}:${minutes.toString().padStart(2, \"0\")}:${seconds\n\t\t\t.toString()\n\t\t\t.padStart(2, \"0\")}`;\n\t}\n\n\treturn formattedTime;\n};\n\n/**\n * @param content 提示内容\n * @confrmCallback 确认回调\n * @options 其他参数\n */\nexport const useConfirm = (content: string, confrmCallback: Function, options: ElMessageBoxOptions = {}) => {\n\tElMessageBox.confirm(content, options?.title || \"提示\", {\n\t\tconfirmButtonText: \"确定\",\n\t\tcancelButtonText: \"取消\",\n\t\ttype: \"warning\",\n\t\t...options\n\t})\n\t\t.then(() => {\n\t\t\tconfrmCallback();\n\t\t})\n\t\t.catch(() => {});\n};\n","/*\n * @Author: WangXin\n * @Date: 2024-01-01 10:33:25\n * @LastEditors: WangXin\n * @LastEditTime: 2024-01-03 10:59:31\n * @FilePath: \\yxUse\\packages\\utils\\subscribe\\index.ts\n * @Description:\n *\n * Copyright (c) 2024 by YuXing, All Rights Reserved.\n */\ninterface Message {\n\ttype: string;\n\tdata: any;\n}\ninterface Subscribe {\n\t[key: string]: Function[];\n}\nclass YxSubscribe {\n\tprivate subscribers: Subscribe;\n\tconstructor() {\n\t\tthis.subscribers = {};\n\t}\n\tsubscribe(sub: string, fn: Function) {\n\t\tif (!this.subscribers[sub]) {\n\t\t\tthis.subscribers[sub] = [];\n\t\t}\n\t\tthis.subscribers[sub].push(fn);\n\t}\n\tunsubscribe(sub: string, fn?: Function) {\n\t\tconst subscribers = this.subscribers[sub];\n\t\tif (!fn) return (this.subscribers[sub] = []);\n\t\tif (subscribers) {\n\t\t\tconst index = subscribers.indexOf(fn);\n\t\t\tif (index !== -1) {\n\t\t\t\tsubscribers.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublish(message: Message) {\n\t\tconst subscribers = this.subscribers[message.type];\n\t\tif (subscribers) {\n\t\t\tsubscribers.forEach(fn => {\n\t\t\t\tfn(message.data);\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport default new YxSubscribe();\n"],"names":["convertShortHexToLongHex","shortHex","length","r","g","b","yxSubscribe","constructor","__publicField","this","subscribers","subscribe","sub","fn","push","unsubscribe","index","indexOf","splice","publish","message","type","forEach","data","color1","color2","threshold","getColorComponents","color","a","startsWith","slice","parseInt","rgbaMatch","match","parseFloat","color1Components","color2Components","Math","sqrt","pow","text","textField","document","createElement","innerText","body","appendChild","select","execCommand","remove","elementPlus","ElMessage","success","enumObject","result","key","isNaN","Number","label","value","time","diffTimeSecond","dayjs","diff","formattedTime","hours","floor","minutes","seconds","toString","padStart","arr","labelKey","valueKey","isValueToNumber","Array","isArray","map","item","toRGBA","toLowerCase","replace","substring","round","rgbaColor1","rgbaColor2","colorComponents","r2","g2","b2","parseColor","_","normalizedR","normalizedG","normalizedB","max","min","BroadcastChannel","postMessage","callback","onmessage","content","confrmCallback","options","ElMessageBox","confirm","title","confirmButtonText","cancelButtonText","then","catch","isShowError","isSuccess","resultMsg","error"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs14.js","sources":["../packages/api/modules/assets/index.ts"],"sourcesContent":["/*\n * @Author: WangXin\n * @Date: 2024-04-11 11:09:04\n * @LastEditors: WangXin\n * @LastEditTime: 2024-08-16 10:16:23\n * @FilePath: /yxuse/packages/api/modules/assets/index.ts\n * @Description:\n *\n * Copyright (c) 2024 by YuXing, All Rights Reserved.\n */\nimport http from \"@packages/utils/http\";\nimport { URL } from \"@packages/config\";\n\nexport const uploadResourceApi = (params: FormData, config?: Object) =>\n\thttp.post(`${URL[\"ttc\"].INTEGRATED_BASE_URL}/file/upload`, params, config);\n\n//获取资源分组\nexport const getGroupListApi = () =>\n\thttp.get(\n\t\t`${URL[\"ttc\"].INTEGRATED_BASE_URL}/resource/group/list`,\n\t\t{},\n\t\t{\n\t\t\theaders: { noLoading: true }\n\t\t}\n\t);\n//获取icon的配置\nexport const getResourceListApi = (groupUuid: string, sign: number) =>\n\thttp.get(`${URL[\"ttc\"].INTEGRATED_BASE_URL}/resource/file/list/${sign}/${groupUuid}`, {}, { headers: { noLoading: true } });\n"],"names":["uploadResourceApi","params","config","http","post","URL","INTEGRATED_BASE_URL","getGroupListApi","get","headers","noLoading","getResourceListApi","groupUuid","sign"],"mappings":"iDAaaA,EAAoB,CAACC,EAAkBC,IACnDC,EAAAA,KAAKC,KAAK,GAAGC,EAAAA,IAAS,IAAEC,kCAAmCL,EAAQC,GAGvDK,EAAkB,IAC9BJ,EAAAA,KAAKK,IACJ,GAAGH,EAAAA,IAAS,IAAEC,0CACd,CAAC,EACD,CACCG,QAAS,CAAEC,WAAW,KAIZC,EAAqB,CAACC,EAAmBC,IACrDV,EAAAA,KAAKK,IAAI,GAAGH,EAAAA,IAAS,IAAEC,0CAA0CO,KAAQD,IAAa,CAAA,EAAI,CAAEH,QAAS,CAAEC,WAAW"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs2.js","sources":["../packages/utils/fecth/index.ts","../packages/utils/mqtt/index.ts","../packages/utils/socket/index.ts"],"sourcesContent":["import { ElMessage } from \"element-plus\";\nimport type { HttpMethod, RequestConfig } from \"./interface\";\nimport { auth } from \"@packages/api\";\nimport { checkStatus, showFullScreenLoading, hideFullScreenLoading } from \"../http/config\";\nfunction buildQuery(params?: Record<string, any>): string {\n\tif (!params) return \"\";\n\tconst query = new URLSearchParams();\n\tObject.entries(params).forEach(([key, value]) => {\n\t\tif (value !== undefined && value !== null) {\n\t\t\tquery.append(key, String(value));\n\t\t}\n\t});\n\treturn `?${query.toString()}`;\n}\n\nasync function baseRequest<T = any>(url: string, method: HttpMethod, data?: any, config: RequestConfig = {}): Promise<T> {\n\tconst { headers = {}, responseType = \"json\", signal, noAuth = false } = config;\n\tconst fullUrl = method === \"GET\" ? `${url}${buildQuery(data)}` : `${url}`;\n\tconst token = auth.getToken();\n\tif (!config.noLoading) {\n\t\tshowFullScreenLoading();\n\t}\n\tconst res = await fetch(fullUrl, {\n\t\tmethod,\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t...(token && !noAuth ? { token: token } : \"\"),\n\t\t\t...headers\n\t\t},\n\t\tbody: method !== \"GET\" && data ? JSON.stringify(data) : undefined,\n\t\tsignal\n\t});\n\thideFullScreenLoading();\n\t// 统一错误处理\n\tif (!res.ok) {\n\t\tlet errorMessage = \"\";\n\t\ttry {\n\t\t\tconst errorData = await res.json();\n\t\t\tif (errorData?.resultMsg) {\n\t\t\t\terrorMessage = errorData.resultMsg;\n\t\t\t}\n\t\t} catch (_) {}\n\t\tcheckStatus(res.status, errorMessage);\n\t\tthrow new Error(errorMessage);\n\t}\n\n\tswitch (responseType) {\n\t\tcase \"text\":\n\t\t\treturn res.text() as Promise<T>;\n\t\tcase \"blob\":\n\t\t\treturn res.blob() as Promise<T>;\n\t\tdefault:\n\t\t\treturn res.json() as Promise<T>;\n\t}\n}\n\nexport const yxFecth = {\n\tget: <T = any>(url: string, params?: Record<string, any>, config?: RequestConfig) => baseRequest<T>(url, \"GET\", params, config),\n\n\tpost: <T = any>(url: string, data?: any, config?: RequestConfig) => baseRequest<T>(url, \"POST\", data, config),\n\n\tput: <T = any>(url: string, data?: any, config?: RequestConfig) => baseRequest<T>(url, \"PUT\", data, config),\n\n\tdelete: <T = any>(url: string, data?: any, config?: RequestConfig) => baseRequest<T>(url, \"DELETE\", data, config)\n};\n","/*\n * @Author: WangXin\n * @Date: 2023-06-28 10:33:54\n * @LastEditors: WangXin\n * @LastEditTime: 2025-04-25 18:35:47\n * @FilePath: /yxuse/packages/utils/mqtt/index.ts\n * @Description:\n *\n * Copyright (c) 2023 by YuXing, All Rights Reserved.\n */\nimport * as mqtt from \"mqtt/dist/mqtt.min\";\nimport type { ClientOptions, CusOptions } from \"./interface\";\nconst clientOptions: ClientOptions = {\n\tmqttVersion: 5,\n\tclean: true, // true: 清除会话, false: 保留会话\n\tconnectTimeout: 4000, // 超时时间\n\tkeepAlive: 60, // 认证信息\n\tclientId: \"mqttjs_\" + Date.now(),\n\t// username: \"xxxx\",\n\t// password: \"xxxx\",\n\tqos: 1\n};\nconst subscribeMap = new Map();\nclass MQ {\n\tclient: any;\n\tconstructor(url: string, options: CusOptions) {\n\t\tthis.client = null;\n\t\tthis.subscribe = this.subscribe;\n\t\tthis.unsubscribe = this.unsubscribe;\n\t\tthis.publish = this.publish;\n\t\tthis.destroyed = this.destroyed;\n\t\tthis.createClient(url, { ...clientOptions, ...options });\n\t}\n\tcreateClient(url: string, options: CusOptions) {\n\t\tthis.client = mqtt.connect(url, options);\n\t\tthis.client.on(\"connect\", this.onConnect);\n\t\tthis.client.on(\"reconnect\", this.onReconnect);\n\t\tthis.client.on(\"error\", this.onError);\n\t\tthis.client.on(\"message\", this.onMessage);\n\t}\n\tpublish(topic: string, message: any) {\n\t\tthis.client.publish(topic, message, { qos: clientOptions.qos }, (e: any) => {\n\t\t\tif (e) {\n\t\t\t\tconsole.log(`客户端: ${clientOptions.clientId}, 发送主题为: ${topic} 的消息, 发送失败: `, e);\n\t\t\t}\n\t\t});\n\t}\n\tsubscribe(topic, callback) {\n\t\tthis.client.subscribe(topic, error => {\n\t\t\tif (!error) {\n\t\t\t\tsubscribeMap.set(topic, callback);\n\t\t\t\tconsole.log(`客户端: ${clientOptions.clientId},主题:${topic}, 订阅成功`);\n\t\t\t} else {\n\t\t\t\tthrow new Error(error);\n\t\t\t}\n\t\t});\n\t}\n\tunsubscribe(topic) {\n\t\tthis.client.unsubscribe(topic, {}, error => {\n\t\t\tif (error) {\n\t\t\t\tconsole.log(`客户端: ${clientOptions.clientId}, 取消订阅主题: ${topic}失败: `, error);\n\t\t\t} else {\n\t\t\t\tconsole.log(`客户端: ${clientOptions.clientId}, 取消订阅主题: ${topic}成功`);\n\t\t\t}\n\t\t});\n\t}\n\tonConnect(e) {\n\t\tconsole.log(`客户端: ${clientOptions.clientId}, 连接emqx服务器成功:`, e);\n\t}\n\tonReconnect(error) {\n\t\tconsole.log(`客户端: ${clientOptions.clientId}, 正在重连:`, error);\n\t}\n\tonError(error) {\n\t\tconsole.log(`客户端: ${clientOptions.clientId}, 连接失败:`, error);\n\t}\n\tonMessage(topic, message) {\n\t\tconst data = message.toString();\n\t\tsubscribeMap.get(topic)(JSON.parse(data));\n\t}\n\tdestroyed() {\n\t\tif (this.client.end) this.client.end();\n\t\tconsole.log(`客户端: ${clientOptions.clientId}, 关闭连接`);\n\t}\n}\nexport default MQ;\n","import type { SocketParams, HeartMessage } from \"./interface\";\nexport default class Ws {\n\turl: string;\n\tprotocols: any;\n\twebSocketState: boolean;\n\tisCustomClose: boolean;\n\treconnectTime: number;\n\theartBeatTime: number;\n\twaitBeatTime: number;\n\tcallback: Function;\n\tHEART_KEY?: string;\n\tHEART_VALUE?: string | number;\n\tws: WebSocket | null;\n\tisReconnectionLoading: boolean;\n\ttimeId: any;\n\teventCenter: any;\n\terrorStack: any;\n\theartMessage?: HeartMessage;\n\tmsgDataPreHandler?: Function;\n\tconstructor(options: SocketParams, protocols?: string) {\n\t\tthis.url = options.url;\n\t\tthis.protocols = protocols;\n\t\tthis.webSocketState = false;\n\t\tthis.isCustomClose = true;\n\t\tthis.reconnectTime = options.reconnectTime; //断线重连时间间隔\n\t\tthis.heartBeatTime = options.heartBeatTime; //心跳间隔时间\n\t\tthis.waitBeatTime = options.waitBeatTime; //心跳等待时间\n\t\tthis.callback = options.callback;\n\t\tif (options.msgDataPreHandler) {\n\t\t\tthis.msgDataPreHandler = options.msgDataPreHandler;\n\t\t}\n\t\tthis.onmessage = this.onmessage;\n\t\tthis.heartMessage = options.heartMessage;\n\t\tthis.HEART_KEY = options.HEART_KEY; //心跳响应key\n\t\tthis.HEART_VALUE = options.HEART_VALUE; //心跳响应value\n\t\tthis.ws = null;\n\t\tthis.isReconnectionLoading = false;\n\t\tthis.createWs();\n\t}\n\n\tcreateWs() {\n\t\tif (\"WebSocket\" in window) {\n\t\t\t// 实例化\n\t\t\tthis.ws = null;\n\t\t\tthis.ws = new WebSocket(this.url, this.protocols);\n\t\t\t// 监听事件\n\t\t\tthis.onopen();\n\t\t\tthis.onerror();\n\t\t\tthis.onclose();\n\t\t\tthis.onmessage();\n\t\t} else {\n\t\t\tconsole.warn(\"你的浏览器不支持 WebSocket\");\n\t\t}\n\t}\n\n\t// 监听成功\n\tonopen() {\n\t\tthis.ws.onopen = () => {\n\t\t\tconsole.info(\"socket已连接成功\");\n\t\t\tthis.webSocketState = true;\n\t\t\tthis.startHeartBeat(this.heartBeatTime);\n\t\t};\n\t}\n\tstartHeartBeat(time: any) {\n\t\tsetTimeout(() => {\n\t\t\tthis.heartMessage && (this.heartMessage.data = new Date().getTime() + \"\");\n\t\t\tthis.send(this.heartMessage ? this.heartMessage : this.HEART_KEY);\n\t\t\tthis.waitingServer();\n\t\t}, time);\n\t}\n\t//延时等待服务端响应,通过webSocketState判断是否连线成功\n\twaitingServer() {\n\t\tthis.webSocketState = false;\n\t\tsetTimeout(() => {\n\t\t\tif (this.webSocketState) {\n\t\t\t\tthis.startHeartBeat(this.heartBeatTime);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconsole.warn(\"warning\", \"心跳无响应,已断线\");\n\t\t\ttry {\n\t\t\t\tthis.close();\n\t\t\t\tif (this.ws) {\n\t\t\t\t\tthis.start();\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.info(\"连接已关闭,无需关闭\");\n\t\t\t}\n\t\t}, this.waitBeatTime);\n\t}\n\t// 监听错误\n\tonerror() {\n\t\tif (!this.ws) return;\n\t\tthis.ws.onerror = err => {\n\t\t\tconsole.log(err);\n\n\t\t\tthis.isCustomClose = false;\n\t\t\tthis.isReconnectionLoading = false;\n\t\t};\n\t}\n\n\t// 监听关闭\n\tonclose() {\n\t\tif (!this.ws) return;\n\t\tthis.ws.onclose = () => {\n\t\t\tconsole.info(\"success\", \"socket关闭成功\");\n\t\t\t// 用户手动关闭的不重连\n\t\t\tif (this.isCustomClose) return;\n\t\t\tif (this.ws) {\n\t\t\t\tconsole.log(\"重连\");\n\n\t\t\t\tthis.reconnection();\n\t\t\t\tthis.isReconnectionLoading = false;\n\t\t\t}\n\t\t};\n\t}\n\n\t// 接收 WebSocket 消息,增加二进制数据支持\n\tasync onmessage() {\n\t\tif (!this.ws) return;\n\t\tthis.ws.onmessage = async event => {\n\t\t\ttry {\n\t\t\t\tlet rawData = event.data;\n\t\t\t\tif (this.msgDataPreHandler) {\n\t\t\t\t\tawait this.msgDataPreHandler(rawData);\n\t\t\t\t}\n\t\t\t\t// 处理心跳消息\n\t\t\t\tif (rawData === this.HEART_VALUE) {\n\t\t\t\t\tthis.webSocketState = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// 解析 JSON 数据\n\t\t\t\tconst data = JSON.parse(rawData);\n\t\t\t\tthis.callback(data);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.log(error);\n\t\t\t\tthis.callback(event.data);\n\t\t\t}\n\t\t};\n\t}\n\n\t// 重连\n\treconnection() {\n\t\t// 防止重复\n\t\tif (this.isReconnectionLoading) return;\n\t\tthis.isReconnectionLoading = true;\n\t\tclearTimeout(this.timeId);\n\t\tthis.timeId = null;\n\t\tthis.timeId = setTimeout(() => {\n\t\t\tthis.createWs();\n\t\t}, this.reconnectTime);\n\t}\n\n\t// 发送消息\n\tsend(message: any) {\n\t\tif (this.webSocketState && this.ws) {\n\t\t\tthis.ws.send(message);\n\t\t}\n\t}\n\n\t// 手动关闭\n\tclose() {\n\t\tthis.isCustomClose = true;\n\t\tthis.isReconnectionLoading = false;\n\t\t// if (this.ws.readyState === WebSocket.OPEN) this.ws?.close();\n\t\tif (this.ws && this.ws.close) this.ws?.close();\n\t}\n\n\t// 手动开启\n\tstart() {\n\t\tthis.isCustomClose = false;\n\t\tthis.reconnection();\n\t}\n\n\t// 订阅\n\tsubscribe(eventName: string, cb: Function) {\n\t\tthis.eventCenter.on(eventName, cb);\n\t}\n\n\t// 取消订阅\n\tunsubscribe(eventName: string, cb: Function) {\n\t\tthis.eventCenter.off(eventName, cb);\n\t}\n\n\t// 销毁\n\tdestroy() {\n\t\tclearTimeout(this.timeId);\n\t\tthis.close();\n\t\tthis.ws = null;\n\t\tthis.errorStack = null;\n\t\tthis.eventCenter = null;\n\t\t// this.isCustomClose = true;\n\t\tthis.webSocketState = false;\n\t}\n}\n"],"names":["async","baseRequest","url","method","data","config","headers","responseType","signal","noAuth","fullUrl","params","query","URLSearchParams","Object","entries","forEach","key","value","append","String","toString","buildQuery","token","auth.getToken","noLoading","showFullScreenLoading","res","fetch","body","JSON","stringify","hideFullScreenLoading","ok","errorMessage","errorData","json","resultMsg","_","status","Error","text","blob","yxFecth","get","post","put","delete","clientOptions","mqttVersion","clean","connectTimeout","keepAlive","clientId","Date","now","qos","subscribeMap","Map","MQ","constructor","options","__publicField","this","client","subscribe","unsubscribe","publish","destroyed","createClient","mqtt.connect","on","onConnect","onReconnect","onError","onMessage","topic","message","e","callback","error","set","parse","end","Ws","protocols","webSocketState","isCustomClose","reconnectTime","heartBeatTime","waitBeatTime","msgDataPreHandler","onmessage","heartMessage","HEART_KEY","HEART_VALUE","ws","isReconnectionLoading","createWs","window","WebSocket","onopen","onerror","onclose","startHeartBeat","time","setTimeout","getTime","send","waitingServer","close","start","err","reconnection","event","rawData","clearTimeout","timeId","_a","eventName","cb","eventCenter","off","destroy","errorStack"],"mappings":"6VAeAA,eAAeC,EAAqBC,EAAaC,EAAoBC,EAAYC,EAAwB,CAAA,GAClG,MAAAC,QAAEA,EAAU,CAAA,EAAAC,aAAIA,EAAe,OAAQC,OAAAA,EAAAC,OAAQA,GAAS,GAAUJ,EAClEK,EAAqB,QAAXP,EAAmB,GAAGD,IAbvC,SAAoBS,GACf,IAACA,EAAe,MAAA,GACd,MAAAC,EAAQ,IAAIC,gBAMX,OALAC,OAAAC,QAAQJ,GAAQK,SAAQ,EAAEC,EAAKC,MACjCA,SACHN,EAAMO,OAAOF,EAAKG,OAAOF,GAAM,IAG1B,IAAIN,EAAMS,YAClB,CAI6CC,CAAWlB,KAAU,GAAGF,IAC9DqB,EAAQC,EAAAA,WACTnB,EAAOoB,WACWC,0BAEjB,MAAAC,QAAYC,MAAMlB,EAAS,CAChCP,SACAG,QAAS,CACR,eAAgB,sBACZiB,IAAUd,EAAS,CAAEc,SAAiB,MACvCjB,GAEJuB,KAAiB,QAAX1B,GAAoBC,EAAO0B,KAAKC,UAAU3B,QAAQ,EACxDI,WAIG,GAFkBwB,2BAEjBL,EAAIM,GAAI,CACZ,IAAIC,EAAe,GACf,IACG,MAAAC,QAAkBR,EAAIS,cACxBD,WAAWE,aACdH,EAAeC,EAAUE,iBAElBC,GAAG,CAEN,oBADMX,EAAIY,OAAQL,GAClB,IAAIM,MAAMN,EAAY,CAG7B,OAAQ3B,GACP,IAAK,OACJ,OAAOoB,EAAIc,OACZ,IAAK,OACJ,OAAOd,EAAIe,OACZ,QACC,OAAOf,EAAIS,OAEd,CAEO,MAAMO,EAAU,CACtBC,IAAK,CAAU1C,EAAaS,EAA8BN,IAA2BJ,EAAeC,EAAK,MAAOS,EAAQN,GAExHwC,KAAM,CAAU3C,EAAaE,EAAYC,IAA2BJ,EAAeC,EAAK,OAAQE,EAAMC,GAEtGyC,IAAK,CAAU5C,EAAaE,EAAYC,IAA2BJ,EAAeC,EAAK,MAAOE,EAAMC,GAEpG0C,OAAQ,CAAU7C,EAAaE,EAAYC,IAA2BJ,EAAeC,EAAK,SAAUE,EAAMC,ICnDrG2C,EAA+B,CACpCC,YAAa,EACbC,OAAO,EACPC,eAAgB,IAChBC,UAAW,GACXC,SAAU,UAAYC,KAAKC,MAG3BC,IAAK,GAEAC,MAAmBC,IACzB,MAAMC,EAEL,WAAAC,CAAY1D,EAAa2D,GADzBC,EAAAC,KAAA,UAECA,KAAKC,OAAS,KACdD,KAAKE,UAAYF,KAAKE,UACtBF,KAAKG,YAAcH,KAAKG,YACxBH,KAAKI,QAAUJ,KAAKI,QACpBJ,KAAKK,UAAYL,KAAKK,UACtBL,KAAKM,aAAanE,EAAK,IAAK8C,KAAkBa,GAAS,CAExD,YAAAQ,CAAanE,EAAa2D,GACzBE,KAAKC,OAASM,0BAAapE,EAAK2D,GAChCE,KAAKC,OAAOO,GAAG,UAAWR,KAAKS,WAC/BT,KAAKC,OAAOO,GAAG,YAAaR,KAAKU,aACjCV,KAAKC,OAAOO,GAAG,QAASR,KAAKW,SAC7BX,KAAKC,OAAOO,GAAG,UAAWR,KAAKY,UAAS,CAEzC,OAAAR,CAAQS,EAAeC,GACjBd,KAAAC,OAAOG,QAAQS,EAAOC,EAAS,CAAErB,IAAKR,EAAcQ,MAAQsB,IAAD,GAI/D,CAEF,SAAAb,CAAUW,EAAOG,GACXhB,KAAAC,OAAOC,UAAUW,GAAgBI,IACrC,GAAKA,EAIE,MAAA,IAAIxC,MAAMwC,GAHHvB,EAAAwB,IAAIL,EAAOG,EAGH,GAEtB,CAEF,WAAAb,CAAYU,GACXb,KAAKC,OAAOE,YAAYU,EAAO,IAAaI,IAAT,GAMlC,CAEF,SAAAR,CAAUM,GAAG,CAGb,WAAAL,CAAYO,GAAO,CAGnB,OAAAN,CAAQM,GAAO,CAGf,SAAAL,CAAUC,EAAOC,GACV,MAAAzE,EAAOyE,EAAQxD,WACrBoC,EAAab,IAAIgC,EAAjBnB,CAAwB3B,KAAKoD,MAAM9E,GAAK,CAEzC,SAAAgE,GACKL,KAAKC,OAAOmB,KAAKpB,KAAKC,OAAOmB,KAAI,EC/EvC,MAAqBC,EAkBpB,WAAAxB,CAAYC,EAAuBwB,GAjBnCvB,EAAAC,KAAA,OACAD,EAAAC,KAAA,aACAD,EAAAC,KAAA,kBACAD,EAAAC,KAAA,iBACAD,EAAAC,KAAA,iBACAD,EAAAC,KAAA,iBACAD,EAAAC,KAAA,gBACAD,EAAAC,KAAA,YACAD,EAAAC,KAAA,aACAD,EAAAC,KAAA,eACAD,EAAAC,KAAA,MACAD,EAAAC,KAAA,yBACAD,EAAAC,KAAA,UACAD,EAAAC,KAAA,eACAD,EAAAC,KAAA,cACAD,EAAAC,KAAA,gBACAD,EAAAC,KAAA,qBAECA,KAAK7D,IAAM2D,EAAQ3D,IACnB6D,KAAKsB,UAAYA,EACjBtB,KAAKuB,gBAAiB,EACtBvB,KAAKwB,eAAgB,EACrBxB,KAAKyB,cAAgB3B,EAAQ2B,cAC7BzB,KAAK0B,cAAgB5B,EAAQ4B,cAC7B1B,KAAK2B,aAAe7B,EAAQ6B,aAC5B3B,KAAKgB,SAAWlB,EAAQkB,SACpBlB,EAAQ8B,oBACX5B,KAAK4B,kBAAoB9B,EAAQ8B,mBAElC5B,KAAK6B,UAAY7B,KAAK6B,UACtB7B,KAAK8B,aAAehC,EAAQgC,aAC5B9B,KAAK+B,UAAYjC,EAAQiC,UACzB/B,KAAKgC,YAAclC,EAAQkC,YAC3BhC,KAAKiC,GAAK,KACVjC,KAAKkC,uBAAwB,EAC7BlC,KAAKmC,UAAS,CAGf,QAAAA,GACK,cAAeC,SAElBpC,KAAKiC,GAAK,KACVjC,KAAKiC,GAAK,IAAII,UAAUrC,KAAK7D,IAAK6D,KAAKsB,WAEvCtB,KAAKsC,SACLtC,KAAKuC,UACLvC,KAAKwC,UACLxC,KAAK6B,YAGN,CAID,MAAAS,GACMtC,KAAAiC,GAAGK,OAAS,KAEhBtC,KAAKuB,gBAAiB,EACjBvB,KAAAyC,eAAezC,KAAK0B,cAAa,CACvC,CAED,cAAAe,CAAeC,GACdC,YAAW,KACL3C,KAAA8B,eAAiB9B,KAAK8B,aAAazF,MAAA,IAAWkD,MAAOqD,UAAY,IACtE5C,KAAK6C,KAAK7C,KAAK8B,aAAe9B,KAAK8B,aAAe9B,KAAK+B,WACvD/B,KAAK8C,eAAc,GACjBJ,EAAI,CAGR,aAAAI,GACC9C,KAAKuB,gBAAiB,EACtBoB,YAAW,KACV,GAAI3C,KAAKuB,eACHvB,KAAAyC,eAAezC,KAAK0B,oBAItB,IACH1B,KAAK+C,QACD/C,KAAKiC,IACRjC,KAAKgD,cAEEjC,GAAG,IAGVf,KAAK2B,aAAY,CAGrB,OAAAY,GACMvC,KAAKiC,KACLjC,KAAAiC,GAAGM,QAAiBU,IAGxBjD,KAAKwB,eAAgB,EACrBxB,KAAKkC,uBAAwB,CAAA,EAC9B,CAID,OAAAM,GACMxC,KAAKiC,KACLjC,KAAAiC,GAAGO,QAAU,KAGbxC,KAAKwB,eACLxB,KAAKiC,KAGRjC,KAAKkD,eACLlD,KAAKkC,uBAAwB,EAAA,EAE/B,CAID,eAAML,GACA7B,KAAKiC,KACLjC,KAAAiC,GAAGJ,UAAY5F,MAAMkH,IACrB,IACH,IAAIC,EAAUD,EAAM9G,KAKhB,GAJA2D,KAAK4B,yBACF5B,KAAK4B,kBAAkBwB,GAG1BA,IAAYpD,KAAKgC,YAEpB,YADAhC,KAAKuB,gBAAiB,GAIjB,MAAAlF,EAAO0B,KAAKoD,MAAMiC,GACxBpD,KAAKgB,SAAS3E,SACN4E,GAEHjB,KAAAgB,SAASmC,EAAM9G,KAAI,GAE1B,CAID,YAAA6G,GAEKlD,KAAKkC,wBACTlC,KAAKkC,uBAAwB,EAC7BmB,aAAarD,KAAKsD,QAClBtD,KAAKsD,OAAS,KACTtD,KAAAsD,OAASX,YAAW,KACxB3C,KAAKmC,UAAS,GACZnC,KAAKyB,eAAa,CAItB,IAAAoB,CAAK/B,GACAd,KAAKuB,gBAAkBvB,KAAKiC,IAC1BjC,KAAAiC,GAAGY,KAAK/B,EACd,CAID,KAAAiC,SACC/C,KAAKwB,eAAgB,EACrBxB,KAAKkC,uBAAwB,EAEzBlC,KAAKiC,IAAMjC,KAAKiC,GAAGc,QAAO,OAAAQ,EAAAvD,KAAKiC,KAAIsB,EAAAR,QAAM,CAI9C,KAAAC,GACChD,KAAKwB,eAAgB,EACrBxB,KAAKkD,cAAa,CAInB,SAAAhD,CAAUsD,EAAmBC,GACvBzD,KAAA0D,YAAYlD,GAAGgD,EAAWC,EAAE,CAIlC,WAAAtD,CAAYqD,EAAmBC,GACzBzD,KAAA0D,YAAYC,IAAIH,EAAWC,EAAE,CAInC,OAAAG,GACCP,aAAarD,KAAKsD,QAClBtD,KAAK+C,QACL/C,KAAKiC,GAAK,KACVjC,KAAK6D,WAAa,KAClB7D,KAAK0D,YAAc,KAEnB1D,KAAKuB,gBAAiB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs3.js","sources":["../packages/yxIcon/index.ts"],"sourcesContent":["/*\n * @Author: WangXin\n * @Date: 2024-04-11 14:07:04\n * @LastEditors: WangXin\n * @LastEditTime: 2024-04-15 15:34:49\n * @FilePath: /yxuse/packages/yxIcon/index.ts\n * @Description:\n *\n * Copyright (c) 2024 by YuXing, All Rights Reserved.\n */\nimport type { App } from \"vue\";\nimport { assets } from \"@packages/api\";\nconst ICON_GROUP_NAME = \"yxIcon\";\nconst initYxIcon = () => {\n\tgetYxIconGroupUuid();\n\t// combineYxIconStr();\n};\nconst getYxIconGroupUuid = async () => {\n\tconst { data } = await assets.getGroupListApi();\n\tconst groupUuid = data.find((item: any) => item.groupName === ICON_GROUP_NAME)?.groupUuid;\n\tgetYxIconFileContent(groupUuid);\n};\nconst getYxIconFileContent = async (groupUuid: string) => {\n\tconst { data } = await assets.getResourceListApi(groupUuid, 1);\n\tcombineYxIconStr(data);\n\treturn data;\n};\nconst combineYxIconStr = (data: any) => {\n\tconst svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n\tsvg.setAttribute(\"xmlns\", \"http://www.w3.org/2000/svg\");\n\tsvg.setAttribute(\"xmlns:xlin\", \"http://www.w3.org/1999/xlink\");\n\tlet svgHtml = \"\";\n\tdata.forEach((svgElement: any) => {\n\t\tsvgHtml += svgElement.text\n\t\t\t.replace(/\\\\/g, \"\")\n\t\t\t.trim()\n\t\t\t.replace(/^\"(.*)\"$/, \"$1\");\n\t});\n\tsvg.innerHTML = svgHtml;\n\tsvg.style.position = \"absolute\";\n\tsvg.style.width = \"0\";\n\tsvg.style.height = \"0\";\n\tdocument.head.appendChild(svg);\n};\nexport default {\n\tinstall: function (app: App<Element>) {\n\t\tinitYxIcon();\n\t}\n};\n"],"names":["getYxIconGroupUuid","async","data","assets.getGroupListApi","groupUuid","_a","find","item","groupName","getYxIconFileContent","assets.getResourceListApi","combineYxIconStr","svg","document","createElementNS","setAttribute","svgHtml","forEach","svgElement","text","replace","trim","innerHTML","style","position","width","height","head","appendChild","index","install","app"],"mappings":"+JAiBMA,EAAqBC,gBAC1B,MAAMC,KAAEA,SAAeC,oBACjBC,EAAY,OAAAC,IAAKC,MAAMC,GAPN,WAOoBA,EAAKC,kBAAgC,EAAAH,EAAAD,UAChFK,EAAqBL,EAAS,EAEzBK,EAAuBR,MAAOG,IACnC,MAAMF,KAAEA,SAAeQ,EAAAA,mBAA0BN,EAAW,GAErD,OADPO,EAAiBT,GACVA,CAAA,EAEFS,EAAoBT,IACzB,MAAMU,EAAMC,SAASC,gBAAgB,6BAA8B,OAC/DF,EAAAG,aAAa,QAAS,8BACtBH,EAAAG,aAAa,aAAc,gCAC/B,IAAIC,EAAU,GACTd,EAAAe,SAASC,IACFF,GAAAE,EAAWC,KACpBC,QAAQ,MAAO,IACfC,OACAD,QAAQ,WAAY,KAAI,IAE3BR,EAAIU,UAAYN,EAChBJ,EAAIW,MAAMC,SAAW,WACrBZ,EAAIW,MAAME,MAAQ,IAClBb,EAAIW,MAAMG,OAAS,IACVb,SAAAc,KAAKC,YAAYhB,EAAG,EAEfiB,EAAA,CACdC,QAAS,SAAUC,GA/BA/B,GAgCP"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs4.js","sources":["../packages/api/index.ts"],"sourcesContent":["/*\n * @Author: WangXin\n * @Date: 2023-08-17 09:30:47\n * @LastEditors: WangXin\n * @LastEditTime: 2024-08-15 18:45:26\n * @FilePath: /yxuse/packages/api/index.ts\n * @Description:\n *\n * Copyright (c) 2023 by YuXing, All Rights Reserved.\n */\nimport * as auth from \"./auth/index\";\nimport * as assets from \"./modules/assets/index\";\nexport { auth, assets };\nimport http from \"@packages/utils/http\";\nimport { URL } from \"@packages/config\";\n\n/**\n * 获取用户可选择的星\n *\n */\nexport const getUserSelectSatelliteList = async (systemName = \"ttc\") => {\n\tconst data = await http.get<any>(`${URL[systemName].INTEGRATED_BASE_URL}/basic/data/satellite/select`);\n\treturn data;\n};\n\n/**\n * 获取用户可选择的测站\n *\n */\nexport const getUserSelectAnteList = async (systemName = \"ttc\") => {\n\tconst data = await http.get<any>(`${URL[systemName].INTEGRATED_BASE_URL}/basic/data/ante/select`);\n\treturn data;\n};\n\n/**\n * 获取用户可选择的主题\n *\n */\nexport const getUserThemeList = async (systemName = \"ttc\") => {\n\treturn await http.get<any>(`${URL[systemName].INTEGRATED_BASE_URL}/theme/list`, {}, { headers: { noLoading: true } });\n};\n\nexport const getCommentUntreatedCount = async (systemName = \"ttc\") => {\n\treturn await http.get<any>(`${URL[systemName].INTEGRATED_BASE_URL}/workorder/comment/untreated/count`);\n};\n"],"names":["getUserSelectSatelliteList","async","systemName","http","get","URL","INTEGRATED_BASE_URL","getUserSelectAnteList","getUserThemeList","headers","noLoading","getCommentUntreatedCount"],"mappings":"+EAoBaA,EAA6BC,MAAOC,EAAa,cAC1CC,EAAKA,KAAAC,IAAS,GAAGC,EAAIA,IAAAH,GAAYI,mDAQxCC,EAAwBN,MAAOC,EAAa,cACrCC,EAAKA,KAAAC,IAAS,GAAGC,EAAIA,IAAAH,GAAYI,8CAQxCE,EAAmBP,MAAOC,EAAa,cACtCC,EAAKA,KAAAC,IAAS,GAAGC,EAAAA,IAAIH,GAAYI,iCAAkC,GAAI,CAAEG,QAAS,CAAEC,WAAW,KAGhGC,EAA2BV,MAAOC,EAAa,cAC9CC,EAAAA,KAAKC,IAAS,GAAGC,MAAIH,GAAYI"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs5.js","sources":["../packages/theme/config.ts","../packages/components/YxTablePro/index.tsx","../packages/components/Toolbar/src/utils/mounted.ts","../packages/components/Toolbar/src/index.config.ts","../packages/components/Toolbar/src/utils/move.ts","../packages/components/Toolbar/src/svg/theme.svg","../packages/components/Toolbar/src/svg/issue.svg","../packages/components/Toolbar/src/svg/lang.svg","../packages/translate/db.js","../packages/translate/utils.js","../packages/translate/api.js","../packages/translate/index.ts","../packages/components/Toolbar/src/components/Badge.vue","../packages/components/Toolbar/src/components/ToolbarContainer.vue","../packages/components/Toolbar/src/svg/menu.svg","../packages/components/Toolbar/src/index.vue","../packages/components/Toolbar/index.ts","../packages/theme/index.ts","../packages/bc/index.ts"],"sourcesContent":["/*\n * @Author: WangXin\n * @Date: 2023-08-21 16:05:51\n * @LastEditors: WangXin\n * @LastEditTime: 2024-11-20 09:27:35\n * @FilePath: /yxuse/packages/theme/config.ts\n * @Description:\n *\n * Copyright (c) 2023 by YuXing, All Rights Reserved.\n */\n//标题\nconst YX_TITLE =\n\t\"@font-face {font-family: 'YX-TITLE';font-size: 16px; src: url('https://yx-picture.obs.cn-north-4.myhuaweicloud.com/ttc/bucket/1699612675710_ALIBABAPUHUITI-2-105-HEAVY.TTF') format('woff'), url('https://yx-picture.obs.cn-north-4.myhuaweicloud.com/ttc/bucket/1699612675710_ALIBABAPUHUITI-2-105-HEAVY.TTF') format('woff2'); font-style: normal;font-display: swap;}\";\n//特殊标题\nconst YX_SP_TITLE =\n\t\"@font-face { font-family: 'YX-SP-TITLE'; font-size: 16px; src: url('https://yx-picture.obs.cn-north-4.myhuaweicloud.com/ttc/bucket/1699844184489_bt.ttf') format('woff'),url('https://yx-picture.obs.cn-north-4.myhuaweicloud.com/ttc/bucket/1699844184489_bt.ttf') format('woff2');font-style: normal; font-display: swap}\";\n//普通文字\nconst YX_TEXT =\n\t\"@font-face {font-family: 'YX-TEXT'; font-size: 16px;src: url('https://yx-picture.obs.cn-north-4.myhuaweicloud.com/ttc/bucket/1699611032932_ALIBABAPUHUITI-2-65-MEDIUM.TTF') format('woff'),url('https://yx-picture.obs.cn-north-4.myhuaweicloud.com/ttc/bucket/1699611032932_ALIBABAPUHUITI-2-65-MEDIUM.TTF') format('woff2'); font-style: normal; font-display: swap;}\";\n\n//繁体字\nconst YX_TEXT_HK =\n\t\"@font-face {font-family: 'PingFang SC'; font-size: 16px;src: url('https://yx-picture.obs.cn-north-4.myhuaweicloud.com/ttc/bucket/苹方-繁 中黑体.otf') format('woff'),url('https://yx-picture.obs.cn-north-4.myhuaweicloud.com/ttc/bucket/苹方-繁 中黑体.otf') format('woff2'); font-style: normal; font-display: swap}\";\n\nexport const ttcFontFamily = YX_TITLE + YX_SP_TITLE + YX_TEXT + YX_TEXT_HK;\n\nexport const defaultConfig = {\n\tloginUrl: \"/ttc/cloud/#/login\",\n\thomeUrl: \"/ttc/cloud/#/cloud\",\n\tlang: \"zh\", //默认语言\n\tthemeApiUrl: \"/gateway/integrated-management/api/v1/theme/list\",\n\tloginApiUrl: \"/gateway/integrated-management/api/v1/account/login\",\n\ttranslateApiUrl: \"/gateway/integrated-management/api/v1/translate/get\",\n\tuserConfigApiUrl: \"/gateway/integrated-management/api/v1/basic/data/frontendConfig\",\n\tenvironment: \"production\",\n\tisRenderToolbar: true,\n\tisRenderIssue: true,\n\tisRenderLang: false,\n\tsystemKey: \"\",\n\tisTranslateApi: false,\n\twhitelistTranslateApi: []\n};\n","/*\n * @Author: WangXin\n * @Date: 2025-05-28 16:31:24\n * @LastEditors: WangXin\n * @LastEditTime: 2025-06-03 15:19:04\n * @FilePath: /yxuse/packages/components/YxTablePro/index.tsx\n * @Description:\n *\n * Copyright (c) ${2024} by YuXing, All Rights Reserved.\n */\nimport { defineComponent, ref, onMounted, nextTick, onBeforeMount, resolveComponent, withModifiers, watch } from \"vue\";\nimport type { PropType } from \"vue\";\nimport type { YxTableProProps, TableProColumn } from \"./type\";\nimport Sortable from \"sortablejs\";\nconst tableProRef = ref();\n/***渲染动态组件 */\nconst dynamicComponent = (column: TableProColumn, { rowData }: any) => {\n\tconst { renderType, event = {}, prop, label, config = {} } = column;\n\tif (!prop || !renderType) return null;\n\tconst Component = resolveComponent(\"el-\" + renderType) as any;\n\tconst { options = [], ...restConfig } = config;\n\t// 渲染子组件(如 select 的 options)\n\tconst renderChildComponent = () => {\n\t\tif (!options || options.length === 0) return null;\n\t\tif (renderType === \"select\") {\n\t\t\treturn options.map((item: any) => <el-option label={item.label} value={item.value} key={item.value} />);\n\t\t}\n\t\tif (renderType === \"radio-group\") {\n\t\t\treturn options.map((item: any) => (\n\t\t\t\t<el-radio label={item.value} key={item.value}>\n\t\t\t\t\t{item.label}\n\t\t\t\t</el-radio>\n\t\t\t));\n\t\t}\n\t\treturn null;\n\t};\n\t// 单独处理 cascader\n\tif (renderType === \"cascader\") {\n\t\treturn <el-cascader v-model={rowData[prop]} placeholder={`请选择${label}`} options={options} {...event} {...restConfig} />;\n\t}\n\t// 通用组件渲染\n\tconst isSelect = [\"select\", \"cascader\"].includes(renderType);\n\n\tconst modelValue = rowData[prop];\n\tconst updateModelValue = (val: any) => {\n\t\t//处理配置是数值类型\n\t\trowData[prop] = config?.type === \"number\" ? Number(val) : val;\n\t};\n\tconst component = (\n\t\t<Component\n\t\t\tmodelValue={modelValue}\n\t\t\tonUpdate:modelValue={updateModelValue}\n\t\t\tplaceholder={`请${isSelect ? \"选择\" : \"输入\"}${label}`}\n\t\t\t{...event}\n\t\t\t{...restConfig}\n\t\t>\n\t\t\t{renderChildComponent()}\n\t\t</Component>\n\t);\n\treturn component;\n\t// if (!isFormCell) return component;\n\t// //编辑表格\n\t// return renderForm(prop, $index, component);\n};\n/**远程加载下拉数据 */\nconst loadOptions = async (config: any) => {\n\tif (config?.options && config?.options.length === 0 && config?.loadOptions && typeof config?.loadOptions === \"function\") {\n\t\tconfig.options = await config?.loadOptions();\n\t}\n};\n\nconst YxTablePro = defineComponent({\n\tname: \"YxTablePro\",\n\tprops: {\n\t\ttableData: {\n\t\t\ttype: Array as PropType<YxTableProProps[\"tableData\"]>,\n\t\t\tdefault: () => []\n\t\t},\n\t\trowKey: {\n\t\t\ttype: String as PropType<YxTableProProps[\"rowKey\"]>,\n\t\t\tdefault: \"\",\n\t\t\trequired: false\n\t\t},\n\t\tcolumns: {\n\t\t\ttype: [Array, Function] as PropType<YxTableProProps[\"columns\"]>,\n\t\t\tdefault: () => []\n\t\t},\n\t\tpageInfo: {\n\t\t\ttype: Object as PropType<YxTableProProps[\"pageInfo\"]>,\n\t\t\tdefault: () => {},\n\t\t\trequired: false\n\t\t},\n\t\tsort: {\n\t\t\ttype: Boolean as PropType<YxTableProProps[\"sort\"]>,\n\t\t\tdefault: false,\n\t\t\trequired: false\n\t\t}\n\t},\n\temits: [\"operate-handle\", \"update-page\", \"sort-end\"],\n\tsetup(props: YxTableProProps, { emit, attrs, expose }) {\n\t\tconst columns = ref<any>([]);\n\t\tconst { tableData, rowKey, pageInfo } = props;\n\t\tonBeforeMount(() => {\n\t\t\tinitTable();\n\t\t});\n\t\tonMounted(() => {\n\t\t\tnextTick(() => {\n\t\t\t\tstartSort();\n\t\t\t});\n\t\t});\n\t\twatch(\n\t\t\t() => props.columns,\n\t\t\t() => {\n\t\t\t\tinitTable();\n\t\t\t}\n\t\t);\n\t\texpose({\n\t\t\ttableProRef\n\t\t});\n\t\t/**Columns转换 */\n\t\tconst initTable = async () => {\n\t\t\tconst columnsList = typeof props.columns === \"function\" ? await props.columns() : props.columns;\n\t\t\tcolumns.value = columnsList\n\t\t\t\t.filter(cell => !cell.show || cell.show(cell))\n\t\t\t\t.map((col: TableProColumn) => {\n\t\t\t\t\tconst { width, ...res } = col;\n\t\t\t\t\tif (col?.renderType && [\"select\", \"cascader\"].includes(col?.renderType) && col?.config?.loadOptions) {\n\t\t\t\t\t\tloadOptions(col.config);\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tflexGrow: width ? 0 : 1,\n\t\t\t\t\t\twidth: width ?? 100,\n\t\t\t\t\t\tcellRenderer: (scope: any) => getCellRenderer(col, scope),\n\t\t\t\t\t\theaderCellRenderer: col.headerRender ?? null,\n\t\t\t\t\t\ttitle: col.label,\n\t\t\t\t\t\tdataKey: col.prop,\n\t\t\t\t\t\tkey: col.prop,\n\t\t\t\t\t\t...res\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t};\n\t\t/**排序 */\n\t\tconst startSort = () => {\n\t\t\tif (!props.sort) return;\n\t\t\tconst sortDom = tableProRef.value?.$el?.querySelector(\".el-table-v2__body\").children[0]?.children[0];\n\t\t\tSortable.create(sortDom, {\n\t\t\t\tanimation: 200,\n\t\t\t\tsort: true,\n\t\t\t\thandle: props.sortHandle ? `.${props.sortHandle}` : null,\n\t\t\t\tonEnd: ({ oldIndex, newIndex }: { oldIndex: number; newIndex: number }) => {\n\t\t\t\t\temit(\"sort-end\", oldIndex, newIndex);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\t\tconst getCellRenderer = (cell: TableProColumn, scope: any) => {\n\t\t\tif (cell?.renderType === \"operate\") return renderOperate(cell, scope);\n\t\t\t//处理动态渲染的组件,绑定动态row\n\t\t\tif (cell?.renderType && cell?.renderType !== \"operate\") {\n\t\t\t\treturn dynamicComponent(cell, scope);\n\t\t\t}\n\t\t\tif (cell?.render) return cell.render(scope, scope.rowIndex, cell);\n\t\t\tif (cell.type === \"index\") return <span class=\"w-full\">{scope.rowIndex + 1}</span>;\n\t\t\treturn scope.rowData[scope.column.dataKey];\n\t\t};\n\t\t/**渲染操作栏 */\n\t\tconst renderOperate = (cell: TableProColumn, { rowIndex, rowData }: any) => {\n\t\t\treturn (\n\t\t\t\t<div class={`flex justify-center items-center cursor-pointer gap-10 ${cell.config?.className ?? \"\"}`}>\n\t\t\t\t\t{cell.operate\n\t\t\t\t\t\t?.filter(op => !op.show || op.show(rowData))\n\t\t\t\t\t\t.map(op => {\n\t\t\t\t\t\t\tif (op?.render) return op.render(rowData, rowIndex);\n\t\t\t\t\t\t\tconst disabled = typeof op?.disabled === \"function\" ? op.disabled(rowData, rowIndex) : op?.disabled ?? false;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tonClick={withModifiers(() => {\n\t\t\t\t\t\t\t\t\t\tif (!disabled) {\n\t\t\t\t\t\t\t\t\t\t\top?.onClick && op?.onClick(rowData, rowIndex);\n\t\t\t\t\t\t\t\t\t\t\temit(\"operate-handle\", op.key, rowData, rowIndex);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}, [\"stop\"])}\n\t\t\t\t\t\t\t\t\tclass={`table-handle whitespace-nowrap ${op?.className ?? \"\"} ${disabled ? \"table-handle-disabled\" : \"\"}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{op.label}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t);\n\t\t};\n\t\t//分页\n\t\tconst pagination = () => {\n\t\t\tif (!pageInfo || pageInfo.total === 0) return null;\n\t\t\tconst handleSizeChange = (e: number) => {\n\t\t\t\temit(\"update-page\", \"pageSize\", e);\n\t\t\t};\n\t\t\tconst handleCurrentChange = (e: number) => {\n\t\t\t\temit(\"update-page\", \"pageIndex\", e);\n\t\t\t};\n\t\t\treturn (\n\t\t\t\t<div class=\"pagination-wrap\">\n\t\t\t\t\t<el-pagination\n\t\t\t\t\t\tv-model:currentPage={pageInfo.pageIndex}\n\t\t\t\t\t\tv-model:pageSize={pageInfo.pageSize}\n\t\t\t\t\t\tsmall={false}\n\t\t\t\t\t\tdisabled={false}\n\t\t\t\t\t\tpage-sizes={[10, 20, 50, 100]}\n\t\t\t\t\t\tlayout={pageInfo?.layout ? pageInfo?.layout : \"total,sizes,prev, pager, next\"}\n\t\t\t\t\t\tbackground={false}\n\t\t\t\t\t\ttotal={pageInfo.total}\n\t\t\t\t\t\tonSizeChange={handleSizeChange}\n\t\t\t\t\t\tonCurrentChange={handleCurrentChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t);\n\t\t};\n\t\tconst getTableHeight = (height: number) => height - (!pageInfo || pageInfo.total === 0 ? 0 : 52);\n\t\treturn () => {\n\t\t\treturn (\n\t\t\t\t<el-auto-resizer>\n\t\t\t\t\t{{\n\t\t\t\t\t\tdefault: ({ width, height }: { width: number; height: number }) => (\n\t\t\t\t\t\t\t<div class=\"w-full h-full\">\n\t\t\t\t\t\t\t\t<el-table-v2\n\t\t\t\t\t\t\t\t\tborder\n\t\t\t\t\t\t\t\t\trow-key={rowKey}\n\t\t\t\t\t\t\t\t\twidth={width}\n\t\t\t\t\t\t\t\t\theight={getTableHeight(height)}\n\t\t\t\t\t\t\t\t\tcolumns={columns.value}\n\t\t\t\t\t\t\t\t\tdata={tableData}\n\t\t\t\t\t\t\t\t\t{...attrs}\n\t\t\t\t\t\t\t\t\tref={tableProRef}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{pagination()}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)\n\t\t\t\t\t}}\n\t\t\t\t</el-auto-resizer>\n\t\t\t);\n\t\t};\n\t}\n});\nexport default YxTablePro;\nexport * from \"./type\";\n","Array.prototype.handler = function (func) {\n\treturn func(this);\n};\n","/*\n * @Author: WangXin\n * @Date: 2023-12-31 17:00:52\n * @LastEditors: WangXin\n * @LastEditTime: 2023-12-31 18:40:41\n * @FilePath: \\yxUse\\packages\\components\\Toolbar\\src\\index.config.ts\n * @Description:\n *\n * Copyright (c) 2023 by YuXing, All Rights Reserved.\n */\nimport { moveElement } from \"./utils/move\";\n\nexport enum PositionEnum {\n\t/** 左上 */\n\tLT = \"left-top\",\n\t/** 右上 */\n\tRT = \"right-top\",\n\t/** 左下 */\n\tLB = \"left-bottom\",\n\t/** 右下 */\n\tRB = \"right-bottom\"\n}\n\nexport interface DataType {\n\t/** 初始状态 */\n\tstatus: boolean;\n\t/** 容器Dom */\n\twrapDom?: HTMLElement | null;\n\t/** 面板dom */\n\tpanelDom?: HTMLElement | null;\n\t/** 悬浮球dom */\n\ttoolDom?: HTMLElement | null;\n\t/** 悬浮球位置属性 */\n\ttoolPos?: DOMRect;\n\t/** 面板位置属性 */\n\tpanelPos?: DOMRect;\n\tpanelWidth?: number;\n\tpanelHeight?: number;\n\tmousePoint?: { x: number; y: number };\n}\n\n/** 初始数据 */\nexport const initData: DataType = {\n\tstatus: false,\n\ttoolDom: null,\n\tpanelWidth: 200,\n\tpanelHeight: 200,\n\tmousePoint: { x: 0, y: 0 }\n};\n\n/**\n * 获取某个元素的dom\n */\nfunction getEleDom(selector: string): HTMLElement {\n\treturn document.querySelector(selector);\n}\n\nexport default {\n\tdata() {\n\t\treturn initData;\n\t},\n\tmounted() {\n\t\tthis.getAllDom();\n\t\tthis.move();\n\t},\n\tcomputed: {\n\t\tpanelWidthPX() {\n\t\t\treturn this.panelWidth + \"px\";\n\t\t},\n\t\tpanelHeightPX() {\n\t\t\treturn this.panelHeight + \"px\";\n\t\t}\n\t},\n\tmethods: {\n\t\t/** 获取所有的dom */\n\t\tgetAllDom() {\n\t\t\tthis.wrapDom = getEleDom(\"#toolbar-wrap\");\n\t\t\tthis.toolDom = getEleDom(\"#toolbar-wrap .tool\");\n\t\t\tthis.panelDom = getEleDom(\"#toolbar-wrap .panel\");\n\t\t},\n\n\t\t/** 加入移动元素方法 */\n\t\tmove() {\n\t\t\tmoveElement(this.toolDom);\n\t\t}\n\t}\n};\n","/*\n * @Author: WangXin\n * @Date: 2023-12-11 17:02:53\n * @LastEditors: WangXin\n * @LastEditTime: 2023-12-18 09:50:11\n * @FilePath: \\yxUse\\packages\\components\\Toolbar\\src\\utils\\move.js\n * @Description:\n *\n * Copyright (c) 2023 by YuXing, All Rights Reserved.\n */\n/**\n * 设置元素可拖拽\n */\nexport function moveElement(movedEle) {\n\t/** 移动状态 */\n\tlet move = false;\n\t/** 鼠标与当前元素的相对位置X */\n\tlet deltaLeft = 0;\n\t/** 鼠标与当前元素的相对位置Y */\n\tlet deltaTop = 0;\n\n\tmovedEle.onmousedown = e => {\n\t\tdeltaLeft = e.clientX - movedEle.offsetLeft;\n\t\tdeltaTop = e.clientY - movedEle.offsetTop;\n\t\tmove = false;\n\t\tconst handleMove = e => {\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tmove = true;\n\t\t\tconst cx = e.clientX;\n\t\t\tconst cy = e.clientY;\n\t\t\tlet dx = cx - deltaLeft;\n\t\t\tlet dy = cy - deltaTop;\n\t\t\tif (dx < 0) dx = 0;\n\t\t\tif (dy < 0) dy = 0;\n\t\t\tif (dx > document.body.clientWidth - movedEle.clientWidth) dx = document.body.clientWidth - movedEle.clientWidth;\n\t\t\tif (dy > document.body.clientHeight - movedEle.clientHeight) dy = document.body.clientHeight - movedEle.clientHeight;\n\t\t\tmovedEle.style.left = dx + \"px\";\n\t\t\tmovedEle.style.top = dy + \"px\";\n\t\t};\n\t\tconst up = () => {\n\t\t\tmove = false;\n\t\t\tdocument.removeEventListener(\"mousemove\", handleMove);\n\t\t\tdocument.removeEventListener(\"mouseup\", up);\n\t\t};\n\t\tdocument.addEventListener(\"mousemove\", handleMove);\n\t\tdocument.addEventListener(\"mouseup\", up);\n\t};\n}","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock, createStaticVNode as _createStaticVNode } from \"vue\"\n\nconst _hoisted_1 = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"50\",\n height: \"50\",\n fill: \"none\",\n viewBox: \"0 0 16 16\"\n}\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _cache[0] || (_cache[0] = [\n _createStaticVNode(\"<g stroke=\\\"currentColor\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"1.333\\\" clip-path=\\\"url(#a)\\\"><path d=\\\"M8 14.666c1.986 0 .778-2.954 2-4.333 1.042-1.176 4.666-.638 4.666-2.333A6.667 6.667 0 1 0 8 14.666Z\\\"></path><path d=\\\"M9.333 5.667a1 1 0 1 0 0-2 1 1 0 0 0 0 2ZM5.333 7a1 1 0 1 0 0-2 1 1 0 0 0 0 2ZM5.667 11.333a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\\\"></path></g><defs><clipPath id=\\\"a\\\"><path fill=\\\"#fff\\\" d=\\\"M0 0h16v16H0z\\\"></path></clipPath></defs>\", 2)\n ])))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"50\",\n height: \"50\",\n fill: \"none\",\n viewBox: \"0 0 16 16\"\n}\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _cache[0] || (_cache[0] = [\n _createElementVNode(\"g\", {\n stroke: \"currentColor\",\n \"stroke-linecap\": \"round\",\n \"stroke-width\": \"1.333\"\n }, [\n _createElementVNode(\"path\", {\n \"stroke-linejoin\": \"round\",\n d: \"M13.333 11v3a.667.667 0 0 1-.666.667H10.5M13.334 5.333V2a.667.667 0 0 0-.667-.667H3.334A.667.667 0 0 0 2.667 2v12c0 .368.298.666.667.666h2\"\n }),\n _createElementVNode(\"path\", { d: \"M5.333 5.333H10M7.667 14.667l5.667-7M5.333 8H8\" })\n ], -1)\n ])))\n}\nexport default { render: render }","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n width: \"1.2em\",\n height: \"1.2em\",\n viewBox: \"0 0 24 24\"\n}\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _cache[0] || (_cache[0] = [\n _createElementVNode(\"path\", {\n fill: \"currentColor\",\n d: \"m18.5 10 4.4 11h-2.155l-1.201-3h-4.09l-1.199 3h-2.154L16.5 10zM10 2v2h6v2h-1.968a18.2 18.2 0 0 1-3.62 6.301 15 15 0 0 0 2.336 1.707l-.751 1.878A17 17 0 0 1 9 13.725a16.7 16.7 0 0 1-6.201 3.548l-.536-1.929a14.7 14.7 0 0 0 5.327-3.042A18 18 0 0 1 4.767 8h2.24A16 16 0 0 0 9 10.877a16.2 16.2 0 0 0 2.91-4.876L2 6V4h6V2zm7.5 10.885L16.253 16h2.492z\"\n }, null, -1)\n ])))\n}\nexport default { render: render }","/*\n * @Author: WangXin\n * @Date: 2024-03-09 16:24:36\n * @LastEditors: WangXin\n * @LastEditTime: 2024-11-18 18:25:39\n * @FilePath: /yxuse/packages/translate/db.js\n * @Description:\n *\n * Copyright (c) 2024 by YuXing, All Rights Reserved.\n */\nimport localforage from \"localforage\";\nimport { auth } from \"@packages/api\";\nlocalforage.config({\n\tname: \"yxI18n\"\n});\nexport const dbSetItem = async (key, value) => {\n\tawait localforage.setItem(key, value);\n};\n\nexport const dbGetItem = async key => {\n\treturn await localforage.getItem(key);\n};\n\nexport const setLang = lang => {\n\tauth.changeSystemConfig(\"lang\", lang);\n};\n","/*\n * @Author: WangXin\n * @Date: 2024-02-23 09:50:04\n * @LastEditors: WangXin\n * @LastEditTime: 2024-06-06 14:51:15\n * @FilePath: /yxuse/packages/translate/utils.js\n * @Description:\n * Copyright (c) 2024 by YuXing, All Rights Reserved.\n */\nimport { getSystemConfig } from \"@packages/api/auth\";\nimport http from \"@packages/utils/http\";\nimport { MD5 } from \"./md5\";\nconst defaultApiUrl = {\n\tURL: \"/gateway/integrated-management/api/v1/translate/get\"\n};\nexport const config = {\n\tURL: getSystemConfig(\"translateApiUrl\") || defaultApiUrl.URL\n};\nexport const translate = async ({ words, systemFlag, toSource = \"en\", fromSource = \"zh\", translateApiUrl }) => {\n\ttry {\n\t\tconst { data } = await http.post(\n\t\t\ttranslateApiUrl ? translateApiUrl : config.URL,\n\t\t\t{\n\t\t\t\twords,\n\t\t\t\tsystemFlag,\n\t\t\t\ttoSource,\n\t\t\t\tfromSource\n\t\t\t},\n\t\t\t{ headers: { noLoading: true } }\n\t\t);\n\t\treturn data.dstMap || {};\n\t} catch (e) {\n\t\treturn null;\n\t}\n};\nfunction truncate(q) {\n\tvar len = q.length;\n\tif (len <= 20) return q;\n\treturn q.substring(0, 10) + len + q.substring(len - 10, len);\n}\n","/*\n * @Author: WangXin\n * @Date: 2024-11-18 17:41:58\n * @LastEditors: WangXin\n * @LastEditTime: 2024-11-18 18:35:59\n * @FilePath: /yxuse/packages/translate/api.js\n * @Description:\n *\n * Copyright (c) ${2024} by YuXing, All Rights Reserved.\n */\nimport { dbGetItem, dbSetItem } from \"./db\";\nimport { translate } from \"./utils\";\nimport { auth } from \"@packages/api\";\nconst sqlKey = `${auth.getSystemConfig(\"systemKey\")}_${window.lang}`;\nexport const whitelistApi = [\n\t\"/gateway/integrated-management/api/v1/theme/list\",\n\t\"/gateway/integrated-management/api/v1/translate/get\",\n\t...auth.getSystemConfig(\"whitelistTranslateApi\")\n];\nconst getYxI18nThesaurus = async () => {\n\tconst lang = await dbGetItem(\"lang\");\n\treturn await dbGetItem(`${auth.getSystemConfig(\"systemKey\")}_${lang}`);\n};\nexport const handleTranslation = async data => {\n\tlet result = JSON.stringify(data);\n\tconst chineseRegex = /[\\u4e00-\\u9fa5]+/g;\n\tconst matches = result.match(chineseRegex);\n\tconst yxI18nThesaurus = await getYxI18nThesaurus();\n\tlet waitWords = [];\n\tif (matches) {\n\t\tfor (const match of matches) {\n\t\t\t// 替换原始中文为翻译结果\n\t\t\tif (yxI18nThesaurus[match]) {\n\t\t\t\tresult = result.replace(new RegExp(match, \"g\"), yxI18nThesaurus[match]);\n\t\t\t} else {\n\t\t\t\tif (!waitWords.includes(match)) {\n\t\t\t\t\twaitWords.push(match);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (waitWords.length > 0) {\n\t\t\tconst i18nMap = await translatedText(waitWords);\n\t\t\twaitWords.forEach(word => {\n\t\t\t\tresult = result.replace(new RegExp(word, \"g\"), i18nMap[word]);\n\t\t\t});\n\t\t\tconst newYxI18nThesaurus = { ...yxI18nThesaurus, ...i18nMap };\n\t\t\tawait dbSetItem(sqlKey, newYxI18nThesaurus);\n\t\t\twaitWords = [];\n\t\t}\n\t}\n\n\treturn JSON.parse(result);\n};\n\nasync function translatedText(words) {\n\tconst result = await translate({ words, toSource: window.lang, systemFlag: auth.getSystemConfig(\"systemKey\") });\n\treturn result;\n}\n","import { dbSetItem, dbGetItem, setLang } from \"./db\";\nimport { translate } from \"./utils\";\nexport * from \"./api\";\nimport _ from \"lodash\";\nimport { BC } from \"@packages/index\";\nimport { BC_LANG_NAME } from \"@packages/config\";\nconst zhPattern = /[\\u4e00-\\u9fa5]+/; // 匹配中文字符的正则表达式\nlet TASK_CONTROL; // 更新任务队列控制\n// 排除svg标签\nconst excludeTag = [\"svg\", \"g\", \"path\", \"polyline\", \"circle\"];\nconst config = {\n\tchildList: true,\n\tsubtree: true,\n\tcharacterData: true,\n\tattributes: true,\n\tattributeFilter: [\"readonly\", \"placeholder\", \"aria-expanded\"]\n};\nlet observer; //观察者\nclass Translate {\n\tprivate from: string;\n\tpublic to: string;\n\tpublic yxI18nThesaurus: object;\n\tpublic systemKey: string;\n\tprivate asyncThesaurusList: Array<string>; //需要同步的词库列表\n\tprivate dbKey: string;\n\tprivate unknownWords: Array<string>;\n\tprivate unknownWordsNode: any;\n\tprivate rootDocument: any;\n\tprivate unknownWordsInputNode: any;\n\tpublic translateApiUrl: any;\n\tprivate maxWordsLength: number;\n\tconstructor() {\n\t\tthis.from = \"zh\"; //源语言\n\t\tthis.to = \"en\"; //目标语言\n\t\tthis.yxI18nThesaurus = {}; //当前语言的词库\n\t\tthis.systemKey = \"station-control\"; //系统标识\n\t\tthis.dbKey = \"\";\n\t\tthis.initTranslate = this.initTranslate.bind(this);\n\t\tthis.unknownWords = []; //词库未有的词汇\n\t\tthis.unknownWordsNode = new Map(); //未翻译的node节点\n\t\tthis.unknownWordsInputNode = new Map(); //未翻译的input节点\n\t\tthis.rootDocument = null;\n\t\tthis.translateApiUrl = null;\n\t\tthis.maxWordsLength = 100;\n\t}\n\tasync initTranslate({\n\t\tto,\n\t\tsystemKey,\n\t\ttranslateApiUrl,\n\t\tasyncThesaurusList\n\t}: {\n\t\tto: any;\n\t\tsystemKey: any;\n\t\ttranslateApiUrl?: any;\n\t}) {\n\t\t//目标语言为中文时直接刷新页面\n\t\tif (to === \"zh\") return;\n\t\tif (to === \"cht\") return this.handleTraditionalChinese();\n\t\tif (translateApiUrl) {\n\t\t\tthis.translateApiUrl = translateApiUrl;\n\t\t}\n\t\t//初始化配置\n\t\tconsole.log(\"开始初始化\");\n\t\tawait this.initConfig({ to, systemKey, asyncThesaurusList });\n\t\tconsole.log(\"初始化配置已完成\");\n\t\t//开启监听\n\t\tthis.observerRouteChange();\n\t\t//监听title变化\n\t\t// this.observerTitleChange();\n\t}\n\t// 繁体字处理\n\thandleTraditionalChinese() {\n\t\tdocument.body.style.fontFamily = \"PingFang SC\";\n\t\tdocument.body.style[\"font-variant-east-asian\"] = \"traditional\";\n\t\tdocument.documentElement.lang = \"zh-tw\";\n\t}\n\t//监听页面路由变化,说明发生了页面切换,再次进行全量翻译\n\tobserverRouteChange() {\n\t\tobserver = new MutationObserver(mutations => {\n\t\t\tif (mutations.length > 0) {\n\t\t\t\tmutations.forEach((mutation, index) => {\n\t\t\t\t\tswitch (mutation.type) {\n\t\t\t\t\t\tcase \"characterData\":\n\t\t\t\t\t\t\tthis.handleTextNodes(mutation.target);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"childList\":\n\t\t\t\t\t\t\t//说明当前更新的dom为新增节点或者删除节点\n\t\t\t\t\t\t\tthis.handleChildListMutation(mutation);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"attributes\":\n\t\t\t\t\t\t\tif (mutation.attributeName === \"placeholder\" && zhPattern.test(mutation.target.placeholder)) {\n\t\t\t\t\t\t\t\tthis.replaceInputValue(mutation.target, \"placeholder\");\n\t\t\t\t\t\t\t} else if (mutation.attributeName === \"readonly\") {\n\t\t\t\t\t\t\t\tthis.replaceInputValue(mutation.target, \"value\");\n\t\t\t\t\t\t\t\tthis.replaceInputValue(mutation.target, \"placeholder\");\n\t\t\t\t\t\t\t} else if (mutation.attributeName === \"aria-expanded\" && mutation.target.ariaExpanded === \"false\") {\n\t\t\t\t\t\t\t\t//处理el-cascader\n\t\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\t\tthis.replaceInputValue(mutation.target, \"value\");\n\t\t\t\t\t\t\t\t}, 0);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault: //考虑性能问题,暂时不考虑监听class变化\n\t\t\t\t\t\t\t// if (mutation.attributeName === 'class') {\n\t\t\t\t\t\t\t// if (mutation.target.className.includes('el-input')) {\n\t\t\t\t\t\t\t// hasCharacterDataMutation = true;\n\t\t\t\t\t\t\t// this.traversingNode(mutation.target);\n\t\t\t\t\t\t\t// } else {\n\t\t\t\t\t\t\t// console.log('下拉框选中值', mutation);\n\t\t\t\t\t\t\t// }\n\t\t\t\t\t\t\t// }\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t// 观察配置\n\t\t// 开始观察根元素,通常是#app或body\n\t\tobserver.observe(this.rootDocument, config);\n\t\t// 获取未处理的 DOM 变化记录\n\t\tconst unprocessedRecords = observer.takeRecords();\n\t\t// 手动处理未处理的记录\n\t\tif (unprocessedRecords.length > 0) {\n\t\t\tconsole.log(\"DOM变化检测到,未处理的Dom\", unprocessedRecords);\n\t\t\tunprocessedRecords.forEach(record => {\n\t\t\t\t// 处理未处理的记录\n\t\t\t});\n\t\t}\n\t}\n\t//处理纯文本节点\n\thandleTextNodes(node) {\n\t\tif (zhPattern.test(node?.data) || zhPattern.test(node?.nodeValue)) {\n\t\t\t//此处不使用replaceValue的原因是 文本节点在词库中不存在时重新赋值相同的值,会触发监听\n\t\t\tconst nodeValue = node.nodeValue.replace(/\\s/g, \"\");\n\t\t\tif (this.yxI18nThesaurus[nodeValue]) {\n\t\t\t\tnode.nodeValue = this.yxI18nThesaurus[nodeValue];\n\t\t\t} else {\n\t\t\t\tif (!this.unknownWords.includes(nodeValue) && nodeValue.length <= this.maxWordsLength) {\n\t\t\t\t\tthis.unknownWords.push(nodeValue);\n\t\t\t\t}\n\t\t\t\tthis.collectNeedsTranslateNode(node, nodeValue);\n\t\t\t}\n\t\t}\n\t}\n\t//处理监听节点是childList的情况,动态处理各种组件的情况\n\thandleChildListMutation(mutation) {\n\t\t//节点替换\n\t\tif (mutation.addedNodes.length > 0 && mutation.removedNodes.length > 0) {\n\t\t\treturn this.addedNode(mutation);\n\t\t}\n\t\t//删除节点不做处理\n\t\tif (mutation.removedNodes.length > 0 && mutation.removedNodes[0].id !== \"nprogress\") return;\n\t\t//处理新增节点\n\t\tthis.addedNode(mutation);\n\t}\n\t//节点新增\n\taddedNode(mutation) {\n\t\tif (mutation.addedNodes.length > 0) {\n\t\t\tconst tagName = mutation.target.tagName.toLowerCase();\n\t\t\tif (excludeTag.includes(tagName)) return;\n\t\t\tif (excludeTag.includes(mutation.addedNodes[0]?.tagName?.toLowerCase())) return;\n\t\t\tconst className = mutation.addedNodes[0]?.className;\n\n\t\t\tconst parentNodeValue = mutation.target.nodeValue; //当前节点的文本\n\t\t\tif (className && className !== \"\") {\n\t\t\t\t//messageBox\n\t\t\t\tif (className.includes(\"v-modal\")) {\n\t\t\t\t\t//如果当前新增的节点是遮罩层,则去替换他的兄弟节点\n\t\t\t\t\tthis.throttleTraversingNode(mutation.previousSibling);\n\t\t\t\t\t// this.startMicroTaskQueue();\n\t\t\t\t}\n\t\t\t\t//tooltip组件\n\t\t\t\telse if (className.includes(\"tooltip\")) {\n\t\t\t\t\tconsole.log(\"监听到了tooltip发生了更新!!!\", mutation.addedNodes[0]);\n\n\t\t\t\t\t// this.replaceValue(\"innerText\", mutation.addedNodes[0]);\n\t\t\t\t\tthis.throttleTraversingNode(mutation.addedNodes[0]);\n\t\t\t\t} else if (className.includes(\"message\")) {\n\t\t\t\t\tconsole.log(\"message组件更新!!\");\n\t\t\t\t\tthis.throttleTraversingNode(mutation.addedNodes[0]);\n\t\t\t\t\t// this.startMicroTaskQueue();\n\t\t\t\t}\n\t\t\t\t//如果有loading、message dom,则直接翻译兄弟节点 [\"message\",\"loading\"]\n\t\t\t\telse if (className.includes(\"loading\")) {\n\t\t\t\t\tthis.throttleTraversingNode(mutation.addedNodes[0]);\n\t\t\t\t}\n\t\t\t\t//如果当前元素中有nodeValue,就进行替换\n\t\t\t\telse if (parentNodeValue) {\n\t\t\t\t\tthis.replaceValue(\"nodeValue\", mutation.target);\n\t\t\t\t}\n\t\t\t\t//当前元素没有nodeValue,\n\t\t\t\telse if (zhPattern.test(mutation.addedNodes[0].innerText)) {\n\t\t\t\t\tthis.throttleTraversingNode(mutation.addedNodes[0]);\n\t\t\t\t\t// this.startMicroTaskQueue();\n\t\t\t\t} else if (className.includes(\"input\")) {\n\t\t\t\t\tthis.throttleTraversingNode(mutation.addedNodes[0]);\n\t\t\t\t}\n\t\t\t\t//新增元素,过滤掉icon的显示隐藏,排除svg标签\n\t\t\t\t// else if (!className.includes('suffix')) {\n\t\t\t\t// this.throttleTraversingNode(mutation.target);\n\t\t\t\t// this.startMicroTaskQueue();\n\t\t\t\t// }\n\t\t\t\t// else {\n\t\t\t\t// console.log('其他新增情况');\n\t\t\t\t// this.throttleTraversingNode(mutation.target);\n\t\t\t\t// this.startMicroTaskQueue();\n\t\t\t\t// }\n\t\t\t} else {\n\t\t\t\tconst node = mutation.addedNodes[0];\n\t\t\t\tif (node && node.nodeType === Node.TEXT_NODE && zhPattern.test(node.nodeValue)) {\n\t\t\t\t\tthis.replaceValue(\"nodeValue\", node);\n\t\t\t\t\t// this.startMicroTaskQueue();\n\t\t\t\t} else {\n\t\t\t\t\tthis.throttleTraversingNode(node);\n\t\t\t\t\t// this.startMicroTaskQueue();\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t//替换title\n\t\t\tconsole.log(\"其他情况\", mutation);\n\t\t\tthis.throttleTraversingNode(mutation.target);\n\t\t\tthis.replaceDocumentTitle();\n\t\t}\n\t\t// this.startMicroTaskQueue();\n\t}\n\t//处理独立元素\n\t//每当页面发生更新时,开启微任务队列\n\tstartMicroTaskQueue() {\n\t\t// 创建一个微任务队列\n\t\tTASK_CONTROL && clearTimeout(TASK_CONTROL);\n\t\tTASK_CONTROL = setTimeout(() => {\n\t\t\tconsole.log(\"更新结束,开始清空未翻译dom队列\");\n\t\t\tconsole.log(\"需要被翻译的词\", this.unknownWords);\n\t\t\t//替换页面title\n\t\t\tthis.replaceDocumentTitle();\n\t\t\tif (this.unknownWords.length > 0) {\n\t\t\t\tconsole.log(\"DOM更新结束,未替换的词汇有:\", this.unknownWords.length + \"个\");\n\t\t\t\t//节流处理\n\t\t\t\tconst translateUnknownWords = _.throttle(\n\t\t\t\t\t() => this.translateUnknownWords(this.unknownWords, this.unknownWordsNode.size),\n\t\t\t\t\t1000,\n\t\t\t\t\t{\n\t\t\t\t\t\tleading: true\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\ttranslateUnknownWords();\n\t\t\t} else {\n\t\t\t\t//检查是否还有未翻译的dom\n\t\t\t\t//处理input\n\t\t\t\tconsole.log(this.unknownWordsInputNode);\n\t\t\t\tif (this.unknownWordsInputNode.size > 0) {\n\t\t\t\t\tconsole.log(\"处理input节点\", this.unknownWordsInputNode);\n\t\t\t\t\tfor (const node of this.unknownWordsInputNode.values()) {\n\t\t\t\t\t\tthis.replaceInputValue(node, \"placeholder\", true);\n\t\t\t\t\t\tif (node.value !== \"\") {\n\t\t\t\t\t\t\tthis.replaceInputValue(node, \"value\", true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.unknownWordsInputNode.clear();\n\t\t\t\t}\n\t\t\t\tthis.replaceUnknownWordsNodeList(true);\n\t\t\t}\n\t\t}, 500);\n\t}\n\t//节流处理\n\tthrottleTraversingNode(originNode) {\n\t\tconst traversingNode = _.throttle(() => this.traversingNode(originNode), 500, {\n\t\t\tleading: true\n\t\t});\n\t\ttraversingNode();\n\t}\n\t//遍历节点\n\ttraversingNode(originNode) {\n\t\tif (!originNode) return;\n\t\tconst processNode = node => this.replaceTextByNode(node);\n\t\tconst walker = document.createTreeWalker(originNode, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT, {\n\t\t\tacceptNode(node) {\n\t\t\t\tif (node.tagName && node.tagName.toLowerCase() === \"svg\") return NodeFilter.FILTER_REJECT;\n\t\t\t\tprocessNode(node);\n\t\t\t\treturn NodeFilter.FILTER_SKIP;\n\t\t\t}\n\t\t});\n\t\tlet node;\n\t\twhile ((node = walker.nextNode())) {\n\t\t\tprocessNode(node);\n\t\t}\n\t}\n\n\t//根据node类型处理node text\n\treplaceTextByNode(node, isTranslate = false) {\n\t\t//记录当前翻译的时间\n\t\tif (node.title && zhPattern.test(node.title)) {\n\t\t\tthis.replaceValue(\"title\", node);\n\t\t}\n\t\tif (node.nodeType === Node.ELEMENT_NODE) {\n\t\t\t//input\n\t\t\tif ([\"textarea\", \"input\"].includes(node.tagName.toLowerCase())) {\n\t\t\t\tif (zhPattern.test(node.placeholder)) {\n\t\t\t\t\tthis.replaceInputValue(node, \"placeholder\");\n\t\t\t\t}\n\t\t\t\t//如果input节点有value值,则也进行替换;\n\t\t\t\tif (node.value && zhPattern.test(node.value)) {\n\t\t\t\t\tthis.replaceInputValue(node, \"value\");\n\t\t\t\t}\n\t\t\t\t//如果input节点有value值,且是readonly的,直接进行收集\n\t\t\t\tif (node.value !== \"\" && node.readOnly) {\n\t\t\t\t\tthis.collectNeedsTranslateInputNode(node);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (node.nodeType === Node.TEXT_NODE && (zhPattern.test(node.nodeValue) || zhPattern.test(node.data))) {\n\t\t\tthis.replaceValue(\"nodeValue\", node, isTranslate);\n\t\t}\n\t}\n\treplaceInputValue(inputNode, key, isTranslate = false) {\n\t\tconst value = inputNode[key];\n\t\t// console.log(inputNode, value);\n\t\tif (!zhPattern.test(value)) return;\n\t\t//如果是级联选择器,进行替换翻译\n\t\tif (this.yxI18nThesaurus[value]) {\n\t\t\tinputNode[key] = this.yxI18nThesaurus[value];\n\t\t} else {\n\t\t\tif (!this.unknownWords.includes(value) && value.length <= this.maxWordsLength) {\n\t\t\t\tthis.unknownWords.push(value);\n\t\t\t\tconsole.log(\"未找到匹配项:\", value, this.yxI18nThesaurus);\n\t\t\t}\n\t\t\tif (!isTranslate) {\n\t\t\t\tthis.collectNeedsTranslateInputNode(inputNode);\n\t\t\t}\n\t\t}\n\t}\n\t//收集input节点\n\tcollectNeedsTranslateInputNode(inputNode) {\n\t\tconst key = Math.random().toString(16).split(\".\")[1];\n\t\tif (!this.unknownWordsInputNode.has(key)) {\n\t\t\tthis.unknownWordsInputNode.set(key, inputNode);\n\t\t\tthis.startMicroTaskQueue(); //有新node被收集 就重开启宏任务500ms\n\t\t}\n\t}\n\treplaceDocumentTitle() {\n\t\tconst title = document.title;\n\t\tif (zhPattern.test(title)) {\n\t\t\tif (this.yxI18nThesaurus[title]) {\n\t\t\t\tdocument.title = this.yxI18nThesaurus[title];\n\t\t\t}\n\t\t}\n\t}\n\tcollectNeedsTranslateNode(node) {\n\t\tconst key = Math.random().toString(16).split(\".\")[1];\n\t\tif (!this.unknownWordsNode.has(key)) {\n\t\t\tthis.unknownWordsNode.set(key, node);\n\t\t\tthis.startMicroTaskQueue(); //有新node被收集 就重开启宏任务500ms\n\t\t}\n\t}\n\treplaceValue(key, node, isTranslate = false) {\n\t\t//过滤空字符串;\n\t\tif (node[key] === \"\") return;\n\t\tconst nodeValue = node[key].replace(/\\s/g, \"\");\n\t\tif (this.yxI18nThesaurus[nodeValue]) {\n\t\t\tnode[key] = this.yxI18nThesaurus[nodeValue];\n\t\t} else {\n\t\t\tif (!this.unknownWords.includes(nodeValue) && nodeValue.length <= this.maxWordsLength) {\n\t\t\t\tthis.unknownWords.push(nodeValue);\n\t\t\t\tconsole.log(\"未找到匹配项:\");\n\t\t\t}\n\t\t\t//收集未匹配到的node节点,待翻译后再次翻译\n\t\t\t//非翻译替换时再进行收集\n\t\t\tif (!isTranslate) {\n\t\t\t\tthis.collectNeedsTranslateNode(node);\n\t\t\t} else {\n\t\t\t\tconsole.log(\"异步处理时被新收集进去的值\", nodeValue);\n\t\t\t\tthis.startMicroTaskQueue(); //有新node被收集 就重开启宏任务500ms\n\t\t\t}\n\t\t}\n\t}\n\t//等待本次同步后,收集未翻译的字符,去后端进行翻译\n\tasync translateUnknownWords(unknownWords, size) {\n\t\t//过滤空字符串\n\t\tif (unknownWords.length == 0) return;\n\n\t\tconst unknownWordsFilter = unknownWords.filter(item => (item + \"\").trim() !== \"\");\n\t\tif (unknownWordsFilter.length === 0) return;\n\t\tconst words = Array.from(new Set(unknownWordsFilter));\n\t\tconsole.log(\"开始远程翻译\", words.length + \"个\");\n\t\tconsole.log(\"需要替换的dom有\", size);\n\t\tconst result = await translate({\n\t\t\twords,\n\t\t\ttoSource: this.to,\n\t\t\tsystemFlag: this.systemKey,\n\t\t\ttranslateApiUrl: this.translateApiUrl\n\t\t});\n\t\t//判定为参数错误,避免进入堆栈溢出,\n\t\tif (!result || Object.keys(result).length === 0) {\n\t\t\tthis.unknownWords = [];\n\t\t\treturn;\n\t\t}\n\t\tthis.yxI18nThesaurus = { ...this.yxI18nThesaurus, ...result };\n\t\t//同步词库到本地\n\t\tawait dbSetItem(this.dbKey, this.yxI18nThesaurus);\n\t\tconsole.log(\"远程翻译结束!!!\");\n\t\t//清空未翻译的词\n\t\tthis.unknownWords = [];\n\t\t//处理文本\n\t\tthis.replaceUnknownWordsNodeList();\n\t\t//处理上一轮未被替换的dom\n\t\tconsole.log(\"更新翻译完成!!!\");\n\t\tthis.startMicroTaskQueue();\n\t\t//清空收集的dom\n\t}\n\treplaceUnknownWordsNodeList(isClear = false) {\n\t\tif (this.unknownWordsNode.size > 0) {\n\t\t\tfor (const dom of this.unknownWordsNode.values()) {\n\t\t\t\t//true是翻译后进行替换dom,防止在替换时,有新的dom被收集,此时词库中还未有翻译,会陷入收集翻译的堆栈溢出\n\t\t\t\tif (zhPattern.test(dom.nodeValue)) {\n\t\t\t\t\tthis.replaceTextByNode(dom, true);\n\t\t\t\t}\n\t\t\t}\n\t\t\tisClear && this.unknownWordsNode.clear();\n\t\t}\n\t}\n\t//初始化配置\n\tasync initConfig({ to, systemKey, asyncThesaurusList }) {\n\t\tthis.to = to || this.to;\n\t\tthis.systemKey = systemKey || this.systemKey;\n\t\tthis.dbKey = `${this.systemKey}_${this.to}`;\n\t\t//给html写入指定语言类名,用于样式适配\n\t\tdocument.querySelector(\"html\").classList.add(to);\n\t\tthis.rootDocument = document.querySelector(\"body\"); //根节点\n\t\t// 设置当前的语言模式,并写入缓存\n\t\tconst lang = await dbGetItem(\"lang\");\n\t\tlang !== to ? await dbSetItem(\"lang\", to) : \"\";\n\t\t//检查缓存中是否有当前系统的词库,没有则去创建,有则同步到对象中\n\t\tconsole.log(\"开始同步词库!!!\");\n\t\tconst db = await dbGetItem(this.dbKey);\n\t\tconst asyncThesaurus = async () => {\n\t\t\tconst result = await translate({\n\t\t\t\twords: [],\n\t\t\t\ttoSource: this.to,\n\t\t\t\tsystemFlag: this.systemKey,\n\t\t\t\ttranslateApiUrl: this.translateApiUrl\n\t\t\t});\n\t\t\t//同步词库\n\t\t\tthis.yxI18nThesaurus = result;\n\t\t\tawait dbSetItem(this.dbKey, this.yxI18nThesaurus);\n\t\t\tconsole.log(\"同步词库已完成!!!\");\n\t\t};\n\t\tif (!db) {\n\t\t\tawait dbSetItem(this.dbKey, {});\n\t\t\tasyncThesaurus();\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tasyncThesaurus();\n\t\t\t\t// this.yxI18nThesaurus = db;\n\t\t\t} catch (error) {\n\t\t\t\tthis.yxI18nThesaurus = db;\n\t\t\t}\n\t\t}\n\n\t\tif (asyncThesaurusList && asyncThesaurusList.length > 0) {\n\t\t\tfor (const systemKey of asyncThesaurusList) {\n\t\t\t\tconst result = await translate({\n\t\t\t\t\twords: [],\n\t\t\t\t\ttoSource: this.to,\n\t\t\t\t\tsystemFlag: systemKey,\n\t\t\t\t\ttranslateApiUrl: this.translateApiUrl\n\t\t\t\t});\n\t\t\t\tconst dbKey = `${systemKey}_${this.to}`;\n\t\t\t\tawait dbSetItem(dbKey, result);\n\t\t\t}\n\t\t}\n\t}\n\tgetYxI18nThesaurus() {\n\t\treturn this.yxI18nThesaurus;\n\t}\n}\nconst yxTranslate = new Translate();\nexport const initTranslate = yxTranslate.initTranslate;\nexport const changeLang = async to => {\n\tconsole.log(\"切换语言\", to);\n\tsetLang(to);\n\t//切换语言\n\tconst lang = await dbGetItem(\"lang\");\n\tif (lang !== to) {\n\t\tawait dbSetItem(\"lang\", to);\n\t\tnew BC(BC_LANG_NAME).postMessage(JSON.stringify({ type: \"lang\" }));\n\t\tlocation.reload();\n\t}\n};\n\nexport const getLang = async () => {\n\treturn (await dbGetItem(\"lang\")) || \"\";\n};\n//在词库中查找某个词语的翻译\nexport const getWordByYxI18nThesaurus = word => {\n\tconst i18nThesaurus = yxTranslate.getYxI18nThesaurus();\n\treturn i18nThesaurus[word] || word;\n};\n\n//在词库中通过翻译过的词语查找原始的词语\nexport const getZhWordByYxI18nThesaurus = word => {\n\tconst i18nThesaurus = yxTranslate.getYxI18nThesaurus();\n\treturn Object.keys(i18nThesaurus).find(key => i18nThesaurus[key] === word) || word;\n};\n\n//加载自定义词库\nexport const loadCustomThesaurus = async (systemKey: string, lang: string) => {\n\tif (lang === \"zh\") return {};\n\ttry {\n\t\tconst thesaurus = await translate({\n\t\t\twords: [],\n\t\t\ttoSource: lang,\n\t\t\tsystemFlag: systemKey,\n\t\t\ttranslateApiUrl: yxTranslate.translateApiUrl\n\t\t});\n\n\t\tawait dbSetItem(`${systemKey}_${lang}`, thesaurus);\n\t\treturn thesaurus;\n\t} catch (error) {\n\t\treturn dbGetItem(`${systemKey}_${lang}`);\n\t}\n};\n","<!--\n * @Author: WangXin\n * @Date: 2024-01-01 11:17:12\n * @LastEditors: WangXin\n * @LastEditTime: 2024-01-01 13:47:00\n * @FilePath: \\yxUse\\packages\\components\\Toolbar\\src\\components\\Badge.vue\n * @Description: \n * \n * Copyright (c) 2024 by YuXing, All Rights Reserved. \n-->\n<script>\nexport default {\n\tprops: {\n\t\tvalue: {\n\t\t\ttypeof: Number\n\t\t}\n\t}\n};\n</script>\n<template>\n\t<div class=\"badge-container\" v-show=\"value > 0\">\n\t\t<sup>{{ value }}</sup>\n\t</div>\n</template>\n<style scoped lang=\"scss\">\n.badge-container {\n\tdisplay: inline-flex;\n\tjustify-content: center;\n\talign-items: center;\n\theight: 18px;\n\tborder-radius: 10px;\n\twidth: fit-content;\n\tposition: absolute;\n\ttop: 0;\n\tright: 18px;\n\tbackground: var(--color-error-100);\n\tcolor: #fff;\n\ttransform: translateY(-50%) translate(100%);\n\tpadding: 0 6px;\n}\n</style>\n","<template>\n\t<!-- 外层容器 -->\n\t<transition name=\"zoom\" mode=\"out-in\">\n\t\t<div v-show=\"showTool\" class=\"toolbar-container\" :class=\"showTool ? 'zoom-in' : 'zoom-out '\">\n\t\t\t<div\n\t\t\t\t:style=\"{ 'grid-template-columns': columns, 'grid-template-rows': rows }\"\n\t\t\t\tclass=\"toolbar-wrap\"\n\t\t\t\tv-if=\"!curComponent.name\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclass=\"flex justify-center items-center\"\n\t\t\t\t\tv-for=\"item in configList\"\n\t\t\t\t\t@click=\"configHandle(item)\"\n\t\t\t\t\t:style=\"{ 'grid-area': item['grid-area'] }\"\n\t\t\t\t>\n\t\t\t\t\t<div :title=\"item.label\" class=\"flex flex-col justify-center items-center\">\n\t\t\t\t\t\t<div class=\"tool-icon relative flex justify-center items-center\">\n\t\t\t\t\t\t\t<i\n\t\t\t\t\t\t\t\tclass=\"yx-icon\"\n\t\t\t\t\t\t\t\tstyle=\"color: var(--color-main-100)\"\n\t\t\t\t\t\t\t\tcolor=\"var(--color-main-100) \n \"\n\t\t\t\t\t\t\t\tsize=\"24\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<component :is=\"item.icon\" />\n\t\t\t\t\t\t\t</i>\n\t\t\t\t\t\t\t<Badge :value=\"badgeValue\" v-if=\"item.isShowBadge\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<span class=\"mt-10 text-center\">{{ item.label }}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"curComponent.name\" class=\"w-full h-full\">\n\t\t\t\t<div class=\"toolbar-wrap-component\" v-if=\"curComponent.name === 'theme'\">\n\t\t\t\t\t<div class=\"flex flex-col toolbar-center items-center\" @click=\"curComponent = {}\" title=\"返回\">\n\t\t\t\t\t\t<i class=\"yx-icon\" style=\"color: var(--color-main-100)\" color=\"var(--color-main-100)\" size=\"30\">\n\t\t\t\t\t\t\t<component :is=\"curComponent.icon\" />\n\t\t\t\t\t\t</i>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\t:style=\"[{ background: item.themeColor, boxShadow: `0px 4px 7px 0px ${item.themeColor}` }, getPosition(index)]\"\n\t\t\t\t\t\t:title=\"item.name\"\n\t\t\t\t\t\tclass=\"theme\"\n\t\t\t\t\t\t:class=\"curTheme === item.id ? 'select' : ''\"\n\t\t\t\t\t\tv-for=\"(item, index) in curComponent.data\"\n\t\t\t\t\t\t@click=\"chooseTheme(item)\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div v-else-if=\"curComponent.name === 'lang'\" class=\"box-border w-full h-full py-10 overflow-y-auto\">\n\t\t\t\t\t<div @click=\"curComponent = {}\" class=\"px-10 cursor-pointer\">返回</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\t@click=\"changeLang(item.lang)\"\n\t\t\t\t\t\t:title=\"item.name\"\n\t\t\t\t\t\tclass=\"px-10 cursor-pointer mt-10 whitespace-nowrap truncate\"\n\t\t\t\t\t\tv-for=\"item in langList\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ item.name }}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</transition>\n</template>\n<script>\nimport theme from \"../svg/theme.svg\";\nimport issue from \"../svg/issue.svg\";\nimport lang from \"../svg/lang.svg\";\nimport { changeTheme, getCurTheme } from \"@packages/theme\";\nimport { changeLang } from \"@packages/translate\";\nimport Badge from \"./Badge.vue\";\nexport default {\n\tcomponents: { theme, issue, Badge, lang },\n\tprops: {\n\t\tshowTool: {\n\t\t\ttypeof: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t\tbadgeValue: {\n\t\t\ttypeof: Number\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tcolumns: \"repeat(2, 1fr)\",\n\t\t\trows: window.isRenderLang ? \"repeat(2, 1fr)\" : \"lfr\",\n\t\t\tconfig: [\n\t\t\t\t{\n\t\t\t\t\tname: \"theme\",\n\t\t\t\t\tlabel: \"主题切换\",\n\t\t\t\t\ticon: \"theme\",\n\t\t\t\t\ticon_active: \"https://yx-picture.obs.cn-north-4.myhuaweicloud.com/ttc/bucket/toolbar-theme-back.svg\",\n\t\t\t\t\tposition: [50, 0],\n\t\t\t\t\tdesc: \"跳转到问题反馈页面\",\n\t\t\t\t\taction: \"hiddenTool\",\n\t\t\t\t\tcomponent: \"Theme\",\n\t\t\t\t\tdata: window.theme,\n\t\t\t\t\t\"grid-area\": window.isRenderLang ? \"1 / 1 / 2 / 3\" : \"1 / 1 / 2 / 2\",\n\t\t\t\t\tshow: window.theme.length > 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"lang\",\n\t\t\t\t\tlabel: \"语言切换\",\n\t\t\t\t\ticon: \"lang\",\n\t\t\t\t\tposition: [100, 0],\n\t\t\t\t\tdesc: \"语言切换\",\n\t\t\t\t\tcomponent: \"Lang\",\n\t\t\t\t\tisShowBadge: true,\n\t\t\t\t\t\"grid-area\": \"2 / 1 / 3 / 2\",\n\t\t\t\t\tshow: window.isRenderLang ? window.isRenderLang : false\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: \"issue\",\n\t\t\t\t\tlabel: \"问题反馈\",\n\t\t\t\t\ticon: \"issue\",\n\t\t\t\t\tposition: [100, 0],\n\t\t\t\t\tdesc: \"跳转到问题反馈页面\",\n\t\t\t\t\tcomponent: \"Issue\",\n\t\t\t\t\tisShowBadge: true,\n\t\t\t\t\t\"grid-area\": window.isRenderLang ? \"2 / 2 / 3 / 3\" : \"1 / 2 / 2 / 3\",\n\t\t\t\t\tshow: window.isRenderIssue ? window.isRenderIssue : false\n\t\t\t\t}\n\t\t\t],\n\t\t\tcurComponent: {},\n\t\t\tcurTheme: getCurTheme(),\n\t\t\tlangList: [\n\t\t\t\t{ name: \"中文-Chinese\", lang: \"zh\" },\n\t\t\t\t{ name: \"中文(香港)-Chinese(Hong Kong)\", lang: \"cht\" },\n\t\t\t\t{ name: \"英语-English\", lang: \"en\" }\n\t\t\t]\n\t\t};\n\t},\n\tcomputed: {\n\t\tconfigList() {\n\t\t\treturn this.config.filter(item => item.show);\n\t\t}\n\t},\n\twatch: {\n\t\tshowTool(val) {\n\t\t\tif (!val) {\n\t\t\t\tthis.curComponent = {};\n\t\t\t} else {\n\t\t\t\tthis.curTheme = this.getCurTheme();\n\t\t\t}\n\t\t}\n\t},\n\tmounted() {\n\t\tthis.curTheme = this.getCurTheme();\n\t},\n\tmethods: {\n\t\tchangeLang,\n\t\tgetCurTheme() {\n\t\t\treturn getCurTheme();\n\t\t\t// this.$nextTick(() => {});\n\t\t},\n\t\tconfigHandle(item) {\n\t\t\tif (item.name === \"issue\") {\n\t\t\t\tconst systemName = window.location.pathname.split(\"/\")[1];\n\t\t\t\twindow.open(`/${systemName}/integrated/#/workOrderManagement`);\n\t\t\t\tthis.$emit(\"zero\");\n\t\t\t} else {\n\t\t\t\tthis.curComponent = item;\n\t\t\t}\n\t\t},\n\t\tchooseTheme(item) {\n\t\t\tchangeTheme(item);\n\t\t\tthis.curTheme = item.id;\n\t\t},\n\t\tgetPosition(index) {\n\t\t\tconst styleObj = {\n\t\t\t\t0: {\n\t\t\t\t\t\"grid-row\": 2,\n\t\t\t\t\t\"grid-column\": 1\n\t\t\t\t},\n\t\t\t\t1: {\n\t\t\t\t\t\"grid-row\": 1,\n\t\t\t\t\t\"grid-column\": 2\n\t\t\t\t},\n\t\t\t\t2: {\n\t\t\t\t\t\"grid-row\": 2,\n\t\t\t\t\t\"grid-column\": 3\n\t\t\t\t},\n\t\t\t\t3: {\n\t\t\t\t\t\"grid-row\": 3,\n\t\t\t\t\t\"grid-column\": 2\n\t\t\t\t}\n\t\t\t};\n\t\t\treturn styleObj[index];\n\t\t}\n\t}\n};\n</script>\n<style scoped>\n.yx-icon {\n\tposition: relative;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 1em;\n\theight: 1em;\n\tfont-size: 24px;\n\tline-height: 1em;\n\tfill: currentColor;\n}\n\n.toolbar-container {\n\tposition: absolute;\n\tz-index: 99999;\n\twidth: 200px;\n\theight: 200px;\n\tbackground: var(--color-main-20);\n\tborder-radius: 10px;\n\tbox-shadow: 1px 2px 6px 3px #00000033;\n\tbackdrop-filter: blur(5px);\n\n\t.toolbar-wrap {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: 1fr 1fr;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tcolor: var(--text-color-body);\n\t\tcursor: pointer;\n\n\t\t.tool-icon {\n\t\t\twidth: 40px;\n\t\t\theight: 40px;\n\t\t\tline-height: 40px;\n\t\t\ttext-align: center;\n\t\t\tbackground-color: #ffffff;\n\t\t\tborder-radius: 100%;\n\t\t\tbox-shadow: 0 4px 7px 0 #00000033;\n\n\t\t\t&:hover {\n\t\t\t\ttransition: all 0.2s;\n\t\t\t\ttransform: scale(1.1);\n\t\t\t}\n\t\t}\n\t}\n\n\t.toolbar-wrap-component {\n\t\tdisplay: grid;\n\t\tgrid-template-rows: repeat(3, 1fr);\n\n\t\t/* 设置4行等高 */\n\t\tgrid-template-columns: repeat(3, 1fr);\n\n\t\t/* 设置4列等宽 */\n\t\tgap: 5px;\n\n\t\t/* 设置网格间距 */\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tcursor: pointer;\n\n\t\t.theme {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\twidth: 40px;\n\t\t\theight: 40px;\n\t\t\tmargin: auto;\n\t\t\ttext-align: center;\n\t\t\tborder-radius: 100%;\n\t\t\tbox-shadow: 0 4px 7px 0 #70aaf7;\n\n\t\t\t&:hover {\n\t\t\t\ttransition: all 0.2s;\n\t\t\t\ttransform: scale(1.1);\n\t\t\t}\n\n\t\t\t&.select {\n\t\t\t\t&::before {\n\t\t\t\t\tfont-size: 20px;\n\t\t\t\t\tcolor: #ffffff;\n\t\t\t\t\tcontent: \"✔\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.toolbar-center {\n\t\t\tdisplay: flex;\n\t\t\tgrid-row: 2;\n\t\t\tgrid-column: 2;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\twidth: 40px;\n\t\t\theight: 40px;\n\t\t\tmargin: auto;\n\t\t\ttext-align: center;\n\t\t\tbackground-color: #ffffff;\n\t\t\tborder-radius: 100%;\n\t\t\tbox-shadow: 0 4px 7px 0 #00000033;\n\n\t\t\t&:hover {\n\t\t\t\ttransition: all 0.2s;\n\t\t\t\ttransform: scale(1.1);\n\t\t\t}\n\t\t}\n\t}\n}\n\n.theme-first {\n\tgrid-row: 2;\n\tgrid-column: 1;\n}\n\n.zoom-in {\n\tanimation: zoom-in 0.2s ease-in-out;\n}\n\n@keyframes zoom-in {\n\t0% {\n\t\ttransform: scale(0);\n\t}\n\n\t100% {\n\t\ttransform: scale(1);\n\t}\n}\n\n.zoom-out {\n\tanimation: zoom-out 0.2s ease-in-out;\n}\n\n@keyframes zoom-out {\n\t0% {\n\t\ttransform: scale(1);\n\t}\n\n\t100% {\n\t\ttransform: scale(0);\n\t}\n}\n</style>\n","import { createElementVNode as _createElementVNode, openBlock as _openBlock, createElementBlock as _createElementBlock } from \"vue\"\n\nconst _hoisted_1 = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: \"50\",\n height: \"50\",\n fill: \"none\",\n viewBox: \"0 0 25 25\"\n}\n\nexport function render(_ctx, _cache) {\n return (_openBlock(), _createElementBlock(\"svg\", _hoisted_1, _cache[0] || (_cache[0] = [\n _createElementVNode(\"g\", {\n stroke: \"currentColor\",\n \"stroke-linejoin\": \"round\",\n \"stroke-width\": \"2\"\n }, [\n _createElementVNode(\"path\", { d: \"M9 3H4a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1h5a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1ZM9 14H4a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1h5a1 1 0 0 0 1-1v-5a1 1 0 0 0-1-1ZM20 3h-5a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1h5a1 1 0 0 0 1-1V4a1 1 0 0 0-1-1ZM20 14h-5a1 1 0 0 0-1 1v5a1 1 0 0 0 1 1h5a1 1 0 0 0 1-1v-5a1 1 0 0 0-1-1Z\" })\n ], -1)\n ])))\n}\nexport default { render: render }","<script lang=\"ts\">\nimport configMixins from \"./index.config\";\nimport { PositionEnum } from \"./index.config\";\nimport ToolbarContainer from \"./components/ToolbarContainer.vue\";\nimport Badge from \"./components/Badge.vue\";\nimport menuIcon from \"./svg/menu.svg\";\nimport { getCommentUntreatedCount } from \"@packages/api\";\nexport default {\n\tname: \"YxToolbar\",\n\tcomponents: { ToolbarContainer, menuIcon, Badge },\n\tmixins: [configMixins],\n\tdata() {\n\t\treturn {\n\t\t\tshowTool: false,\n\t\t\tposition: {\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0\n\t\t\t},\n\t\t\tbadgeValue: 0,\n\t\t\tshowBadge: window.isRenderIssue\n\t\t};\n\t},\n\tcomputed: {\n\t\tshowClass() {\n\t\t\treturn this.status ? \"expanded\" : \"folded\";\n\t\t}\n\t},\n\tmounted() {\n\t\tif (this.showBadge) {\n\t\t\tthis.getCount();\n\t\t}\n\t\tthis.initToolPosition();\n\t},\n\tmethods: {\n\t\tinitToolPosition() {\n\t\t\tconst toolWrap = document.querySelector(\".toolbar-wrap\");\n\t\t\tconst left = window.innerWidth - 60 - 100 + \"px\";\n\t\t\tconst top = window.innerHeight - 60 - 100 + \"px\";\n\t\t\ttoolWrap.style.setProperty(\"--tool-left\", left);\n\t\t\ttoolWrap.style.setProperty(\"--tool-top\", top);\n\t\t},\n\t\tasync getCount() {\n\t\t\tconst { data } = await getCommentUntreatedCount();\n\t\t\tthis.badgeValue = data.count;\n\t\t},\n\t\t/** 点击悬浮球事件 */\n\t\thandlerClickTool(e: MouseEvent) {\n\t\t\tconst flag = this.mousePoint.x === e.screenX && this.mousePoint.y === e.screenY;\n\t\t\tif (!flag) return;\n\t\t\t// 切换状态\n\t\t\tthis.switchStatus();\n\t\t\t// 获取悬浮球位置\n\t\t\tthis.getAllPosition();\n\t\t\t// 设置悬浮球\n\t\t\tthis.setPanel();\n\t\t\tthis.showTool = true;\n\t\t},\n\t\t/** 切换状态 */\n\t\tswitchStatus() {\n\t\t\tthis.status = !this.status;\n\t\t},\n\t\tgetAllPosition() {\n\t\t\tthis.toolPos = this.getDomPosition(this.toolDom);\n\t\t\tthis.panelPos = this.getDomPosition(this.panelDom);\n\t\t},\n\t\t/** 获取悬浮球的位置 */\n\t\tgetDomPosition(dom: HTMLElement) {\n\t\t\treturn dom.getBoundingClientRect();\n\t\t},\n\t\t/** 设置悬浮球 */\n\t\tsetPanel() {\n\t\t\tconst minX = 0;\n\t\t\tconst minY = 0;\n\t\t\tconst maxX = window.innerWidth - this.panelWidth;\n\t\t\tconst maxY = window.innerHeight - this.panelHeight;\n\t\t\tlet x = this.toolPos.left + this.toolPos.width / 2 - this.panelWidth / 2;\n\t\t\tlet y = this.toolPos.top + this.toolPos.height / 2 - this.panelHeight / 2;\n\n\t\t\tif (x < minX) x = minX;\n\t\t\tif (y < minY) y = minY;\n\t\t\tif (x > maxX) x = maxX - 40;\n\t\t\tif (y > maxY) y = maxY - 40;\n\n\t\t\tthis.setPanelPosition(x, y);\n\t\t},\n\t\t/** 设置panel的位置 */\n\t\tsetPanelPosition(x, y) {\n\t\t\tthis.panelDom.style.left = x + \"px\";\n\t\t\tthis.panelDom.style.top = y + \"px\";\n\t\t},\n\t\t/** 点击Tool */\n\t\tmousedownTool(e) {\n\t\t\tthis.mousePoint.x = e.screenX;\n\t\t\tthis.mousePoint.y = e.screenY;\n\t\t},\n\t\tclose() {\n\t\t\tthis.status = false;\n\t\t\tthis.showTool = false;\n\t\t}\n\t}\n};\n</script>\n\n<template>\n\t<!-- 外层容器 -->\n\t<div id=\"toolbar-wrap\" class=\"toolbar-wrap\">\n\t\t<!-- 悬浮球 -->\n\t\t<div class=\"tool\" :class=\"`${showClass}`\" @click=\"handlerClickTool\" @mousedown=\"mousedownTool\" @mouseup=\"mouseupTool\">\n\t\t\t<i class=\"yx-icon\">\n\t\t\t\t<component :is=\"'menuIcon'\" />\n\t\t\t</i>\n\t\t\t<!-- <el-icon size=\"30\">\n\t\t\t</el-icon> -->\n\t\t\t<Badge v-if=\"showBadge\" :value=\"badgeValue\" />\n\t\t</div>\n\n\t\t<div class=\"mask\" :class=\"`${showClass}`\" @click=\"close\" />\n\n\t\t<!-- 面板 -->\n\t\t<ToolbarContainer @zero=\"badgeValue = 0\" :badgeValue=\"badgeValue\" class=\"panel\" :showTool=\"showTool\" />\n\t</div>\n</template>\n\n<style scoped lang=\"scss\">\n.yx-icon {\n\tposition: relative;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 1em;\n\theight: 1em;\n\tfont-size: 35px;\n\tline-height: 1em;\n\tfill: currentColor;\n}\n\n.toolbar-wrap {\n\t--tool-left: \"0px\";\n\t--tool-top: \"0px\";\n\n\tz-index: 99;\n\tdisplay: flex;\n\n\t.tool {\n\t\tposition: fixed;\n\t\ttop: var(--tool-top);\n\t\tleft: var(--tool-left);\n\t\tz-index: 99;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 60px;\n\t\theight: 60px;\n\t\tcolor: var(--button-text-color);\n\t\tcursor: pointer;\n\t\tbackground-color: var(--color-main-100);\n\t\tborder-radius: 100%;\n\t\tbox-shadow: 1px 2px 6px 3px #00000017;\n\t\tbackdrop-filter: blur(20px);\n\n\t\t&.expanded {\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t&.folded {\n\t\t\tdisplay: flex;\n\t\t}\n\t}\n\n\t.panel {\n\t\t// background-color: rgba(255, 255, 255, 0.5);\n\t\tposition: fixed;\n\t\ttop: 400px;\n\t\tleft: 400px;\n\t\tz-index: 100000;\n\t\twidth: v-bind(panelWidthPX);\n\t\theight: v-bind(panelHeightPX);\n\t\tmargin: 20px;\n\t\tborder-radius: 10px;\n\n\t\t&.expanded {\n\t\t\tdisplay: block;\n\t\t}\n\n\t\t&.folded {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t.mask {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tz-index: 99999;\n\t\twidth: 100vw;\n\t\theight: 100vh;\n\n\t\t&.folded {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n</style>\n","/*\n * @Author: WangXin\n * @Date: 2024-04-02 20:01:00\n * @LastEditors: WangXin\n * @LastEditTime: 2024-04-15 15:48:58\n * @FilePath: /yxuse/packages/components/Toolbar/index.ts\n * @Description:\n *\n * Copyright (c) 2024 by YuXing, All Rights Reserved.\n */\nimport { version, createApp } from \"vue\";\nimport \"./src/utils/mounted\";\nimport ToolbarApp from \"./src/index.vue\";\n\n/** 主题配置 */\ninterface ThemeConfig {\n\t/** 主题id */\n\tid: number;\n\t/** 主题名 */\n\ttheme: string;\n\t/** 主题url */\n\tthemeUrl: string;\n\t/** 默认主题id */\n\tdefaultTheme: number;\n\t/** 背景色 工具悬浮球的主题背景色:backgroundColor属性 */\n\tthemeColor: string;\n\t/** 创建者 */\n\tcreator?: string;\n\t/** 创建时间 */\n\tcreateTime?: string;\n}\n\n/** Toolbar的配置 */\ninterface ToolbarConfig {\n\ttheme: ThemeConfig[];\n\t/** 是否渲染工单 */\n\tisRenderIssue?: boolean;\n\t/** 是否渲染切换语言 */\n\tisRenderLang?: boolean;\n}\n\n/**\n * 悬浮球工具\n */\nclass Toolbar {\n\t/** 单例对象 */\n\tstatic instance: Toolbar | null = null;\n\n\t/** 工具挂载domId */\n\t#elId: string = \"yxToolbarV2\";\n\n\t/** 当前vue版本 */\n\tget vueVersion(): \"2\" | \"3\" {\n\t\treturn version[0] as `${\"2\" | \"3\"}`;\n\t}\n\n\tconstructor(config: ToolbarConfig) {\n\t\tconst { theme, isRenderIssue, isRenderLang } = config;\n\n\t\tif (!Toolbar.instance) {\n\t\t\t// @ts-expect-error\n\t\t\twindow.theme = theme;\n\t\t\twindow.isRenderIssue = isRenderIssue;\n\t\t\twindow.isRenderLang = isRenderLang;\n\t\t\tthis.init();\n\t\t\tToolbar.instance = this;\n\t\t}\n\t\treturn Toolbar.instance;\n\t}\n\n\t/** 初始化 */\n\tinit() {\n\t\tthis.mount();\n\t}\n\n\t/** 挂载初始化容器 */\n\tmount() {\n\t\t// 1. 新建标签\n\t\tconst el = document.createElement(\"div\");\n\t\tel.id = this.#elId;\n\t\tdocument.body.appendChild(el);\n\t\t// 2. 挂载\n\t\tif (this.vueVersion === \"3\") {\n\t\t\treturn createApp(ToolbarApp).mount(`#${this.#elId}`);\n\t\t} else {\n\t\t\tconst Vue = require(\"vue\");\n\t\t\treturn new Vue({ render: h => h(ToolbarApp) }).$mount(`#${this.#elId}`);\n\t\t}\n\t}\n}\nexport default Toolbar;\n","/*\n * @Author: WangXin\n * @Date: 2023-08-17 13:42:02\n * @LastEditors: WangXin\n * @LastEditTime: 2024-09-24 16:10:18\n * @FilePath: /yxuse/packages/theme/index.ts\n * @Description:\n *\n * Copyright (c) 2023 by YuXing, All Rights Reserved.\n */\n\nimport { ttcFontFamily, defaultConfig } from \"./config\";\nimport { getUserThemeList } from \"@packages/api\";\n// import { YxTable } from \"@packages/components\";\nimport { Toolbar } from \"@packages/components\";\nimport { yxSubscribe, isColorEqual } from \"@packages/utils\";\nimport { BC } from \"@packages/index\";\nimport { BC_THEME_NAME, BC_LANG_NAME } from \"@packages/config\";\nimport { setSystemConfig } from \"@packages/api/auth\";\nimport http from \"@packages/utils/http\";\nimport type { ThemeDTO, YxuseOptions } from \"./type.ts\";\nimport { getLang, initTranslate } from \"@packages/translate\";\n\n/**\n * @description:注册主题下的css变量\n * @options isRenderToolbar :是否需要渲染Toolbar\n * @param isJumpLogin :是否在没有token或token过期时自动跳转至登录页\n */\nexport const install = async (config: YxuseOptions): Promise<void> => {\n\t//同步默认配置\n\tconfig = { ...defaultConfig, ...config };\n\t// 获取当前主题\n\t// 如何当前系统没有主题,则自动添加默认主题\n\tlet themeId = getCurTheme();\n\ttry {\n\t\tawait handleSystemConfig(config);\n\t\tconst { data } = await http.get(config?.themeApiUrl, {}, { headers: { noLoading: true } });\n\t\twindow[\"YX_THEME_LIST\"] = data;\n\t\t//是否需要在没有token或token过期时自动跳转至登录页\n\t\tconsole.log(config);\n\t\t//如果需要加载翻译\n\t\tif (config.isRenderLang && config.systemKey) {\n\t\t\tconst lang = await getLang();\n\t\t\t//默认为中文\n\t\t\tawait initTranslate({ to: lang ? lang : config.lang, systemKey: config.systemKey });\n\t\t}\n\t\t//初始化完毕后,挂载toolbar组件\n\t\tif (config.isRenderToolbar) {\n\t\t\tnew Toolbar({ theme: data, isRenderIssue: config.isRenderIssue, isRenderLang: config.isRenderLang });\n\t\t}\n\n\t\t//如果已经设置了主题 则使用缓存中的主题,反正则去设置默认主题\n\t\t//当前要注册的themeUrl\n\t\tlet themeUrl = themeId ? data.find((item: ThemeDTO) => item.id === themeId)?.themeUrl : \"\";\n\n\t\tif (!themeId || !themeUrl) {\n\t\t\t//网关首次进来设置默认主题,并同步主题变量到\n\t\t\tconst defaultTheme = data.find((item: ThemeDTO) => item.defaultTheme === 1);\n\t\t\tconst theme = defaultTheme || data[0];\n\t\t\tthemeUrl = theme.themeUrl;\n\t\t\tthemeId = theme.id;\n\t\t}\n\t\tconst themeCssVar = await setCssVar(themeUrl);\n\t\tsaveCssVar({ themeCssVar, themeId });\n\t\tinitTtcFont();\n\n\t\t//监听当前广播的消息,有切换主题的消息就切换主题\n\t\tnew BC(BC_THEME_NAME).onmessage = (event: any) => {\n\t\t\tconst data = JSON.parse(event.data);\n\t\t\t// setCssVar(data.data.themeUrl);\n\t\t\tinstallCssVarInSystemTheme(data.data.themeCssVar);\n\t\t\t//通知订阅回调的系统\n\t\t\tyxSubscribe.publish({ type: \"theme\", data: null });\n\t\t};\n\t\tnew BC(BC_LANG_NAME).onmessage = (event: any) => {\n\t\t\tlocation.reload();\n\t\t};\n\n\t\tconsole.log(\"主题初始化完毕!!!\");\n\t} catch (err) {\n\t\t//请求报错使用缓存中兜底css变量\n\t\tinitTtcFont();\n\t\tupdateTheme();\n\t}\n};\n//处理系统配置\nconst handleSystemConfig = (config: YxuseOptions) => {\n\t//存储当前的系统配置\n\tsetSystemConfig({ ...config });\n};\n//初始化字体\nconst initTtcFont = () => {\n\tconst style = document.createElement(\"style\");\n\tstyle.innerHTML = ttcFontFamily;\n\tdocument.head.appendChild(style);\n};\nexport const saveCssVar = ({ themeCssVar, themeId }) => {\n\tconst ttcGlobalState = localStorage.getItem(\"ttcGlobalState\") || \"{}\";\n\tconst globalState = JSON.parse(ttcGlobalState);\n\tglobalState.theme = {\n\t\tthemeCssVar,\n\t\tid: themeId\n\t};\n\tlocalStorage.setItem(\"ttcGlobalState\", JSON.stringify(globalState));\n};\n/**\n * @description:修改主题\n * @param theme 主题\n */\nexport const changeTheme = async (theme: ThemeDTO) => {\n\tconst themeCssVar = await setCssVar(theme.themeUrl);\n\tsaveCssVar({ themeCssVar, themeId: theme?.id });\n\n\t//通知其他分系统\n\tnew BC(BC_THEME_NAME).postMessage(\n\t\tJSON.stringify({\n\t\t\ttype: \"theme\",\n\t\t\tdata: {\n\t\t\t\tthemeId: theme?.id,\n\t\t\t\tthemeUrl: theme?.themeUrl,\n\t\t\t\tthemeCssVar: themeCssVar\n\t\t\t}\n\t\t})\n\t);\n\t//触发当前系统的主题修改回调\n\tyxSubscribe.publish({ type: \"theme\", data: theme });\n};\n\n/**\n * @description:更新主题\n */\nexport const updateTheme = () => {\n\tconst themeCssVar = getCurThemeCssVar();\n\tconst root = document.documentElement;\n\tObject.keys(themeCssVar).forEach(classifyName => {\n\t\tif (classifyName !== \"exclude\") {\n\t\t\tObject.keys(themeCssVar[classifyName]).forEach(varName => {\n\t\t\t\tconst cssVarName = `--${classifyName}-${varName}`;\n\t\t\t\troot.style.setProperty(cssVarName, themeCssVar[classifyName][varName]);\n\t\t\t});\n\t\t}\n\t});\n};\n/**\n * 注册主题变量\n */\nexport const setCssVar = async (themeUrl: string) => {\n\tconst cssVar = await fetch(themeUrl);\n\tconst themeCssVar = await cssVar.json();\n\tconst cssText = () => {\n\t\tlet cssText = \":root {\\n\"; // 开始构建 CSS 变量内容\n\t\tObject.keys(themeCssVar).forEach(classifyName => {\n\t\t\tif (classifyName !== \"exclude\") {\n\t\t\t\tObject.keys(themeCssVar[classifyName]).forEach(varName => {\n\t\t\t\t\tconst cssVarName = `--${classifyName}-${varName}`;\n\t\t\t\t\tconst value = themeCssVar[classifyName][varName];\n\t\t\t\t\tcssText += ` ${cssVarName}: ${value};\\n`; // 将变量及其值添加到 CSS 内容中\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tcssText += \"}\"; // 结束 CSS 变量内容\n\t\treturn cssText;\n\t};\n\t//如果已经有了class 为theme的style标签,则直替换内容,否则创建一个\n\tconst themeStyle = document.querySelector(\".YX_THEME_STYLE\");\n\tif (themeStyle) {\n\t\tthemeStyle.innerHTML = \"\";\n\t\tthemeStyle.appendChild(document.createTextNode(cssText()));\n\t} else {\n\t\tconst styleTag = document.createElement(\"style\"); // 创建一个 <style> 标签\n\t\tstyleTag.className = \"YX_THEME_STYLE\";\n\t\tstyleTag.appendChild(document.createTextNode(cssText())); // 将 CSS 内容添加到 <style> 标签中\n\t\tdocument.head.appendChild(styleTag); // 将 <style> 标签添加到 <head> 中\n\t}\n\treturn themeCssVar;\n};\n\n/**\n * @description:获取默认主题URl\n */\nexport const getDefaultThemeUrl = async () => {\n\tconst { data } = await getUserThemeList();\n\tconst defaultTheme = data.find((item: ThemeDTO) => item.defaultTheme === 1);\n\tconst defaultThemeUrl = defaultTheme ? defaultTheme.themeUrl : data[0].themeUrl;\n\treturn defaultThemeUrl;\n};\n/**\n * @description:获取当前主题\n */\nexport const getCurTheme = () => {\n\tconst ttcGlobalState = localStorage.getItem(\"ttcGlobalState\");\n\tconst theme = ttcGlobalState && JSON.parse(ttcGlobalState)?.theme;\n\treturn theme?.id || null;\n};\n/**\n * @description:获取当前主题变量\n */\nexport const getCurThemeCssVar = () => {\n\tconst ttcGlobalState = localStorage.getItem(\"ttcGlobalState\");\n\tconst theme = ttcGlobalState && JSON.parse(ttcGlobalState)?.theme;\n\treturn theme?.themeCssVar || {};\n};\n\n/**\n * @description:获取当前主题下的某个组/模块配置颜色\n * @param groupName 名称\n */\nexport const getGroupColor = (groupName: string): object => {\n\tconst theme = getCurThemeCssVar();\n\treturn theme?.[groupName] || {};\n};\n\n/**\n * @description:判断当前css变量的色值是否在所有主题中\n * @param cssVarName 色值变量\n * @param color 名称\n */\n\nexport const findColorByTheme = (cssVarName: string, color: string) => {\n\tconst cssVar = getCurThemeCssVar();\n\tif (!cssVar[\"exclude\"]) return null;\n\tfor (let id in cssVar[\"exclude\"]) {\n\t\tconst keys = cssVar[\"exclude\"][id];\n\t\tfor (let css of Object.keys(keys)) {\n\t\t\tfor (let key of Object.keys(keys[css])) {\n\t\t\t\tconst currentCssVar = `--${css}-${key}`;\n\t\t\t\tif (currentCssVar === cssVarName && isColorEqual(keys[css][key], color)) {\n\t\t\t\t\treturn color; // 找到匹配的颜色,立即返回结果\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null; // 未找到匹配的颜色\n};\n\n/**\n * @description:注册当前系统私有css变量\n * @param systemName 系统名称\n */\n// export const installSystemTheme = (systemName: string): void => {\n// \tconst curTheme = getCurTheme();\n// \tconst systemConfig = config[curTheme][systemName];\n// \tconst root = document.documentElement;\n// \tObject.keys(systemConfig).forEach(varName => {\n// \t\tconst cssVarName = `--${varName}`;\n// \t\troot.style.setProperty(cssVarName, systemConfig[varName]);\n// \t});\n// };\n\n//将css变量注册在当前的系统中\nexport const installCssVarInSystemTheme = (cssVar?: any, className?: string): void => {\n\tconst themeCssVar = cssVar || getCurThemeCssVar();\n\t// console.log(\"当前缓存中的主题是\", themeCssVar[\"color\"]);\n\tconst cssText = () => {\n\t\tlet cssText = \":root {\\n\"; // 开始构建 CSS 变量内容\n\t\tObject.keys(themeCssVar).forEach(classifyName => {\n\t\t\tif (classifyName !== \"exclude\") {\n\t\t\t\tObject.keys(themeCssVar[classifyName]).forEach(varName => {\n\t\t\t\t\tconst cssVarName = `--${classifyName}-${varName}`;\n\t\t\t\t\tconst value = themeCssVar[classifyName][varName];\n\t\t\t\t\tcssText += ` ${cssVarName}: ${value};\\n`; // 将变量及其值添加到 CSS 内容中\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tcssText += \"}\"; // 结束 CSS 变量内容\n\t\treturn cssText;\n\t};\n\t//如果已经有了class 为theme的style标签,则直替换内容,否则创建一个\n\tconst styleClassName = className || \"YX_THEME_STYLE\";\n\tconst themeStyle = document.querySelector(`.${styleClassName}`);\n\tif (themeStyle) {\n\t\tthemeStyle.innerHTML = \"\";\n\t\tthemeStyle.appendChild(document.createTextNode(cssText()));\n\t} else {\n\t\tconst styleTag = document.createElement(\"style\"); // 创建一个 <style> 标签\n\t\tstyleTag.className = \"YX_THEME_STYLE\";\n\t\tstyleTag.appendChild(document.createTextNode(cssText())); // 将 CSS 内容添加到 <style> 标签中\n\t\tdocument.head.appendChild(styleTag); // 将 <style> 标签添加到 <head> 中\n\t}\n};\n","/*\n * @Author: WangXin\n * @Date: 2024-09-24 12:26:14\n * @LastEditors: WangXin\n * @LastEditTime: 2025-05-12 10:55:49\n * @FilePath: /yxuse/packages/bc/index.ts\n * @Description:\n *\n * Copyright (c) ${2024} by YuXing, All Rights Reserved.\n */\ndeclare global {\n\tinterface Window {\n\t\t/**页面是否激活 */\n\t\tpageActive: boolean;\n\t}\n}\nexport class BC {\n\tpublic onmessage: Function;\n\tpublic postMessage: Function;\n\tstatic init() {\n\t\twindow.pageActive = document.visibilityState === \"visible\";\n\t\tdocument.addEventListener(\"visibilitychange\", () => {\n\t\t\twindow.pageActive = document.visibilityState === \"visible\";\n\t\t});\n\t}\n\tconstructor(channelName: string) {\n\t\tBC.init();\n\t\tconst broadcastChannel = new BroadcastChannel(channelName);\n\t\tthis.onmessage = (event: any) => event;\n\t\tbroadcastChannel.onmessage = event => {\n\t\t\tconst { type } = event.data;\n\t\t\tif (type === \"router\") {\n\t\t\t\tif (window.pageActive) return this.onmessage(event);\n\t\t\t} else {\n\t\t\t\tthis.onmessage(event);\n\t\t\t}\n\t\t};\n\t\tthis.postMessage = (message: any) => {\n\t\t\treturn broadcastChannel.postMessage(message);\n\t\t};\n\t}\n}\n"],"names":["defaultConfig","loginUrl","homeUrl","lang","themeApiUrl","loginApiUrl","translateApiUrl","userConfigApiUrl","environment","isRenderToolbar","isRenderIssue","isRenderLang","systemKey","isTranslateApi","whitelistTranslateApi","tableProRef","ref","dynamicComponent","column","rowData","_slot","renderType","event","prop","label","config","Component","resolveComponent","options","restConfig","_createVNode","_resolveComponent","_mergeProps","modelValue","$event","placeholder","isSelect","includes","s","component","val","type","Number","length","map","item","value","key","default","_isVNode","Object","prototype","toString","call","YxTablePro","defineComponent","name","props","tableData","Array","rowKey","String","required","columns","Function","pageInfo","sort","Boolean","emits","setup","emit","attrs","expose","onBeforeMount","initTable","onMounted","nextTick","startSort","watch","async","columnsList","filter","cell","show","col","width","res","loadOptions","flexGrow","cellRenderer","scope","getCellRenderer","headerCellRenderer","headerRender","title","dataKey","sortDom","$el","querySelector","children","_pnpm","Sortable","create","animation","handle","sortHandle","onEnd","oldIndex","newIndex","renderOperate","render","rowIndex","class","className","operate","op","disabled","onClick","withModifiers","pagination","total","createVNode","currentPage","pageIndex","pageSize","small","layout","background","onSizeChange","e","onCurrentChange","getTableHeight","height","border","data","handler","func","this","initData","status","toolDom","panelWidth","panelHeight","mousePoint","x","y","getEleDom","selector","document","configMixins","mounted","getAllDom","move","computed","panelWidthPX","panelHeightPX","methods","wrapDom","panelDom","movedEle","deltaLeft","deltaTop","onmousedown","clientX","offsetLeft","clientY","offsetTop","handleMove","stopPropagation","preventDefault","cx","cy","dx","dy","body","clientWidth","clientHeight","style","left","top","up","removeEventListener","addEventListener","moveElement","_hoisted_1","xmlns","fill","viewBox","theme","_ctx","_cache","_openBlock","openBlock","_createElementBlock","createElementBlock","_createStaticVNode","createStaticVNode","issue","_createElementVNode","stroke","d","localforage","dbSetItem","setItem","dbGetItem","getItem","URL","getSystemConfig","translate","words","systemFlag","toSource","fromSource","http","post","headers","noLoading","dstMap","sqlKey","auth.getSystemConfig","window","whitelistApi","handleTranslation","result","JSON","stringify","matches","match","yxI18nThesaurus","getYxI18nThesaurus","waitWords","replace","RegExp","push","i18nMap","translatedText","forEach","word","newYxI18nThesaurus","parse","zhPattern","TASK_CONTROL","excludeTag","childList","subtree","characterData","attributes","attributeFilter","observer","yxTranslate","constructor","__publicField","from","to","dbKey","initTranslate","bind","unknownWords","unknownWordsNode","Map","unknownWordsInputNode","rootDocument","maxWordsLength","asyncThesaurusList","handleTraditionalChinese","initConfig","observerRouteChange","fontFamily","documentElement","MutationObserver","mutations","mutation","index","handleTextNodes","target","handleChildListMutation","attributeName","test","replaceInputValue","ariaExpanded","setTimeout","observe","unprocessedRecords","takeRecords","record","node","nodeValue","collectNeedsTranslateNode","addedNodes","removedNodes","addedNode","id","tagName","toLowerCase","_b","_a","_c","parentNodeValue","throttleTraversingNode","previousSibling","replaceValue","innerText","nodeType","Node","TEXT_NODE","replaceDocumentTitle","startMicroTaskQueue","clearTimeout","_","throttle","translateUnknownWords","size","leading","values","clear","replaceUnknownWordsNodeList","originNode","traversingNode","processNode","replaceTextByNode","walker","createTreeWalker","NodeFilter","SHOW_ELEMENT","SHOW_TEXT","acceptNode","FILTER_REJECT","FILTER_SKIP","nextNode","isTranslate","ELEMENT_NODE","readOnly","collectNeedsTranslateInputNode","inputNode","Math","random","split","has","set","unknownWordsFilter","trim","Set","keys","isClear","dom","classList","add","db","asyncThesaurus","error","changeLang","changeSystemConfig","setLang","BC","BC_LANG_NAME","postMessage","location","reload","getLang","getWordByYxI18nThesaurus","getZhWordByYxI18nThesaurus","i18nThesaurus","find","loadCustomThesaurus","thesaurus","typeof","_withDirectives","withDirectives","createElementVNode","$props","_sfc_main","components","Badge","showTool","badgeValue","rows","icon","icon_active","position","desc","action","isShowBadge","curComponent","curTheme","getCurTheme","langList","configList","configHandle","systemName","pathname","open","$emit","chooseTheme","changeTheme","getPosition","_hoisted_2","_hoisted_3","color","_hoisted_5","_hoisted_9","_hoisted_11","__default__","ToolbarContainer","_createBlock","createBlock","_Transition","mode","_withCtx","withCtx","_normalizeClass","normalizeClass","$data","_createCommentVNode","createCommentVNode","_normalizeStyle","_Fragment","Fragment","_renderList","$options","_hoisted_4","_resolveDynamicComponent","resolveDynamicComponent","_component_Badge","_toDisplayString","toDisplayString","_hoisted_6","_hoisted_7","_hoisted_8","normalizeStyle","themeColor","boxShadow","_hoisted_10","menuIcon","mixins","showBadge","showClass","getCount","initToolPosition","toolWrap","innerWidth","innerHeight","setProperty","getCommentUntreatedCount","count","handlerClickTool","screenX","screenY","switchStatus","getAllPosition","setPanel","toolPos","getDomPosition","panelPos","getBoundingClientRect","maxX","maxY","setPanelPosition","mousedownTool","close","args","onMousedown","onMouseup","mouseupTool","_component_ToolbarContainer","onZero","_Toolbar","_elId","instance","init","vueVersion","version","mount","el","createElement","__privateGet","appendChild","createApp","ToolbarApp","require","h","$mount","WeakMap","Toolbar","install","themeId","handleSystemConfig","get","themeUrl","defaultTheme","themeCssVar","setCssVar","saveCssVar","initTtcFont","BC_THEME_NAME","onmessage","yxSubscribe","publish","err","updateTheme","setSystemConfig","innerHTML","YX_TITLE","head","ttcGlobalState","localStorage","globalState","getCurThemeCssVar","root","classifyName","varName","cssVarName","cssVar","fetch","json","cssText","cssText2","themeStyle","createTextNode","styleTag","getDefaultThemeUrl","getUserThemeList","getGroupColor","groupName","findColorByTheme","css","isColorEqual","installCssVarInSystemTheme","styleClassName","channelName","broadcastChannel","BroadcastChannel","pageActive","message","visibilityState"],"mappings":"6yBAWA,MAeaA,EAAgB,CAC5BC,SAAU,qBACVC,QAAS,qBACTC,KAAM,KACNC,YAAa,mDACbC,YAAa,sDACbC,gBAAiB,sDACjBC,iBAAkB,kEAClBC,YAAa,aACbC,iBAAiB,EACjBC,eAAe,EACfC,cAAc,EACdC,UAAW,GACXC,gBAAgB,EAChBC,sBAAuB,yEC1BxB,MAAMC,EAAcC,EAAAA,MAEdC,EAAmBA,CAACC,GAA0BC,cAAmBC,IAAAA,EAChE,MAAAC,WAAEA,EAAAA,MAAYC,EAAQ,CAAE,EAAAC,KAAEA,EAAAA,MAAMC,EAAOC,OAAAA,EAAS,CAAA,GAAOP,EAC7D,IAAKK,IAASF,EAAmB,OAAA,KACjC,MAAMK,EAAYC,EAAAA,iBAAiB,MAAQN,IACrCO,QAAEA,EAAU,MAAOC,GAAeJ,EAiBxC,GAAmB,aAAfJ,EACH,OAAAS,cAAAC,EAAAA,iBAAA,eAAAC,EAAAA,WAAA,CAAAC,WAA6Bd,EAAQI,GAAK,sBAAAW,GAAbf,EAAQI,GAAKW,EAAAC,YAAe,MAAMX,IAAOI,QAAWA,GAAaN,EAAWO,GAAU,MAGpH,MAAMO,EAAW,CAAC,SAAU,YAAYC,SAAShB,GAE3CY,EAAad,EAAQI,GA9BM,IAAAe,EA8C1BC,OAXQT,EAAAA,YAAAJ,EAAAM,aAAA,CAAAC,WAEDA,EAAU,sBANeO,IAE9BjB,EAAAA,GAAyB,YAAjBE,MAAAA,OAAAA,EAAAA,EAAQgB,MAAoBC,OAAOF,GAAOA,CAAAA,EAKpBL,YACxB,IAAIC,EAAW,KAAO,OAAOZ,KACtCF,EACAO,GAzC2B,mBAAAS,EAyCjBlB,EA/BVQ,GAA8B,IAAnBA,EAAQe,OACL,WAAftB,EACIO,EAAQgB,KAAcd,GAAAA,EAAAA,YAAAC,EAAAA,iBAAA,aAAA,CAAAP,MAAuBqB,EAAKrB,MAAKsB,MAASD,EAAKC,MAAKC,IAAOF,EAAKC,OAAK,QAEhF,gBAAfzB,EACIO,EAAQgB,KAAcd,GAAAA,EAAAA,YAAAC,EAAAA,iBAAA,YAAA,CAAAP,MACXqB,EAAKC,MAAKC,IAAOF,EAAKC,OAAK,CAAAE,QAAAA,IAC1CH,CAAAA,EAAKrB,WAIF,KAXsC,OAVbyB,oBAAAC,OAAAC,UAAAC,SAAAC,KAAAf,KAAAW,EAAAA,QAAAX,GA2CRlB,EAAA,CAAA4B,QAAAA,IAAA,CAAA5B,IAGlBmB,EAYFe,IAAaC,gBAAgB,CAClCC,KAAM,aACNC,MAAO,CACNC,UAAW,CACVjB,KAAMkB,MACNX,QAASA,IAAM,IAEhBY,OAAQ,CACPnB,KAAMoB,OACNb,QAAS,GACTc,UAAU,GAEXC,QAAS,CACRtB,KAAM,CAACkB,MAAOK,UACdhB,QAASA,IAAM,IAEhBiB,SAAU,CACTxB,KAAMS,OACNF,QAASA,OACTc,UAAU,GAEXI,KAAM,CACLzB,KAAM0B,QACNnB,SAAS,EACTc,UAAU,IAGZM,MAAO,CAAC,iBAAkB,cAAe,YACzCC,KAAAA,CAAMZ,GAAwBa,KAAEA,EAAAA,MAAMC,EAAAA,OAAOC,IAC5C,MAAMT,EAAU/C,EAAGA,IAAM,KACnB0C,UAAEA,EAAAA,OAAWE,EAAAA,SAAQK,GAAaR,EACxCgB,EAAAA,eAAc,KACFC,GAAA,IAEZC,EAAAA,WAAU,KACTC,EAAAA,UAAS,KACGC,GAAA,GACX,IAEFC,SACC,IAAMrB,EAAMM,UACZ,KACYW,GAAA,IAGNF,EAAA,CACNzD,gBAGD,MAAM2D,EAAYK,UACXC,MAAAA,EAAuC,mBAAlBvB,EAAMM,cAA+BN,EAAMM,UAAYN,EAAMM,QACxFA,EAAQjB,MAAQkC,EACdC,QAAOC,IAASA,EAAKC,MAAQD,EAAKC,KAAKD,KACvCtC,KAA6BwC,UACvB,MAAAC,MAAEA,KAAUC,GAAQF,EAInB,OAHE/D,MAAL+D,OAAK/D,EAAAA,EAAAA,aAAc,CAAC,SAAU,YAAYgB,SAAS+C,MAAAA,OAAAA,EAAAA,EAAK/D,cAAe+D,OAAAA,EAAK3D,MAAAA,OAAAA,EAAAA,EAAAA,iBAAQ8D,cA7DzER,OAAOtD,KACtBA,MAAAA,OAAAA,EAAAA,EAAQG,UAAsC,KAA3BH,MAAAA,OAAAA,EAAAA,EAAQG,QAAQe,UAAgBlB,MAAAA,OAAAA,EAAAA,EAAQ8D,cAA8C,mBAAxB9D,MAAAA,OAAAA,EAAAA,EAAQ8D,eAC5F9D,EAAOG,cAAgBH,MAAAA,SAAAA,EAAQ8D,eAChC,EA2DKA,CAAYH,EAAI3D,QAEV,CACN+D,SAAUH,EAAQ,EAAI,EACtBA,MAAOA,GAAS,IAChBI,aAAeC,GAAeC,EAAgBP,EAAKM,GACnDE,mBAAoBR,EAAIS,cAAgB,KACxCC,MAAOV,EAAI5D,MACXuE,QAASX,EAAI7D,KACbwB,IAAKqC,EAAI7D,QACN+D,EACH,GACD,EAGGT,EAAYA,eACb,IAACpB,EAAMS,KAAM,OACX8B,MAAAA,EAAUjF,OAAAA,EAAAA,OAAY+B,EAAZ/B,OAAY+B,EAAAA,EAAAA,YAAOmD,EAAAA,EAAAA,UAAKC,EAAAA,EAAAA,cAAc,sBAAsBC,SAAS,SAArEpF,EAAAA,EAAyEoF,SAAS,GAC1FC,EAAAC,SAACC,OAAON,EAAS,CACxBO,UAAW,IACXrC,MAAM,EACNsC,OAAQ/C,EAAMgD,WAAa,IAAIhD,EAAMgD,aAAe,KACpDC,MAAOA,EAAGC,WAAUC,eACdtC,EAAA,WAAYqC,EAAUC,EAAQ,GAEpC,EAEIjB,EAAkBA,CAACT,EAAsBQ,IACrB,mBAArBR,WAAM7D,YAAiCwF,EAAc3B,EAAMQ,IAErDrE,MAAN6D,OAAM7D,EAAAA,EAAAA,aAAmC,aAAfA,MAAN6D,OAAM7D,EAAAA,EAAAA,YACtBJ,EAAiBiE,EAAMQ,IAE3BR,MAAAA,OAAAA,EAAAA,EAAM4B,QAAe5B,EAAK4B,OAAOpB,EAAOA,EAAMqB,SAAU7B,GAC1C,UAAdA,EAAKzC,KAAkBX,EAAAA,YAAA,OAAA,CAAAkF,MAAA,UAAA,CAA6BtB,EAAMqB,SAAW,IAClErB,EAAMvE,QAAQuE,EAAMxE,OAAO6E,SAG7Bc,EAAgBA,CAAC3B,GAAwB6B,WAAU5F,sBACxDW,OAAAA,EAAAA,YAAA,MAAA,CAAAkF,MACa,2DAA0D9B,OAAAA,EAAAA,EAAKzD,aAALyD,EAAAA,EAAa+B,YAAa,MAC9F/B,CAAAA,OAAAA,EAAKgC,EAAAA,kBACHjC,QAAOkC,IAAOA,EAAGhC,MAAQgC,EAAGhC,KAAKhE,KAClCyB,KAAUuE,IACV,SAAIA,WAAIL,OAAQ,OAAOK,EAAGL,OAAO3F,EAAS4F,GACpCK,MAAAA,EAAmC,mBAAjBD,MAAAA,OAAAA,EAAAA,EAAIC,UAA0BD,EAAGC,SAASjG,EAAS4F,IAAYI,MAAAA,OAAAA,EAAAA,EAAIC,YAAY,EACvGtF,OAAAA,EAAAA,YAAA,OAAA,CAAAuF,QAEWC,EAAaA,eAAC,KACjBF,KACAC,MAAAA,OAAAA,EAAAA,EAAAA,WAAeA,MAAJF,GAAIE,EAAAA,QAAQlG,EAAS4F,IACpCzC,EAAK,iBAAkB6C,EAAGpE,IAAK5B,EAAS4F,GACzC,GACE,CAAC,SAAQC,MACL,mCAAsCC,MAAJE,OAAIF,EAAAA,EAAAA,YAAa,MAAMG,EAAW,wBAA0B,MAEpGD,CAAAA,EAAG3F,OAAK,KAGV,EAKA+F,EAAaA,KAClB,IAAKtD,GAA+B,IAAnBA,EAASuD,MAAoB,OAAA,KAO9C1F,OAAAA,EAAAA,YAAA,MAAA,CAAAkF,MAAA,mBAAAlF,CAAAA,EAAA2F,YAAA1F,mBAAA,iBAAA,CAAA2F,YAGwBzD,EAAS0D,UAAS,uBAAlB1D,GAAAA,EAAS0D,UAASzF,EAAA0F,SACrB3D,EAAS2D,SAAQ,oBAAjB3D,GAAAA,EAAS2D,SAAQ1F,EAAA2F,OAC5B,EAAKT,UACF,EAAK,aACH,CAAC,GAAI,GAAI,GAAI,KAAIU,QACrB7D,MAAAA,OAAAA,EAAAA,EAAU6D,QAAS7D,MAAAA,OAAAA,EAAAA,EAAU6D,OAAS,gCAA+BC,YACjE,EAAKP,MACVvD,EAASuD,MAAKQ,aAhBgBC,IAClC3D,EAAA,cAAe,WAAY2D,EAAC,EAgBDC,gBAdUD,IACrC3D,EAAA,cAAe,YAAa2D,EAAC,GAcI,OAAA,EAKlCE,KAAqCC,GAAWnE,GAA+B,IAAnBA,EAASuD,MAAkB,GAAJ,GACzF,MAAO,IACN1F,cAAAC,EAAAA,iBAAA,mBAAA,KAAA,CAGGiB,QAASA,EAAGqC,QAAO+C,YAA2CtG,EAAAA,YAAA,MAAA,CAAAkF,MAAA,iBAAA,CAAAlF,EAAAA,YAAAC,EAAAA,iBAAA,eAAAC,EAAAA,WAAA,CAAAqG,QAAA,EAAA,UAIlDzE,EAAMyB,MACRA,EAAK+C,OACJD,EAAeC,GAAOrE,QACrBA,EAAQjB,MAAKwF,KAChB5E,GACFa,EAAK,CAAAvD,IACJD,IAELwG,MAAAA,OAOR,IChPD5D,MAAMR,UAAUoF,QAAU,SAAUC,GACnC,OAAOA,EAAKC,KACb,ECwCO,MAAMC,EAAqB,CACjCC,QAAQ,EACRC,QAAS,KACTC,WAAY,IACZC,YAAa,IACbC,WAAY,CAAEC,EAAG,EAAGC,EAAG,IAMxB,SAASC,EAAUC,GACX,OAAAC,SAASlD,cAAciD,EAC/B,CAEA,MAAeE,EAAA,CACdf,KAAO,IACCI,EAER,OAAAY,GACCb,KAAKc,YACLd,KAAKe,MACN,EACAC,SAAU,CACT,YAAAC,GACC,OAAOjB,KAAKI,WAAa,IAC1B,EACA,aAAAc,GACC,OAAOlB,KAAKK,YAAc,IAAA,GAG5Bc,QAAS,CAER,SAAAL,GACMd,KAAAoB,QAAUX,EAAU,iBACpBT,KAAAG,QAAUM,EAAU,uBACpBT,KAAAqB,SAAWZ,EAAU,uBAC3B,EAGA,IAAAM,ICrEK,SAAqBO,GAI3B,IAAIC,EAAY,EAEZC,EAAW,EAENF,EAAAG,YAAmBjC,IACf+B,EAAA/B,EAAEkC,QAAUJ,EAASK,WACtBH,EAAAhC,EAAEoC,QAAUN,EAASO,UAE1B,MAAAC,EAAatC,IAClBA,EAAEuC,kBACFvC,EAAEwC,iBAEF,MAAMC,EAAKzC,EAAEkC,QACPQ,EAAK1C,EAAEoC,QACb,IAAIO,EAAKF,EAAKV,EACVa,EAAKF,EAAKV,EACVW,EAAK,IAAQA,EAAA,GACbC,EAAK,IAAQA,EAAA,GACbD,EAAKxB,SAAS0B,KAAKC,YAAchB,EAASgB,cAAkBH,EAAAxB,SAAS0B,KAAKC,YAAchB,EAASgB,aACjGF,EAAKzB,SAAS0B,KAAKE,aAAejB,EAASiB,eAAmBH,EAAAzB,SAAS0B,KAAKE,aAAejB,EAASiB,cAC/FjB,EAAAkB,MAAMC,KAAON,EAAK,KAClBb,EAAAkB,MAAME,IAAMN,EAAK,IAAA,EAErBO,EAAK,KAEDhC,SAAAiC,oBAAoB,YAAad,GACjCnB,SAAAiC,oBAAoB,UAAWD,EAAE,EAElChC,SAAAkC,iBAAiB,YAAaf,GAC9BnB,SAAAkC,iBAAiB,UAAWF,EAAE,CAEzC,CDmCGG,CAAY9C,KAAKG,QAAO,IEjFrB4C,EAAa,CACjBC,MAAO,6BACPpG,MAAO,KACP+C,OAAQ,KACRsD,KAAM,OACNC,QAAS,aAQX,MAAeC,EAAA,CAAE9E,OALV,SAAgB+E,EAAMC,GAC3B,OAAQC,EAAUC,YAAIC,EAAmBC,mBAAC,MAAOV,EAAYM,EAAO,KAAOA,EAAO,GAAK,CACrFK,EAAkBC,kBAAC,obAAuc,KAE9d,GCZMZ,EAAa,CACjBC,MAAO,6BACPpG,MAAO,KACP+C,OAAQ,KACRsD,KAAM,OACNC,QAAS,aAkBX,MAAeU,EAAA,CAAEvF,OAfV,SAAgB+E,EAAMC,GAC3B,OAAQC,EAAUC,YAAIC,EAAmBC,mBAAC,MAAOV,EAAYM,EAAO,KAAOA,EAAO,GAAK,CACrFQ,EAAAA,mBAAoB,IAAK,CACvBC,OAAQ,eACR,iBAAkB,QAClB,eAAgB,SACf,CACDD,EAAAA,mBAAoB,OAAQ,CAC1B,kBAAmB,QACnBE,EAAG,+IAELF,EAAAA,mBAAoB,OAAQ,CAAEE,EAAG,qDAC9B,KAET,GCtBMhB,EAAa,CACjBnG,MAAO,QACP+C,OAAQ,QACRuD,QAAS,aAWX,MAAexL,EAAA,CAAE2G,OARV,SAAgB+E,EAAMC,GAC3B,OAAQC,EAAUC,YAAIC,EAAmBC,mBAAC,MAAOV,EAAYM,EAAO,KAAOA,EAAO,GAAK,CACrFQ,EAAAA,mBAAoB,OAAQ,CAC1BZ,KAAM,eACNc,EAAG,4VACF,MAAQ,KAEf,GCHAC,EAAWA,YAAChL,OAAO,CAClB+B,KAAM,WAEA,MAAMkJ,EAAY3H,MAAOhC,EAAKD,WAC9B2J,cAAYE,QAAQ5J,EAAKD,EAAK,EAGxB8J,EAAY7H,MAAMhC,SACjB0J,EAAAA,YAAYI,QAAQ9J,GCLrBtB,EAAS,CACrBqL,IAAKC,EAAeA,gBAAC,oBAHhB,uDAKOC,EAAYjI,OAASkI,QAAOC,aAAYC,WAAW,KAAMC,aAAa,KAAM9M,sBACpF,IACH,MAAMgI,KAAEA,SAAe+E,EAAAA,KAAKC,KAC3BhN,GAAoCmB,EAAOqL,IAC3C,CACCG,QACAC,aACAC,WACAC,cAED,CAAEG,QAAS,CAAEC,WAAW,KAElB,OAAAlF,EAAKmF,QAAU,CAAE,CACxB,OAAQxF,GACD,OAAA,IACT,GCpBMyF,EAAS,GAAGC,kBAAqB,gBAAgBC,OAAOzN,OACjD0N,EAAe,CAC3B,mDACA,yDACGF,EAAoBZ,gBAAC,0BAMZe,EAAoB/I,MAAMuD,IAClC,IAAAyF,EAASC,KAAKC,UAAU3F,GAC5B,MACM4F,EAAUH,EAAOI,MADF,qBAEfC,OARoBrJ,WACpB5E,MAAAA,QAAayM,EAAU,QACtB,aAAMA,EAAU,GAAGe,EAAoBZ,gBAAC,gBAAgB5M,IAAM,EAMvCkO,GAC9B,IAAIC,EAAY,GAChB,GAAIJ,EAAS,CACZ,IAAA,MAAWC,KAASD,EAEfE,EAAgBD,GACVJ,EAAAA,EAAOQ,QAAQ,IAAIC,OAAOL,EAAO,KAAMC,EAAgBD,IAE3DG,EAAUjM,SAAS8L,IACvBG,EAAUG,KAAKN,GAId,GAAAG,EAAU3L,OAAS,EAAG,CACnB,MAAA+L,QAaT3J,eAA8BkI,GAC7B,MAAMc,QAAef,EAAU,CAAEC,QAAOE,SAAUS,OAAOzN,KAAM+M,WAAYS,kBAAqB,eACzF,OAAAI,CACR,CAhByBY,CAAeL,GACrCA,EAAUM,SAAgBC,IAChBd,EAAAA,EAAOQ,QAAQ,IAAIC,OAAOK,EAAM,KAAMH,EAAQG,GAAK,IAE7D,MAAMC,EAAqB,IAAKV,KAAoBM,SAC9ChC,EAAUgB,EAAQoB,GACxBR,EAAY,EACf,CACA,CAEQ,OAAAN,KAAKe,MAAMhB,EAAM,EC7CzB,MAAMiB,EAAY,mBAClB,IAAIC,EAEJ,MAAMC,EAAa,CAAC,MAAO,IAAK,OAAQ,WAAY,UAC9CzN,EAAS,CACd0N,WAAW,EACXC,SAAS,EACTC,eAAe,EACfC,YAAY,EACZC,gBAAiB,CAAC,WAAY,cAAe,kBAE9C,IAAIC,EAycJ,MAAMC,EAAc,IAxcpB,MAaC,WAAAC,GAZQC,EAAAlH,KAAA,QACDkH,EAAAlH,KAAA,MACAkH,EAAAlH,KAAA,mBACAkH,EAAAlH,KAAA,aACCkH,EAAAlH,KAAA,sBACAkH,EAAAlH,KAAA,SACAkH,EAAAlH,KAAA,gBACAkH,EAAAlH,KAAA,oBACAkH,EAAAlH,KAAA,gBACAkH,EAAAlH,KAAA,yBACDkH,EAAAlH,KAAA,mBACCkH,EAAAlH,KAAA,kBAEPA,KAAKmH,KAAO,KACZnH,KAAKoH,GAAK,KACVpH,KAAK2F,gBAAkB,CAAC,EACxB3F,KAAK7H,UAAY,kBACjB6H,KAAKqH,MAAQ,GACbrH,KAAKsH,cAAgBtH,KAAKsH,cAAcC,KAAKvH,MAC7CA,KAAKwH,aAAe,GACfxH,KAAAyH,qBAAuBC,IACvB1H,KAAA2H,0BAA4BD,IACjC1H,KAAK4H,aAAe,KACpB5H,KAAKnI,gBAAkB,KACvBmI,KAAK6H,eAAiB,GAAA,CAEvB,mBAAMP,EAAcF,GACnBA,EAAAjP,UACAA,EAAAN,gBACAA,EAAAiQ,mBACAA,IAOA,GAAW,OAAPV,EAAJ,CACA,GAAW,QAAPA,EAAqB,OAAApH,KAAK+H,2BAC1BlQ,IACHmI,KAAKnI,gBAAkBA,SAIlBmI,KAAKgI,WAAW,CAAEZ,KAAIjP,YAAW2P,uBAGvC9H,KAAKiI,qBAVY,CAUQ,CAK1B,wBAAAF,GACUpH,SAAA0B,KAAKG,MAAM0F,WAAa,cACxBvH,SAAA0B,KAAKG,MAAM,2BAA6B,cACjD7B,SAASwH,gBAAgBzQ,KAAO,OAAA,CAGjC,mBAAAuQ,GACYlB,EAAA,IAAIqB,kBAA8BC,IACxCA,EAAUnO,OAAS,GACZmO,EAAAlC,SAAQ,CAACmC,EAAUC,KAC5B,OAAQD,EAAStO,MAChB,IAAK,gBACCgG,KAAAwI,gBAAgBF,EAASG,QAC9B,MACD,IAAK,YAEJzI,KAAK0I,wBAAwBJ,GAC7B,MACD,IAAK,aAC2B,gBAA3BA,EAASK,eAAmCpC,EAAUqC,KAAKN,EAASG,OAAO/O,aACzEsG,KAAA6I,kBAAkBP,EAASG,OAAQ,eACH,aAA3BH,EAASK,eACd3I,KAAA6I,kBAAkBP,EAASG,OAAQ,SACnCzI,KAAA6I,kBAAkBP,EAASG,OAAQ,gBACH,kBAA3BH,EAASK,eAAsE,UAAjCL,EAASG,OAAOK,cAExEC,YAAW,KACL/I,KAAA6I,kBAAkBP,EAASG,OAAQ,QAAO,GAC7C,GAYJ,GAEF,IAKM1B,EAAAiC,QAAQhJ,KAAK4H,aAAc5O,GAE9B,MAAAiQ,EAAqBlC,EAASmC,cAEhCD,EAAmB/O,OAAS,GAEZ+O,EAAA9C,SAAkBgD,IAAV,GAG5B,CAGD,eAAAX,CAAgBY,GACX,GAAA7C,EAAUqC,KAAW,MAANQ,OAAM,EAAAA,EAAAvJ,OAAS0G,EAAUqC,KAAW,MAANQ,OAAM,EAAAA,EAAAC,WAAY,CAElE,MAAMA,EAAYD,EAAKC,UAAUvD,QAAQ,MAAO,IAC5C9F,KAAK2F,gBAAgB0D,GACnBD,EAAAC,UAAYrJ,KAAK2F,gBAAgB0D,KAEjCrJ,KAAKwH,aAAa5N,SAASyP,IAAcA,EAAUnP,QAAU8F,KAAK6H,gBACjE7H,KAAAwH,aAAaxB,KAAKqD,GAEnBrJ,KAAAsJ,0BAA0BF,EAAMC,GACtC,CACD,CAGD,uBAAAX,CAAwBJ,GAEvB,GAAIA,EAASiB,WAAWrP,OAAS,GAAKoO,EAASkB,aAAatP,OAAS,EAC7D,OAAA8F,KAAKyJ,UAAUnB,GAGnBA,EAASkB,aAAatP,OAAS,GAAqC,cAAhCoO,EAASkB,aAAa,GAAGE,IAEjE1J,KAAKyJ,UAAUnB,EAAQ,CAGxB,SAAAmB,CAAUnB,aACL,GAAAA,EAASiB,WAAWrP,OAAS,EAAG,CACnC,MAAMyP,EAAUrB,EAASG,OAAOkB,QAAQC,cACpC,GAAAnD,EAAW7M,SAAS+P,GAAU,OAC9B,GAAAlD,EAAW7M,SAAS,OAAAiQ,EAAA,OAAAC,EAAAxB,EAASiB,WAAW,SAAI,EAAAO,EAAAH,cAAS,EAAAE,EAAAD,eAAgB,OACzE,MAAMpL,EAAY,OAAAuL,EAAAzB,EAASiB,WAAW,SAAI,EAAAQ,EAAAvL,UAEpCwL,EAAkB1B,EAASG,OAAOY,UACpC,GAAA7K,GAA2B,KAAdA,EAEZA,EAAU5E,SAAS,WAEjBoG,KAAAiK,uBAAuB3B,EAAS4B,iBAI7B1L,EAAU5E,SAAS,YAKjB4E,EAAU5E,SAAS,YAMrB4E,EAAU5E,SAAS,WAP3BoG,KAAKiK,uBAAuB3B,EAASiB,WAAW,IAWxCS,EACHhK,KAAAmK,aAAa,YAAa7B,EAASG,SAGhClC,EAAUqC,KAAKN,EAASiB,WAAW,GAAGa,YAGpC5L,EAAU5E,SAAS,WAF7BoG,KAAKiK,uBAAuB3B,EAASiB,WAAW,QAe3C,CACA,MAAAH,EAAOd,EAASiB,WAAW,GAC7BH,GAAQA,EAAKiB,WAAaC,KAAKC,WAAahE,EAAUqC,KAAKQ,EAAKC,WAC9DrJ,KAAAmK,aAAa,YAAaf,GAG/BpJ,KAAKiK,uBAAuBb,EAE7B,CACD,MAIKpJ,KAAAiK,uBAAuB3B,EAASG,QACrCzI,KAAKwK,sBACN,CAKD,mBAAAC,GAECjE,GAAgBkE,aAAalE,GAC7BA,EAAeuC,YAAW,KAKrB,GADJ/I,KAAKwK,uBACDxK,KAAKwH,aAAatN,OAAS,EAAG,CAGHyQ,EAAAA,EAAEC,UAC/B,IAAM5K,KAAK6K,sBAAsB7K,KAAKwH,aAAcxH,KAAKyH,iBAAiBqD,OAC1E,IACA,CACCC,SAAS,GAGWF,EAAA,KAChB,CAIF,GAAA7K,KAAK2H,sBAAsBmD,KAAO,EAAG,CAExC,IAAA,MAAW1B,KAAQpJ,KAAK2H,sBAAsBqD,SACxChL,KAAA6I,kBAAkBO,EAAM,eAAe,GACzB,KAAfA,EAAK/O,OACH2F,KAAA6I,kBAAkBO,EAAM,SAAS,GAGxCpJ,KAAK2H,sBAAsBsD,OAAM,CAElCjL,KAAKkL,6BAA4B,EAAI,IAEpC,IAAG,CAGP,sBAAAjB,CAAuBkB,GACCR,IAAEC,UAAS,IAAM5K,KAAKoL,eAAeD,IAAa,IAAK,CAC7EJ,SAAS,GAEKK,EAAA,CAGhB,cAAAA,CAAeD,GACd,IAAKA,EAAY,OACjB,MAAME,EAAcjC,GAAQpJ,KAAKsL,kBAAkBlC,GAC7CmC,EAAS5K,SAAS6K,iBAAiBL,EAAYM,WAAWC,aAAeD,WAAWE,UAAW,CACpGC,WAAWxC,GACNA,EAAKO,SAA0C,QAA/BP,EAAKO,QAAQC,cAAgC6B,WAAWI,eAC5ER,EAAYjC,GACLqC,WAAWK,eAGhB,IAAA1C,EACI,KAAAA,EAAOmC,EAAOQ,YACrBV,EAAYjC,EACb,CAID,iBAAAkC,CAAkBlC,EAAM4C,GAAc,GAEjC5C,EAAK/L,OAASkJ,EAAUqC,KAAKQ,EAAK/L,QAChC2C,KAAAmK,aAAa,QAASf,GAExBA,EAAKiB,WAAaC,KAAK2B,aAEtB,CAAC,WAAY,SAASrS,SAASwP,EAAKO,QAAQC,iBAC3CrD,EAAUqC,KAAKQ,EAAK1P,cAClBsG,KAAA6I,kBAAkBO,EAAM,eAG1BA,EAAK/O,OAASkM,EAAUqC,KAAKQ,EAAK/O,QAChC2F,KAAA6I,kBAAkBO,EAAM,SAGX,KAAfA,EAAK/O,OAAgB+O,EAAK8C,UAC7BlM,KAAKmM,+BAA+B/C,IAG5BA,EAAKiB,WAAaC,KAAKC,YAAchE,EAAUqC,KAAKQ,EAAKC,YAAc9C,EAAUqC,KAAKQ,EAAKvJ,QAChGG,KAAAmK,aAAa,YAAaf,EAAM4C,EACtC,CAED,iBAAAnD,CAAkBuD,EAAW9R,EAAK0R,GAAc,GACzC,MAAA3R,EAAQ+R,EAAU9R,GAEnBiM,EAAUqC,KAAKvO,KAEhB2F,KAAK2F,gBAAgBtL,GACxB+R,EAAU9R,GAAO0F,KAAK2F,gBAAgBtL,KAEjC2F,KAAKwH,aAAa5N,SAASS,IAAUA,EAAMH,QAAU8F,KAAK6H,gBACzD7H,KAAAwH,aAAaxB,KAAK3L,GAGnB2R,GACJhM,KAAKmM,+BAA+BC,IAEtC,CAGD,8BAAAD,CAA+BC,GACxB,MAAA9R,EAAM+R,KAAKC,SAAS3R,SAAS,IAAI4R,MAAM,KAAK,GAC7CvM,KAAK2H,sBAAsB6E,IAAIlS,KAC9B0F,KAAA2H,sBAAsB8E,IAAInS,EAAK8R,GACpCpM,KAAKyK,sBACN,CAED,oBAAAD,GACC,MAAMnN,EAAQsD,SAAStD,MACnBkJ,EAAUqC,KAAKvL,IACd2C,KAAK2F,gBAAgBtI,KACfsD,SAAAtD,MAAQ2C,KAAK2F,gBAAgBtI,GAExC,CAED,yBAAAiM,CAA0BF,GACnB,MAAA9O,EAAM+R,KAAKC,SAAS3R,SAAS,IAAI4R,MAAM,KAAK,GAC7CvM,KAAKyH,iBAAiB+E,IAAIlS,KACzB0F,KAAAyH,iBAAiBgF,IAAInS,EAAK8O,GAC/BpJ,KAAKyK,sBACN,CAED,YAAAN,CAAa7P,EAAK8O,EAAM4C,GAAc,GAEjC,GAAc,KAAd5C,EAAK9O,GAAa,OACtB,MAAM+O,EAAYD,EAAK9O,GAAKwL,QAAQ,MAAO,IACvC9F,KAAK2F,gBAAgB0D,GACxBD,EAAK9O,GAAO0F,KAAK2F,gBAAgB0D,KAE5BrJ,KAAKwH,aAAa5N,SAASyP,IAAcA,EAAUnP,QAAU8F,KAAK6H,gBACjE7H,KAAAwH,aAAaxB,KAAKqD,GAKnB2C,EAIJhM,KAAKyK,sBAHLzK,KAAKsJ,0BAA0BF,GAKjC,CAGD,2BAAMyB,CAAsBrD,EAAcsD,GAErC,GAAuB,GAAvBtD,EAAatN,OAAa,OAExB,MAAAwS,EAAqBlF,EAAahL,QAAOpC,GAA+B,MAAtBA,EAAO,IAAIuS,SAC/D,GAA8B,IAA9BD,EAAmBxS,OAAc,OACrC,MAAMsK,EAAQtJ,MAAMiM,KAAK,IAAIyF,IAAIF,IAG3BpH,QAAef,EAAU,CAC9BC,QACAE,SAAU1E,KAAKoH,GACf3C,WAAYzE,KAAK7H,UACjBN,gBAAiBmI,KAAKnI,kBAGlByN,GAAyC,IAA/B7K,OAAOoS,KAAKvH,GAAQpL,QAInC8F,KAAK2F,gBAAkB,IAAK3F,KAAK2F,mBAAoBL,SAE/CrB,EAAUjE,KAAKqH,MAAOrH,KAAK2F,iBAGjC3F,KAAKwH,aAAe,GAEpBxH,KAAKkL,8BAGLlL,KAAKyK,uBAbJzK,KAAKwH,aAAe,EAaI,CAG1B,2BAAA0D,CAA4B4B,GAAU,GACjC,GAAA9M,KAAKyH,iBAAiBqD,KAAO,EAAG,CACnC,IAAA,MAAWiC,KAAO/M,KAAKyH,iBAAiBuD,SAEnCzE,EAAUqC,KAAKmE,EAAI1D,YACjBrJ,KAAAsL,kBAAkByB,GAAK,GAGnBD,GAAA9M,KAAKyH,iBAAiBwD,OAAM,CACxC,CAGD,gBAAMjD,EAAWZ,GAAEA,EAAIjP,UAAAA,EAAA2P,mBAAWA,IAC5B9H,KAAAoH,GAAKA,GAAMpH,KAAKoH,GAChBpH,KAAA7H,UAAYA,GAAa6H,KAAK7H,UACnC6H,KAAKqH,MAAQ,GAAGrH,KAAK7H,aAAa6H,KAAKoH,KAEvCzG,SAASlD,cAAc,QAAQuP,UAAUC,IAAI7F,GACxCpH,KAAA4H,aAAejH,SAASlD,cAAc,cAExB0G,EAAU,UACpBiD,SAAWnD,EAAU,OAAQmD,GAGtC,MAAM8F,QAAW/I,EAAUnE,KAAKqH,OAC1B8F,EAAiB7Q,UAChB,MAAAgJ,QAAef,EAAU,CAC9BC,MAAO,GACPE,SAAU1E,KAAKoH,GACf3C,WAAYzE,KAAK7H,UACjBN,gBAAiBmI,KAAKnI,kBAGvBmI,KAAK2F,gBAAkBL,QACjBrB,EAAUjE,KAAKqH,MAAOrH,KAAK2F,gBAAe,EAGjD,GAAKuH,EAIA,IACYC,UAEPC,GACRpN,KAAK2F,gBAAkBuH,CAAA,YAPlBjJ,EAAUjE,KAAKqH,MAAO,IACb8F,IAUZ,GAAArF,GAAsBA,EAAmB5N,OAAS,EACrD,IAAA,MAAW/B,KAAa2P,EAAoB,CACrC,MAAAxC,QAAef,EAAU,CAC9BC,MAAO,GACPE,SAAU1E,KAAKoH,GACf3C,WAAYtM,EACZN,gBAAiBmI,KAAKnI,kBAEjBwP,EAAQ,GAAGlP,KAAa6H,KAAKoH,WAC7BnD,EAAUoD,EAAO/B,EAAM,CAE/B,CAED,kBAAAM,GACC,OAAO5F,KAAK2F,eAAA,GAID2B,EAAgBN,EAAYM,cAC5B+F,EAAa/Q,MAAM8K,IHrcT,CAAA1P,IACC6Q,EAAA+E,mBAAC,OAAQ5V,EAAI,EGscpC6V,CAAQnG,SAEWjD,EAAU,UAChBiD,UACNnD,EAAU,OAAQmD,GACpB,IAAAoG,GAAGC,gBAAcC,YAAYnI,KAAKC,UAAU,CAAExL,KAAM,UACxD2T,SAASC,SAAO,EAILC,EAAUvR,eACR6H,EAAU,SAAY,GAGxB2J,EAAmC1H,GACzBY,EAAYpB,qBACbQ,IAASA,EAIlB2H,EAAqC3H,IAC3C,MAAA4H,EAAgBhH,EAAYpB,qBAC3B,OAAAnL,OAAOoS,KAAKmB,GAAeC,SAAYD,EAAc1T,KAAS8L,KAASA,CAAA,EAIlE8H,EAAsB5R,MAAOnE,EAAmBT,KACxDA,GAAS,OAATA,EAAe,MAAO,CAAC,EACvB,IACG,MAAAyW,QAAkB5J,EAAU,CACjCC,MAAO,GACPE,SAAUhN,EACV+M,WAAYtM,EACZN,gBAAiBmP,EAAYnP,kBAIvB,aADDoM,EAAU,GAAG9L,KAAaT,IAAQyW,GACjCA,QACCf,GACR,OAAOjJ,EAAU,GAAGhM,KAAaT,IAAM,wPCjfnCqL,EAAA,CAAAxE,MAAM,6BATG,CACdvD,MAAO,CACNX,MAAO,CACN+T,OAAQnU,2CAMVoU,OAAAA,EAAAC,gBAAAhL,EAAAC,YAAAC,EAAAA,mBAEM,MAFNT,EAEM,CADLc,EAAA0K,mBAAsB,6BAAdC,EAAKnU,OAAA,oBADuBmU,EAAKnU,MAAA,yCCmDtCoU,EAAU,CACdC,WAAY,CAAEvL,QAAOS,QAAO+K,QAAOjX,QACnCsD,MAAO,CACN4T,SAAU,CACTR,OAAQ1S,QACRnB,SAAS,GAEVsU,WAAY,CACXT,OAAQnU,SAGV4F,KAAO,KACC,CACNvE,QAAS,iBACTwT,KAAM3J,OAAOjN,aAAe,iBAAmB,MAC/Cc,OAAQ,CACP,CACC+B,KAAM,QACNhC,MAAO,OACPgW,KAAM,QACNC,YAAa,wFACbC,SAAU,CAAC,GAAI,GACfC,KAAM,YACNC,OAAQ,aACRrV,UAAW,QACX+F,KAAMsF,OAAOhC,MACb,YAAagC,OAAOjN,aAAe,gBAAkB,gBACrDwE,KAAMyI,OAAOhC,MAAMjJ,OAAS,GAE7B,CACCa,KAAM,OACNhC,MAAO,OACPgW,KAAM,OACNE,SAAU,CAAC,IAAK,GAChBC,KAAM,OACNpV,UAAW,OACXsV,aAAa,EACb,YAAa,gBACb1S,OAAMyI,OAAOjN,cAAeiN,OAAOjN,cAEpC,CACC6C,KAAM,QACNhC,MAAO,OACPgW,KAAM,QACNE,SAAU,CAAC,IAAK,GAChBC,KAAM,YACNpV,UAAW,QACXsV,aAAa,EACb,YAAajK,OAAOjN,aAAe,gBAAkB,gBACrDwE,OAAMyI,OAAOlN,eAAgBkN,OAAOlN,gBAGtCoX,aAAc,CAAE,EAChBC,SAAUC,KACVC,SAAU,CACT,CAAEzU,KAAM,aAAcrD,KAAM,MAC5B,CAAEqD,KAAM,4BAA6BrD,KAAM,OAC3C,CAAEqD,KAAM,aAAcrD,KAAM,SAI/BsJ,SAAU,CACT,UAAAyO,GACC,OAAOzP,KAAKhH,OAAOwD,QAAOpC,GAAQA,EAAKsC,MACxC,GAEDL,MAAO,CACN,QAAAuS,CAAS7U,GACHA,EAGCiG,KAAAsP,SAAWtP,KAAKuP,cAFrBvP,KAAKqP,aAAe,CAAE,CAIxB,GAED,OAAAxO,GACMb,KAAAsP,SAAWtP,KAAKuP,aACrB,EACDpO,QAAS,CACRkM,aACAkC,YAAc,IACNA,KAGR,YAAAG,CAAatV,GACR,GAAc,UAAdA,EAAKW,KAAkB,CAC1B,MAAM4U,EAAaxK,OAAOwI,SAASiC,SAASrD,MAAM,KAAK,GAChDpH,OAAA0K,KAAK,IAAIF,sCAChB3P,KAAK8P,MAAM,aAEX9P,KAAKqP,aAAejV,CAErB,EACD,WAAA2V,CAAY3V,GACX4V,GAAY5V,GACZ4F,KAAKsP,SAAWlV,EAAKsP,EACrB,EACDuG,YAAY1H,IACM,CAChB,EAAG,CACF,WAAY,EACZ,cAAe,GAEhB,EAAG,CACF,WAAY,EACZ,cAAe,GAEhB,EAAG,CACF,WAAY,EACZ,cAAe,GAEhB,EAAG,CACF,WAAY,EACZ,cAAe,IAGDA,MA3LnBxF,EAAA,CAAA,WAAAmN,EAAA,CAAA,SAgBWC,EAAA,CAAA5R,MAAM,0DAETA,MAAM,UACNiE,MAAA,CAAoC4N,MAAA,yBACpCA,MAAM,0EAENtF,KAAK,MAMDuF,EAAA,CAAA9R,MAAM,wBA5BlBjE,IAAA,EAiCiCiE,MAAM,oBAjCvCjE,IAAA,EAkCSiE,MAAM,8BAENA,MAAM,UAAUiE,MAAA,CAAoC4N,MAAA,yBAACA,MAAM,wBAAwBtF,KAAK,MApCjGwF,GAAA,CAAA,QAAA,eAAAhW,IAAA,EAiDkDiE,MAAM,kDAjDxDgS,GAAA,CAAA,UAAA,eCEMxN,GAAa,CACjBC,MAAO,6BACPpG,MAAO,KACP+C,OAAQ,KACRsD,KAAM,OACNC,QAAS,aAcX,MCdKsN,GAAU,CACdzV,KAAM,YACN2T,WAAY,CAAE+B,+GFPdC,EA4DaC,YAAAC,aAAA,CA5DD7V,KAAK,OAAO8V,KAAK,WAF9BtW,QAAAuW,EAAAC,SAGE,IA0DM,kBA1DNlN,EA0DM0K,mBAAA,MAAA,CA1DiBhQ,MAHzByS,EAAAC,eAAA,CAG+B,oBAA4BzC,EAAQI,SAAA,UAAA,gBAIxDsC,EAAA7B,aAAatU,KAPxBoW,EAAAC,mBAAA,IAAA,kBAIG5N,EA2BMC,mBAAA,MAAA,CA/BTnJ,IAAA,EAKKkI,MALL6O,EAAAA,eAAA,CAAA,wBAKuCH,EAAO5V,QAAA,qBAAwB4V,EAAIpC,OACtEvQ,MAAM,kBAGN+E,aAAA,GAAAE,EAAAA,mBAqBM8N,EA9BVC,SAAA,KAAAC,EAAAA,WAWoBC,EAAUhC,YAAlBrV,kBAFRoJ,EAqBMC,mBAAA,MAAA,CApBLlF,MAAM,mCAELK,QAAKnF,GAAEgY,EAAY/B,aAACtV,GACpBoI,MAbN6O,EAAAA,4BAa4BjX,EAAI,iBAE3ByJ,EAAAA,mBAcM,MAAA,CAdAxG,MAAOjD,EAAKrB,MAAOwF,MAAM,8CAC9BsF,EAAA0K,mBAWM,MAXN4B,EAWM,CAVLtM,EAAA0K,mBAQI,IARJmD,EAQI,EADHpO,EAAAA,YAAAoN,EAAAC,YAA6BgB,EAxBrCC,wBAwBwBxX,EAAK2U,UAEW3U,EAAKgV,2BAAtCsB,EAAqDC,YAAAkB,EAAA,CA1B5DvX,IAAA,EA0BeD,MAAOmU,EAAUK,+BA1BhCsC,EAAAC,mBAAA,IAAA,KA4BMvN,EAAA0K,mBAAuD,OAAvD8B,EAAmCyB,EAAAC,gBAAA3X,EAAKrB,OAAK,IA5BnD,EAAAmX,IAAA,GAAAnN,iBAiCcmO,EAAA7B,aAAatU,MAAxBuI,EAAAA,YAAAE,EAAAA,mBA2BM,MA3BNwO,EA2BM,CA1BsD,UAAjBd,EAAA7B,aAAatU,MAAvDuI,EAAAA,YAAAE,EAAAA,mBAcM,MAdNyO,EAcM,CAbLpO,EAAAA,mBAIM,MAAA,CAJDtF,MAAM,4CAA6CK,uBAAOsS,EAAY7B,aAAA,CAAA,GAAOhS,MAAM,OACvFwG,EAAA0K,mBAEI,IAFJ2D,GAEI,EADH5O,EAAAC,YAAAmN,EAAAA,YAAqCiB,EAAAA,wBAArBT,EAAY7B,aAACN,6BAG/BvL,EAOEC,mBAAA6N,EAAAC,SAAA,KA/CPC,aA6C8BN,EAAY7B,aAACxP,MA7C3C,CA6CczF,EAAMmO,mBALf/E,EAOEC,mBAAA,MAAA,CANAjB,MAzCP6O,EAAAc,eAAA,CAAA,CAAA7S,WAyC6BlF,EAAKgY,WAAUC,UAAA,mBAAgCjY,EAAKgY,cAAgBX,EAAWxB,YAAC1H,KACtGlL,MAAOjD,EAAKW,KACbwD,MA3CNyS,EAAAA,gBA2CY,QACEE,aAAa9W,EAAKsP,GAAE,SAAA,KAE3B9K,QAAKnF,GAAEgY,EAAW1B,YAAC3V,IA9C1B,KAAA,GAAAkW,gBAiDqC,SAAjBY,EAAA7B,aAAatU,MAA7BuI,EAAAA,YAAAE,EAAAA,mBAUM,MAVN8O,GAUM,CATLzO,EAAAA,mBAAqE,MAAA,CAA/DjF,uBAAOsS,EAAY7B,aAAA,CAAA,GAAO9Q,MAAM,wBAAuB,OAC7D+E,aAAA,GAAAE,EAAAA,mBAOM8N,EA1DXC,SAAA,KAAAC,EAAAA,WAuDqBN,EAAQ1B,UAAhBpV,kBAJRoJ,EAOMC,mBAAA,MAAA,CANJ7E,QAAOnF,GAAAgY,EAAApE,WAAWjT,EAAK1C,MACvB2F,MAAOjD,EAAKW,KACbwD,MAAM,2EAGHnE,EAAKW,MAzDd,EAAAwV,gBAAAY,EAAAC,mBAAA,IAAA,MAAAD,EAAAC,mBAAA,IAAA,iBAGe5C,EAAQI,eAHvBjE,EAAA,wCESiC4H,SDYlB,CAAElU,OAXV,SAAgB+E,EAAMC,GAC3B,OAAQC,EAAUC,YAAIC,EAAmBC,mBAAC,MAAOV,GAAYM,EAAO,KAAOA,EAAO,GAAK,CACrFQ,EAAAA,mBAAoB,IAAK,CACvBC,OAAQ,eACR,kBAAmB,QACnB,eAAgB,KACf,CACDD,EAAAA,mBAAoB,OAAQ,CAAEE,EAAG,mSAC9B,KAET,GCX2C4K,SAC1C6D,OAAQ,CAAC5R,GACTf,KAAO,KACC,CACN+O,UAAU,EACVK,SAAU,CACTvM,IAAK,EACLD,KAAM,GAEPoM,WAAY,EACZ4D,UAAWtN,OAAOlN,gBAGpB+I,SAAU,CACT,SAAA0R,GACQ,OAAA1S,KAAKE,OAAS,WAAa,QAAA,GAGpC,OAAAW,GACKb,KAAKyS,WACRzS,KAAK2S,WAEN3S,KAAK4S,kBACN,EACAzR,QAAS,CACR,gBAAAyR,GACO,MAAAC,EAAWlS,SAASlD,cAAc,iBAClCgF,EAAO0C,OAAO2N,WAAa,GAAK,IAAM,KACtCpQ,EAAMyC,OAAO4N,YAAc,GAAK,IAAM,KACnCF,EAAArQ,MAAMwQ,YAAY,cAAevQ,GACjCoQ,EAAArQ,MAAMwQ,YAAY,aAActQ,EAC1C,EACA,cAAMiQ,GACL,MAAM9S,KAAEA,SAAeoT,6BACvBjT,KAAK6O,WAAahP,EAAKqT,KACxB,EAEA,gBAAAC,CAAiB3T,GACHQ,KAAKM,WAAWC,IAAMf,EAAE4T,SAAWpT,KAAKM,WAAWE,IAAMhB,EAAE6T,UAGxErT,KAAKsT,eAELtT,KAAKuT,iBAELvT,KAAKwT,WACLxT,KAAK4O,UAAW,EACjB,EAEA,YAAA0E,GACMtT,KAAAE,QAAUF,KAAKE,MACrB,EACA,cAAAqT,GACCvT,KAAKyT,QAAUzT,KAAK0T,eAAe1T,KAAKG,SACxCH,KAAK2T,SAAW3T,KAAK0T,eAAe1T,KAAKqB,SAC1C,EAEAqS,eAAe3G,GACPA,EAAI6G,wBAGZ,QAAAJ,GACC,MAEMK,EAAO1O,OAAO2N,WAAa9S,KAAKI,WAChC0T,EAAO3O,OAAO4N,YAAc/S,KAAKK,YACnC,IAAAE,EAAIP,KAAKyT,QAAQhR,KAAOzC,KAAKyT,QAAQ7W,MAAQ,EAAIoD,KAAKI,WAAa,EACnEI,EAAIR,KAAKyT,QAAQ/Q,IAAM1C,KAAKyT,QAAQ9T,OAAS,EAAIK,KAAKK,YAAc,EAEpEE,EAPS,IAOKA,EAPL,GAQTC,EAPS,IAOKA,EAPL,GAQTD,EAAIsT,IAAMtT,EAAIsT,EAAO,IACrBrT,EAAIsT,IAAMtT,EAAIsT,EAAO,IAEpB9T,KAAA+T,iBAAiBxT,EAAGC,EAC1B,EAEA,gBAAAuT,CAAiBxT,EAAGC,GACdR,KAAAqB,SAASmB,MAAMC,KAAOlC,EAAI,KAC1BP,KAAAqB,SAASmB,MAAME,IAAMlC,EAAI,IAC/B,EAEA,aAAAwT,CAAcxU,GACRQ,KAAAM,WAAWC,EAAIf,EAAE4T,QACjBpT,KAAAM,WAAWE,EAAIhB,EAAE6T,OACvB,EACA,KAAAY,GACCjU,KAAKE,QAAS,EACdF,KAAK4O,UAAW,CAAA,gJAQK7L,GAAM,CAAA2G,GAAA,+IAA7BpQ,EAeMJ,iBAAA,oBAbA,OAAAoK,mCAAwB,MAASP,GAAA,CAAUc,EAAAA,mBAAA,MAAA,CAAqBtF,uBAAS,CAAE,OAAA,GAAAkT,EAAAiB,cAAgB9T,QAAOyE,sBAAE8P,kBAAW1B,EAAA0B,oBAAAe,IAAAC,YAAA9Q,EAAA,KAAAA,EAAA,GAAA,IAAA6Q,IAAAzC,EAAAuC,eAAAvC,EAAAuC,iBAAAE,IACnHE,UAEI/Q,EAAA,KAAAA,EAAA,GAAA,IAAA6Q,IAAA9Q,EAAAiR,aAAAjR,EAAAiR,eAAAH,KAAA,+BAGS5Q,EAAAA,YAASoN,EAAAA,YAAAiB,EAAAC,wBAAA,gBAjHzBV,EAAAuB,WAAAnP,EAAAA,YAiH6CoN,EAAAA,YAAAmB,EAAA,CAAAvX,IAAA,EAjH7CD,MAAA6W,EAAArC,YAAA,KAAA,EAAA,CAAA,WAoHEsC,EAAAA,mBAA2D,IAAA,IAAtD,IAA2CtN,EAAAA,mBAAA,MAAA,CAAAtF,MAAAyS,EAAAC,eAAA,CAAA,OAAA,GAAAQ,EAAAiB,cAGhD9T,QAAuGyE,EAAA,KAAAA,EAAA,GAAA,IAAA6Q,IAAAzC,EAAAwC,OAAAxC,EAAAwC,SAAAC,KAApF,KAAI,GAAA7a,EAAAA,YAA6Bib,EAAY,CAAEC,OAAMlR,EAAO,KAAAA,EAAA,GAAA5J,GAAAyX,EAAArC,WAAA,GAAEA,WAAUqC,EAAArC,WAAAtQ,MAAA,qGC3EvFiW,GAAN,MAAMA,EAYL,WAAAvN,CAAYjO,eAPIgH,OAAA,iBAAAyU,0GAQf,MAAQtR,MAAAA,EAAOlL,cAAAA,EAAAC,aAAeA,GAAiBc,EAU/C,OARKwb,EAAQE,WAEZvP,OAAOhC,MAAQA,EACfgC,OAAOlN,cAAgBA,EACvBkN,OAAOjN,aAAeA,EACtB8H,KAAK2U,OACLH,EAAQE,SAAW1U,MAEbwU,EAAQE,QAAA,CAfhB,cAAIE,GACIC,OAAAA,EAAAA,QAAQ,EAAC,CAkBjB,IAAAF,GACC3U,KAAK8U,OAAM,CAIZ,KAAAA,GAEO,MAAAC,EAAKpU,SAASqU,cAAc,OAI9B,GAHJD,EAAGrL,GAAKuL,EAAKjV,KAAAyU,GACJ9T,SAAA0B,KAAK6S,YAAYH,GAEF,MAApB/U,KAAK4U,WACDO,OAAAA,YAAUC,IAAYN,MAAM,IAAIG,EAAAjV,KAAKyU,MAG5C,OAAO,IADKY,QAAQ,OACb,CAAQ,CAAEhX,UAAaiX,EAAEF,MAAeG,OAAO,IAAIN,EAAAjV,KAAKyU,KAChE,GAtCDA,EAAA,IAAAe,QAHAhB,GAAOE,SAA2B,KAFnC,IAAMe,GAANjB,GChBa,MAAAkB,GAAUpZ,MAAOtD,UAE7BA,EAAS,IAAKzB,KAAkByB,GAGhC,IAAI2c,EAAUpG,KACV,UACGqG,GAAmB5c,GACzB,MAAM6G,KAAEA,SAAe+E,EAAAA,KAAKiR,IAAI,MAAA7c,OAAA,EAAAA,EAAQrB,YAAa,CAAA,EAAI,CAAEmN,QAAS,CAAEC,WAAW,KAK7E/L,GAJJmM,OAAsB,cAAItF,EAItB7G,EAAOd,cAAgBc,EAAOb,UAAW,CACtCT,MAAAA,QAAamW,UAEbvG,EAAc,CAAEF,GAAI1P,GAAcsB,EAAOtB,KAAMS,UAAWa,EAAOb,WAAW,CAG/Ea,EAAOhB,iBACN,IAAAyd,GAAQ,CAAEtS,MAAOtD,EAAM5H,cAAee,EAAOf,cAAeC,aAAcc,EAAOd,eAKlF,IAAA4d,EAAWH,EAAU,OAAA7L,EAAAjK,EAAKoO,MAAM7T,GAAmBA,EAAKsP,KAAOiM,UAA1C,EAAA7L,EAAoDgM,SAAW,GAEpF,IAACH,IAAYG,EAAU,CAE1B,MACM3S,EADetD,EAAKoO,MAAM7T,GAAyC,IAAtBA,EAAK2b,gBAC1BlW,EAAK,GACnCiW,EAAW3S,EAAM2S,SACjBH,EAAUxS,EAAMuG,EAAA,CAEX,MAAAsM,QAAoBC,GAAUH,GACzBI,GAAA,CAAEF,cAAaL,YACdQ,KAGZ,IAAI3I,GAAG4I,EAAaA,eAAEC,UAAaxd,IAClC,MAAMgH,EAAO0F,KAAKe,MAAMzN,EAAMgH,MAEHA,GAAAA,EAAKA,KAAKmW,aAErCM,EAAAA,YAAYC,QAAQ,CAAEvc,KAAM,QAAS6F,KAAM,MAAM,EAElD,IAAI2N,GAAGC,EAAYA,cAAE4I,UAAaxd,IACjC8U,SAASC,QAAO,QAIT4I,GAEIL,KACAM,IAAA,GAIRb,GAAsB5c,IAEX0d,kBAAA,IAAK1d,GAAQ,EAGxBmd,GAAc,KACb,MAAA3T,EAAQ7B,SAASqU,cAAc,SACrCxS,EAAMmU,UjBrEsBC,yzCiBsEnBjW,SAAAkW,KAAK3B,YAAY1S,EAAK,EAEnB0T,GAAa,EAAGF,cAAaL,cACzC,MAAMmB,EAAiBC,aAAa3S,QAAQ,mBAAqB,KAC3D4S,EAAczR,KAAKe,MAAMwQ,GAC/BE,EAAY7T,MAAQ,CACnB6S,cACAtM,GAAIiM,GAELoB,aAAa7S,QAAQ,iBAAkBqB,KAAKC,UAAUwR,GAAY,EAMtDhH,GAAc1T,MAAO6G,IACjC,MAAM6S,QAAoBC,GAAU9S,EAAM2S,UAC1CI,GAAW,CAAEF,cAAaL,QAAS,MAAAxS,OAAAA,EAAAA,EAAOuG,KAGtC,IAAA8D,GAAG4I,EAAaA,eAAE1I,YACrBnI,KAAKC,UAAU,CACdxL,KAAM,QACN6F,KAAM,CACL8V,QAAS,MAAAxS,OAAA,EAAAA,EAAOuG,GAChBoM,SAAU,MAAA3S,OAAA,EAAAA,EAAO2S,SACjBE,kBAKHM,EAAAA,YAAYC,QAAQ,CAAEvc,KAAM,QAAS6F,KAAMsD,GAAO,EAMtCsT,GAAc,KAC1B,MAAMT,EAAciB,KACdC,EAAOvW,SAASwH,gBACtB1N,OAAOoS,KAAKmJ,GAAa7P,SAAwBgR,IAC3B,YAAjBA,GACH1c,OAAOoS,KAAKmJ,EAAYmB,IAAehR,SAAmBiR,IACzD,MAAMC,EAAa,KAAKF,KAAgBC,IACxCF,EAAK1U,MAAMwQ,YAAYqE,EAAYrB,EAAYmB,GAAcC,GAAQ,GACrE,GAEF,EAKWnB,GAAY3Z,MAAOwZ,IACzB,MAAAwB,QAAeC,MAAMzB,GACrBE,QAAoBsB,EAAOE,OAC3BC,EAAU,KACf,IAAIA,EAAU,YAWPA,OAVPhd,OAAOoS,KAAKmJ,GAAa7P,SAAwBgR,IAC3B,YAAjBA,GACH1c,OAAOoS,KAAKmJ,EAAYmB,IAAehR,SAAmBiR,IACzD,MAAMC,EAAa,KAAKF,KAAgBC,IAClC/c,EAAQ2b,EAAYmB,GAAcC,GAC7BM,GAAA,KAAKL,MAAehd,MAAK,GACpC,IAGQqd,GAAA,IACJD,CAAAA,EAGFE,EAAahX,SAASlD,cAAc,mBAC1C,GAAIka,EACHA,EAAWhB,UAAY,GACvBgB,EAAWzC,YAAYvU,SAASiX,eAAeH,UACzC,CACA,MAAAI,EAAWlX,SAASqU,cAAc,SACxC6C,EAASrZ,UAAY,iBACrBqZ,EAAS3C,YAAYvU,SAASiX,eAAeH,MACpC9W,SAAAkW,KAAK3B,YAAY2C,EAAQ,CAE5B,OAAA7B,CAAA,EAMK8B,GAAqBxb,UACjC,MAAMuD,KAAEA,SAAekY,qBACjBhC,EAAelW,EAAKoO,MAAM7T,GAAyC,IAAtBA,EAAK2b,eAEjD,OADiBA,EAAeA,EAAaD,SAAWjW,EAAK,GAAGiW,QAChE,EAKKvG,GAAc,WACpB,MAAAuH,EAAiBC,aAAa3S,QAAQ,kBACtCjB,EAAQ2T,IAAkB,OAAAhN,EAAAvE,KAAKe,MAAMwQ,SAAiB,EAAAhN,EAAA3G,OACrDA,OAAA,MAAAA,OAAAA,EAAAA,EAAOuG,KAAM,IAAA,EAKRuN,GAAoB,WAC1B,MAAAH,EAAiBC,aAAa3S,QAAQ,kBACtCjB,EAAQ2T,IAAkB,OAAAhN,EAAAvE,KAAKe,MAAMwQ,SAAiB,EAAAhN,EAAA3G,OACrD,OAAA,MAAAA,OAAA,EAAAA,EAAO6S,cAAe,CAAC,CAAA,EAOlBgC,GAAiBC,IAC7B,MAAM9U,EAAQ8T,KACP,OAAA,MAAA9T,OAAA,EAAAA,EAAQ8U,KAAc,CAAC,CAAA,EASlBC,GAAmB,CAACb,EAAoBjH,KACpD,MAAMkH,EAASL,KACf,IAAKK,EAAgB,QAAU,OAAA,KACtB,IAAA,IAAA5N,KAAM4N,EAAgB,QAAG,CACjC,MAAMzK,EAAOyK,EAAgB,QAAE5N,GAC/B,IAAA,IAASyO,KAAO1d,OAAOoS,KAAKA,GAC3B,IAAA,IAASvS,KAAOG,OAAOoS,KAAKA,EAAKsL,IAAO,CAEnC,GADkB,KAAKA,KAAO7d,MACZ+c,GAAce,eAAavL,EAAKsL,GAAK7d,GAAM8V,GACzD,OAAAA,CACR,CAEF,CAGM,OAAA,IAAA,EAkBKiI,GAA6B,CAACf,EAAc9Y,KAClD,MAAAwX,EAAcsB,GAAUL,KAExBQ,EAAU,KACf,IAAIA,EAAU,YAWPA,OAVPhd,OAAOoS,KAAKmJ,GAAa7P,SAAwBgR,IAC3B,YAAjBA,GACH1c,OAAOoS,KAAKmJ,EAAYmB,IAAehR,SAAmBiR,IACzD,MAAMC,EAAa,KAAKF,KAAgBC,IAClC/c,EAAQ2b,EAAYmB,GAAcC,GAC7BM,GAAA,KAAKL,MAAehd,MAAK,GACpC,IAGQqd,GAAA,IACJD,CAAAA,EAGFa,EAAiB9Z,GAAa,iBAC9BmZ,EAAahX,SAASlD,cAAc,IAAI6a,KAC9C,GAAIX,EACHA,EAAWhB,UAAY,GACvBgB,EAAWzC,YAAYvU,SAASiX,eAAeH,UACzC,CACA,MAAAI,EAAWlX,SAASqU,cAAc,SACxC6C,EAASrZ,UAAY,iBACrBqZ,EAAS3C,YAAYvU,SAASiX,eAAeH,MACpC9W,SAAAkW,KAAK3B,YAAY2C,EAAQ,kSCtQ7B,MAAMrK,GASZ,WAAAvG,CAAYsR,GARLrR,EAAAlH,KAAA,aACAkH,EAAAlH,KAAA,eAQNwN,GAAGmH,OACG,MAAA6D,EAAmB,IAAIC,iBAAiBF,GACzCvY,KAAAqW,UAAaxd,GAAeA,EAChB2f,EAAAnC,UAAqBxd,IAC/B,MAAAmB,KAAEA,GAASnB,EAAMgH,KACvB,GAAa,WAAT7F,GACH,GAAImL,OAAOuT,WAAmB,OAAA1Y,KAAKqW,UAAUxd,QAE7CmH,KAAKqW,UAAUxd,EAAK,EAGjBmH,KAAA0N,YAAeiL,GACZH,EAAiB9K,YAAYiL,EACrC,CApBD,WAAOhE,GACCxP,OAAAuT,WAA0C,YAA7B/X,SAASiY,gBACpBjY,SAAAkC,iBAAiB,oBAAoB,KACtCsC,OAAAuT,WAA0C,YAA7B/X,SAASiY,eAAoB,GACjD"}