diff --git a/TUICallKit-Vue3/components/dev-training-entry/index.vue b/TUICallKit-Vue3/components/dev-training-entry/index.vue
index 6a1133fb5..22916f9e4 100644
--- a/TUICallKit-Vue3/components/dev-training-entry/index.vue
+++ b/TUICallKit-Vue3/components/dev-training-entry/index.vue
@@ -1,729 +1,729 @@
-
-
-
-
-
-
-
-
-
- 居家耗糖训练
- 体验
-
- 低强度动起来,帮助身体消耗糖分
-
-
-
-
-
-
-
- 推荐
-
-
- {{ item.title }}
- {{ item.sub }}
- 进入
-
-
-
-
- 左右滑动,选择适合您的训练
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+ 居家耗糖训练
+ 体验
+
+ 低强度动起来,帮助身体消耗糖分
+
+
+
+
+
+
+
+ 推荐
+
+
+ {{ item.title }}
+ {{ item.sub }}
+ 进入
+
+
+
+
+ 左右滑动,选择适合您的训练
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TUICallKit-Vue3/pages.json b/TUICallKit-Vue3/pages.json
index 66acdbafd..223d8b39f 100644
--- a/TUICallKit-Vue3/pages.json
+++ b/TUICallKit-Vue3/pages.json
@@ -1,243 +1,243 @@
-{
- "pages": [
- {
- "path": "pages/index/index",
- "style": {
- "navigationBarTitleText": "甄养堂",
- "backgroundColor": "#F8F8F8",
- "backgroundColorTop": "#F8F8F8"
- }
- },
- {
- "path": "pages/login/login",
- "style": {
- "navigationBarTitleText": "视频问诊"
- }
- },
- {
- "path": "pages/user/userinfo",
- "style": {
- "navigationBarTitleText": "个人资料"
- }
- },
- {
- "path": "pages/index/video",
- "style": {
- "navigationBarTitleText": "甄养堂"
- }
- },
- {
- "path": "pages/order/monad/monad",
- "style": {
- "navigationBarTitleText": "诊单确认",
- "navigationBarHidden": true,
- "navigationStyle": "custom"
- }
- },
- {
- "path": "pages/user/user",
- "style": {
- "navigationBarTitleText": "我的",
- "backgroundColor": "#e8eaed",
- "backgroundColorTop": "#e8eaed"
- }
- },
- {
- "path": "pages/Card/Card",
- "style": {
- "navigationBarTitleText": "就诊卡"
- }
- },
- {
- "path": "pages/Card/edit_card",
- "style": {
- "navigationBarTitleText": "修改就诊卡"
- }
- },
- {
- "path": "pages/Card/contact",
- "style": {
- "navigationBarTitleText": "服务"
- }
- },
- {
- "path": "pages/order/order",
- "style": {
- "navigationBarTitleText": "付款"
- }
- }
- ],
- "subPackages": [
- {
- "root": "TUICallKit/src/Components",
- "pages": [
- {
- "path": "TUICallKit",
- "style": {
- "navigationBarTitleText": "视频问诊",
- "navigationBarHidden": true,
- "navigationStyle": "custom"
- }
- }
- ]
- },
- {
- "root": "TUIKit",
- "pages": [
- {
- "path": "pages/chat/chat",
- "style": {
- "navigationBarTitleText": "问诊"
- }
- }
- ]
- },
- {
- "root": "doctor",
- "pages": [
- {
- "path": "pages/doctor/doctor",
- "style": {
- "navigationBarTitleText": "医生信息"
- }
- },
- {
- "path": "pages/doctor/list/list",
- "style": {
- "navigationBarTitleText": "执业医生列表"
- }
- },
- {
- "path": "pages/article/article",
- "style": {
- "navigationBarTitleText": "健康百科"
- }
- }
- ]
- },
- {
- "root": "training",
- "pages": [
- {
- "path": "pages/grip-ring",
- "style": {
- "navigationBarTitleText": "握力环训练",
- "navigationBarBackgroundColor": "#f8fafc",
- "navigationBarTextStyle": "black",
- "backgroundColor": "#f8fafc"
- }
- },
- {
- "path": "pages/pilates-ring",
- "style": {
- "navigationBarTitleText": "瑜伽环训练",
- "navigationBarBackgroundColor": "#f8fafc",
- "navigationBarTextStyle": "black",
- "backgroundColor": "#f8fafc"
- }
- },
- {
- "path": "pages/foot-pedal",
- "style": {
- "navigationBarTitleText": "脚蹬器训练",
- "navigationBarBackgroundColor": "#f8fafc",
- "navigationBarTextStyle": "black",
- "backgroundColor": "#f8fafc"
- }
- },
- {
- "path": "pages/dumbbell",
- "style": {
- "navigationBarTitleText": "哑铃训练",
- "navigationBarBackgroundColor": "#f8fafc",
- "navigationBarTextStyle": "black",
- "backgroundColor": "#f8fafc"
- }
- },
- {
- "path": "pages/metronome",
- "style": {
- "navigationBarTitleText": "耗糖节拍器",
- "navigationBarBackgroundColor": "#f8fafc",
- "navigationBarTextStyle": "black",
- "backgroundColor": "#f8fafc"
- }
- }
- ]
- },
- {
- "root": "tongji",
- "pages": [
- {
- "path": "pages/index",
- "style": {
- "navigationBarTitleText": "血糖记录",
- "navigationBarBackgroundColor": "#204e2b",
- "navigationBarTextStyle": "white",
- "backgroundColor": "#faf9f5",
- "enablePullDownRefresh": true,
- "mp-weixin": {
- "usingPlugins": {
- "WechatSI": {
- "version": "0.3.5",
- "provider": "wx069ba97219f66d99"
- }
- }
- }
- }
- },
- {
- "path": "pages/weekly",
- "style": {
- "navigationStyle": "custom",
- "navigationBarTitleText": "血糖管理",
- "backgroundColor": "#f4fbf4",
- "enablePullDownRefresh": true,
- "mp-weixin": {
- "usingPlugins": {
- "WechatSI": {
- "version": "0.3.5",
- "provider": "wx069ba97219f66d99"
- }
- }
- }
- }
- },
- {
- "path": "pages/more",
- "style": {
- "navigationStyle": "custom",
- "navigationBarTitleText": "日常护理",
- "backgroundColor": "#f4fbf4",
- "enablePullDownRefresh": true,
- "mp-weixin": {
- "usingPlugins": {
- "WechatSI": {
- "version": "0.3.5",
- "provider": "wx069ba97219f66d99"
- }
- }
- }
- }
- },
- {
- "path": "endless-game/index",
- "style": {
- "navigationStyle": "custom",
- "navigationBarTitleText": "识糖小课堂",
- "backgroundColor": "#eefbf4",
- "disableScroll": false,
- "enableShareAppMessage": true,
- "enableShareTimeline": true
- }
- }
- ]
- }
- ],
- "globalStyle": {
- "navigationBarTextStyle": "black",
- "navigationBarTitleText": "甄养堂互联网医院",
- "navigationBarBackgroundColor": "#F8F8F8",
- "backgroundColor": "#F8F8F8"
- }
-}
+{
+ "pages": [
+ {
+ "path": "pages/index/index",
+ "style": {
+ "navigationBarTitleText": "甄养堂",
+ "backgroundColor": "#F8F8F8",
+ "backgroundColorTop": "#F8F8F8"
+ }
+ },
+ {
+ "path": "pages/login/login",
+ "style": {
+ "navigationBarTitleText": "视频问诊"
+ }
+ },
+ {
+ "path": "pages/user/userinfo",
+ "style": {
+ "navigationBarTitleText": "个人资料"
+ }
+ },
+ {
+ "path": "pages/index/video",
+ "style": {
+ "navigationBarTitleText": "甄养堂"
+ }
+ },
+ {
+ "path": "pages/order/monad/monad",
+ "style": {
+ "navigationBarTitleText": "诊单确认",
+ "navigationBarHidden": true,
+ "navigationStyle": "custom"
+ }
+ },
+ {
+ "path": "pages/user/user",
+ "style": {
+ "navigationBarTitleText": "我的",
+ "backgroundColor": "#e8eaed",
+ "backgroundColorTop": "#e8eaed"
+ }
+ },
+ {
+ "path": "pages/Card/Card",
+ "style": {
+ "navigationBarTitleText": "就诊卡"
+ }
+ },
+ {
+ "path": "pages/Card/edit_card",
+ "style": {
+ "navigationBarTitleText": "修改就诊卡"
+ }
+ },
+ {
+ "path": "pages/Card/contact",
+ "style": {
+ "navigationBarTitleText": "服务"
+ }
+ },
+ {
+ "path": "pages/order/order",
+ "style": {
+ "navigationBarTitleText": "付款"
+ }
+ }
+ ],
+ "subPackages": [
+ {
+ "root": "TUICallKit/src/Components",
+ "pages": [
+ {
+ "path": "TUICallKit",
+ "style": {
+ "navigationBarTitleText": "视频问诊",
+ "navigationBarHidden": true,
+ "navigationStyle": "custom"
+ }
+ }
+ ]
+ },
+ {
+ "root": "TUIKit",
+ "pages": [
+ {
+ "path": "pages/chat/chat",
+ "style": {
+ "navigationBarTitleText": "问诊"
+ }
+ }
+ ]
+ },
+ {
+ "root": "doctor",
+ "pages": [
+ {
+ "path": "pages/doctor/doctor",
+ "style": {
+ "navigationBarTitleText": "医生信息"
+ }
+ },
+ {
+ "path": "pages/doctor/list/list",
+ "style": {
+ "navigationBarTitleText": "执业医生列表"
+ }
+ },
+ {
+ "path": "pages/article/article",
+ "style": {
+ "navigationBarTitleText": "健康百科"
+ }
+ }
+ ]
+ },
+ {
+ "root": "training",
+ "pages": [
+ {
+ "path": "pages/grip-ring",
+ "style": {
+ "navigationBarTitleText": "握力环训练",
+ "navigationBarBackgroundColor": "#f8fafc",
+ "navigationBarTextStyle": "black",
+ "backgroundColor": "#f8fafc"
+ }
+ },
+ {
+ "path": "pages/pilates-ring",
+ "style": {
+ "navigationBarTitleText": "瑜伽环训练",
+ "navigationBarBackgroundColor": "#f8fafc",
+ "navigationBarTextStyle": "black",
+ "backgroundColor": "#f8fafc"
+ }
+ },
+ {
+ "path": "pages/foot-pedal",
+ "style": {
+ "navigationBarTitleText": "脚蹬器训练",
+ "navigationBarBackgroundColor": "#f8fafc",
+ "navigationBarTextStyle": "black",
+ "backgroundColor": "#f8fafc"
+ }
+ },
+ {
+ "path": "pages/dumbbell",
+ "style": {
+ "navigationBarTitleText": "哑铃训练",
+ "navigationBarBackgroundColor": "#f8fafc",
+ "navigationBarTextStyle": "black",
+ "backgroundColor": "#f8fafc"
+ }
+ },
+ {
+ "path": "pages/metronome",
+ "style": {
+ "navigationBarTitleText": "耗糖节拍器",
+ "navigationBarBackgroundColor": "#f8fafc",
+ "navigationBarTextStyle": "black",
+ "backgroundColor": "#f8fafc"
+ }
+ }
+ ]
+ },
+ {
+ "root": "tongji",
+ "pages": [
+ {
+ "path": "pages/index",
+ "style": {
+ "navigationBarTitleText": "血糖记录",
+ "navigationBarBackgroundColor": "#204e2b",
+ "navigationBarTextStyle": "white",
+ "backgroundColor": "#faf9f5",
+ "enablePullDownRefresh": true,
+ "mp-weixin": {
+ "usingPlugins": {
+ "WechatSI": {
+ "version": "0.3.5",
+ "provider": "wx069ba97219f66d99"
+ }
+ }
+ }
+ }
+ },
+ {
+ "path": "pages/weekly",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTitleText": "血糖管理",
+ "backgroundColor": "#f4fbf4",
+ "enablePullDownRefresh": true,
+ "mp-weixin": {
+ "usingPlugins": {
+ "WechatSI": {
+ "version": "0.3.5",
+ "provider": "wx069ba97219f66d99"
+ }
+ }
+ }
+ }
+ },
+ {
+ "path": "pages/more",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTitleText": "日常护理",
+ "backgroundColor": "#f4fbf4",
+ "enablePullDownRefresh": true,
+ "mp-weixin": {
+ "usingPlugins": {
+ "WechatSI": {
+ "version": "0.3.5",
+ "provider": "wx069ba97219f66d99"
+ }
+ }
+ }
+ }
+ },
+ {
+ "path": "endless-game/index",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTitleText": "识糖小课堂",
+ "backgroundColor": "#eefbf4",
+ "disableScroll": false,
+ "enableShareAppMessage": true,
+ "enableShareTimeline": true
+ }
+ }
+ ]
+ }
+ ],
+ "globalStyle": {
+ "navigationBarTextStyle": "black",
+ "navigationBarTitleText": "甄养堂互联网医院",
+ "navigationBarBackgroundColor": "#F8F8F8",
+ "backgroundColor": "#F8F8F8"
+ }
+}
diff --git a/TUICallKit-Vue3/tongji/composables/useDietAi.js b/TUICallKit-Vue3/tongji/composables/useDietAi.js
index 477836a73..ba414ed88 100644
--- a/TUICallKit-Vue3/tongji/composables/useDietAi.js
+++ b/TUICallKit-Vue3/tongji/composables/useDietAi.js
@@ -1,317 +1,317 @@
-import { ref, computed } from 'vue'
-import { requestAiStream, parsePartialDietPlainText } from '../utils/aiStreamRequest.js'
-
-const DIET_AI_PREFILL_KEY = 'tongji_diet_ai_prefill'
-
-const emptyDietAiRecommend = () => ({
- breakfast: '',
- drinks: '',
- lunch: '',
- dinner: '',
- tips: '',
- avoid: [],
- analysis: [],
- exercise: null,
- disclaimer: '',
- rules_summary: '',
- source: '',
- date: ''
-})
-
-/** AI 饮食助手(今日推荐 + 能不能吃) */
-export function useDietAi(proxy, { diagnosisId, showUserToast, formatUserMessage }) {
- const dietAiRecommend = ref(emptyDietAiRecommend())
- const dietAiLoading = ref(false)
- const dietAiStreaming = ref(false)
- const dietAiReplacing = ref(false)
- const dietAiStreamField = ref('')
- let dietStreamBuffer = ''
- const dietAiAskText = ref('')
- const dietAiAsking = ref(false)
- const dietAiAskResult = ref({ advice: '', level: '', level_label: '', portion: '', food: '' })
-
- const hasDietAiMealContent = computed(() => {
- const r = dietAiRecommend.value
- return !!(r.breakfast || r.drinks || r.lunch || r.dinner || r.tips)
- })
-
- function detectDietStreamField(text) {
- const tail = String(text || '').match(/(?:^|\n)(早餐|喝的|午餐|晚餐|提示|少碰)[::]\s*([^\n]*)$/)
- if (!tail) return 'breakfast'
- const map = { '早餐': 'breakfast', '喝的': 'drinks', '午餐': 'lunch', '晚餐': 'dinner', '提示': 'tips', '少碰': 'tips' }
- return map[tail[1]] || 'breakfast'
- }
-
- function mergePartialDietFromStream() {
- const partial = parsePartialDietPlainText(dietStreamBuffer)
- const next = { ...dietAiRecommend.value }
- for (const key of ['breakfast', 'drinks', 'lunch', 'dinner', 'tips']) {
- if (partial[key] != null) next[key] = partial[key]
- }
- if (Array.isArray(partial.avoid)) next.avoid = partial.avoid
- dietAiRecommend.value = next
- dietAiStreamField.value = detectDietStreamField(dietStreamBuffer)
- }
-
- function applyDietRecommendPayload(payload) {
- if (!payload) return
- const prevAnalysis = dietAiRecommend.value.analysis
- const prevExercise = dietAiRecommend.value.exercise
- dietAiRecommend.value = {
- ...emptyDietAiRecommend(),
- ...payload,
- avoid: Array.isArray(payload.avoid) ? payload.avoid : [],
- analysis: Array.isArray(payload.analysis) && payload.analysis.length
- ? payload.analysis
- : (Array.isArray(prevAnalysis) ? prevAnalysis : []),
- exercise: (payload.exercise && typeof payload.exercise === 'object')
- ? payload.exercise
- : (prevExercise || null)
- }
- }
-
- function resolveDietDonePayload(payload) {
- if (!payload) return payload
- if (payload.source !== 'rule' || !dietStreamBuffer) return payload
-
- const streamed = parsePartialDietPlainText(dietStreamBuffer)
- if (!streamed.breakfast) return payload
-
- return {
- ...emptyDietAiRecommend(),
- ...payload,
- breakfast: streamed.breakfast,
- drinks: streamed.drinks || payload.drinks || '',
- lunch: streamed.lunch || payload.lunch || '',
- dinner: streamed.dinner || payload.dinner || '',
- tips: streamed.tips || payload.tips || '',
- avoid: (Array.isArray(streamed.avoid) && streamed.avoid.length) ? streamed.avoid : (payload.avoid || []),
- source: 'ai',
- disclaimer: 'AI 建议供参考,仍请结合医嘱与血糖监测。'
- }
- }
-
- function onDietAiStreamEvent(event, payload) {
- if (event === 'analysis') {
- if (Array.isArray(payload?.analysis)) {
- dietAiRecommend.value = { ...dietAiRecommend.value, analysis: payload.analysis }
- }
- } else if (event === 'exercise') {
- if (payload?.exercise && typeof payload.exercise === 'object') {
- dietAiRecommend.value = { ...dietAiRecommend.value, exercise: payload.exercise }
- }
- } else if (event === 'delta') {
- dietAiStreaming.value = true
- if (payload.buffer != null) {
- dietStreamBuffer = payload.buffer
- } else {
- dietStreamBuffer += payload.text || ''
- }
- mergePartialDietFromStream()
- } else if (event === 'done') {
- applyDietRecommendPayload(resolveDietDonePayload(payload))
- dietStreamBuffer = ''
- dietAiStreamField.value = ''
- } else if (event === 'error') {
- showUserToast(formatUserMessage(payload?.message, '饮食建议加载失败'))
- }
- }
-
- async function fetchDietAiRecommendFallback(refresh) {
- const res = await proxy.apiUrl({
- url: '/api/tcm/dailyDietAiRecommend',
- method: 'GET',
- timeout: 35000,
- data: {
- diagnosis_id: diagnosisId.value,
- refresh: refresh ? 1 : 0,
- ...(refresh ? { _t: Date.now() } : {})
- }
- }, false)
- if (res?.code === 1 && res.data) {
- applyDietRecommendPayload(res.data)
- } else if (res?.msg) {
- showUserToast(res.msg)
- }
- }
-
- async function fetchDietAiRecommend(refresh = false) {
- if (!diagnosisId.value || dietAiLoading.value) return
- dietAiLoading.value = true
- dietAiStreaming.value = false
- dietAiReplacing.value = !!refresh
- dietStreamBuffer = ''
- dietAiStreamField.value = ''
- if (refresh) {
- applyDietRecommendPayload(emptyDietAiRecommend())
- }
- try {
- await requestAiStream({
- baseUrl: proxy.$url,
- url: '/api/tcm/dailyDietAiRecommendStream',
- method: 'GET',
- data: {
- diagnosis_id: diagnosisId.value,
- refresh: refresh ? 1 : 0,
- ...(refresh ? { _t: Date.now() } : {})
- },
- onEvent: onDietAiStreamEvent,
- fallback: () => fetchDietAiRecommendFallback(refresh)
- })
- } catch (e) {
- try {
- await fetchDietAiRecommendFallback(refresh)
- } catch (e2) {
- showUserToast('饮食建议加载失败')
- }
- } finally {
- dietAiLoading.value = false
- dietAiStreaming.value = false
- dietAiReplacing.value = false
- dietAiStreamField.value = ''
- }
- }
-
- function refreshDietAiRecommend() {
- if (dietAiLoading.value) return
- fetchDietAiRecommend(true)
- }
-
- async function askDietAiFoodFallback(q) {
- const res = await proxy.apiUrl({
- url: '/api/tcm/dailyDietAiAsk',
- method: 'POST',
- timeout: 35000,
- data: {
- diagnosis_id: diagnosisId.value,
- question: q
- }
- }, false)
- if (res?.code === 1 && res.data) {
- dietAiAskResult.value = {
- advice: res.data.advice || '',
- level: res.data.level || '',
- level_label: res.data.level_label || '',
- portion: res.data.portion || '',
- food: res.data.food || q
- }
- } else {
- showUserToast(formatUserMessage(res?.msg, '咨询失败'))
- }
- }
-
- async function askDietAiFood() {
- const q = String(dietAiAskText.value || '').trim()
- if (!q) {
- showUserToast('请输入想咨询的食物')
- return
- }
- if (!diagnosisId.value) return
- // 发送后立即清空输入框
- dietAiAskText.value = ''
- dietAiAsking.value = true
- dietAiAskResult.value = { advice: '', level: '', level_label: '', portion: '', food: '' }
- try {
- await requestAiStream({
- baseUrl: proxy.$url,
- url: '/api/tcm/dailyDietAiAskStream',
- method: 'POST',
- data: {
- diagnosis_id: diagnosisId.value,
- question: q
- },
- onEvent: (event, payload) => {
- if (event === 'start' && !dietAiAskResult.value.advice) {
- dietAiAskResult.value = { ...dietAiAskResult.value, advice: payload.message || '正在想…' }
- } else if (event === 'delta') {
- dietAiAskResult.value = {
- ...dietAiAskResult.value,
- advice: payload.advice || dietAiAskResult.value.advice
- }
- } else if (event === 'done') {
- dietAiAskResult.value = {
- advice: payload.advice || '',
- level: payload.level || '',
- level_label: payload.level_label || '',
- portion: payload.portion || '',
- food: payload.food || q
- }
- } else if (event === 'error') {
- showUserToast(formatUserMessage(payload?.message, '咨询失败'))
- }
- },
- fallback: () => askDietAiFoodFallback(q)
- })
- } catch (e) {
- try {
- await askDietAiFoodFallback(q)
- } catch (e2) {
- showUserToast('网络异常,请稍后再试')
- }
- } finally {
- dietAiAsking.value = false
- }
- }
-
- function onDietAiAskInput(e) {
- dietAiAskText.value = e?.detail?.value ?? ''
- }
-
- function saveDietPrefillToStorage() {
- const r = dietAiRecommend.value
- if (!r.breakfast) return
- try {
- uni.setStorageSync(DIET_AI_PREFILL_KEY, {
- breakfast: r.breakfast,
- drinks: r.drinks || '',
- lunch: r.lunch,
- dinner: r.dinner,
- tips: r.tips || ''
- })
- } catch (e) {}
- }
-
- function goMoreDietForm(withPrefill = false) {
- if (withPrefill) saveDietPrefillToStorage()
- uni.navigateTo({ url: '/tongji/pages/more?openDiet=1' })
- }
-
- async function applyDietAiToForm() {
- if (!dietAiRecommend.value.breakfast) {
- await fetchDietAiRecommend(false)
- }
- goMoreDietForm(true)
- }
-
- function openDietForm() {
- goMoreDietForm(false)
- }
-
- return {
- dietAiRecommend,
- dietAiLoading,
- dietAiStreaming,
- dietAiReplacing,
- dietAiStreamField,
- dietAiAskText,
- dietAiAsking,
- dietAiAskResult,
- hasDietAiMealContent,
- fetchDietAiRecommend,
- refreshDietAiRecommend,
- askDietAiFood,
- onDietAiAskInput,
- applyDietAiToForm,
- openDietForm
- }
-}
-
-/** more 页打开饮食表单时读取并清除预填 */
-export function consumeDietAiPrefill() {
- try {
- const data = uni.getStorageSync(DIET_AI_PREFILL_KEY)
- uni.removeStorageSync(DIET_AI_PREFILL_KEY)
- if (data && typeof data === 'object' && data.breakfast) return data
- } catch (e) {}
- return null
-}
+import { ref, computed } from 'vue'
+import { requestAiStream, parsePartialDietPlainText } from '../utils/aiStreamRequest.js'
+
+const DIET_AI_PREFILL_KEY = 'tongji_diet_ai_prefill'
+
+const emptyDietAiRecommend = () => ({
+ breakfast: '',
+ drinks: '',
+ lunch: '',
+ dinner: '',
+ tips: '',
+ avoid: [],
+ analysis: [],
+ exercise: null,
+ disclaimer: '',
+ rules_summary: '',
+ source: '',
+ date: ''
+})
+
+/** AI 饮食助手(今日推荐 + 能不能吃) */
+export function useDietAi(proxy, { diagnosisId, showUserToast, formatUserMessage }) {
+ const dietAiRecommend = ref(emptyDietAiRecommend())
+ const dietAiLoading = ref(false)
+ const dietAiStreaming = ref(false)
+ const dietAiReplacing = ref(false)
+ const dietAiStreamField = ref('')
+ let dietStreamBuffer = ''
+ const dietAiAskText = ref('')
+ const dietAiAsking = ref(false)
+ const dietAiAskResult = ref({ advice: '', level: '', level_label: '', portion: '', food: '' })
+
+ const hasDietAiMealContent = computed(() => {
+ const r = dietAiRecommend.value
+ return !!(r.breakfast || r.drinks || r.lunch || r.dinner || r.tips)
+ })
+
+ function detectDietStreamField(text) {
+ const tail = String(text || '').match(/(?:^|\n)(早餐|喝的|午餐|晚餐|提示|少碰)[::]\s*([^\n]*)$/)
+ if (!tail) return 'breakfast'
+ const map = { '早餐': 'breakfast', '喝的': 'drinks', '午餐': 'lunch', '晚餐': 'dinner', '提示': 'tips', '少碰': 'tips' }
+ return map[tail[1]] || 'breakfast'
+ }
+
+ function mergePartialDietFromStream() {
+ const partial = parsePartialDietPlainText(dietStreamBuffer)
+ const next = { ...dietAiRecommend.value }
+ for (const key of ['breakfast', 'drinks', 'lunch', 'dinner', 'tips']) {
+ if (partial[key] != null) next[key] = partial[key]
+ }
+ if (Array.isArray(partial.avoid)) next.avoid = partial.avoid
+ dietAiRecommend.value = next
+ dietAiStreamField.value = detectDietStreamField(dietStreamBuffer)
+ }
+
+ function applyDietRecommendPayload(payload) {
+ if (!payload) return
+ const prevAnalysis = dietAiRecommend.value.analysis
+ const prevExercise = dietAiRecommend.value.exercise
+ dietAiRecommend.value = {
+ ...emptyDietAiRecommend(),
+ ...payload,
+ avoid: Array.isArray(payload.avoid) ? payload.avoid : [],
+ analysis: Array.isArray(payload.analysis) && payload.analysis.length
+ ? payload.analysis
+ : (Array.isArray(prevAnalysis) ? prevAnalysis : []),
+ exercise: (payload.exercise && typeof payload.exercise === 'object')
+ ? payload.exercise
+ : (prevExercise || null)
+ }
+ }
+
+ function resolveDietDonePayload(payload) {
+ if (!payload) return payload
+ if (payload.source !== 'rule' || !dietStreamBuffer) return payload
+
+ const streamed = parsePartialDietPlainText(dietStreamBuffer)
+ if (!streamed.breakfast) return payload
+
+ return {
+ ...emptyDietAiRecommend(),
+ ...payload,
+ breakfast: streamed.breakfast,
+ drinks: streamed.drinks || payload.drinks || '',
+ lunch: streamed.lunch || payload.lunch || '',
+ dinner: streamed.dinner || payload.dinner || '',
+ tips: streamed.tips || payload.tips || '',
+ avoid: (Array.isArray(streamed.avoid) && streamed.avoid.length) ? streamed.avoid : (payload.avoid || []),
+ source: 'ai',
+ disclaimer: 'AI 建议供参考,仍请结合医嘱与血糖监测。'
+ }
+ }
+
+ function onDietAiStreamEvent(event, payload) {
+ if (event === 'analysis') {
+ if (Array.isArray(payload?.analysis)) {
+ dietAiRecommend.value = { ...dietAiRecommend.value, analysis: payload.analysis }
+ }
+ } else if (event === 'exercise') {
+ if (payload?.exercise && typeof payload.exercise === 'object') {
+ dietAiRecommend.value = { ...dietAiRecommend.value, exercise: payload.exercise }
+ }
+ } else if (event === 'delta') {
+ dietAiStreaming.value = true
+ if (payload.buffer != null) {
+ dietStreamBuffer = payload.buffer
+ } else {
+ dietStreamBuffer += payload.text || ''
+ }
+ mergePartialDietFromStream()
+ } else if (event === 'done') {
+ applyDietRecommendPayload(resolveDietDonePayload(payload))
+ dietStreamBuffer = ''
+ dietAiStreamField.value = ''
+ } else if (event === 'error') {
+ showUserToast(formatUserMessage(payload?.message, '饮食建议加载失败'))
+ }
+ }
+
+ async function fetchDietAiRecommendFallback(refresh) {
+ const res = await proxy.apiUrl({
+ url: '/api/tcm/dailyDietAiRecommend',
+ method: 'GET',
+ timeout: 35000,
+ data: {
+ diagnosis_id: diagnosisId.value,
+ refresh: refresh ? 1 : 0,
+ ...(refresh ? { _t: Date.now() } : {})
+ }
+ }, false)
+ if (res?.code === 1 && res.data) {
+ applyDietRecommendPayload(res.data)
+ } else if (res?.msg) {
+ showUserToast(res.msg)
+ }
+ }
+
+ async function fetchDietAiRecommend(refresh = false) {
+ if (!diagnosisId.value || dietAiLoading.value) return
+ dietAiLoading.value = true
+ dietAiStreaming.value = false
+ dietAiReplacing.value = !!refresh
+ dietStreamBuffer = ''
+ dietAiStreamField.value = ''
+ if (refresh) {
+ applyDietRecommendPayload(emptyDietAiRecommend())
+ }
+ try {
+ await requestAiStream({
+ baseUrl: proxy.$url,
+ url: '/api/tcm/dailyDietAiRecommendStream',
+ method: 'GET',
+ data: {
+ diagnosis_id: diagnosisId.value,
+ refresh: refresh ? 1 : 0,
+ ...(refresh ? { _t: Date.now() } : {})
+ },
+ onEvent: onDietAiStreamEvent,
+ fallback: () => fetchDietAiRecommendFallback(refresh)
+ })
+ } catch (e) {
+ try {
+ await fetchDietAiRecommendFallback(refresh)
+ } catch (e2) {
+ showUserToast('饮食建议加载失败')
+ }
+ } finally {
+ dietAiLoading.value = false
+ dietAiStreaming.value = false
+ dietAiReplacing.value = false
+ dietAiStreamField.value = ''
+ }
+ }
+
+ function refreshDietAiRecommend() {
+ if (dietAiLoading.value) return
+ fetchDietAiRecommend(true)
+ }
+
+ async function askDietAiFoodFallback(q) {
+ const res = await proxy.apiUrl({
+ url: '/api/tcm/dailyDietAiAsk',
+ method: 'POST',
+ timeout: 35000,
+ data: {
+ diagnosis_id: diagnosisId.value,
+ question: q
+ }
+ }, false)
+ if (res?.code === 1 && res.data) {
+ dietAiAskResult.value = {
+ advice: res.data.advice || '',
+ level: res.data.level || '',
+ level_label: res.data.level_label || '',
+ portion: res.data.portion || '',
+ food: res.data.food || q
+ }
+ } else {
+ showUserToast(formatUserMessage(res?.msg, '咨询失败'))
+ }
+ }
+
+ async function askDietAiFood() {
+ const q = String(dietAiAskText.value || '').trim()
+ if (!q) {
+ showUserToast('请输入想咨询的食物')
+ return
+ }
+ if (!diagnosisId.value) return
+ // 发送后立即清空输入框
+ dietAiAskText.value = ''
+ dietAiAsking.value = true
+ dietAiAskResult.value = { advice: '', level: '', level_label: '', portion: '', food: '' }
+ try {
+ await requestAiStream({
+ baseUrl: proxy.$url,
+ url: '/api/tcm/dailyDietAiAskStream',
+ method: 'POST',
+ data: {
+ diagnosis_id: diagnosisId.value,
+ question: q
+ },
+ onEvent: (event, payload) => {
+ if (event === 'start' && !dietAiAskResult.value.advice) {
+ dietAiAskResult.value = { ...dietAiAskResult.value, advice: payload.message || '正在想…' }
+ } else if (event === 'delta') {
+ dietAiAskResult.value = {
+ ...dietAiAskResult.value,
+ advice: payload.advice || dietAiAskResult.value.advice
+ }
+ } else if (event === 'done') {
+ dietAiAskResult.value = {
+ advice: payload.advice || '',
+ level: payload.level || '',
+ level_label: payload.level_label || '',
+ portion: payload.portion || '',
+ food: payload.food || q
+ }
+ } else if (event === 'error') {
+ showUserToast(formatUserMessage(payload?.message, '咨询失败'))
+ }
+ },
+ fallback: () => askDietAiFoodFallback(q)
+ })
+ } catch (e) {
+ try {
+ await askDietAiFoodFallback(q)
+ } catch (e2) {
+ showUserToast('网络异常,请稍后再试')
+ }
+ } finally {
+ dietAiAsking.value = false
+ }
+ }
+
+ function onDietAiAskInput(e) {
+ dietAiAskText.value = e?.detail?.value ?? ''
+ }
+
+ function saveDietPrefillToStorage() {
+ const r = dietAiRecommend.value
+ if (!r.breakfast) return
+ try {
+ uni.setStorageSync(DIET_AI_PREFILL_KEY, {
+ breakfast: r.breakfast,
+ drinks: r.drinks || '',
+ lunch: r.lunch,
+ dinner: r.dinner,
+ tips: r.tips || ''
+ })
+ } catch (e) {}
+ }
+
+ function goMoreDietForm(withPrefill = false) {
+ if (withPrefill) saveDietPrefillToStorage()
+ uni.navigateTo({ url: '/tongji/pages/more?openDiet=1' })
+ }
+
+ async function applyDietAiToForm() {
+ if (!dietAiRecommend.value.breakfast) {
+ await fetchDietAiRecommend(false)
+ }
+ goMoreDietForm(true)
+ }
+
+ function openDietForm() {
+ goMoreDietForm(false)
+ }
+
+ return {
+ dietAiRecommend,
+ dietAiLoading,
+ dietAiStreaming,
+ dietAiReplacing,
+ dietAiStreamField,
+ dietAiAskText,
+ dietAiAsking,
+ dietAiAskResult,
+ hasDietAiMealContent,
+ fetchDietAiRecommend,
+ refreshDietAiRecommend,
+ askDietAiFood,
+ onDietAiAskInput,
+ applyDietAiToForm,
+ openDietForm
+ }
+}
+
+/** more 页打开饮食表单时读取并清除预填 */
+export function consumeDietAiPrefill() {
+ try {
+ const data = uni.getStorageSync(DIET_AI_PREFILL_KEY)
+ uni.removeStorageSync(DIET_AI_PREFILL_KEY)
+ if (data && typeof data === 'object' && data.breakfast) return data
+ } catch (e) {}
+ return null
+}
diff --git a/TUICallKit-Vue3/tongji/composables/useTongjiAuth.js b/TUICallKit-Vue3/tongji/composables/useTongjiAuth.js
index 5b34f7852..c886aaf8f 100644
--- a/TUICallKit-Vue3/tongji/composables/useTongjiAuth.js
+++ b/TUICallKit-Vue3/tongji/composables/useTongjiAuth.js
@@ -1,115 +1,115 @@
-import { ref } from 'vue'
-import { formatUserMessage } from '../utils/tongjiHelpers.js'
-
-/** 登录 / 就诊卡门禁(index 与 more 共用) */
-export function useTongjiAuth(proxy) {
- const authChecking = ref(false)
- let gateRedirected = false
- let authSessionPromise = null
-
- function hasAuthToken() {
- return !!String(uni.getStorageSync('token') || '').trim()
- }
-
- function clearAuthStorage() {
- uni.removeStorageSync('token')
- authSessionPromise = null
- }
-
- function wxLoginGetCode() {
- return new Promise((resolve, reject) => {
- uni.login({
- provider: 'weixin',
- success: (res) => {
- if (res && res.code) resolve(res.code)
- else reject(new Error('微信登录未返回 code'))
- },
- fail: reject
- })
- })
- }
-
- async function mnpLoginWithCode(code) {
- const res = await proxy.apiUrl({
- url: '/api/login/mnpLogin',
- method: 'POST',
- data: { code }
- }, false)
- if (res && res.code === 1 && res.data && res.data.token) {
- uni.setStorageSync('token', res.data.token)
- uni.setStorageSync('userData', res.data)
- return res.data
- }
- clearAuthStorage()
- throw new Error(formatUserMessage(res?.msg, '登录失败'))
- }
-
- async function doWxLogin() {
- const code = await wxLoginGetCode()
- await mnpLoginWithCode(code)
- return hasAuthToken()
- }
-
- async function verifyOrLogin() {
- if (!hasAuthToken()) {
- return doWxLogin()
- }
- try {
- const res = await proxy.apiUrl({ url: '/api/user/info', method: 'POST' }, false)
- if (res && res.code === 1 && res.data) {
- uni.setStorageSync('userData', res.data)
- return true
- }
- } catch (e) {
- /* 网络异常走重新登录 */
- }
- clearAuthStorage()
- try {
- return await doWxLogin()
- } catch (e2) {
- return false
- }
- }
-
- async function ensureLoggedIn() {
- if (authSessionPromise) {
- return authSessionPromise
- }
- authSessionPromise = verifyOrLogin()
- .then((ok) => {
- if (!ok) authSessionPromise = null
- return !!ok
- })
- .catch(() => {
- authSessionPromise = null
- return false
- })
- return authSessionPromise
- }
-
- function redirectToCardEntry(returnPath) {
- if (gateRedirected) return
- gateRedirected = true
- const returnUrl = encodeURIComponent(returnPath || '/tongji/pages/index')
- uni.redirectTo({
- url: `/pages/Card/edit_card?add=1&returnUrl=${returnUrl}`
- })
- }
-
- function resetGateRedirect() {
- gateRedirected = false
- }
-
- function isGateRedirected() {
- return gateRedirected
- }
-
- return {
- authChecking,
- hasAuthToken,
- ensureLoggedIn,
- redirectToCardEntry,
- resetGateRedirect,
- isGateRedirected
- }
-}
+import { ref } from 'vue'
+import { formatUserMessage } from '../utils/tongjiHelpers.js'
+
+/** 登录 / 就诊卡门禁(index 与 more 共用) */
+export function useTongjiAuth(proxy) {
+ const authChecking = ref(false)
+ let gateRedirected = false
+ let authSessionPromise = null
+
+ function hasAuthToken() {
+ return !!String(uni.getStorageSync('token') || '').trim()
+ }
+
+ function clearAuthStorage() {
+ uni.removeStorageSync('token')
+ authSessionPromise = null
+ }
+
+ function wxLoginGetCode() {
+ return new Promise((resolve, reject) => {
+ uni.login({
+ provider: 'weixin',
+ success: (res) => {
+ if (res && res.code) resolve(res.code)
+ else reject(new Error('微信登录未返回 code'))
+ },
+ fail: reject
+ })
+ })
+ }
+
+ async function mnpLoginWithCode(code) {
+ const res = await proxy.apiUrl({
+ url: '/api/login/mnpLogin',
+ method: 'POST',
+ data: { code }
+ }, false)
+ if (res && res.code === 1 && res.data && res.data.token) {
+ uni.setStorageSync('token', res.data.token)
+ uni.setStorageSync('userData', res.data)
+ return res.data
+ }
+ clearAuthStorage()
+ throw new Error(formatUserMessage(res?.msg, '登录失败'))
+ }
+
+ async function doWxLogin() {
+ const code = await wxLoginGetCode()
+ await mnpLoginWithCode(code)
+ return hasAuthToken()
+ }
+
+ async function verifyOrLogin() {
+ if (!hasAuthToken()) {
+ return doWxLogin()
+ }
+ try {
+ const res = await proxy.apiUrl({ url: '/api/user/info', method: 'POST' }, false)
+ if (res && res.code === 1 && res.data) {
+ uni.setStorageSync('userData', res.data)
+ return true
+ }
+ } catch (e) {
+ /* 网络异常走重新登录 */
+ }
+ clearAuthStorage()
+ try {
+ return await doWxLogin()
+ } catch (e2) {
+ return false
+ }
+ }
+
+ async function ensureLoggedIn() {
+ if (authSessionPromise) {
+ return authSessionPromise
+ }
+ authSessionPromise = verifyOrLogin()
+ .then((ok) => {
+ if (!ok) authSessionPromise = null
+ return !!ok
+ })
+ .catch(() => {
+ authSessionPromise = null
+ return false
+ })
+ return authSessionPromise
+ }
+
+ function redirectToCardEntry(returnPath) {
+ if (gateRedirected) return
+ gateRedirected = true
+ const returnUrl = encodeURIComponent(returnPath || '/tongji/pages/index')
+ uni.redirectTo({
+ url: `/pages/Card/edit_card?add=1&returnUrl=${returnUrl}`
+ })
+ }
+
+ function resetGateRedirect() {
+ gateRedirected = false
+ }
+
+ function isGateRedirected() {
+ return gateRedirected
+ }
+
+ return {
+ authChecking,
+ hasAuthToken,
+ ensureLoggedIn,
+ redirectToCardEntry,
+ resetGateRedirect,
+ isGateRedirected
+ }
+}
diff --git a/TUICallKit-Vue3/tongji/pages/more.vue b/TUICallKit-Vue3/tongji/pages/more.vue
index e26d77f33..9bf7db1a3 100644
--- a/TUICallKit-Vue3/tongji/pages/more.vue
+++ b/TUICallKit-Vue3/tongji/pages/more.vue
@@ -1,8515 +1,8515 @@
-
-
-
-
-
-
- {{ p.kind === 'south' ? '↓' : '▼' }}
-
-
- 正在登录…
-
-
-
-
-
-
-
-
-
-
- 稳糖乐园
- 用健康打卡浇灌你的稳糖树
-
-
- {{ gamifyPoints }}
- 稳糖积分
-
-
-
-
- 今日控糖任务
-
-
-
-
-
-
-
- +{{ task.points }}积分
-
-
-
- {{ task.name }}
-
- 已完成
-
- 去浇水
-
-
- 去记录
-
-
-
-
-
-
-
-
- Lv.{{ treeLevel }}
- {{ treeLevelName }}
-
- {{ currentTreeSpecies.name }}
-
-
-
- {{ treeXpUpgradeHint }}
-
- 还差 {{ treeState.pointsToNext }} XP 升级至 Lv.{{ treeLevel + 1 }}
-
-
- {{ treeProgressLabel }}
-
-
-
-
-
- 🌿
-
-
-
-
-
- {{ treeEmoji }}
-
-
- ✨
-
-
- -0.5 mmol/L
-
-
- +{{ floatReward.text }}
-
-
-
-
- {{ waterHintText }}
-
-
-
-
-
-
-
- {{ opt.label }}
-
-
-
-
-
-
-
- 健康日历
- {{ heatmapMonthLabel }} · 已记录 {{ heatmapTotalRecords }} / {{ heatmapInRangeDays }} 天
-
-
-
-
- 一
- 二
- 三
- 四
- 五
- 六
- 日
- 0 ? jumpToDayRecord(cell.date) : null"
- >
- {{ cell.day }}
-
-
-
-
-
-
-
-
-
- 血糖明细
- 共 {{ bloodRecordDays.length }} 天
-
-
- 加载中…
-
-
- 该时段暂无血糖记录
-
-
-
-
- {{ day.dateLabel }}
- {{ day.weekday }}
-
-
-
- 空腹
-
- 偏高
- 偏低
- {{ formatBloodMetric(day.blood.fasting_blood_sugar) }}
- mmol/L
-
-
-
- 餐后
-
- 偏高
- 偏低
- {{ formatBloodMetric(day.blood.postprandial_blood_sugar) }}
- mmol/L
-
-
- ——
- mmol/L
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 邀请家人点赞
- 分享战报给家人,邀请他们为您点赞鼓励
-
-
-
-
-
-
-
-
-
- 💬
-
-
-
- {{ encourageParts.prefix }}{{ encourageParts.highlight }}{{ encourageParts.suffix }}
-
-
-
-
-
-
-
-
-
- 就诊卡
- {{ cards.length }} 张
-
-
- {{ card.patient_name || '未填' }}
- {{ card.age }}岁
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ inputForm.id ? '修改今日血糖' : '录入今日血糖' }}
- {{ todayText }} · {{ patientName || '本人' }}
-
-
- ×
-
-
-
- 加载今日数据中…
-
-
-
- 请如实填写,留空表示该项不上传。当天可多次修改。
-
-
-
-
-
- 语音录入
- 选一种方式,自动填入下方字段
-
-
-
-
- 推荐
-
-
-
-
- {{ isVoiceBarLive('glucose') ? '正在聆听…松手结束' : '长按说话,自动填写' }}
- 例:空腹6.5,餐后8.2
-
-
-
-
-
-
-
-
- 血糖(mmol/L)
-
-
-
- 空腹血糖
-
-
-
-
-
-
-
-
- 餐后血糖
-
-
-
-
-
-
-
-
- 其他血糖
-
-
-
-
-
- 备注
-
-
-
-
-
-
- 删除
-
-
- {{ inputForm.submitting ? '提交中…' : (inputForm.id ? '保存修改' : '提交录入') }}
-
-
-
-
-
-
-
-
-
-
-
- {{ bpForm.id ? '修改今日血压' : '录入今日血压' }}
- {{ todayText }} · {{ patientName || '本人' }}
-
- ×
-
- 加载中…
-
-
-
-
-
-
- {{ isVoiceBarLive('bp') ? '正在聆听…松手结束' : '长按说话,自动填写' }}
- 例:高压120,低压80
-
-
- 血压(mmHg)
-
-
- 高压
-
-
-
-
-
- 低压
-
-
-
-
-
- 用药(选填)
-
- 西药
-
-
-
-
-
- 胰岛素
-
-
-
-
-
-
- 删除
- {{ bpForm.submitting ? '提交中…' : '保存' }}
-
-
-
-
-
-
-
-
-
-
- 记今日饮食
- {{ todayText }}
-
- ×
-
- 加载中…
-
-
- AI 推荐
- 早 {{ dietAiPrefill.breakfast }} · 喝 {{ dietAiPrefill.drinks }} · 午 {{ dietAiPrefill.lunch }} · 晚 {{ dietAiPrefill.dinner }}
-
- 一键填入
-
-
- 至少填写一餐,完成后可浇水领取积分。
-
-
-
-
-
- {{ isVoiceBarLive('diet') ? '正在聆听…松手结束' : '长按说话,自动填写' }}
- 例:早餐鸡蛋粥,午餐米饭炒青菜
-
-
-
- 早餐
-
-
-
-
-
- 午餐
-
-
-
-
-
- 晚餐
-
-
-
-
-
-
-
-
-
-
- {{ dietForm.submitting ? '提交中…' : '保存饮食' }}
-
-
-
-
-
-
-
-
-
-
-
- 记今日运动
- {{ todayText }}
-
- ×
-
- 加载中…
-
- 填写运动类型或时长,完成后可浇水领取积分。
-
-
-
-
-
- {{ isVoiceBarLive('exercise') ? '正在聆听…松手结束' : '长按说话,自动填写' }}
- 例:散步30分钟,中强度
-
-
-
- 运动类型
-
-
-
-
-
- 时长(分钟)
-
-
-
-
- 运动强度
-
-
- {{ opt.label }}
-
-
-
-
-
- {{ exerciseForm.submitting ? '提交中…' : '保存运动' }}
-
-
-
-
-
-
-
-
-
-
-
- {{ sttListening ? '正在聆听…' : '准备录音…' }}
- 松开手指结束并识别
-
-
-
-
-
-
-
- 本周稳糖战报
- ×
-
-
-
-
- {{ weeklyReportData.patientLabel }}
-
- {{ weeklyReportData.weekLabel }}
-
-
- {{ weeklyReportData.recordDays }}
- 天有记录
-
-
- {{ weeklyReportData.completeDays }}
- 完整一日
-
-
- {{ weeklyReportData.streakDays }}
- 连续天数
-
-
- {{ weeklyReportData.quote }}
- 习惯参考,不替代医嘱 · 家人打开分享可查看近7日记录
-
-
-
-
-
-
- 分享给家人
-
- 关闭
-
-
-
-
-
-
-
-
- 今日稳糖进度
-
- ×
-
-
- {{ waterStatusSummary }}
-
-
-
-
- {{ row.name }}
- {{ row.statusSub }}
-
- {{ row.statusLabel }}
-
-
-
- {{ waterStatusGrowthHint }}
-
-
-
-
-
-
-
-
-
-
-
-
-
- 选择你的稳糖树
-
- ×
-
-
-
- 全勤打卡约 {{ speciesDaysToMax }} 天满级 · 每级 {{ TREE_XP_PER_LEVEL }} 积分 · 从小到大的 10 个阶段见下方
-
-
-
-
- {{ speciesEmojiAtLevel(sp.id, treeLevel) }}
-
- {{ sp.name }}
- {{ sp.tagline }}
-
-
-
-
- {{ stage.emoji }}
- Lv.{{ stage.level }}
- {{ stage.name }}
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+ {{ p.kind === 'south' ? '↓' : '▼' }}
+
+
+ 正在登录…
+
+
+
+
+
+
+
+
+
+
+ 稳糖乐园
+ 用健康打卡浇灌你的稳糖树
+
+
+ {{ gamifyPoints }}
+ 稳糖积分
+
+
+
+
+ 今日控糖任务
+
+
+
+
+
+
+
+ +{{ task.points }}积分
+
+
+
+ {{ task.name }}
+
+ 已完成
+
+ 去浇水
+
+
+ 去记录
+
+
+
+
+
+
+
+
+ Lv.{{ treeLevel }}
+ {{ treeLevelName }}
+
+ {{ currentTreeSpecies.name }}
+
+
+
+ {{ treeXpUpgradeHint }}
+
+ 还差 {{ treeState.pointsToNext }} XP 升级至 Lv.{{ treeLevel + 1 }}
+
+
+ {{ treeProgressLabel }}
+
+
+
+
+
+ 🌿
+
+
+
+
+
+ {{ treeEmoji }}
+
+
+ ✨
+
+
+ -0.5 mmol/L
+
+
+ +{{ floatReward.text }}
+
+
+
+
+ {{ waterHintText }}
+
+
+
+
+
+
+
+ {{ opt.label }}
+
+
+
+
+
+
+
+ 健康日历
+ {{ heatmapMonthLabel }} · 已记录 {{ heatmapTotalRecords }} / {{ heatmapInRangeDays }} 天
+
+
+
+
+ 一
+ 二
+ 三
+ 四
+ 五
+ 六
+ 日
+ 0 ? jumpToDayRecord(cell.date) : null"
+ >
+ {{ cell.day }}
+
+
+
+
+
+
+
+
+
+ 血糖明细
+ 共 {{ bloodRecordDays.length }} 天
+
+
+ 加载中…
+
+
+ 该时段暂无血糖记录
+
+
+
+
+ {{ day.dateLabel }}
+ {{ day.weekday }}
+
+
+
+ 空腹
+
+ 偏高
+ 偏低
+ {{ formatBloodMetric(day.blood.fasting_blood_sugar) }}
+ mmol/L
+
+
+
+ 餐后
+
+ 偏高
+ 偏低
+ {{ formatBloodMetric(day.blood.postprandial_blood_sugar) }}
+ mmol/L
+
+
+ ——
+ mmol/L
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 邀请家人点赞
+ 分享战报给家人,邀请他们为您点赞鼓励
+
+
+
+
+
+
+
+
+
+ 💬
+
+
+
+ {{ encourageParts.prefix }}{{ encourageParts.highlight }}{{ encourageParts.suffix }}
+
+
+
+
+
+
+
+
+
+ 就诊卡
+ {{ cards.length }} 张
+
+
+ {{ card.patient_name || '未填' }}
+ {{ card.age }}岁
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ inputForm.id ? '修改今日血糖' : '录入今日血糖' }}
+ {{ todayText }} · {{ patientName || '本人' }}
+
+
+ ×
+
+
+
+ 加载今日数据中…
+
+
+
+ 请如实填写,留空表示该项不上传。当天可多次修改。
+
+
+
+
+
+ 语音录入
+ 选一种方式,自动填入下方字段
+
+
+
+
+ 推荐
+
+
+
+
+ {{ isVoiceBarLive('glucose') ? '正在聆听…松手结束' : '长按说话,自动填写' }}
+ 例:空腹6.5,餐后8.2
+
+
+
+
+
+
+
+
+ 血糖(mmol/L)
+
+
+
+ 空腹血糖
+
+
+
+
+
+
+
+
+ 餐后血糖
+
+
+
+
+
+
+
+
+ 其他血糖
+
+
+
+
+
+ 备注
+
+
+
+
+
+
+ 删除
+
+
+ {{ inputForm.submitting ? '提交中…' : (inputForm.id ? '保存修改' : '提交录入') }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ bpForm.id ? '修改今日血压' : '录入今日血压' }}
+ {{ todayText }} · {{ patientName || '本人' }}
+
+ ×
+
+ 加载中…
+
+
+
+
+
+
+ {{ isVoiceBarLive('bp') ? '正在聆听…松手结束' : '长按说话,自动填写' }}
+ 例:高压120,低压80
+
+
+ 血压(mmHg)
+
+
+ 高压
+
+
+
+
+
+ 低压
+
+
+
+
+
+ 用药(选填)
+
+ 西药
+
+
+
+
+
+ 胰岛素
+
+
+
+
+
+
+ 删除
+ {{ bpForm.submitting ? '提交中…' : '保存' }}
+
+
+
+
+
+
+
+
+
+
+ 记今日饮食
+ {{ todayText }}
+
+ ×
+
+ 加载中…
+
+
+ AI 推荐
+ 早 {{ dietAiPrefill.breakfast }} · 喝 {{ dietAiPrefill.drinks }} · 午 {{ dietAiPrefill.lunch }} · 晚 {{ dietAiPrefill.dinner }}
+
+ 一键填入
+
+
+ 至少填写一餐,完成后可浇水领取积分。
+
+
+
+
+
+ {{ isVoiceBarLive('diet') ? '正在聆听…松手结束' : '长按说话,自动填写' }}
+ 例:早餐鸡蛋粥,午餐米饭炒青菜
+
+
+
+ 早餐
+
+
+
+
+
+ 午餐
+
+
+
+
+
+ 晚餐
+
+
+
+
+
+
+
+
+
+
+ {{ dietForm.submitting ? '提交中…' : '保存饮食' }}
+
+
+
+
+
+
+
+
+
+
+
+ 记今日运动
+ {{ todayText }}
+
+ ×
+
+ 加载中…
+
+ 填写运动类型或时长,完成后可浇水领取积分。
+
+
+
+
+
+ {{ isVoiceBarLive('exercise') ? '正在聆听…松手结束' : '长按说话,自动填写' }}
+ 例:散步30分钟,中强度
+
+
+
+ 运动类型
+
+
+
+
+
+ 时长(分钟)
+
+
+
+
+ 运动强度
+
+
+ {{ opt.label }}
+
+
+
+
+
+ {{ exerciseForm.submitting ? '提交中…' : '保存运动' }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ sttListening ? '正在聆听…' : '准备录音…' }}
+ 松开手指结束并识别
+
+
+
+
+
+
+
+ 本周稳糖战报
+ ×
+
+
+
+
+ {{ weeklyReportData.patientLabel }}
+
+ {{ weeklyReportData.weekLabel }}
+
+
+ {{ weeklyReportData.recordDays }}
+ 天有记录
+
+
+ {{ weeklyReportData.completeDays }}
+ 完整一日
+
+
+ {{ weeklyReportData.streakDays }}
+ 连续天数
+
+
+ {{ weeklyReportData.quote }}
+ 习惯参考,不替代医嘱 · 家人打开分享可查看近7日记录
+
+
+
+
+
+
+ 分享给家人
+
+ 关闭
+
+
+
+
+
+
+
+
+ 今日稳糖进度
+
+ ×
+
+
+ {{ waterStatusSummary }}
+
+
+
+
+ {{ row.name }}
+ {{ row.statusSub }}
+
+ {{ row.statusLabel }}
+
+
+
+ {{ waterStatusGrowthHint }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 选择你的稳糖树
+
+ ×
+
+
+
+ 全勤打卡约 {{ speciesDaysToMax }} 天满级 · 每级 {{ TREE_XP_PER_LEVEL }} 积分 · 从小到大的 10 个阶段见下方
+
+
+
+
+ {{ speciesEmojiAtLevel(sp.id, treeLevel) }}
+
+ {{ sp.name }}
+ {{ sp.tagline }}
+
+
+
+
+ {{ stage.emoji }}
+ Lv.{{ stage.level }}
+ {{ stage.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TUICallKit-Vue3/tongji/pages/weekly.vue b/TUICallKit-Vue3/tongji/pages/weekly.vue
index c470685d6..809932519 100644
--- a/TUICallKit-Vue3/tongji/pages/weekly.vue
+++ b/TUICallKit-Vue3/tongji/pages/weekly.vue
@@ -1,2819 +1,2819 @@
-
-
-
- 正在登录…
-
-
-
-
-
-
-
-
-
- {{ card.patient_name || '就诊卡' }}
-
-
-
-
-
-
-
-
-
- {{ dailyContextError }}
-
-
-
-
-
-
- 血糖趋势
- {{ rangeText }} · mmol/L
-
-
-
-
-
- 空腹
-
-
-
- 餐后
-
-
-
-
-
-
- 图表已暂停显示
-
-
- 当前时间范围暂无血糖数据
-
-
-
-
-
-
-
-
-
- 识糖小课堂
- 三消认食物,学习哪些食物含糖高
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- AI 饮食建议
-
-
-
- {{ dietAiLoading ? '生成中' : '换一换' }}
-
-
- 读您近 7 天 · 30 天血糖,定制早餐(含驼奶粉)、喝的与三餐
-
-
-
- 正在生成今日饮食建议…
-
-
-
-
-
- 早餐
-
-
- {{ dietAiRecommend.breakfast || (dietAiLoading ? '…' : '—') }}▍
-
-
-
-
-
- 喝的
-
-
- {{ dietAiRecommend.drinks || '…' }}▍
-
-
-
-
-
- 午餐
-
-
- {{ dietAiRecommend.lunch || (dietAiLoading ? '…' : '—') }}▍
-
-
-
-
-
- 晚餐
-
-
- {{ dietAiRecommend.dinner || '…' }}▍
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ×
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ sttListening ? '松手结束' : '准备录音…' }}
-
-
-
- {{ dietAiAskResult.level_label }}
-
-
- {{ dietAiAskResult.advice || (dietAiAsking ? '正在想…' : '') }}▍
-
-
-
-
-
-
-
-
-
-
- {{ sttListening ? '正在聆听…' : '准备录音…' }}
- 松开手指结束并识别
-
-
-
-
-
-
-
-
-
- 授权手机号
- 绑定手机号后即可记录血糖,无需先填写就诊卡
-
-
- ×
-
-
-
-
- {{ dailyContextError }}
-
- 微信仅提供手机号,请选择性别以便写入就诊档案。
-
- 性别
-
-
- 男
-
-
- 女
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ inputForm.id ? '修改今日血糖' : '录入今日血糖' }}
- {{ todayText }} · {{ patientName || '本人' }}
-
-
- ×
-
-
-
-
- 加载今日数据中…
-
-
-
- 请如实填写,留空表示该项不上传。当天可多次修改。
-
-
- 血糖(mmol/L)
-
-
-
- 空腹血糖
-
-
-
-
-
-
-
-
- 餐后血糖
-
-
-
-
-
-
-
-
- 其他血糖
-
-
-
-
-
-
- 备注
-
-
-
-
-
-
-
- 删除
-
-
- {{ inputForm.submitting ? '提交中…' : (inputForm.id ? '保存修改' : '提交录入') }}
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ 正在登录…
+
+
+
+
+
+
+
+
+
+ {{ card.patient_name || '就诊卡' }}
+
+
+
+
+
+
+
+
+
+ {{ dailyContextError }}
+
+
+
+
+
+
+ 血糖趋势
+ {{ rangeText }} · mmol/L
+
+
+
+
+
+ 空腹
+
+
+
+ 餐后
+
+
+
+
+
+
+ 图表已暂停显示
+
+
+ 当前时间范围暂无血糖数据
+
+
+
+
+
+
+
+
+
+ 识糖小课堂
+ 三消认食物,学习哪些食物含糖高
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AI 饮食建议
+
+
+
+ {{ dietAiLoading ? '生成中' : '换一换' }}
+
+
+ 读您近 7 天 · 30 天血糖,定制早餐(含驼奶粉)、喝的与三餐
+
+
+
+ 正在生成今日饮食建议…
+
+
+
+
+
+ 早餐
+
+
+ {{ dietAiRecommend.breakfast || (dietAiLoading ? '…' : '—') }}▍
+
+
+
+
+
+ 喝的
+
+
+ {{ dietAiRecommend.drinks || '…' }}▍
+
+
+
+
+
+ 午餐
+
+
+ {{ dietAiRecommend.lunch || (dietAiLoading ? '…' : '—') }}▍
+
+
+
+
+
+ 晚餐
+
+
+ {{ dietAiRecommend.dinner || '…' }}▍
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ×
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ sttListening ? '松手结束' : '准备录音…' }}
+
+
+
+ {{ dietAiAskResult.level_label }}
+
+
+ {{ dietAiAskResult.advice || (dietAiAsking ? '正在想…' : '') }}▍
+
+
+
+
+
+
+
+
+
+
+ {{ sttListening ? '正在聆听…' : '准备录音…' }}
+ 松开手指结束并识别
+
+
+
+
+
+
+
+
+
+ 授权手机号
+ 绑定手机号后即可记录血糖,无需先填写就诊卡
+
+
+ ×
+
+
+
+
+ {{ dailyContextError }}
+
+ 微信仅提供手机号,请选择性别以便写入就诊档案。
+
+ 性别
+
+
+ 男
+
+
+ 女
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ inputForm.id ? '修改今日血糖' : '录入今日血糖' }}
+ {{ todayText }} · {{ patientName || '本人' }}
+
+
+ ×
+
+
+
+
+ 加载今日数据中…
+
+
+
+ 请如实填写,留空表示该项不上传。当天可多次修改。
+
+
+ 血糖(mmol/L)
+
+
+
+ 空腹血糖
+
+
+
+
+
+
+
+
+ 餐后血糖
+
+
+
+
+
+
+
+
+ 其他血糖
+
+
+
+
+
+
+ 备注
+
+
+
+
+
+
+
+ 删除
+
+
+ {{ inputForm.submitting ? '提交中…' : (inputForm.id ? '保存修改' : '提交录入') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TUICallKit-Vue3/tongji/styles/stitch-vitalmint-theme.scss b/TUICallKit-Vue3/tongji/styles/stitch-vitalmint-theme.scss
index ddd955c27..58eb01752 100644
--- a/TUICallKit-Vue3/tongji/styles/stitch-vitalmint-theme.scss
+++ b/TUICallKit-Vue3/tongji/styles/stitch-vitalmint-theme.scss
@@ -1,51 +1,51 @@
-/**
- * Google Stitch MCP · VitalMint Health
- * 设计 token 与 stitch-weekly.html tailwind.config 一一对应
- */
-
-.stitch-vitalmint {
- --primary: #006c49;
- --on-primary: #ffffff;
- --on-primary-fixed-variant: #005236;
- --primary-container: #10b981;
- --on-primary-container: #00422b;
- --inverse-primary: #4edea3;
-
- --surface: #f4fbf4;
- --on-surface: #161d19;
- --on-surface-variant: #3c4a42;
- --surface-container-lowest: #ffffff;
- --surface-container-low: #eef6ee;
- --surface-container: #e8f0e9;
- --surface-container-high: #e3eae3;
- --surface-container-highest: #dde4dd;
- --surface-variant: #dde4dd;
-
- --outline: #6c7a71;
- --outline-variant: #bbcabf;
-
- --error: #ba1a1a;
- --on-error-container: #93000a;
- --error-container: #ffdad6;
- --tertiary: #a43a3a;
- --tertiary-container: #fc7c78;
- --on-tertiary: #ffffff;
- --on-tertiary-container: #711419;
-
- --st-container-margin: 40rpx;
- --st-section-gap: 64rpx;
- --st-card-padding: 40rpx;
- --st-stack-gap: 32rpx;
- --st-inline-gap: 24rpx;
- --st-radius-2xl: 48rpx;
- --st-radius-xl: 24rpx;
- --st-radius-lg: 16rpx;
- --st-shadow-ambient: 0 20rpx 60rpx -20rpx rgba(0, 108, 73, 0.08);
-}
-
-.weekly-page.stitch-vitalmint {
- min-height: 100vh;
- background: var(--surface);
- color: var(--on-surface);
- padding-bottom: calc(200rpx + env(safe-area-inset-bottom));
-}
+/**
+ * Google Stitch MCP · VitalMint Health
+ * 设计 token 与 stitch-weekly.html tailwind.config 一一对应
+ */
+
+.stitch-vitalmint {
+ --primary: #006c49;
+ --on-primary: #ffffff;
+ --on-primary-fixed-variant: #005236;
+ --primary-container: #10b981;
+ --on-primary-container: #00422b;
+ --inverse-primary: #4edea3;
+
+ --surface: #f4fbf4;
+ --on-surface: #161d19;
+ --on-surface-variant: #3c4a42;
+ --surface-container-lowest: #ffffff;
+ --surface-container-low: #eef6ee;
+ --surface-container: #e8f0e9;
+ --surface-container-high: #e3eae3;
+ --surface-container-highest: #dde4dd;
+ --surface-variant: #dde4dd;
+
+ --outline: #6c7a71;
+ --outline-variant: #bbcabf;
+
+ --error: #ba1a1a;
+ --on-error-container: #93000a;
+ --error-container: #ffdad6;
+ --tertiary: #a43a3a;
+ --tertiary-container: #fc7c78;
+ --on-tertiary: #ffffff;
+ --on-tertiary-container: #711419;
+
+ --st-container-margin: 40rpx;
+ --st-section-gap: 64rpx;
+ --st-card-padding: 40rpx;
+ --st-stack-gap: 32rpx;
+ --st-inline-gap: 24rpx;
+ --st-radius-2xl: 48rpx;
+ --st-radius-xl: 24rpx;
+ --st-radius-lg: 16rpx;
+ --st-shadow-ambient: 0 20rpx 60rpx -20rpx rgba(0, 108, 73, 0.08);
+}
+
+.weekly-page.stitch-vitalmint {
+ min-height: 100vh;
+ background: var(--surface);
+ color: var(--on-surface);
+ padding-bottom: calc(200rpx + env(safe-area-inset-bottom));
+}
diff --git a/TUICallKit-Vue3/tongji/styles/weekly-stitch.scss b/TUICallKit-Vue3/tongji/styles/weekly-stitch.scss
index 477efebbd..ce1da2cb1 100644
--- a/TUICallKit-Vue3/tongji/styles/weekly-stitch.scss
+++ b/TUICallKit-Vue3/tongji/styles/weekly-stitch.scss
@@ -1,981 +1,981 @@
-/**
- * weekly.vue — 与 code.html (Stitch Modern WeChat UI) 1:1
- */
-
-.weekly-page {
- --st-shadow-ambient: 0 24rpx 60rpx -20rpx rgba(0, 108, 73, 0.08), 0 8rpx 20rpx -8rpx rgba(0, 0, 0, 0.03);
- --st-shadow-cta: 0 16rpx 32rpx rgba(0, 108, 73, 0.2);
- --st-shadow-float: 0 16rpx 64rpx rgba(0, 108, 73, 0.15);
- --tab-dock-full-offset: calc(220rpx + env(safe-area-inset-bottom));
- padding-bottom: var(--tab-dock-full-offset);
-}
-
-/* ===== Header ===== */
-.weekly-page .st-header {
- position: relative;
- display: flex;
- align-items: center;
- padding-left: var(--st-container-margin);
- padding-right: var(--st-container-margin);
- padding-bottom: 32rpx;
- /* padding-top / padding-right 由 initHeaderSafeArea 动态设置 */
- background: var(--surface);
-}
-
-.weekly-page .st-header-text {
- flex: 1;
- min-width: 0;
- overflow: hidden;
-}
-
-.weekly-page .st-header-left {
- display: flex;
- align-items: center;
- gap: var(--st-inline-gap);
- flex: 1;
- min-width: 0;
-}
-
-.weekly-page .st-avatar {
- width: 80rpx;
- height: 80rpx;
- border-radius: 50%;
- background: var(--primary-container);
- border: 4rpx solid var(--surface-container-lowest);
- display: flex;
- align-items: center;
- justify-content: center;
- flex-shrink: 0;
-}
-
-.weekly-page .st-greet {
- display: block;
- font-size: 40rpx;
- font-weight: 700;
- line-height: 1.27;
- color: var(--on-surface);
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.weekly-page .st-status {
- display: block;
- margin-top: 4rpx;
- font-size: 24rpx;
- font-weight: 600;
- color: var(--on-surface-variant);
- opacity: 0.8;
-}
-
-.weekly-page .st-voice-round {
- width: 80rpx;
- height: 80rpx;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
- flex-shrink: 0;
-}
-
-.weekly-page .st-voice-round.disabled {
- opacity: 0.45;
-}
-
-.weekly-page .st-card-scroll {
- margin: 0 var(--st-container-margin) 8rpx;
- white-space: nowrap;
-}
-
-.weekly-page .st-card-row {
- display: inline-flex;
- gap: 16rpx;
-}
-
-.weekly-page .st-card-chip {
- padding: 12rpx 28rpx;
- border-radius: 999rpx;
- font-size: 26rpx;
- font-weight: 600;
- color: var(--on-surface-variant);
- background: var(--surface-container-lowest);
- border: 1rpx solid var(--outline-variant);
-}
-
-.weekly-page .st-card-chip.active {
- background: var(--primary);
- border-color: var(--primary);
- color: var(--on-primary);
-}
-
-/* ===== 居家训练(DEV 内嵌) ===== */
-.weekly-page .st-training-section {
- width: 100%;
- box-sizing: border-box;
-}
-
-.weekly-page .st-training-section .dev-entry-inline--weekly {
- overflow: hidden;
-}
-
-.weekly-page .st-training-section .inline-scroll {
- margin-left: -4rpx;
- margin-right: -4rpx;
- width: calc(100% + 8rpx);
-}
-
-.weekly-page .st-training-section .inline-card:first-child {
- border-color: rgba(0, 108, 73, 0.22);
- background: linear-gradient(160deg, rgba(0, 108, 73, 0.08) 0%, #f4f7f5 55%);
-}
-
-/* ===== Main ===== */
-.weekly-page .st-main {
- padding: 0 var(--st-container-margin) 32rpx;
- display: flex;
- flex-direction: column;
- gap: 48rpx;
- margin-top: 16rpx;
-}
-
-.weekly-page .st-daily-context-error {
- padding: 24rpx 28rpx;
- border-radius: 24rpx;
- background: #fef2f2;
- border: 1rpx solid rgba(220, 38, 38, 0.22);
- box-sizing: border-box;
-}
-
-.weekly-page .st-daily-context-error-text {
- font-size: 28rpx;
- font-weight: 600;
- color: #991b1b;
- line-height: 1.5;
-}
-
-.weekly-page .st-main-spacer {
- height: 32rpx;
-}
-
-/* CTA — rounded-2xl h-14 */
-.weekly-page .st-cta {
- width: 100%;
- height: 112rpx;
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 16rpx;
- border-radius: var(--st-radius-2xl);
- background: var(--primary);
- color: var(--on-primary);
- font-size: 32rpx;
- font-weight: 700;
- box-shadow: var(--st-shadow-cta);
-}
-
-.weekly-page .st-cta:active {
- transform: scale(0.98);
-}
-
-/* 游戏入口 */
-.weekly-page .st-game-entry {
-
- margin-top: 24rpx;
- padding: 28rpx 32rpx;
- display: flex;
- align-items: center;
- gap: 24rpx;
- border-radius: var(--st-radius-2xl);
- background: var(--surface-container-lowest);
- border: 1rpx solid rgba(0, 108, 73, 0.14);
- box-shadow: var(--st-shadow-ambient);
- box-sizing: border-box;
-}
-
-.weekly-page .st-game-entry:active {
- transform: scale(0.98);
- opacity: 0.92;
-}
-
-.weekly-page .st-game-entry-icon {
- width: 88rpx;
- height: 88rpx;
- border-radius: 24rpx;
- background: rgba(0, 108, 73, 0.1);
- display: flex;
- align-items: center;
- justify-content: center;
- flex-shrink: 0;
-}
-
-.weekly-page .st-game-entry-body {
- flex: 1;
- min-width: 0;
- display: flex;
- flex-direction: column;
- gap: 6rpx;
-}
-
-.weekly-page .st-game-entry-title {
- font-size: 32rpx;
- font-weight: 700;
- color: var(--on-surface);
- line-height: 1.25;
-}
-
-.weekly-page .st-game-entry-sub {
- font-size: 24rpx;
- font-weight: 500;
- color: var(--on-surface-variant, #64748b);
- line-height: 1.35;
-}
-
-/* ===== Chart card — rounded-3xl ===== */
-.weekly-page .st-chart-card {
- padding: 40rpx 10rpx 40rpx 10rpx;
- border-radius: 48rpx;
- background: var(--surface-container-lowest);
- border: 1rpx solid rgba(221, 228, 221, 0.3);
- box-shadow: var(--st-shadow-ambient);
- display: flex;
- flex-direction: column;
- gap: 0;
- overflow: hidden;
-}
-
-.weekly-page .st-chart-head {
- display: flex;
- align-items: center;
- justify-content: space-between;
- margin-bottom: 12rpx;
- gap: 16rpx;
-}
-
-.weekly-page .st-chart-title {
- display: block;
- font-size: 30rpx;
- font-weight: 700;
- color: var(--on-surface);
-}
-
-.weekly-page .st-chart-sub {
- display: block;
- margin-top: 4rpx;
- font-size: 22rpx;
- font-weight: 600;
- color: var(--on-surface-variant);
-}
-
-.weekly-page .st-chart-more {
- display: inline-flex;
- align-items: center;
- gap: 4rpx;
- margin-top: 6rpx;
-}
-
-.weekly-page .st-chart-more-text {
- font-size: 22rpx;
- font-weight: 600;
- color: var(--primary);
-}
-
-.weekly-page .st-chart-more:active {
- opacity: 0.75;
-}
-
-.weekly-page .st-chart-legend {
- display: flex;
- gap: var(--st-inline-gap);
-}
-
-.weekly-page .st-legend-item {
- display: flex;
- align-items: center;
- gap: 8rpx;
- font-size: 24rpx;
- font-weight: 600;
- color: var(--on-surface-variant);
-}
-
-.weekly-page .st-legend-item.inactive {
- opacity: 0.4;
-}
-
-.weekly-page .st-dot {
- width: 16rpx;
- height: 16rpx;
- border-radius: 50%;
-}
-
-.weekly-page .st-dot-fasting {
- background: var(--primary);
-}
-
-.weekly-page .st-dot-post {
- background: var(--tertiary);
-}
-
-.weekly-page .st-chart-summary {
- display: flex;
- padding: 32rpx;
- margin-bottom: 48rpx;
- border-radius: var(--st-radius-xl);
- background: var(--surface-container-low);
-}
-
-.weekly-page .st-chart-summary-item {
- flex: 1;
- display: flex;
- flex-direction: column;
- align-items: center;
- border-right: 1rpx solid var(--surface-container-highest);
-}
-
-.weekly-page .st-chart-summary-item:last-child {
- border-right: none;
-}
-
-.weekly-page .st-chart-summary-num {
- font-size: 40rpx;
- font-weight: 700;
- color: var(--on-surface);
-}
-
-.weekly-page .st-chart-summary-num.is-high {
- color: var(--tertiary);
-}
-
-.weekly-page .st-chart-summary-num.is-good {
- color: var(--primary);
-}
-
-.weekly-page .st-chart-summary-label {
- margin-top: 8rpx;
- font-size: 24rpx;
- font-weight: 600;
- color: var(--on-surface-variant);
-}
-
-.weekly-page .st-chart-foot {
- padding: 20rpx 0 20rpx;
-}
-
-.weekly-page .st-chart-mock-hint {
- display: block;
- margin: 0;
- font-size: 30rpx;
- font-weight: 600;
- color: var(--outline);
- line-height: 1.35;
- text-align: center;
-}
-
-.weekly-page .st-chart-area {
- position: relative;
- height: 360rpx;
- overflow: hidden;
- cursor: pointer;
-}
-
-.weekly-page .st-chart-area:active {
- opacity: 0.92;
-}
-
-.weekly-page .st-chart-canvas {
- width: 100%;
- height: 360rpx;
- display: block;
-}
-
-/* 识糖入口嵌在趋势卡内:轻量分隔,避免大块留白 */
-.weekly-page .st-chart-card .st-game-entry-list {
- display: flex;
- flex-direction: column;
- gap: 12rpx;
- margin: 12rpx 20rpx 0;
-}
-
-.weekly-page .st-chart-card .st-game-entry--in-card {
- margin-top: 0;
- padding: 16rpx 20rpx;
- gap: 16rpx;
- border-radius: 24rpx;
- background: var(--surface-container-low);
- border: 1rpx solid rgba(0, 108, 73, 0.08);
- box-shadow: none;
-}
-
-.weekly-page .st-chart-card .st-game-entry--in-card .st-game-entry-icon {
- width: 64rpx;
- height: 64rpx;
- border-radius: 16rpx;
-}
-
-.weekly-page .st-chart-card .st-game-entry--in-card .st-game-entry-title {
- font-size: 28rpx;
-}
-
-.weekly-page .st-chart-card .st-game-entry--in-card .st-game-entry-sub {
- font-size: 22rpx;
-}
-
-.weekly-page .st-chart-empty,
-.weekly-page .st-chart-placeholder {
- position: absolute;
- inset: 0;
- display: flex;
- align-items: center;
- justify-content: center;
- font-size: 26rpx;
- color: var(--outline);
-}
-
-/* ===== 最新测量 ===== */
-.weekly-page .st-latest-section {
- display: flex;
- flex-direction: column;
- gap: 32rpx;
-}
-
-.weekly-page .st-latest-hero {
- position: relative;
- overflow: hidden;
- min-height: 320rpx;
- padding: 48rpx 40rpx;
- border-radius: 48rpx;
- background: var(--surface-container-lowest);
- box-shadow: var(--st-shadow-ambient);
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- text-align: center;
-}
-
-.weekly-page .st-latest-hero.is-high {
- background: var(--error-container);
- color: var(--on-error-container);
-}
-
-.weekly-page .st-latest-hero-pattern {
- position: absolute;
- inset: 0;
- opacity: 0.1;
- background-image: radial-gradient(circle at 4rpx 4rpx, currentColor 2rpx, transparent 0);
- background-size: 32rpx 32rpx;
- pointer-events: none;
-}
-
-.weekly-page .st-latest-label {
- position: relative;
- z-index: 1;
- font-size: 24rpx;
- font-weight: 600;
- letter-spacing: 0.08em;
- text-transform: uppercase;
- opacity: 0.9;
- margin-bottom: 8rpx;
-}
-
-.weekly-page .st-latest-value-row {
- position: relative;
- z-index: 1;
- display: flex;
- align-items: baseline;
- gap: 8rpx;
-}
-
-.weekly-page .st-latest-value {
- font-size: 112rpx;
- font-weight: 800;
- line-height: 1;
- letter-spacing: -0.02em;
-}
-
-.weekly-page .st-latest-hero.is-high .st-latest-value,
-.weekly-page .st-latest-hero.is-high .st-latest-unit {
- color: var(--on-error-container);
-}
-
-.weekly-page .st-latest-unit {
- font-size: 32rpx;
- font-weight: 500;
- opacity: 0.8;
-}
-
-.weekly-page .st-latest-flag {
- position: relative;
- z-index: 1;
- margin-top: 24rpx;
- display: inline-flex;
- align-items: center;
- gap: 12rpx;
- padding: 8rpx 24rpx;
- border-radius: 999rpx;
- background: rgba(255, 255, 255, 0.3);
- font-size: 24rpx;
- font-weight: 700;
-}
-
-.weekly-page .st-summary-grid {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 24rpx;
-}
-
-.weekly-page .st-summary-card {
- padding: 32rpx;
- border-radius: var(--st-radius-2xl);
- background: var(--surface-container-lowest);
- border: 1rpx solid rgba(221, 228, 221, 0.5);
- box-shadow: var(--st-shadow-ambient);
- display: flex;
- flex-direction: column;
- gap: 8rpx;
-}
-
-.weekly-page .st-summary-label {
- font-size: 24rpx;
- font-weight: 600;
- color: var(--on-surface-variant);
-}
-
-.weekly-page .st-summary-value {
- font-size: 48rpx;
- font-weight: 700;
- color: var(--on-surface);
-}
-
-.weekly-page .st-summary-value.is-high {
- color: var(--tertiary);
-}
-
-.weekly-page .st-summary-tag {
- align-self: flex-start;
- padding: 4rpx 16rpx;
- border-radius: 8rpx;
- font-size: 20rpx;
- font-weight: 600;
- color: var(--tertiary);
- background: rgba(255, 218, 214, 0.5);
-}
-
-/* ===== AI 饮食 ===== */
-.weekly-page .st-ai-section {
- position: relative;
- overflow: hidden;
- padding: 40rpx;
- border-radius: 48rpx;
- background: linear-gradient(135deg, rgba(0, 108, 73, 0.1) 0%, rgba(0, 108, 73, 0.05) 100%);
- border: 1rpx solid rgba(0, 108, 73, 0.1);
-}
-
-.weekly-page .st-ai-deco {
- position: absolute;
- width: 256rpx;
- height: 256rpx;
- top: -64rpx;
- right: -64rpx;
- border-radius: 50%;
- background: rgba(78, 222, 163, 0.2);
- filter: blur(40rpx);
- pointer-events: none;
-}
-
-.weekly-page .st-ai-head {
- position: relative;
- z-index: 1;
- display: flex;
- align-items: center;
- justify-content: space-between;
- margin-bottom: 16rpx;
-}
-
-.weekly-page .st-ai-head-left {
- display: flex;
- align-items: center;
- gap: 16rpx;
-}
-
-.weekly-page .st-ai-icon {
- width: 64rpx;
- height: 64rpx;
- border-radius: 50%;
- background: var(--primary);
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.weekly-page .st-ai-icon.thinking {
- animation: st-pulse 1.2s ease-in-out infinite;
-}
-
-@keyframes st-pulse {
- 50% { opacity: 0.65; }
-}
-
-.weekly-page .st-ai-title {
- font-size: 40rpx;
- font-weight: 700;
- color: var(--on-surface);
-}
-
-.weekly-page .st-ai-refresh {
- display: flex;
- align-items: center;
- gap: 8rpx;
- padding: 12rpx 24rpx;
- border-radius: 999rpx;
- background: rgba(255, 255, 255, 0.5);
- font-size: 24rpx;
- font-weight: 600;
- color: var(--primary);
-}
-
-.weekly-page .st-ai-refresh.disabled {
- opacity: 0.5;
-}
-
-.weekly-page .st-ai-sub {
- position: relative;
- z-index: 1;
- display: block;
- margin-bottom: 32rpx;
- font-size: 28rpx;
- line-height: 1.43;
- color: var(--on-surface-variant);
-}
-
-.weekly-page .st-meal-list {
- position: relative;
- z-index: 1;
- display: flex;
- flex-direction: column;
- gap: 24rpx;
-}
-
-.weekly-page .st-meal-glass {
- padding: 32rpx;
- border-radius: var(--st-radius-2xl);
- background: rgba(255, 255, 255, 0.8);
- border: 1rpx solid #ffffff;
- box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.04);
-}
-
-.weekly-page .st-meal-glass--drinks {
- background: rgba(224, 242, 254, 0.65);
- border-color: rgba(14, 165, 233, 0.15);
-}
-
-.weekly-page .st-meal-head {
- display: flex;
- align-items: center;
- gap: 16rpx;
- margin-bottom: 16rpx;
-}
-
-.weekly-page .st-meal-label {
- font-size: 28rpx;
- font-weight: 700;
- color: var(--on-surface);
-}
-
-.weekly-page .st-meal-text {
- font-size: 28rpx;
- line-height: 1.43;
- color: var(--on-surface-variant);
-}
-
-.weekly-page .st-skeleton-line {
- height: 28rpx;
- margin-bottom: 16rpx;
- border-radius: 8rpx;
- background: rgba(255, 255, 255, 0.5);
-}
-
-.weekly-page .st-skeleton-hint {
- font-size: 26rpx;
- color: var(--outline);
- text-align: center;
-}
-
-/* ===== 底部浮动输入 ===== */
-.weekly-page .st-float-ask {
- position: fixed;
- left: var(--st-container-margin);
- right: var(--st-container-margin);
- bottom: var(--tab-dock-full-offset);
- z-index: 210;
-}
-
-.weekly-page .st-float-close {
- position: absolute;
- top: -18rpx;
- right: -6rpx;
- width: 44rpx;
- height: 44rpx;
- border-radius: 50%;
- background: rgba(0, 0, 0, 0.45);
- display: flex;
- align-items: center;
- justify-content: center;
- z-index: 2;
-}
-
-.weekly-page .st-float-close-icon {
- color: #ffffff;
- font-size: 30rpx;
- line-height: 1;
-}
-
-.weekly-page .st-float-reopen {
- position: fixed;
- right: var(--st-container-margin);
- bottom: var(--tab-dock-full-offset);
- width: 88rpx;
- height: 88rpx;
- border-radius: 50%;
- background: linear-gradient(180deg, #2d7340 0%, #006c49 100%);
- box-shadow: var(--st-shadow-float);
- display: flex;
- align-items: center;
- justify-content: center;
- z-index: 210;
-}
-
-.weekly-page .st-float-inner {
- display: flex;
- align-items: center;
- gap: 16rpx;
- padding: 16rpx 16rpx 16rpx 28rpx;
- border-radius: 999rpx;
- background: rgba(255, 255, 255, 0.9);
- backdrop-filter: blur(20rpx);
- border: 1rpx solid rgba(0, 108, 73, 0.1);
- box-shadow: var(--st-shadow-float);
- transition: border-radius 0.22s ease, padding 0.22s ease, border-color 0.22s ease;
-}
-
-/* 聚焦/有内容时展开:底部对齐让输入框向上增高,圆角收敛为圆角矩形 */
-.weekly-page .st-float-inner.is-expanded {
- align-items: flex-end;
- border-radius: 32rpx;
- padding: 18rpx 16rpx 18rpx 32rpx;
- border-color: rgba(0, 108, 73, 0.28);
-}
-
-.weekly-page .st-float-icon {
- width: 64rpx;
- height: 64rpx;
- border-radius: 50%;
- background: rgba(0, 108, 73, 0.1);
- display: flex;
- align-items: center;
- justify-content: center;
- flex-shrink: 0;
-}
-
-.weekly-page .st-float-input {
- flex: 1;
- min-width: 0;
- width: 100%;
- min-height: 64rpx;
- max-height: 240rpx;
- font-size: 28rpx;
- line-height: 40rpx;
- color: var(--on-surface);
- background: transparent;
- padding: 12rpx 0;
- box-sizing: border-box;
- transition: min-height 0.2s ease;
-}
-
-/* 聚焦时输入框变大;内容超长时由 auto-height 继续向上增高,超过上限可滚动 */
-.weekly-page .st-float-inner.is-expanded .st-float-input {
- min-height: 104rpx;
-}
-
-.weekly-page .st-float-placeholder {
- color: rgba(60, 74, 66, 0.6);
- font-size: 26rpx;
- line-height: 40rpx;
- white-space: nowrap;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-
-.weekly-page .st-float-mic {
- width: 72rpx;
- height: 72rpx;
- border-radius: 50%;
- background: rgba(0, 108, 73, 0.1);
- display: flex;
- align-items: center;
- justify-content: center;
- flex-shrink: 0;
- transition: background 0.2s ease, transform 0.15s ease;
-}
-
-.weekly-page .st-float-mic.listening {
- background: var(--primary);
- animation: st-float-mic-pulse 1.2s ease-in-out infinite;
-}
-
-.weekly-page .st-float-mic.disabled {
- opacity: 0.45;
- pointer-events: none;
-}
-
-.weekly-page .st-float-mic:active {
- transform: scale(0.94);
-}
-
-.weekly-page .st-float-hold-hint {
- margin-top: 12rpx;
- text-align: center;
- font-size: 24rpx;
- color: var(--primary);
- line-height: 1.4;
-}
-
-.weekly-page .st-voice-overlay {
- position: fixed;
- left: 0;
- right: 0;
- top: 0;
- bottom: 0;
- z-index: 3000;
- display: flex;
- align-items: center;
- justify-content: center;
- background: rgba(0, 0, 0, 0.32);
- pointer-events: none;
-}
-
-.weekly-page .st-voice-card {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 20rpx;
- padding: 56rpx 64rpx;
- border-radius: 32rpx;
- background: rgba(20, 24, 22, 0.86);
- box-shadow: 0 16rpx 48rpx rgba(0, 0, 0, 0.35);
-}
-
-.weekly-page .st-voice-icon {
- width: 120rpx;
- height: 120rpx;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
- background: linear-gradient(180deg, #2d7340 0%, #006c49 100%);
-}
-
-.weekly-page .st-voice-icon.active {
- animation: st-voice-pulse 1.1s ease-in-out infinite;
-}
-
-@keyframes st-voice-pulse {
- 0%, 100% { box-shadow: 0 0 0 0 rgba(0, 108, 73, 0.45); }
- 50% { box-shadow: 0 0 0 20rpx rgba(0, 108, 73, 0); }
-}
-
-.weekly-page .st-voice-title {
- font-size: 32rpx;
- font-weight: 700;
- color: #ffffff;
- line-height: 1.3;
-}
-
-.weekly-page .st-voice-sub {
- font-size: 24rpx;
- color: rgba(255, 255, 255, 0.7);
- line-height: 1.3;
-}
-
-@keyframes st-float-mic-pulse {
- 0%, 100% { box-shadow: 0 0 0 0 rgba(0, 108, 73, 0.35); }
- 50% { box-shadow: 0 0 0 12rpx rgba(0, 108, 73, 0); }
-}
-
-.weekly-page .st-float-send {
- width: 80rpx;
- height: 80rpx;
- border-radius: 50%;
- background: var(--primary);
- display: flex;
- align-items: center;
- justify-content: center;
- flex-shrink: 0;
- box-shadow: 0 4rpx 12rpx rgba(0, 108, 73, 0.2);
- line-height: 0;
- overflow: hidden;
-}
-
-.weekly-page .st-float-send.disabled {
- opacity: 0.55;
-}
-
-.weekly-page .st-float-send:active {
- transform: scale(0.95);
-}
-
-.weekly-page .st-float-result {
- margin-top: 16rpx;
- padding: 24rpx 32rpx;
- border-radius: var(--st-radius-xl);
- background: rgba(255, 255, 255, 0.95);
- border: 1rpx solid var(--outline-variant);
- box-shadow: var(--st-shadow-ambient);
-}
-
-.weekly-page .st-float-badge {
- display: inline-block;
- margin-bottom: 8rpx;
- padding: 4rpx 12rpx;
- border-radius: 8rpx;
- font-size: 22rpx;
- font-weight: 700;
- color: var(--primary);
- background: rgba(0, 108, 73, 0.1);
-}
-
-.weekly-page .st-float-advice {
- font-size: 28rpx;
- line-height: 1.5;
- color: var(--on-surface-variant);
-}
-
-.weekly-page .ai-stream-cursor {
- animation: st-blink 0.8s step-end infinite;
-}
-
-@keyframes st-blink {
- 50% { opacity: 0; }
-}
-
-.weekly-page .chart-tip {
- position: absolute;
- z-index: 10;
- padding: 12rpx 16rpx;
- border-radius: 12rpx;
- background: rgba(22, 29, 25, 0.88);
- color: #fff;
- font-size: 22rpx;
- pointer-events: none;
-}
-
-.weekly-page .chart-tip-date {
- font-weight: 700;
- margin-bottom: 8rpx;
-}
-
-.weekly-page .chart-tip-row {
- display: flex;
- align-items: center;
- gap: 8rpx;
- margin-top: 4rpx;
-}
+/**
+ * weekly.vue — 与 code.html (Stitch Modern WeChat UI) 1:1
+ */
+
+.weekly-page {
+ --st-shadow-ambient: 0 24rpx 60rpx -20rpx rgba(0, 108, 73, 0.08), 0 8rpx 20rpx -8rpx rgba(0, 0, 0, 0.03);
+ --st-shadow-cta: 0 16rpx 32rpx rgba(0, 108, 73, 0.2);
+ --st-shadow-float: 0 16rpx 64rpx rgba(0, 108, 73, 0.15);
+ --tab-dock-full-offset: calc(220rpx + env(safe-area-inset-bottom));
+ padding-bottom: var(--tab-dock-full-offset);
+}
+
+/* ===== Header ===== */
+.weekly-page .st-header {
+ position: relative;
+ display: flex;
+ align-items: center;
+ padding-left: var(--st-container-margin);
+ padding-right: var(--st-container-margin);
+ padding-bottom: 32rpx;
+ /* padding-top / padding-right 由 initHeaderSafeArea 动态设置 */
+ background: var(--surface);
+}
+
+.weekly-page .st-header-text {
+ flex: 1;
+ min-width: 0;
+ overflow: hidden;
+}
+
+.weekly-page .st-header-left {
+ display: flex;
+ align-items: center;
+ gap: var(--st-inline-gap);
+ flex: 1;
+ min-width: 0;
+}
+
+.weekly-page .st-avatar {
+ width: 80rpx;
+ height: 80rpx;
+ border-radius: 50%;
+ background: var(--primary-container);
+ border: 4rpx solid var(--surface-container-lowest);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.weekly-page .st-greet {
+ display: block;
+ font-size: 40rpx;
+ font-weight: 700;
+ line-height: 1.27;
+ color: var(--on-surface);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.weekly-page .st-status {
+ display: block;
+ margin-top: 4rpx;
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+ opacity: 0.8;
+}
+
+.weekly-page .st-voice-round {
+ width: 80rpx;
+ height: 80rpx;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.weekly-page .st-voice-round.disabled {
+ opacity: 0.45;
+}
+
+.weekly-page .st-card-scroll {
+ margin: 0 var(--st-container-margin) 8rpx;
+ white-space: nowrap;
+}
+
+.weekly-page .st-card-row {
+ display: inline-flex;
+ gap: 16rpx;
+}
+
+.weekly-page .st-card-chip {
+ padding: 12rpx 28rpx;
+ border-radius: 999rpx;
+ font-size: 26rpx;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+ background: var(--surface-container-lowest);
+ border: 1rpx solid var(--outline-variant);
+}
+
+.weekly-page .st-card-chip.active {
+ background: var(--primary);
+ border-color: var(--primary);
+ color: var(--on-primary);
+}
+
+/* ===== 居家训练(DEV 内嵌) ===== */
+.weekly-page .st-training-section {
+ width: 100%;
+ box-sizing: border-box;
+}
+
+.weekly-page .st-training-section .dev-entry-inline--weekly {
+ overflow: hidden;
+}
+
+.weekly-page .st-training-section .inline-scroll {
+ margin-left: -4rpx;
+ margin-right: -4rpx;
+ width: calc(100% + 8rpx);
+}
+
+.weekly-page .st-training-section .inline-card:first-child {
+ border-color: rgba(0, 108, 73, 0.22);
+ background: linear-gradient(160deg, rgba(0, 108, 73, 0.08) 0%, #f4f7f5 55%);
+}
+
+/* ===== Main ===== */
+.weekly-page .st-main {
+ padding: 0 var(--st-container-margin) 32rpx;
+ display: flex;
+ flex-direction: column;
+ gap: 48rpx;
+ margin-top: 16rpx;
+}
+
+.weekly-page .st-daily-context-error {
+ padding: 24rpx 28rpx;
+ border-radius: 24rpx;
+ background: #fef2f2;
+ border: 1rpx solid rgba(220, 38, 38, 0.22);
+ box-sizing: border-box;
+}
+
+.weekly-page .st-daily-context-error-text {
+ font-size: 28rpx;
+ font-weight: 600;
+ color: #991b1b;
+ line-height: 1.5;
+}
+
+.weekly-page .st-main-spacer {
+ height: 32rpx;
+}
+
+/* CTA — rounded-2xl h-14 */
+.weekly-page .st-cta {
+ width: 100%;
+ height: 112rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 16rpx;
+ border-radius: var(--st-radius-2xl);
+ background: var(--primary);
+ color: var(--on-primary);
+ font-size: 32rpx;
+ font-weight: 700;
+ box-shadow: var(--st-shadow-cta);
+}
+
+.weekly-page .st-cta:active {
+ transform: scale(0.98);
+}
+
+/* 游戏入口 */
+.weekly-page .st-game-entry {
+
+ margin-top: 24rpx;
+ padding: 28rpx 32rpx;
+ display: flex;
+ align-items: center;
+ gap: 24rpx;
+ border-radius: var(--st-radius-2xl);
+ background: var(--surface-container-lowest);
+ border: 1rpx solid rgba(0, 108, 73, 0.14);
+ box-shadow: var(--st-shadow-ambient);
+ box-sizing: border-box;
+}
+
+.weekly-page .st-game-entry:active {
+ transform: scale(0.98);
+ opacity: 0.92;
+}
+
+.weekly-page .st-game-entry-icon {
+ width: 88rpx;
+ height: 88rpx;
+ border-radius: 24rpx;
+ background: rgba(0, 108, 73, 0.1);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.weekly-page .st-game-entry-body {
+ flex: 1;
+ min-width: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 6rpx;
+}
+
+.weekly-page .st-game-entry-title {
+ font-size: 32rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+ line-height: 1.25;
+}
+
+.weekly-page .st-game-entry-sub {
+ font-size: 24rpx;
+ font-weight: 500;
+ color: var(--on-surface-variant, #64748b);
+ line-height: 1.35;
+}
+
+/* ===== Chart card — rounded-3xl ===== */
+.weekly-page .st-chart-card {
+ padding: 40rpx 10rpx 40rpx 10rpx;
+ border-radius: 48rpx;
+ background: var(--surface-container-lowest);
+ border: 1rpx solid rgba(221, 228, 221, 0.3);
+ box-shadow: var(--st-shadow-ambient);
+ display: flex;
+ flex-direction: column;
+ gap: 0;
+ overflow: hidden;
+}
+
+.weekly-page .st-chart-head {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 12rpx;
+ gap: 16rpx;
+}
+
+.weekly-page .st-chart-title {
+ display: block;
+ font-size: 30rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+}
+
+.weekly-page .st-chart-sub {
+ display: block;
+ margin-top: 4rpx;
+ font-size: 22rpx;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .st-chart-more {
+ display: inline-flex;
+ align-items: center;
+ gap: 4rpx;
+ margin-top: 6rpx;
+}
+
+.weekly-page .st-chart-more-text {
+ font-size: 22rpx;
+ font-weight: 600;
+ color: var(--primary);
+}
+
+.weekly-page .st-chart-more:active {
+ opacity: 0.75;
+}
+
+.weekly-page .st-chart-legend {
+ display: flex;
+ gap: var(--st-inline-gap);
+}
+
+.weekly-page .st-legend-item {
+ display: flex;
+ align-items: center;
+ gap: 8rpx;
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .st-legend-item.inactive {
+ opacity: 0.4;
+}
+
+.weekly-page .st-dot {
+ width: 16rpx;
+ height: 16rpx;
+ border-radius: 50%;
+}
+
+.weekly-page .st-dot-fasting {
+ background: var(--primary);
+}
+
+.weekly-page .st-dot-post {
+ background: var(--tertiary);
+}
+
+.weekly-page .st-chart-summary {
+ display: flex;
+ padding: 32rpx;
+ margin-bottom: 48rpx;
+ border-radius: var(--st-radius-xl);
+ background: var(--surface-container-low);
+}
+
+.weekly-page .st-chart-summary-item {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ border-right: 1rpx solid var(--surface-container-highest);
+}
+
+.weekly-page .st-chart-summary-item:last-child {
+ border-right: none;
+}
+
+.weekly-page .st-chart-summary-num {
+ font-size: 40rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+}
+
+.weekly-page .st-chart-summary-num.is-high {
+ color: var(--tertiary);
+}
+
+.weekly-page .st-chart-summary-num.is-good {
+ color: var(--primary);
+}
+
+.weekly-page .st-chart-summary-label {
+ margin-top: 8rpx;
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .st-chart-foot {
+ padding: 20rpx 0 20rpx;
+}
+
+.weekly-page .st-chart-mock-hint {
+ display: block;
+ margin: 0;
+ font-size: 30rpx;
+ font-weight: 600;
+ color: var(--outline);
+ line-height: 1.35;
+ text-align: center;
+}
+
+.weekly-page .st-chart-area {
+ position: relative;
+ height: 360rpx;
+ overflow: hidden;
+ cursor: pointer;
+}
+
+.weekly-page .st-chart-area:active {
+ opacity: 0.92;
+}
+
+.weekly-page .st-chart-canvas {
+ width: 100%;
+ height: 360rpx;
+ display: block;
+}
+
+/* 识糖入口嵌在趋势卡内:轻量分隔,避免大块留白 */
+.weekly-page .st-chart-card .st-game-entry-list {
+ display: flex;
+ flex-direction: column;
+ gap: 12rpx;
+ margin: 12rpx 20rpx 0;
+}
+
+.weekly-page .st-chart-card .st-game-entry--in-card {
+ margin-top: 0;
+ padding: 16rpx 20rpx;
+ gap: 16rpx;
+ border-radius: 24rpx;
+ background: var(--surface-container-low);
+ border: 1rpx solid rgba(0, 108, 73, 0.08);
+ box-shadow: none;
+}
+
+.weekly-page .st-chart-card .st-game-entry--in-card .st-game-entry-icon {
+ width: 64rpx;
+ height: 64rpx;
+ border-radius: 16rpx;
+}
+
+.weekly-page .st-chart-card .st-game-entry--in-card .st-game-entry-title {
+ font-size: 28rpx;
+}
+
+.weekly-page .st-chart-card .st-game-entry--in-card .st-game-entry-sub {
+ font-size: 22rpx;
+}
+
+.weekly-page .st-chart-empty,
+.weekly-page .st-chart-placeholder {
+ position: absolute;
+ inset: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 26rpx;
+ color: var(--outline);
+}
+
+/* ===== 最新测量 ===== */
+.weekly-page .st-latest-section {
+ display: flex;
+ flex-direction: column;
+ gap: 32rpx;
+}
+
+.weekly-page .st-latest-hero {
+ position: relative;
+ overflow: hidden;
+ min-height: 320rpx;
+ padding: 48rpx 40rpx;
+ border-radius: 48rpx;
+ background: var(--surface-container-lowest);
+ box-shadow: var(--st-shadow-ambient);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+}
+
+.weekly-page .st-latest-hero.is-high {
+ background: var(--error-container);
+ color: var(--on-error-container);
+}
+
+.weekly-page .st-latest-hero-pattern {
+ position: absolute;
+ inset: 0;
+ opacity: 0.1;
+ background-image: radial-gradient(circle at 4rpx 4rpx, currentColor 2rpx, transparent 0);
+ background-size: 32rpx 32rpx;
+ pointer-events: none;
+}
+
+.weekly-page .st-latest-label {
+ position: relative;
+ z-index: 1;
+ font-size: 24rpx;
+ font-weight: 600;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ opacity: 0.9;
+ margin-bottom: 8rpx;
+}
+
+.weekly-page .st-latest-value-row {
+ position: relative;
+ z-index: 1;
+ display: flex;
+ align-items: baseline;
+ gap: 8rpx;
+}
+
+.weekly-page .st-latest-value {
+ font-size: 112rpx;
+ font-weight: 800;
+ line-height: 1;
+ letter-spacing: -0.02em;
+}
+
+.weekly-page .st-latest-hero.is-high .st-latest-value,
+.weekly-page .st-latest-hero.is-high .st-latest-unit {
+ color: var(--on-error-container);
+}
+
+.weekly-page .st-latest-unit {
+ font-size: 32rpx;
+ font-weight: 500;
+ opacity: 0.8;
+}
+
+.weekly-page .st-latest-flag {
+ position: relative;
+ z-index: 1;
+ margin-top: 24rpx;
+ display: inline-flex;
+ align-items: center;
+ gap: 12rpx;
+ padding: 8rpx 24rpx;
+ border-radius: 999rpx;
+ background: rgba(255, 255, 255, 0.3);
+ font-size: 24rpx;
+ font-weight: 700;
+}
+
+.weekly-page .st-summary-grid {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 24rpx;
+}
+
+.weekly-page .st-summary-card {
+ padding: 32rpx;
+ border-radius: var(--st-radius-2xl);
+ background: var(--surface-container-lowest);
+ border: 1rpx solid rgba(221, 228, 221, 0.5);
+ box-shadow: var(--st-shadow-ambient);
+ display: flex;
+ flex-direction: column;
+ gap: 8rpx;
+}
+
+.weekly-page .st-summary-label {
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .st-summary-value {
+ font-size: 48rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+}
+
+.weekly-page .st-summary-value.is-high {
+ color: var(--tertiary);
+}
+
+.weekly-page .st-summary-tag {
+ align-self: flex-start;
+ padding: 4rpx 16rpx;
+ border-radius: 8rpx;
+ font-size: 20rpx;
+ font-weight: 600;
+ color: var(--tertiary);
+ background: rgba(255, 218, 214, 0.5);
+}
+
+/* ===== AI 饮食 ===== */
+.weekly-page .st-ai-section {
+ position: relative;
+ overflow: hidden;
+ padding: 40rpx;
+ border-radius: 48rpx;
+ background: linear-gradient(135deg, rgba(0, 108, 73, 0.1) 0%, rgba(0, 108, 73, 0.05) 100%);
+ border: 1rpx solid rgba(0, 108, 73, 0.1);
+}
+
+.weekly-page .st-ai-deco {
+ position: absolute;
+ width: 256rpx;
+ height: 256rpx;
+ top: -64rpx;
+ right: -64rpx;
+ border-radius: 50%;
+ background: rgba(78, 222, 163, 0.2);
+ filter: blur(40rpx);
+ pointer-events: none;
+}
+
+.weekly-page .st-ai-head {
+ position: relative;
+ z-index: 1;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 16rpx;
+}
+
+.weekly-page .st-ai-head-left {
+ display: flex;
+ align-items: center;
+ gap: 16rpx;
+}
+
+.weekly-page .st-ai-icon {
+ width: 64rpx;
+ height: 64rpx;
+ border-radius: 50%;
+ background: var(--primary);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.weekly-page .st-ai-icon.thinking {
+ animation: st-pulse 1.2s ease-in-out infinite;
+}
+
+@keyframes st-pulse {
+ 50% { opacity: 0.65; }
+}
+
+.weekly-page .st-ai-title {
+ font-size: 40rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+}
+
+.weekly-page .st-ai-refresh {
+ display: flex;
+ align-items: center;
+ gap: 8rpx;
+ padding: 12rpx 24rpx;
+ border-radius: 999rpx;
+ background: rgba(255, 255, 255, 0.5);
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--primary);
+}
+
+.weekly-page .st-ai-refresh.disabled {
+ opacity: 0.5;
+}
+
+.weekly-page .st-ai-sub {
+ position: relative;
+ z-index: 1;
+ display: block;
+ margin-bottom: 32rpx;
+ font-size: 28rpx;
+ line-height: 1.43;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .st-meal-list {
+ position: relative;
+ z-index: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 24rpx;
+}
+
+.weekly-page .st-meal-glass {
+ padding: 32rpx;
+ border-radius: var(--st-radius-2xl);
+ background: rgba(255, 255, 255, 0.8);
+ border: 1rpx solid #ffffff;
+ box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.04);
+}
+
+.weekly-page .st-meal-glass--drinks {
+ background: rgba(224, 242, 254, 0.65);
+ border-color: rgba(14, 165, 233, 0.15);
+}
+
+.weekly-page .st-meal-head {
+ display: flex;
+ align-items: center;
+ gap: 16rpx;
+ margin-bottom: 16rpx;
+}
+
+.weekly-page .st-meal-label {
+ font-size: 28rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+}
+
+.weekly-page .st-meal-text {
+ font-size: 28rpx;
+ line-height: 1.43;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .st-skeleton-line {
+ height: 28rpx;
+ margin-bottom: 16rpx;
+ border-radius: 8rpx;
+ background: rgba(255, 255, 255, 0.5);
+}
+
+.weekly-page .st-skeleton-hint {
+ font-size: 26rpx;
+ color: var(--outline);
+ text-align: center;
+}
+
+/* ===== 底部浮动输入 ===== */
+.weekly-page .st-float-ask {
+ position: fixed;
+ left: var(--st-container-margin);
+ right: var(--st-container-margin);
+ bottom: var(--tab-dock-full-offset);
+ z-index: 210;
+}
+
+.weekly-page .st-float-close {
+ position: absolute;
+ top: -18rpx;
+ right: -6rpx;
+ width: 44rpx;
+ height: 44rpx;
+ border-radius: 50%;
+ background: rgba(0, 0, 0, 0.45);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 2;
+}
+
+.weekly-page .st-float-close-icon {
+ color: #ffffff;
+ font-size: 30rpx;
+ line-height: 1;
+}
+
+.weekly-page .st-float-reopen {
+ position: fixed;
+ right: var(--st-container-margin);
+ bottom: var(--tab-dock-full-offset);
+ width: 88rpx;
+ height: 88rpx;
+ border-radius: 50%;
+ background: linear-gradient(180deg, #2d7340 0%, #006c49 100%);
+ box-shadow: var(--st-shadow-float);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 210;
+}
+
+.weekly-page .st-float-inner {
+ display: flex;
+ align-items: center;
+ gap: 16rpx;
+ padding: 16rpx 16rpx 16rpx 28rpx;
+ border-radius: 999rpx;
+ background: rgba(255, 255, 255, 0.9);
+ backdrop-filter: blur(20rpx);
+ border: 1rpx solid rgba(0, 108, 73, 0.1);
+ box-shadow: var(--st-shadow-float);
+ transition: border-radius 0.22s ease, padding 0.22s ease, border-color 0.22s ease;
+}
+
+/* 聚焦/有内容时展开:底部对齐让输入框向上增高,圆角收敛为圆角矩形 */
+.weekly-page .st-float-inner.is-expanded {
+ align-items: flex-end;
+ border-radius: 32rpx;
+ padding: 18rpx 16rpx 18rpx 32rpx;
+ border-color: rgba(0, 108, 73, 0.28);
+}
+
+.weekly-page .st-float-icon {
+ width: 64rpx;
+ height: 64rpx;
+ border-radius: 50%;
+ background: rgba(0, 108, 73, 0.1);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.weekly-page .st-float-input {
+ flex: 1;
+ min-width: 0;
+ width: 100%;
+ min-height: 64rpx;
+ max-height: 240rpx;
+ font-size: 28rpx;
+ line-height: 40rpx;
+ color: var(--on-surface);
+ background: transparent;
+ padding: 12rpx 0;
+ box-sizing: border-box;
+ transition: min-height 0.2s ease;
+}
+
+/* 聚焦时输入框变大;内容超长时由 auto-height 继续向上增高,超过上限可滚动 */
+.weekly-page .st-float-inner.is-expanded .st-float-input {
+ min-height: 104rpx;
+}
+
+.weekly-page .st-float-placeholder {
+ color: rgba(60, 74, 66, 0.6);
+ font-size: 26rpx;
+ line-height: 40rpx;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.weekly-page .st-float-mic {
+ width: 72rpx;
+ height: 72rpx;
+ border-radius: 50%;
+ background: rgba(0, 108, 73, 0.1);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+ transition: background 0.2s ease, transform 0.15s ease;
+}
+
+.weekly-page .st-float-mic.listening {
+ background: var(--primary);
+ animation: st-float-mic-pulse 1.2s ease-in-out infinite;
+}
+
+.weekly-page .st-float-mic.disabled {
+ opacity: 0.45;
+ pointer-events: none;
+}
+
+.weekly-page .st-float-mic:active {
+ transform: scale(0.94);
+}
+
+.weekly-page .st-float-hold-hint {
+ margin-top: 12rpx;
+ text-align: center;
+ font-size: 24rpx;
+ color: var(--primary);
+ line-height: 1.4;
+}
+
+.weekly-page .st-voice-overlay {
+ position: fixed;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ z-index: 3000;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: rgba(0, 0, 0, 0.32);
+ pointer-events: none;
+}
+
+.weekly-page .st-voice-card {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 20rpx;
+ padding: 56rpx 64rpx;
+ border-radius: 32rpx;
+ background: rgba(20, 24, 22, 0.86);
+ box-shadow: 0 16rpx 48rpx rgba(0, 0, 0, 0.35);
+}
+
+.weekly-page .st-voice-icon {
+ width: 120rpx;
+ height: 120rpx;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: linear-gradient(180deg, #2d7340 0%, #006c49 100%);
+}
+
+.weekly-page .st-voice-icon.active {
+ animation: st-voice-pulse 1.1s ease-in-out infinite;
+}
+
+@keyframes st-voice-pulse {
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(0, 108, 73, 0.45); }
+ 50% { box-shadow: 0 0 0 20rpx rgba(0, 108, 73, 0); }
+}
+
+.weekly-page .st-voice-title {
+ font-size: 32rpx;
+ font-weight: 700;
+ color: #ffffff;
+ line-height: 1.3;
+}
+
+.weekly-page .st-voice-sub {
+ font-size: 24rpx;
+ color: rgba(255, 255, 255, 0.7);
+ line-height: 1.3;
+}
+
+@keyframes st-float-mic-pulse {
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(0, 108, 73, 0.35); }
+ 50% { box-shadow: 0 0 0 12rpx rgba(0, 108, 73, 0); }
+}
+
+.weekly-page .st-float-send {
+ width: 80rpx;
+ height: 80rpx;
+ border-radius: 50%;
+ background: var(--primary);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+ box-shadow: 0 4rpx 12rpx rgba(0, 108, 73, 0.2);
+ line-height: 0;
+ overflow: hidden;
+}
+
+.weekly-page .st-float-send.disabled {
+ opacity: 0.55;
+}
+
+.weekly-page .st-float-send:active {
+ transform: scale(0.95);
+}
+
+.weekly-page .st-float-result {
+ margin-top: 16rpx;
+ padding: 24rpx 32rpx;
+ border-radius: var(--st-radius-xl);
+ background: rgba(255, 255, 255, 0.95);
+ border: 1rpx solid var(--outline-variant);
+ box-shadow: var(--st-shadow-ambient);
+}
+
+.weekly-page .st-float-badge {
+ display: inline-block;
+ margin-bottom: 8rpx;
+ padding: 4rpx 12rpx;
+ border-radius: 8rpx;
+ font-size: 22rpx;
+ font-weight: 700;
+ color: var(--primary);
+ background: rgba(0, 108, 73, 0.1);
+}
+
+.weekly-page .st-float-advice {
+ font-size: 28rpx;
+ line-height: 1.5;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .ai-stream-cursor {
+ animation: st-blink 0.8s step-end infinite;
+}
+
+@keyframes st-blink {
+ 50% { opacity: 0; }
+}
+
+.weekly-page .chart-tip {
+ position: absolute;
+ z-index: 10;
+ padding: 12rpx 16rpx;
+ border-radius: 12rpx;
+ background: rgba(22, 29, 25, 0.88);
+ color: #fff;
+ font-size: 22rpx;
+ pointer-events: none;
+}
+
+.weekly-page .chart-tip-date {
+ font-weight: 700;
+ margin-bottom: 8rpx;
+}
+
+.weekly-page .chart-tip-row {
+ display: flex;
+ align-items: center;
+ gap: 8rpx;
+ margin-top: 4rpx;
+}
diff --git a/TUICallKit-Vue3/tongji/utils/tongjiHelpers.js b/TUICallKit-Vue3/tongji/utils/tongjiHelpers.js
index 11b63942a..31fc4753a 100644
--- a/TUICallKit-Vue3/tongji/utils/tongjiHelpers.js
+++ b/TUICallKit-Vue3/tongji/utils/tongjiHelpers.js
@@ -1,56 +1,56 @@
-/** 将接口 msg / 异常对象转为可展示的字符串,避免 [object Object] */
-export function formatUserMessage(msg, fallback = '') {
- if (msg == null || msg === '') return fallback
- if (typeof msg === 'string') return msg
- if (typeof msg === 'number' || typeof msg === 'boolean') return String(msg)
- if (Array.isArray(msg)) {
- const parts = msg.map((item) => {
- if (item == null) return ''
- if (typeof item === 'string') return item
- if (typeof item === 'number' || typeof item === 'boolean') return String(item)
- if (typeof item === 'object') {
- return item.msg || item.message || item.error || item.title || item.label || ''
- }
- return String(item)
- }).filter(Boolean)
- return parts.length ? parts.join(';') : fallback
- }
- if (typeof msg === 'object') {
- return msg.msg || msg.message || msg.error || msg.title || msg.label || fallback
- }
- return String(msg)
-}
-
-export function showUserToast(title, options = {}) {
- const text = formatUserMessage(title, '')
- if (!text) return
- uni.showToast({
- title: text,
- icon: options.icon || 'none',
- duration: options.duration
- })
-}
-
-export function formatDate(date) {
- const y = date.getFullYear()
- const m = String(date.getMonth() + 1).padStart(2, '0')
- const d = String(date.getDate()).padStart(2, '0')
- return `${y}-${m}-${d}`
-}
-
-export function parseDate(str) {
- if (!str) return new Date()
- const [y, m, d] = str.split('-').map(Number)
- return new Date(y, (m || 1) - 1, d || 1)
-}
-
-export function toNumber(v) {
- if (v === null || v === undefined || v === '') return null
- const n = Number(v)
- return Number.isFinite(n) && n !== 0 ? n : null
-}
-
-export function getWeekday(dateStr) {
- const w = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
- return w[parseDate(dateStr).getDay()]
-}
+/** 将接口 msg / 异常对象转为可展示的字符串,避免 [object Object] */
+export function formatUserMessage(msg, fallback = '') {
+ if (msg == null || msg === '') return fallback
+ if (typeof msg === 'string') return msg
+ if (typeof msg === 'number' || typeof msg === 'boolean') return String(msg)
+ if (Array.isArray(msg)) {
+ const parts = msg.map((item) => {
+ if (item == null) return ''
+ if (typeof item === 'string') return item
+ if (typeof item === 'number' || typeof item === 'boolean') return String(item)
+ if (typeof item === 'object') {
+ return item.msg || item.message || item.error || item.title || item.label || ''
+ }
+ return String(item)
+ }).filter(Boolean)
+ return parts.length ? parts.join(';') : fallback
+ }
+ if (typeof msg === 'object') {
+ return msg.msg || msg.message || msg.error || msg.title || msg.label || fallback
+ }
+ return String(msg)
+}
+
+export function showUserToast(title, options = {}) {
+ const text = formatUserMessage(title, '')
+ if (!text) return
+ uni.showToast({
+ title: text,
+ icon: options.icon || 'none',
+ duration: options.duration
+ })
+}
+
+export function formatDate(date) {
+ const y = date.getFullYear()
+ const m = String(date.getMonth() + 1).padStart(2, '0')
+ const d = String(date.getDate()).padStart(2, '0')
+ return `${y}-${m}-${d}`
+}
+
+export function parseDate(str) {
+ if (!str) return new Date()
+ const [y, m, d] = str.split('-').map(Number)
+ return new Date(y, (m || 1) - 1, d || 1)
+}
+
+export function toNumber(v) {
+ if (v === null || v === undefined || v === '') return null
+ const n = Number(v)
+ return Number.isFinite(n) && n !== 0 ? n : null
+}
+
+export function getWeekday(dateStr) {
+ const w = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
+ return w[parseDate(dateStr).getDay()]
+}
diff --git a/TongjiUniApp/.gitignore b/TongjiUniApp/.gitignore
new file mode 100644
index 000000000..cd55d9148
--- /dev/null
+++ b/TongjiUniApp/.gitignore
@@ -0,0 +1,8 @@
+node_modules/
+dist/
+unpackage/
+.DS_Store
+*.log
+.idea/
+.vscode/
+.hbuilderx/
diff --git a/TongjiUniApp/App.vue b/TongjiUniApp/App.vue
new file mode 100644
index 000000000..1222dedc1
--- /dev/null
+++ b/TongjiUniApp/App.vue
@@ -0,0 +1,78 @@
+
+
+
diff --git a/TongjiUniApp/README.md b/TongjiUniApp/README.md
new file mode 100644
index 000000000..d5287fd86
--- /dev/null
+++ b/TongjiUniApp/README.md
@@ -0,0 +1,33 @@
+# TongjiUniApp
+
+从 `TUICallKit-Vue3` 抽出的独立 uni-app,保留血糖管理与「我的」相关能力。
+
+## 包含功能
+
+| 模块 | 说明 |
+|------|------|
+| 血糖管理 | `tongji/pages/weekly`(首页) |
+| 日常护理 | `tongji/pages/more` |
+| 血糖记录 | `tongji/pages/index` |
+| 识糖小课堂 | `tongji/endless-game` |
+| 我的 | 个人资料、就诊卡 |
+| 居家耗糖训练 | `training` 分包(哑铃/脚蹬/瑜伽环/握力环/节拍器) |
+
+底部导航:血糖 · 我的(已去掉原首页/视频问诊)。
+
+## 开发
+
+```bash
+npm install
+npm run dev:mp-weixin # 微信小程序 → dist/dev/mp-weixin
+npm run build:mp-weixin
+npm run dev:h5
+```
+
+- API:`main.js` → `https://admin.zhenyangtang.com.cn/`
+- 微信语音插件 WechatSI 已配置(`manifest.json` / `pages.json`)
+- 微信小程序 appid 沿用原工程:`wx79b9a0bfbfe7cbcd`(可在 `manifest.json` 修改)
+
+## 说明
+
+未移植:视频问诊(TUICallKit)、医生站、订单支付等。就诊卡未登录时回跳血糖首页,由 App 静默 `mnpLogin` 完成鉴权。
diff --git a/TongjiUniApp/components/app-tab-bar/tab-bar-dock.vue b/TongjiUniApp/components/app-tab-bar/tab-bar-dock.vue
new file mode 100644
index 000000000..1eafb8b1b
--- /dev/null
+++ b/TongjiUniApp/components/app-tab-bar/tab-bar-dock.vue
@@ -0,0 +1,123 @@
+
+
+
+
+
+ 糖
+
+ 血糖
+
+
+
+
+ 我的
+
+
+
+
+
+
+
+
+
diff --git a/TongjiUniApp/components/dev-training-entry/index.vue b/TongjiUniApp/components/dev-training-entry/index.vue
new file mode 100644
index 000000000..22916f9e4
--- /dev/null
+++ b/TongjiUniApp/components/dev-training-entry/index.vue
@@ -0,0 +1,729 @@
+
+
+
+
+
+
+
+
+
+ 居家耗糖训练
+ 体验
+
+ 低强度动起来,帮助身体消耗糖分
+
+
+
+
+
+
+
+ 推荐
+
+
+ {{ item.title }}
+ {{ item.sub }}
+ 进入
+
+
+
+
+ 左右滑动,选择适合您的训练
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TongjiUniApp/index.html b/TongjiUniApp/index.html
new file mode 100644
index 000000000..d6df0d522
--- /dev/null
+++ b/TongjiUniApp/index.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TongjiUniApp/main.js b/TongjiUniApp/main.js
new file mode 100644
index 000000000..a3baa55dd
--- /dev/null
+++ b/TongjiUniApp/main.js
@@ -0,0 +1,150 @@
+import App from './App'
+
+var baseUrl = 'https://admin.zhenyangtang.com.cn/'
+
+function joinApiUrl(base, path) {
+ const b = String(base || '').replace(/\/+$/, '')
+ const p = String(path || '').replace(/^\/+/, '')
+ return p ? `${b}/${p}` : b
+}
+
+// #ifndef VUE3
+import Vue from 'vue'
+import './uni.promisify.adaptor'
+
+Vue.config.productionTip = false
+Vue.prototype.$url = baseUrl
+Vue.prototype.apiUrl = function apiurl(promise, Loading = true) {
+ let token = uni.getStorageSync('token')
+ promise.header = {
+ token: token,
+ 'content-type': 'application/x-www-form-urlencoded',
+ }
+ let header = {}
+ if (promise.header) {
+ header = promise.header
+ }
+ let data = {}
+ if (promise.data) {
+ data = promise.data
+ }
+ let url = joinApiUrl(Vue.prototype.$url, promise.url)
+
+ return new Promise(function (resolve, reject) {
+ uni.request({
+ url: url,
+ data: data,
+ timeout: promise.timeout != null ? promise.timeout : 15000,
+ method: promise.method ? promise.method : 'POST',
+ header: header,
+ sslVerify: false,
+ success: (res) => {
+ const data = res.data
+ resolve(data)
+ },
+ fail(e) {
+ reject(e)
+ },
+ complete(e) {},
+ })
+ })
+}
+App.mpType = 'app'
+const app = new Vue({
+ ...App,
+})
+app.$mount()
+// #endif
+
+// #ifdef VUE3
+import { createSSRApp } from 'vue'
+
+function apiUrl(promise, Loading = true) {
+ const token = uni.getStorageSync('token')
+
+ const header = {
+ token: token,
+ 'content-type': 'application/x-www-form-urlencoded',
+ ...(promise.header || {}),
+ }
+
+ const data = promise.data || {}
+ const url = joinApiUrl(baseUrl, promise.url || '')
+
+ return new Promise((resolve, reject) => {
+ if (Loading) {
+ uni.showLoading({ title: '加载中...', mask: true })
+ }
+
+ uni.request({
+ url: url,
+ data: data,
+ timeout: promise.timeout != null ? promise.timeout : 15000,
+ method: promise.method || 'POST',
+ header: header,
+ sslVerify: false,
+ success: (res) => {
+ const data = res.data
+
+ if (data.code === -1) {
+ uni.removeStorageSync('token')
+ }
+
+ resolve(data)
+ },
+ fail: (e) => {
+ reject(e)
+ },
+ complete: (e) => {
+ if (Loading) {
+ uni.hideLoading()
+ }
+ },
+ })
+ })
+}
+
+/**
+ * 解析页面参数(支持普通参数和扫码 scene 参数)
+ * @param {Object} options - 页面 options
+ * @returns {Object} 解析后的参数对象
+ */
+function parsePageParams(options) {
+ const params = {}
+ if (!options) return params
+
+ if (options.scene) {
+ try {
+ const decodedScene = decodeURIComponent(options.scene)
+ decodedScene.split('&').forEach((item) => {
+ const [key, value] = item.split('=')
+ if (key && value) {
+ params[key] = value
+ }
+ })
+ } catch (error) {
+ console.error('解析scene参数失败:', error)
+ }
+ }
+
+ Object.keys(options).forEach((key) => {
+ if (key !== 'scene' && options[key]) {
+ params[key] = options[key]
+ }
+ })
+
+ return params
+}
+
+export function createApp() {
+ const app = createSSRApp(App)
+
+ app.config.globalProperties.$url = baseUrl
+ app.config.globalProperties.apiUrl = apiUrl
+ app.config.globalProperties.$parsePageParams = parsePageParams
+
+ return {
+ app,
+ }
+}
+// #endif
diff --git a/TongjiUniApp/manifest.json b/TongjiUniApp/manifest.json
new file mode 100644
index 000000000..23b67939d
--- /dev/null
+++ b/TongjiUniApp/manifest.json
@@ -0,0 +1,68 @@
+{
+ "name" : "tongji-uniapp",
+ "appid" : "__UNI__TONGJI01",
+ "description" : "血糖管理 / 日常护理",
+ "versionName" : "1.0.0",
+ "versionCode" : "100",
+ "transformPx" : false,
+ "app-plus" : {
+ "usingComponents" : true,
+ "nvueStyleCompiler" : "uni-app",
+ "compilerVersion" : 3,
+ "splashscreen" : {
+ "alwaysShowBeforeRender" : true,
+ "waiting" : true,
+ "autoclose" : true,
+ "delay" : 0
+ },
+ "modules" : {},
+ "distribute" : {
+ "android" : {
+ "permissions" : [
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ "ios" : {},
+ "sdkConfigs" : {}
+ }
+ },
+ "quickapp" : {},
+ "mp-weixin" : {
+ "appid" : "wx79b9a0bfbfe7cbcd",
+ "lazyCodeLoading" : "requiredComponents",
+ "setting" : {
+ "urlCheck" : false,
+ "minified" : true
+ },
+ "optimization" : {
+ "subPackages" : true
+ },
+ "usingComponents" : true,
+ "requiredBackgroundModes" : [ "audio" ],
+ "plugins" : {
+ "WechatSI" : {
+ "version" : "0.3.5",
+ "provider" : "wx069ba97219f66d99"
+ }
+ }
+ },
+ "mp-alipay" : {
+ "usingComponents" : true
+ },
+ "mp-baidu" : {
+ "usingComponents" : true
+ },
+ "mp-toutiao" : {
+ "usingComponents" : true
+ },
+ "uniStatistics" : {
+ "enable" : false
+ },
+ "vueVersion" : "3"
+}
diff --git a/TongjiUniApp/package-lock.json b/TongjiUniApp/package-lock.json
new file mode 100644
index 000000000..df754b5db
--- /dev/null
+++ b/TongjiUniApp/package-lock.json
@@ -0,0 +1,12196 @@
+{
+ "name": "tongji-uniapp",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "tongji-uniapp",
+ "version": "1.0.0",
+ "license": "ISC",
+ "dependencies": {
+ "@dcloudio/uni-app": "3.0.0-4060620250520001",
+ "@dcloudio/uni-app-harmony": "3.0.0-4060620250520001",
+ "@dcloudio/uni-app-plus": "3.0.0-4060620250520001",
+ "@dcloudio/uni-components": "3.0.0-4060620250520001",
+ "@dcloudio/uni-h5": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-alipay": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-baidu": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-jd": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-kuaishou": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-lark": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-qq": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-toutiao": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-weixin": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-xhs": "3.0.0-4060620250520001",
+ "@dcloudio/uni-quickapp-webview": "3.0.0-4060620250520001",
+ "vue": "^3.4.21"
+ },
+ "devDependencies": {
+ "@dcloudio/types": "^3.4.8",
+ "@dcloudio/uni-automator": "3.0.0-4060620250520001",
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-stacktracey": "3.0.0-4060620250520001",
+ "@dcloudio/vite-plugin-uni": "3.0.0-4060620250520001",
+ "@types/node": "^20.11.0",
+ "@vue/runtime-core": "^3.4.21",
+ "cross-env": "^7.0.3",
+ "less": "^4.6.4",
+ "sass": "^1.77.8",
+ "typescript": "^5.4.0",
+ "vite": "^5.2.8"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
+ "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz",
+ "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz",
+ "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/generator": "^7.29.7",
+ "@babel/helper-compilation-targets": "^7.29.7",
+ "@babel/helper-module-transforms": "^7.29.7",
+ "@babel/helpers": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/template": "^7.29.7",
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz",
+ "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.8",
+ "@babel/types": "^7.29.8",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz",
+ "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz",
+ "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.29.7",
+ "@babel/helper-validator-option": "^7.29.7",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz",
+ "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "@babel/helper-member-expression-to-functions": "^7.29.7",
+ "@babel/helper-optimise-call-expression": "^7.29.7",
+ "@babel/helper-replace-supers": "^7.29.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7",
+ "@babel/traverse": "^7.29.7",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz",
+ "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "regexpu-core": "^6.3.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.6.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz",
+ "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "debug": "^4.4.3",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.22.11"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz",
+ "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz",
+ "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz",
+ "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz",
+ "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz",
+ "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz",
+ "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz",
+ "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "@babel/helper-wrap-function": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz",
+ "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.29.7",
+ "@babel/helper-optimise-call-expression": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz",
+ "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
+ "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz",
+ "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz",
+ "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.29.7",
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz",
+ "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz",
+ "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.8"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz",
+ "integrity": "sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz",
+ "integrity": "sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz",
+ "integrity": "sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz",
+ "integrity": "sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz",
+ "integrity": "sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7",
+ "@babel/plugin-transform-optional-chaining": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz",
+ "integrity": "sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-bigint": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz",
+ "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz",
+ "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz",
+ "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz",
+ "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz",
+ "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz",
+ "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-remap-async-to-generator": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz",
+ "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-remap-async-to-generator": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz",
+ "integrity": "sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz",
+ "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz",
+ "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz",
+ "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz",
+ "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "@babel/helper-compilation-targets": "^7.29.7",
+ "@babel/helper-globals": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-replace-supers": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz",
+ "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/template": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz",
+ "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz",
+ "integrity": "sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz",
+ "integrity": "sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz",
+ "integrity": "sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz",
+ "integrity": "sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-explicit-resource-management": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz",
+ "integrity": "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/plugin-transform-destructuring": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz",
+ "integrity": "sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz",
+ "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz",
+ "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz",
+ "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz",
+ "integrity": "sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz",
+ "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz",
+ "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz",
+ "integrity": "sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz",
+ "integrity": "sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz",
+ "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.8.tgz",
+ "integrity": "sha512-6iSnEK0zlkLKU4heofK/AdmRD4e2SHVpJMtrwnTCzhnaM98ria4rTrOXBBi45BTTYnJtO8txnPsX4fChYXkmeA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "@babel/traverse": "^7.29.8"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz",
+ "integrity": "sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz",
+ "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz",
+ "integrity": "sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz",
+ "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz",
+ "integrity": "sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz",
+ "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/plugin-transform-destructuring": "^7.29.7",
+ "@babel/plugin-transform-parameters": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz",
+ "integrity": "sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-replace-supers": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz",
+ "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz",
+ "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz",
+ "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz",
+ "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz",
+ "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "@babel/helper-create-class-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz",
+ "integrity": "sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.8.tgz",
+ "integrity": "sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regexp-modifiers": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz",
+ "integrity": "sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz",
+ "integrity": "sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz",
+ "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.8.tgz",
+ "integrity": "sha512-4S9ksMGVWUshvgK0mKfvZky7leuG5/uoFVwMpAomJ8bMoDJiNHRVmc1EglwW/CmGVSqqWpEbXm9FmbRit22qoA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz",
+ "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz",
+ "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz",
+ "integrity": "sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz",
+ "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.29.7",
+ "@babel/helper-create-class-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7",
+ "@babel/plugin-syntax-typescript": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz",
+ "integrity": "sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz",
+ "integrity": "sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz",
+ "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz",
+ "integrity": "sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.7.tgz",
+ "integrity": "sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.29.7",
+ "@babel/helper-compilation-targets": "^7.29.7",
+ "@babel/helper-plugin-utils": "^7.29.7",
+ "@babel/helper-validator-option": "^7.29.7",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.29.7",
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.29.7",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.29.7",
+ "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.7",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.29.7",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.29.7",
+ "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+ "@babel/plugin-syntax-import-assertions": "^7.29.7",
+ "@babel/plugin-syntax-import-attributes": "^7.29.7",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.29.7",
+ "@babel/plugin-transform-async-generator-functions": "^7.29.7",
+ "@babel/plugin-transform-async-to-generator": "^7.29.7",
+ "@babel/plugin-transform-block-scoped-functions": "^7.29.7",
+ "@babel/plugin-transform-block-scoping": "^7.29.7",
+ "@babel/plugin-transform-class-properties": "^7.29.7",
+ "@babel/plugin-transform-class-static-block": "^7.29.7",
+ "@babel/plugin-transform-classes": "^7.29.7",
+ "@babel/plugin-transform-computed-properties": "^7.29.7",
+ "@babel/plugin-transform-destructuring": "^7.29.7",
+ "@babel/plugin-transform-dotall-regex": "^7.29.7",
+ "@babel/plugin-transform-duplicate-keys": "^7.29.7",
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.7",
+ "@babel/plugin-transform-dynamic-import": "^7.29.7",
+ "@babel/plugin-transform-explicit-resource-management": "^7.29.7",
+ "@babel/plugin-transform-exponentiation-operator": "^7.29.7",
+ "@babel/plugin-transform-export-namespace-from": "^7.29.7",
+ "@babel/plugin-transform-for-of": "^7.29.7",
+ "@babel/plugin-transform-function-name": "^7.29.7",
+ "@babel/plugin-transform-json-strings": "^7.29.7",
+ "@babel/plugin-transform-literals": "^7.29.7",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.29.7",
+ "@babel/plugin-transform-member-expression-literals": "^7.29.7",
+ "@babel/plugin-transform-modules-amd": "^7.29.7",
+ "@babel/plugin-transform-modules-commonjs": "^7.29.7",
+ "@babel/plugin-transform-modules-systemjs": "^7.29.7",
+ "@babel/plugin-transform-modules-umd": "^7.29.7",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.7",
+ "@babel/plugin-transform-new-target": "^7.29.7",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.29.7",
+ "@babel/plugin-transform-numeric-separator": "^7.29.7",
+ "@babel/plugin-transform-object-rest-spread": "^7.29.7",
+ "@babel/plugin-transform-object-super": "^7.29.7",
+ "@babel/plugin-transform-optional-catch-binding": "^7.29.7",
+ "@babel/plugin-transform-optional-chaining": "^7.29.7",
+ "@babel/plugin-transform-parameters": "^7.29.7",
+ "@babel/plugin-transform-private-methods": "^7.29.7",
+ "@babel/plugin-transform-private-property-in-object": "^7.29.7",
+ "@babel/plugin-transform-property-literals": "^7.29.7",
+ "@babel/plugin-transform-regenerator": "^7.29.7",
+ "@babel/plugin-transform-regexp-modifiers": "^7.29.7",
+ "@babel/plugin-transform-reserved-words": "^7.29.7",
+ "@babel/plugin-transform-shorthand-properties": "^7.29.7",
+ "@babel/plugin-transform-spread": "^7.29.7",
+ "@babel/plugin-transform-sticky-regex": "^7.29.7",
+ "@babel/plugin-transform-template-literals": "^7.29.7",
+ "@babel/plugin-transform-typeof-symbol": "^7.29.7",
+ "@babel/plugin-transform-unicode-escapes": "^7.29.7",
+ "@babel/plugin-transform-unicode-property-regex": "^7.29.7",
+ "@babel/plugin-transform-unicode-regex": "^7.29.7",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.29.7",
+ "@babel/preset-modules": "0.1.6-no-external-plugins",
+ "babel-plugin-polyfill-corejs2": "^0.4.15",
+ "babel-plugin-polyfill-corejs3": "^0.14.0",
+ "babel-plugin-polyfill-regenerator": "^0.6.6",
+ "core-js-compat": "^3.48.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.6-no-external-plugins",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+ "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz",
+ "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz",
+ "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz",
+ "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/generator": "^7.29.8",
+ "@babel/helper-globals": "^7.29.7",
+ "@babel/parser": "^7.29.8",
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.8",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@dcloudio/types": {
+ "version": "3.4.32",
+ "resolved": "https://registry.npmjs.org/@dcloudio/types/-/types-3.4.32.tgz",
+ "integrity": "sha512-sjhbkjUKxoym8KLEnyeXxCsxvRlBc7Bd/kNSZZRLj+lewS384bDPtq/x5FZ4iG+NrnzDmg3+HyiwV5u5vu2reQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@dcloudio/uni-app": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-app/-/uni-app-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-lF9bNbAyeGNP0uAgpcdby5+Wbf4gdvjtW2J/DIWe5E0zoFfTDJkyiE3Zg90i3uF7aZ4unw/hwBdlGLZ6xuQIAg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cloud": "3.0.0-4060620250520001",
+ "@dcloudio/uni-components": "3.0.0-4060620250520001",
+ "@dcloudio/uni-console": "3.0.0-4060620250520001",
+ "@dcloudio/uni-i18n": "3.0.0-4060620250520001",
+ "@dcloudio/uni-push": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-stat": "3.0.0-4060620250520001",
+ "@vue/shared": "3.4.21"
+ },
+ "peerDependencies": {
+ "@dcloudio/types": "^3.4.14"
+ }
+ },
+ "node_modules/@dcloudio/uni-app-harmony": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-app-harmony/-/uni-app-harmony-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-5RIgJ+f4U/+5C+0LW4vB3z0DaIurUnRrocV4KVsJ1Hy67GFIp2sjQ5telPXgCYow0d3hregYMKP6iSxinXeloA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-app-uts": "3.0.0-4060620250520001",
+ "@dcloudio/uni-app-vite": "3.0.0-4060620250520001",
+ "debug": "^4.3.3",
+ "fs-extra": "^10.0.0",
+ "licia": "^1.29.0",
+ "postcss-selector-parser": "^6.0.6"
+ }
+ },
+ "node_modules/@dcloudio/uni-app-plus": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-app-plus/-/uni-app-plus-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-dvPgDWXUyh9DLb7q9hPCFzFEb3Nc26V5E3xNeAELwsOdAltzsrrz4ecPBYaOqoUREZ4PNmcNuS/I+AuNW+HvVA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-app-uts": "3.0.0-4060620250520001",
+ "@dcloudio/uni-app-vite": "3.0.0-4060620250520001",
+ "@dcloudio/uni-app-vue": "3.0.0-4060620250520001",
+ "debug": "^4.3.3",
+ "fs-extra": "^10.0.0",
+ "licia": "^1.29.0",
+ "postcss-selector-parser": "^6.0.6"
+ }
+ },
+ "node_modules/@dcloudio/uni-app-uts": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-app-uts/-/uni-app-uts-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-kq1JhhBmtmdfqmkeOCj3jhOwIv3J20gqXbMexoc1B998k42Byt4XQ68x/fITeZ6JGUw/ev99eFexyECI4Y1Nuw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/parser": "^7.23.9",
+ "@babel/types": "^7.20.7",
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-console": "3.0.0-4060620250520001",
+ "@dcloudio/uni-i18n": "3.0.0-4060620250520001",
+ "@dcloudio/uni-nvue-styler": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@jridgewell/gen-mapping": "^0.3.3",
+ "@jridgewell/trace-mapping": "^0.3.19",
+ "@rollup/pluginutils": "^5.0.5",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/compiler-sfc": "3.4.21",
+ "@vue/consolidate": "^1.0.0",
+ "@vue/shared": "3.4.21",
+ "debug": "^4.3.3",
+ "es-module-lexer": "^1.2.1",
+ "estree-walker": "^2.0.2",
+ "fs-extra": "^10.0.0",
+ "magic-string": "^0.30.7",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2",
+ "unimport": "4.1.1"
+ }
+ },
+ "node_modules/@dcloudio/uni-app-vite": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-app-vite/-/uni-app-vite-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-Aid9y2L330X0r7v3IwlJFLTrlESNEqgkwxzyuTZqN6Zlhb1ETgHuliV0Bl1/Pq4GPnt3OEgFg2H2BcqAYekNGQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-i18n": "3.0.0-4060620250520001",
+ "@dcloudio/uni-nvue-styler": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@rollup/pluginutils": "^5.0.5",
+ "@vitejs/plugin-vue": "5.1.0",
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/compiler-sfc": "3.4.21",
+ "debug": "^4.3.3",
+ "fs-extra": "^10.0.0",
+ "picocolors": "^1.0.0"
+ }
+ },
+ "node_modules/@dcloudio/uni-app-vue": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-app-vue/-/uni-app-vue-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-eBr1gZlpyzW6jv2mMvrU9eTfibfWJu7cSU8P6k8OoKRt9bIRrQxELNsDGsORQFaWkrNcuarhAXuKxxvnV9bVCA==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@dcloudio/uni-automator": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-automator/-/uni-automator-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-ImOT4lXHyTPUVNs4jIweB1ORtcIsWVPcO0/Yr9jh1Qwfy17D4yC26+R8cx+kDdowYutTV1hA3IqKk/g/NS2x+Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "address": "^1.1.2",
+ "cross-env": "^7.0.3",
+ "debug": "^4.3.3",
+ "default-gateway": "^6.0.3",
+ "fs-extra": "^10.0.0",
+ "jsonc-parser": "^3.2.0",
+ "licia": "^1.29.0",
+ "merge": "^2.1.1",
+ "qrcode-reader": "^1.0.4",
+ "qrcode-terminal": "^0.12.0",
+ "ws": "^8.4.2"
+ },
+ "peerDependencies": {
+ "jest": "27.0.4",
+ "jest-environment-node": "27.5.1"
+ }
+ },
+ "node_modules/@dcloudio/uni-cli-shared": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-cli-shared/-/uni-cli-shared-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-6OhYL/3xDq2vqqfD6jka8yfNPEjTFcr6qZ1HQvN6YZbM1+AJrgPZkCyhh3w4ypC911lSMVWeWqunIigLLobXAw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@ampproject/remapping": "^2.1.2",
+ "@babel/code-frame": "^7.23.5",
+ "@babel/core": "^7.23.3",
+ "@babel/parser": "^7.23.9",
+ "@babel/types": "^7.20.7",
+ "@dcloudio/uni-i18n": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@intlify/core-base": "9.1.9",
+ "@intlify/shared": "9.1.9",
+ "@intlify/vue-devtools": "9.1.9",
+ "@rollup/pluginutils": "^5.0.5",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/compiler-sfc": "3.4.21",
+ "@vue/compiler-ssr": "3.4.21",
+ "@vue/server-renderer": "3.4.21",
+ "@vue/shared": "3.4.21",
+ "adm-zip": "^0.5.12",
+ "autoprefixer": "^10.4.19",
+ "base64url": "^3.0.1",
+ "chokidar": "^3.5.3",
+ "compare-versions": "^3.6.0",
+ "debug": "^4.3.3",
+ "es-module-lexer": "^1.2.1",
+ "esbuild": "^0.20.1",
+ "estree-walker": "^2.0.2",
+ "fast-glob": "^3.2.11",
+ "fs-extra": "^10.0.0",
+ "hash-sum": "^2.0.0",
+ "isbinaryfile": "^5.0.2",
+ "jsonc-parser": "^3.2.0",
+ "lines-and-columns": "^2.0.4",
+ "magic-string": "^0.30.7",
+ "merge": "^2.1.1",
+ "mime": "^3.0.0",
+ "module-alias": "^2.2.2",
+ "os-locale-s-fix": "^1.0.8-fix-1",
+ "picocolors": "^1.0.0",
+ "postcss-import": "^14.0.2",
+ "postcss-load-config": "^3.1.1",
+ "postcss-modules": "^4.3.0",
+ "postcss-selector-parser": "^6.0.6",
+ "resolve": "^1.22.1",
+ "source-map-js": "^1.0.2",
+ "tapable": "^2.2.0",
+ "unimport": "4.1.1",
+ "unplugin-auto-import": "19.1.0",
+ "xregexp": "3.1.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@dcloudio/uni-cli-shared/node_modules/unplugin-auto-import": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-19.1.0.tgz",
+ "integrity": "sha512-B+TGBEBHqY9aR+7YfShfLujETOHstzpV+yaqgy5PkfV0QG7Py+TYMX7vJ9W4SrysHR+UzR+gzcx/nuZjmPeclA==",
+ "license": "MIT",
+ "dependencies": {
+ "local-pkg": "^1.0.0",
+ "magic-string": "^0.30.17",
+ "picomatch": "^4.0.2",
+ "unimport": "^4.1.1",
+ "unplugin": "^2.2.0",
+ "unplugin-utils": "^0.2.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@nuxt/kit": "^3.2.2",
+ "@vueuse/core": "*"
+ },
+ "peerDependenciesMeta": {
+ "@nuxt/kit": {
+ "optional": true
+ },
+ "@vueuse/core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@dcloudio/uni-cloud": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-cloud/-/uni-cloud-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-M/OCsqNwWkj0xjKqECGHy2w/Veo4E52TZJifov+7dOahRvEKuZe2S5gstI7YlfQuNl17B1MsckyUVwdoqthsiw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-i18n": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@vue/shared": "3.4.21",
+ "fast-glob": "^3.2.11"
+ }
+ },
+ "node_modules/@dcloudio/uni-components": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-components/-/uni-components-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-kRIGLVaTvkoUFgljtxyTbSRgin7l0TVc9biZTViLRFL8W1DbK7/Nxy4XAOgUwPC807c/bKAf/JUfljlCcMwwQg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cloud": "3.0.0-4060620250520001",
+ "@dcloudio/uni-h5": "3.0.0-4060620250520001",
+ "@dcloudio/uni-i18n": "3.0.0-4060620250520001"
+ }
+ },
+ "node_modules/@dcloudio/uni-console": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-console/-/uni-console-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-KdEj12xYogeGKBxrTh/9HKUsTOe3+nzK1mszT7abkeEZ0iLFEVewhQjxqpD7AzLeGL4wem648sVc+lEbLz75vw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "fs-extra": "^10.0.0"
+ }
+ },
+ "node_modules/@dcloudio/uni-h5": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-h5/-/uni-h5-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-lfjD85Pj0rLnsPJQKP6T+iy3H1gW/PWwcRU8b/K6lfE0CL74P9DdgZp9VsFRyaTvH1uvwg+PeUElj6iFsI9cSQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-h5-vite": "3.0.0-4060620250520001",
+ "@dcloudio/uni-h5-vue": "3.0.0-4060620250520001",
+ "@dcloudio/uni-i18n": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@vue/server-renderer": "3.4.21",
+ "@vue/shared": "3.4.21",
+ "debug": "^4.3.3",
+ "localstorage-polyfill": "^1.0.1",
+ "postcss-selector-parser": "^6.0.6",
+ "safe-area-insets": "^1.4.1",
+ "vue-router": "^4.3.0",
+ "xmlhttprequest": "^1.8.0"
+ }
+ },
+ "node_modules/@dcloudio/uni-h5-vite": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-h5-vite/-/uni-h5-vite-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-sLHfMkEfUMJTZXZedr2/FGuz+M84teDnt1BrdZjGE1tiC+1qPHa49Bg8oxeuR0MLWLAuWq33cW4b2149/ZBW7Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@rollup/pluginutils": "^5.0.5",
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/compiler-sfc": "3.4.21",
+ "@vue/server-renderer": "3.4.21",
+ "@vue/shared": "3.4.21",
+ "debug": "^4.3.3",
+ "fs-extra": "^10.0.0",
+ "mime": "^3.0.0",
+ "module-alias": "^2.2.2"
+ }
+ },
+ "node_modules/@dcloudio/uni-h5-vue": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-h5-vue/-/uni-h5-vue-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-5il9s6XMxSmi1ZT6xBqKr6D7Si71rxxRC50WxMyr/a59rgpLVcvqonX6BMPwAxxgYKrGU6HIUifJs0UnD64JNQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@vue/server-renderer": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-h5/node_modules/@vue/compiler-core": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.41.tgz",
+ "integrity": "sha512-q0Xtv/F9w2YO/7htQhtiL+Ev2WCJbe5N2hc+XfgyKkEKqWpSxknmT8QOuGdEKNdjPq0c3F7rNpFkTo3Kfrm7pg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/parser": "^7.29.8",
+ "@vue/shared": "3.5.41",
+ "entities": "^7.0.1",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@dcloudio/uni-h5/node_modules/@vue/compiler-core/node_modules/@vue/shared": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.41.tgz",
+ "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@dcloudio/uni-h5/node_modules/@vue/compiler-dom": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.41.tgz",
+ "integrity": "sha512-oKacVfNglLvGjnS6BXOlGL7EyG2h8X03pqXCjzotRZUaXGjbrTJUnVAQjrCqUnS+lyu31nwQjZY/d817GmCnfw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vue/compiler-core": "3.5.41",
+ "@vue/shared": "3.5.41"
+ }
+ },
+ "node_modules/@dcloudio/uni-h5/node_modules/@vue/compiler-dom/node_modules/@vue/shared": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.41.tgz",
+ "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@dcloudio/uni-h5/node_modules/@vue/compiler-sfc": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.41.tgz",
+ "integrity": "sha512-XJhip7R2wy6vX3knCxdZN4KracFaZUef58s1KYewqluedHIJaPIVfXoYT7MF1F8nCvv6k8bWWxDC8opMkg1VTQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/parser": "^7.29.8",
+ "@vue/compiler-core": "3.5.41",
+ "@vue/compiler-dom": "3.5.41",
+ "@vue/compiler-ssr": "3.5.41",
+ "@vue/shared": "3.5.41",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.21",
+ "postcss": "^8.5.19",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@dcloudio/uni-h5/node_modules/@vue/compiler-sfc/node_modules/@vue/shared": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.41.tgz",
+ "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@dcloudio/uni-h5/node_modules/@vue/compiler-ssr": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.41.tgz",
+ "integrity": "sha512-U3v5OejKEGqOI0Wy0+Sz7hGuIFZHA4LSXzrNM3IMIeDyJEBBfTpX26n3SDgToRpP2bLc9FfI2j/kSgcJ8Emq5A==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.41",
+ "@vue/shared": "3.5.41"
+ }
+ },
+ "node_modules/@dcloudio/uni-h5/node_modules/@vue/compiler-ssr/node_modules/@vue/shared": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.41.tgz",
+ "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@dcloudio/uni-h5/node_modules/@vue/runtime-dom": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.41.tgz",
+ "integrity": "sha512-3vVBahVBS9+U6cmXBLyb8nE6/yYo4J/CGI9eVFs3KiMc0YHuudwKyShTD65jtJy/L9PUUxNAFu4cj4LiJ0UFbw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vue/reactivity": "3.5.41",
+ "@vue/runtime-core": "3.5.41",
+ "@vue/shared": "3.5.41",
+ "csstype": "^3.2.3"
+ }
+ },
+ "node_modules/@dcloudio/uni-h5/node_modules/@vue/runtime-dom/node_modules/@vue/shared": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.41.tgz",
+ "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@dcloudio/uni-h5/node_modules/entities": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
+ "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/@dcloudio/uni-h5/node_modules/vue": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.41.tgz",
+ "integrity": "sha512-2laE0p+aK+/AOPG/XL/WepOs/GlK755LJ1XECi9kDUrz1FKNw8rb2Xzlw9JS1rqEV55nb0ttsKxVlTCcd+R5cg==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.41",
+ "@vue/compiler-sfc": "3.5.41",
+ "@vue/runtime-dom": "3.5.41",
+ "@vue/server-renderer": "3.5.41",
+ "@vue/shared": "3.5.41"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@dcloudio/uni-h5/node_modules/vue-router": {
+ "version": "4.6.4",
+ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz",
+ "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-api": "^6.6.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "vue": "^3.5.0"
+ }
+ },
+ "node_modules/@dcloudio/uni-h5/node_modules/vue/node_modules/@vue/server-renderer": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.41.tgz",
+ "integrity": "sha512-n6hx/pNFfbD6SuyeuMVkvqox8bwf/ET9JlA/kAz/imw8sw++wkqKe2mHX5KutjPpbKE4Z56yTHszoOjGMI9igQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@vue/compiler-ssr": "3.5.41",
+ "@vue/runtime-dom": "3.5.41",
+ "@vue/shared": "3.5.41"
+ }
+ },
+ "node_modules/@dcloudio/uni-h5/node_modules/vue/node_modules/@vue/shared": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.41.tgz",
+ "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@dcloudio/uni-i18n": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-i18n/-/uni-i18n-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-UqYcjERvmlb8FPhKqg9xAkDPxjMXG9BjezaVm0PTw33Jm5h2Sf9BnCJZYVg2RNS7+3kPSwUBIGdyC4rBNI4COg==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@dcloudio/uni-mp-alipay": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-alipay/-/uni-mp-alipay-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-B+8QhXjSZzU1Z8jG5GofPtPuLCsBiGobqlhVMmM7e+KJqKdEGPTFhYFXBoQU3zoU1ONCWvRW6VhScWIt26+4Wg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vite": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vue": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-baidu": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-baidu/-/uni-mp-baidu-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-hHmwVyrU+ubdglHP2W9yirm9MTgdHoIWSvoR+sQsaL3ygQBE67di6vyqJhPmH4rB+I0j7/29yLjbQ58Xzz77yg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-app": "3.0.0-4060620250520001",
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-compiler": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vite": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vue": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-weixin": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/shared": "3.4.21",
+ "jimp": "^0.10.1",
+ "licia": "^1.29.0",
+ "qrcode-reader": "^1.0.4",
+ "qrcode-terminal": "^0.12.0",
+ "ws": "^8.4.2"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-compiler": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-compiler/-/uni-mp-compiler-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-nMeZO/vX/vOZVCnFj+fwwzyrSwWI/oiBUL3ci1bnPfOR8mgM1TB6TVLt3x0g8Xmpjvc88E9/La+2UmCpcKWUAg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/generator": "^7.20.5",
+ "@babel/parser": "^7.23.9",
+ "@babel/types": "^7.20.7",
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/shared": "3.4.21",
+ "estree-walker": "^2.0.2"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-jd": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-jd/-/uni-mp-jd-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-4CQEmLeXeiTKTncWCpL6zAa0SEDKLCUzCkbUfNXcvUl/D7N37nkPdIhyZNWGTt7d3SQCOPSiqN1vGS10X82mOA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-compiler": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vite": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vue": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-kuaishou": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-kuaishou/-/uni-mp-kuaishou-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-aWLBYZ9G+ltRIgIt1n7gr43CNSlwIRKF5NJ7uxj8uAOscEAt+VXIUsPS6bqhkrQ4Nt3zggSOrF0zBRF4YQVSuA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-compiler": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vite": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vue": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-weixin": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-lark": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-lark/-/uni-mp-lark-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-8NwHxJb1rtIvEemGfbBQRGqojlL6KGObxluEtrFX+bjqzAmHqvd6kBAR7LUBFAnHmigVZ9V6J0tqt3Fs2hZJYg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-compiler": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-toutiao": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vite": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vue": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-qq": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-qq/-/uni-mp-qq-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-4iYm9Mnb0whS68qNiJ+t08PaUjP9Jfxwc81RsaPYMSm4oQvDmG8h7STSqAJS70ldUvvX7qjiU8eC6g2fbu+glQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vite": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vue": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@vue/shared": "3.4.21",
+ "fs-extra": "^10.0.0"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-toutiao": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-toutiao/-/uni-mp-toutiao-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-ChTXgYQM55pFyoSRhJh8pIykRPPZ7Ijkj2KaHnPkivAdictZrA0Urj8v4/DDDfFamHRnSNNyciPLZKjlJqZVMA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-compiler": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vite": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vue": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-vite": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-vite/-/uni-mp-vite-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-zk62bZsl6X6U+Ite7p7BONIjnN7XiNdhu8P+xcZGDOJCstUawrdbvqzsix2Uht/UxFp4I4a7lB82nDLCcPBdlA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-i18n": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-compiler": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vue": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/compiler-sfc": "3.4.21",
+ "@vue/shared": "3.4.21",
+ "debug": "^4.3.3"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-vue": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-vue/-/uni-mp-vue-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-7VlkwL8XSPhurdkj3CXVWaNPt5ydsQJqRtXZDsbpiLET3TF3pB23QRdPHWSZadv1BSM0zOxaA3HiHnnSQmnG3Q==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-weixin": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-weixin/-/uni-mp-weixin-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-0vzOMVPsLtJB/LF+HlplZEzYmXguEP8Ph4Gzl1/5o7PSvsZQGz+e6hpCjjQPSWdm6Pga4nvGnrtOQ9F7yZvkfA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vite": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vue": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@vue/shared": "3.4.21",
+ "jimp": "^0.10.1",
+ "licia": "^1.29.0",
+ "qrcode-reader": "^1.0.4",
+ "qrcode-terminal": "^0.12.0",
+ "ws": "^8.4.2"
+ }
+ },
+ "node_modules/@dcloudio/uni-mp-xhs": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-mp-xhs/-/uni-mp-xhs-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-Q60T5QACcdO2OYi7L0c7rTPHP9K9c8OvWG44XD2pNnxaYYm8+UzHG1oCPLgvqRcTy9ZiRF3xvWilgj/Fuwu7rA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-compiler": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vite": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vue": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-nvue-styler": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-nvue-styler/-/uni-nvue-styler-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-XsM2jDrMVMMQvKJLGHcxBV4sGkyiFw0J6SctbYci7I/qf/se9WehEqdnuNdFrDv1Fah92bitQ5RFrNrsh7MKOw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "parse-css-font": "^4.0.0",
+ "postcss": "^8.4.35"
+ }
+ },
+ "node_modules/@dcloudio/uni-push": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-push/-/uni-push-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-7ly9CIZQOPu/mkej/M/2OI88Qq2O89E71lbW2NM+isHMbeJWXDTIn84Xdlk9EONWcOw03HuUWLb2ZYqoeDYiTw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001"
+ }
+ },
+ "node_modules/@dcloudio/uni-quickapp-webview": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-quickapp-webview/-/uni-quickapp-webview-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-DN1BEeX4PxOPR5EG4zHx/QI7DLoBtqIshw3DPOvtaLPMOd9LKMFgiHRm37WkIjUSDzD1n/DgRB+nXgxH20lCvQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vite": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-vue": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-shared": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-shared/-/uni-shared-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-U3VhBYC2+kPDFm7Ap9oZeJTqmys774bcli6kJpNmDYFkgkqOoYUtT+0SueOliREL98ogaqoW42zV5T4XjPXj4w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@dcloudio/uni-stacktracey": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-stacktracey/-/uni-stacktracey-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-Sd3Zvps3TWqMCiSVUtb0Ro30GhA1ic7e92kv5PzCP9REHg7ecNJl7ACo6cY2NioAgITEvmMu6jeZKE2Z+FX4sg==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/@dcloudio/uni-stat": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/uni-stat/-/uni-stat-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-l2XREt2On5uf33PVrAdarncMmGqBLkgZdLsafqag8R2Kdw2Gg/JQQ66RsrLlfBHN2m9eXpfFW6MITqF2vYOoeA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "debug": "^4.3.3"
+ }
+ },
+ "node_modules/@dcloudio/vite-plugin-uni": {
+ "version": "3.0.0-4060620250520001",
+ "resolved": "https://registry.npmjs.org/@dcloudio/vite-plugin-uni/-/vite-plugin-uni-3.0.0-4060620250520001.tgz",
+ "integrity": "sha512-U2UDgnEF6A2xQ2cqGnwaCZMCOk6hMQaJ/lmJoUAlst9ldy8c70T4oPTfzaJzBUQJioF0T+BRhF/HbKnrxICh4g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@babel/core": "^7.23.3",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-transform-typescript": "^7.23.3",
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-shared": "3.0.0-4060620250520001",
+ "@rollup/pluginutils": "^5.0.5",
+ "@vitejs/plugin-legacy": "5.3.2",
+ "@vitejs/plugin-vue": "5.1.0",
+ "@vitejs/plugin-vue-jsx": "3.1.0",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/compiler-sfc": "3.4.21",
+ "@vue/shared": "3.4.21",
+ "cac": "6.7.9",
+ "debug": "^4.3.3",
+ "estree-walker": "^2.0.2",
+ "express": "^4.17.1",
+ "fast-glob": "^3.2.11",
+ "fs-extra": "^10.0.0",
+ "hash-sum": "^2.0.0",
+ "jsonc-parser": "^3.2.0",
+ "magic-string": "^0.30.7",
+ "picocolors": "^1.0.0",
+ "terser": "^5.4.0",
+ "unplugin-auto-import": "19.1.0"
+ },
+ "bin": {
+ "uni": "bin/uni.js"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.2.8"
+ }
+ },
+ "node_modules/@dcloudio/vite-plugin-uni/node_modules/unplugin-auto-import": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-19.1.0.tgz",
+ "integrity": "sha512-B+TGBEBHqY9aR+7YfShfLujETOHstzpV+yaqgy5PkfV0QG7Py+TYMX7vJ9W4SrysHR+UzR+gzcx/nuZjmPeclA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "local-pkg": "^1.0.0",
+ "magic-string": "^0.30.17",
+ "picomatch": "^4.0.2",
+ "unimport": "^4.1.1",
+ "unplugin": "^2.2.0",
+ "unplugin-utils": "^0.2.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@nuxt/kit": "^3.2.2",
+ "@vueuse/core": "*"
+ },
+ "peerDependenciesMeta": {
+ "@nuxt/kit": {
+ "optional": true
+ },
+ "@vueuse/core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
+ "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
+ "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
+ "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
+ "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
+ "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
+ "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
+ "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
+ "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
+ "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
+ "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
+ "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
+ "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
+ "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
+ "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
+ "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
+ "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
+ "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
+ "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
+ "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
+ "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
+ "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
+ "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
+ "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@intlify/core-base": {
+ "version": "9.1.9",
+ "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.1.9.tgz",
+ "integrity": "sha512-x5T0p/Ja0S8hs5xs+ImKyYckVkL4CzcEXykVYYV6rcbXxJTe2o58IquSqX9bdncVKbRZP7GlBU1EcRaQEEJ+vw==",
+ "license": "MIT",
+ "dependencies": {
+ "@intlify/devtools-if": "9.1.9",
+ "@intlify/message-compiler": "9.1.9",
+ "@intlify/message-resolver": "9.1.9",
+ "@intlify/runtime": "9.1.9",
+ "@intlify/shared": "9.1.9",
+ "@intlify/vue-devtools": "9.1.9"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@intlify/devtools-if": {
+ "version": "9.1.9",
+ "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.1.9.tgz",
+ "integrity": "sha512-oKSMKjttG3Ut/1UGEZjSdghuP3fwA15zpDPcjkf/1FjlOIm6uIBGMNS5jXzsZy593u+P/YcnrZD6cD3IVFz9vQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@intlify/shared": "9.1.9"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@intlify/message-compiler": {
+ "version": "9.1.9",
+ "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.1.9.tgz",
+ "integrity": "sha512-6YgCMF46Xd0IH2hMRLCssZI3gFG4aywidoWQ3QP4RGYQXQYYfFC54DxhSgfIPpVoPLQ+4AD29eoYmhiHZ+qLFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@intlify/message-resolver": "9.1.9",
+ "@intlify/shared": "9.1.9",
+ "source-map": "0.6.1"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@intlify/message-resolver": {
+ "version": "9.1.9",
+ "resolved": "https://registry.npmjs.org/@intlify/message-resolver/-/message-resolver-9.1.9.tgz",
+ "integrity": "sha512-Lx/DBpigeK0sz2BBbzv5mu9/dAlt98HxwbG7xLawC3O2xMF9MNWU5FtOziwYG6TDIjNq0O/3ZbOJAxwITIWXEA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@intlify/runtime": {
+ "version": "9.1.9",
+ "resolved": "https://registry.npmjs.org/@intlify/runtime/-/runtime-9.1.9.tgz",
+ "integrity": "sha512-XgPw8+UlHCiie3fI41HPVa/VDJb3/aSH7bLhY1hJvlvNV713PFtb4p4Jo+rlE0gAoMsMCGcsiT982fImolSltg==",
+ "license": "MIT",
+ "dependencies": {
+ "@intlify/message-compiler": "9.1.9",
+ "@intlify/message-resolver": "9.1.9",
+ "@intlify/shared": "9.1.9"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@intlify/shared": {
+ "version": "9.1.9",
+ "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.1.9.tgz",
+ "integrity": "sha512-xKGM1d0EAxdDFCWedcYXOm6V5Pfw/TMudd6/qCdEb4tv0hk9EKeg7lwQF1azE0dP2phvx0yXxrt7UQK+IZjNdw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@intlify/vue-devtools": {
+ "version": "9.1.9",
+ "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.1.9.tgz",
+ "integrity": "sha512-YPehH9uL4vZcGXky4Ev5qQIITnHKIvsD2GKGXgqf+05osMUI6WSEQHaN9USRa318Rs8RyyPCiDfmA0hRu3k7og==",
+ "license": "MIT",
+ "dependencies": {
+ "@intlify/message-resolver": "9.1.9",
+ "@intlify/runtime": "9.1.9",
+ "@intlify/shared": "9.1.9"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz",
+ "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/console": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz",
+ "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/core": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz",
+ "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/console": "^27.5.1",
+ "@jest/reporters": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.8.1",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-changed-files": "^27.5.1",
+ "jest-config": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-resolve-dependencies": "^27.5.1",
+ "jest-runner": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "jest-watcher": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "rimraf": "^3.0.0",
+ "slash": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/environment": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz",
+ "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz",
+ "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@sinonjs/fake-timers": "^8.0.1",
+ "@types/node": "*",
+ "jest-message-util": "^27.5.1",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/globals": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz",
+ "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "expect": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/reporters": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz",
+ "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@jest/console": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "exit": "^0.1.2",
+ "glob": "^7.1.2",
+ "graceful-fs": "^4.2.9",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-instrument": "^5.1.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.1.3",
+ "jest-haste-map": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.0",
+ "string-length": "^4.0.1",
+ "terminal-link": "^2.0.0",
+ "v8-to-istanbul": "^8.1.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/source-map": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz",
+ "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "callsites": "^3.0.0",
+ "graceful-fs": "^4.2.9",
+ "source-map": "^0.6.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/test-result": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz",
+ "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/console": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/test-sequencer": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz",
+ "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/test-result": "^27.5.1",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-runtime": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/transform": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz",
+ "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/core": "^7.1.0",
+ "@jest/types": "^27.5.1",
+ "babel-plugin-istanbul": "^6.1.1",
+ "chalk": "^4.0.0",
+ "convert-source-map": "^1.4.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "pirates": "^4.0.4",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.1",
+ "write-file-atomic": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@jest/types": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
+ "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/@jimp/bmp": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.10.3.tgz",
+ "integrity": "sha512-keMOc5woiDmONXsB/6aXLR4Z5Q+v8lFq3EY2rcj2FmstbDMhRuGbmcBxlEgOqfRjwvtf/wOtJ3Of37oAWtVfLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "bmp-js": "^0.1.0",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/core": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.10.3.tgz",
+ "integrity": "sha512-Gd5IpL3U2bFIO57Fh/OA3HCpWm4uW/pU01E75rI03BXfTdz3T+J7TwvyG1XaqsQ7/DSlS99GXtLQPlfFIe28UA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "any-base": "^1.1.0",
+ "buffer": "^5.2.0",
+ "core-js": "^3.4.1",
+ "exif-parser": "^0.1.12",
+ "file-type": "^9.0.0",
+ "load-bmfont": "^1.3.1",
+ "mkdirp": "^0.5.1",
+ "phin": "^2.9.1",
+ "pixelmatch": "^4.0.2",
+ "tinycolor2": "^1.4.1"
+ }
+ },
+ "node_modules/@jimp/custom": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.10.3.tgz",
+ "integrity": "sha512-nZmSI+jwTi5IRyNLbKSXQovoeqsw+D0Jn0SxW08wYQvdkiWA8bTlDQFgQ7HVwCAKBm8oKkDB/ZEo9qvHJ+1gAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/core": "^0.10.3",
+ "core-js": "^3.4.1"
+ }
+ },
+ "node_modules/@jimp/gif": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.10.3.tgz",
+ "integrity": "sha512-vjlRodSfz1CrUvvrnUuD/DsLK1GHB/yDZXHthVdZu23zYJIW7/WrIiD1IgQ5wOMV7NocfrvPn2iqUfBP81/WWA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1",
+ "omggif": "^1.0.9"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/jpeg": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.10.3.tgz",
+ "integrity": "sha512-AAANwgUZOt6f6P7LZxY9lyJ9xclqutYJlsxt3JbriXUGJgrrFAIkcKcqv1nObgmQASSAQKYaMV9KdHjMlWFKlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1",
+ "jpeg-js": "^0.3.4"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-blit": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.10.3.tgz",
+ "integrity": "sha512-5zlKlCfx4JWw9qUVC7GI4DzXyxDWyFvgZLaoGFoT00mlXlN75SarlDwc9iZ/2e2kp4bJWxz3cGgG4G/WXrbg3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-blur": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.10.3.tgz",
+ "integrity": "sha512-cTOK3rjh1Yjh23jSfA6EHCHjsPJDEGLC8K2y9gM7dnTUK1y9NNmkFS23uHpyjgsWFIoH9oRh2SpEs3INjCpZhQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-circle": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.10.3.tgz",
+ "integrity": "sha512-51GAPIVelqAcfuUpaM5JWJ0iWl4vEjNXB7p4P7SX5udugK5bxXUjO6KA2qgWmdpHuCKtoNgkzWU9fNSuYp7tCA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-color": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.10.3.tgz",
+ "integrity": "sha512-RgeHUElmlTH7vpI4WyQrz6u59spiKfVQbsG/XUzfWGamFSixa24ZDwX/yV/Ts+eNaz7pZeIuv533qmKPvw2ujg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1",
+ "tinycolor2": "^1.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-contain": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.10.3.tgz",
+ "integrity": "sha512-bYJKW9dqzcB0Ihc6u7jSyKa3juStzbLs2LFr6fu8TzA2WkMS/R8h+ddkiO36+F9ILTWHP0CIA3HFe5OdOGcigw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5",
+ "@jimp/plugin-blit": ">=0.3.5",
+ "@jimp/plugin-resize": ">=0.3.5",
+ "@jimp/plugin-scale": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-cover": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.10.3.tgz",
+ "integrity": "sha512-pOxu0cM0BRPzdV468n4dMocJXoMbTnARDY/EpC3ZW15SpMuc/dr1KhWQHgoQX5kVW1Wt8zgqREAJJCQ5KuPKDA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5",
+ "@jimp/plugin-crop": ">=0.3.5",
+ "@jimp/plugin-resize": ">=0.3.5",
+ "@jimp/plugin-scale": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-crop": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.10.3.tgz",
+ "integrity": "sha512-nB7HgOjjl9PgdHr076xZ3Sr6qHYzeBYBs9qvs3tfEEUeYMNnvzgCCGtUl6eMakazZFCMk3mhKmcB9zQuHFOvkg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-displace": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.10.3.tgz",
+ "integrity": "sha512-8t3fVKCH5IVqI4lewe4lFFjpxxr69SQCz5/tlpDLQZsrNScNJivHdQ09zljTrVTCSgeCqQJIKgH2Q7Sk/pAZ0w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-dither": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.10.3.tgz",
+ "integrity": "sha512-JCX/oNSnEg1kGQ8ffZ66bEgQOLCY3Rn+lrd6v1jjLy/mn9YVZTMsxLtGCXpiCDC2wG/KTmi4862ysmP9do9dAQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-fisheye": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.10.3.tgz",
+ "integrity": "sha512-RRZb1wqe+xdocGcFtj2xHU7sF7xmEZmIa6BmrfSchjyA2b32TGPWKnP3qyj7p6LWEsXn+19hRYbjfyzyebPElQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-flip": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.10.3.tgz",
+ "integrity": "sha512-0epbi8XEzp0wmSjoW9IB0iMu0yNF17aZOxLdURCN3Zr+8nWPs5VNIMqSVa1Y62GSyiMDpVpKF/ITiXre+EqrPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5",
+ "@jimp/plugin-rotate": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-gaussian": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.10.3.tgz",
+ "integrity": "sha512-25eHlFbHUDnMMGpgRBBeQ2AMI4wsqCg46sue0KklI+c2BaZ+dGXmJA5uT8RTOrt64/K9Wz5E+2n7eBnny4dfpQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-invert": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.10.3.tgz",
+ "integrity": "sha512-effYSApWY/FbtlzqsKXlTLkgloKUiHBKjkQnqh5RL4oQxh/33j6aX+HFdDyQKtsXb8CMd4xd7wyiD2YYabTa0g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-mask": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.10.3.tgz",
+ "integrity": "sha512-twrg8q8TIhM9Z6Jcu9/5f+OCAPaECb0eKrrbbIajJqJ3bCUlj5zbfgIhiQIzjPJ6KjpnFPSqHQfHkU1Vvk/nVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-normalize": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.10.3.tgz",
+ "integrity": "sha512-xkb5eZI/mMlbwKkDN79+1/t/+DBo8bBXZUMsT4gkFgMRKNRZ6NQPxlv1d3QpRzlocsl6UMxrHnhgnXdLAcgrXw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-print": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.10.3.tgz",
+ "integrity": "sha512-wjRiI6yjXsAgMe6kVjizP+RgleUCLkH256dskjoNvJzmzbEfO7xQw9g6M02VET+emnbY0CO83IkrGm2q43VRyg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1",
+ "load-bmfont": "^1.4.0"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5",
+ "@jimp/plugin-blit": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-resize": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.10.3.tgz",
+ "integrity": "sha512-rf8YmEB1d7Sg+g4LpqF0Mp+dfXfb6JFJkwlAIWPUOR7lGsPWALavEwTW91c0etEdnp0+JB9AFpy6zqq7Lwkq6w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-rotate": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.10.3.tgz",
+ "integrity": "sha512-YXLlRjm18fkW9MOHUaVAxWjvgZM851ofOipytz5FyKp4KZWDLk+dZK1JNmVmK7MyVmAzZ5jsgSLhIgj+GgN0Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5",
+ "@jimp/plugin-blit": ">=0.3.5",
+ "@jimp/plugin-crop": ">=0.3.5",
+ "@jimp/plugin-resize": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-scale": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.10.3.tgz",
+ "integrity": "sha512-5DXD7x7WVcX1gUgnlFXQa8F+Q3ThRYwJm+aesgrYvDOY+xzRoRSdQvhmdd4JEEue3lyX44DvBSgCIHPtGcEPaw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5",
+ "@jimp/plugin-resize": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-shadow": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.10.3.tgz",
+ "integrity": "sha512-/nkFXpt2zVcdP4ETdkAUL0fSzyrC5ZFxdcphbYBodqD7fXNqChS/Un1eD4xCXWEpW8cnG9dixZgQgStjywH0Mg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5",
+ "@jimp/plugin-blur": ">=0.3.5",
+ "@jimp/plugin-resize": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/plugin-threshold": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.10.3.tgz",
+ "integrity": "sha512-Dzh0Yq2wXP2SOnxcbbiyA4LJ2luwrdf1MghNIt9H+NX7B+IWw/N8qA2GuSm9n4BPGSLluuhdAWJqHcTiREriVA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5",
+ "@jimp/plugin-color": ">=0.8.0",
+ "@jimp/plugin-resize": ">=0.8.0"
+ }
+ },
+ "node_modules/@jimp/plugins": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.10.3.tgz",
+ "integrity": "sha512-jTT3/7hOScf0EIKiAXmxwayHhryhc1wWuIe3FrchjDjr9wgIGNN2a7XwCgPl3fML17DXK1x8EzDneCdh261bkw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/plugin-blit": "^0.10.3",
+ "@jimp/plugin-blur": "^0.10.3",
+ "@jimp/plugin-circle": "^0.10.3",
+ "@jimp/plugin-color": "^0.10.3",
+ "@jimp/plugin-contain": "^0.10.3",
+ "@jimp/plugin-cover": "^0.10.3",
+ "@jimp/plugin-crop": "^0.10.3",
+ "@jimp/plugin-displace": "^0.10.3",
+ "@jimp/plugin-dither": "^0.10.3",
+ "@jimp/plugin-fisheye": "^0.10.3",
+ "@jimp/plugin-flip": "^0.10.3",
+ "@jimp/plugin-gaussian": "^0.10.3",
+ "@jimp/plugin-invert": "^0.10.3",
+ "@jimp/plugin-mask": "^0.10.3",
+ "@jimp/plugin-normalize": "^0.10.3",
+ "@jimp/plugin-print": "^0.10.3",
+ "@jimp/plugin-resize": "^0.10.3",
+ "@jimp/plugin-rotate": "^0.10.3",
+ "@jimp/plugin-scale": "^0.10.3",
+ "@jimp/plugin-shadow": "^0.10.3",
+ "@jimp/plugin-threshold": "^0.10.3",
+ "core-js": "^3.4.1",
+ "timm": "^1.6.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/png": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.10.3.tgz",
+ "integrity": "sha512-YKqk/dkl+nGZxSYIDQrqhmaP8tC3IK8H7dFPnnzFVvbhDnyYunqBZZO3SaZUKTichClRw8k/CjBhbc+hifSGWg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/utils": "^0.10.3",
+ "core-js": "^3.4.1",
+ "pngjs": "^3.3.3"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/tiff": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.10.3.tgz",
+ "integrity": "sha512-7EsJzZ5Y/EtinkBGuwX3Bi4S+zgbKouxjt9c82VJTRJOQgLWsE/RHqcyRCOQBhHAZ9QexYmDz34medfLKdoX0g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "core-js": "^3.4.1",
+ "utif": "^2.0.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/types": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.10.3.tgz",
+ "integrity": "sha512-XGmBakiHZqseSWr/puGN+CHzx0IKBSpsKlmEmsNV96HKDiP6eu8NSnwdGCEq2mmIHe0JNcg1hqg59hpwtQ7Tiw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/bmp": "^0.10.3",
+ "@jimp/gif": "^0.10.3",
+ "@jimp/jpeg": "^0.10.3",
+ "@jimp/png": "^0.10.3",
+ "@jimp/tiff": "^0.10.3",
+ "core-js": "^3.4.1",
+ "timm": "^1.6.1"
+ },
+ "peerDependencies": {
+ "@jimp/custom": ">=0.3.5"
+ }
+ },
+ "node_modules/@jimp/utils": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.10.3.tgz",
+ "integrity": "sha512-VcSlQhkil4ReYmg1KkN+WqHyYfZ2XfZxDsKAHSfST1GEz/RQHxKZbX+KhFKtKflnL0F4e6DlNQj3vznMNXCR2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "core-js": "^3.4.1",
+ "regenerator-runtime": "^0.13.3"
+ }
+ },
+ "node_modules/@jimp/utils/node_modules/regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.11",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz",
+ "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@napi-rs/lzma-linux-x64-gnu": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz",
+ "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^22.20 || ^24.12 || >=25"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@parcel/watcher": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz",
+ "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "detect-libc": "^2.0.3",
+ "is-glob": "^4.0.3",
+ "node-addon-api": "^7.0.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher-android-arm64": "2.6.0",
+ "@parcel/watcher-darwin-arm64": "2.6.0",
+ "@parcel/watcher-darwin-x64": "2.6.0",
+ "@parcel/watcher-freebsd-x64": "2.6.0",
+ "@parcel/watcher-linux-arm-glibc": "2.6.0",
+ "@parcel/watcher-linux-arm-musl": "2.6.0",
+ "@parcel/watcher-linux-arm64-glibc": "2.6.0",
+ "@parcel/watcher-linux-arm64-musl": "2.6.0",
+ "@parcel/watcher-linux-x64-glibc": "2.6.0",
+ "@parcel/watcher-linux-x64-musl": "2.6.0",
+ "@parcel/watcher-win32-arm64": "2.6.0",
+ "@parcel/watcher-win32-x64": "2.6.0"
+ }
+ },
+ "node_modules/@parcel/watcher-android-arm64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz",
+ "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-arm64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz",
+ "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-x64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz",
+ "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-freebsd-x64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz",
+ "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-glibc": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz",
+ "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-musl": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz",
+ "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-glibc": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz",
+ "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-musl": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz",
+ "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-glibc": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz",
+ "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-musl": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz",
+ "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-arm64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz",
+ "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-x64": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz",
+ "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz",
+ "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz",
+ "integrity": "sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz",
+ "integrity": "sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz",
+ "integrity": "sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz",
+ "integrity": "sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz",
+ "integrity": "sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz",
+ "integrity": "sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz",
+ "integrity": "sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz",
+ "integrity": "sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz",
+ "integrity": "sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz",
+ "integrity": "sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz",
+ "integrity": "sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz",
+ "integrity": "sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz",
+ "integrity": "sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz",
+ "integrity": "sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz",
+ "integrity": "sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz",
+ "integrity": "sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz",
+ "integrity": "sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz",
+ "integrity": "sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz",
+ "integrity": "sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz",
+ "integrity": "sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz",
+ "integrity": "sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz",
+ "integrity": "sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz",
+ "integrity": "sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz",
+ "integrity": "sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz",
+ "integrity": "sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@sinonjs/commons": {
+ "version": "1.8.6",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
+ "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz",
+ "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "@sinonjs/commons": "^1.7.0"
+ }
+ },
+ "node_modules/@tootallnate/once": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
+ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/types": "^7.28.2"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/graceful-fs": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
+ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+ "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+ "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "20.19.43",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz",
+ "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.21.0"
+ }
+ },
+ "node_modules/@types/prettier": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz",
+ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@types/stack-utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
+ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@types/yargs": {
+ "version": "16.0.11",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.11.tgz",
+ "integrity": "sha512-sbtvk8wDN+JvEdabmZExoW/HNr1cB7D/j4LT08rMiuikfA7m/JNJg7ATQcgzs34zHnoScDkY0ZRSl29Fkmk36g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@vitejs/plugin-legacy": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-5.3.2.tgz",
+ "integrity": "sha512-8moCOrIMaZ/Rjln0Q6GsH6s8fAt1JOI3k8nmfX4tXUxE5KAExVctSyOBk+A25GClsdSWqIk2yaUthH3KJ2X4tg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.23.9",
+ "@babel/preset-env": "^7.23.9",
+ "browserslist": "^4.23.0",
+ "browserslist-to-esbuild": "^2.1.1",
+ "core-js": "^3.36.0",
+ "magic-string": "^0.30.7",
+ "regenerator-runtime": "^0.14.1",
+ "systemjs": "^6.14.3"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "peerDependencies": {
+ "terser": "^5.4.0",
+ "vite": "^5.0.0"
+ }
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.0.tgz",
+ "integrity": "sha512-QMRxARyrdiwi1mj3AW4fLByoHTavreXq0itdEW696EihXglf1MB3D4C2gBvE0jMPH29ZjC3iK8aIaUMLf4EOGA==",
+ "license": "MIT",
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vitejs/plugin-vue-jsx": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.1.0.tgz",
+ "integrity": "sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.23.3",
+ "@babel/plugin-transform-typescript": "^7.23.3",
+ "@vue/babel-plugin-jsx": "^1.1.5"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.0.0 || ^5.0.0",
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/@vue/babel-helper-vue-transform-on": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz",
+ "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vue/babel-plugin-jsx": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz",
+ "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/plugin-syntax-jsx": "^7.27.1",
+ "@babel/template": "^7.27.2",
+ "@babel/traverse": "^7.28.0",
+ "@babel/types": "^7.28.2",
+ "@vue/babel-helper-vue-transform-on": "1.5.0",
+ "@vue/babel-plugin-resolve-type": "1.5.0",
+ "@vue/shared": "^3.5.18"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vue/babel-plugin-jsx/node_modules/@vue/shared": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.41.tgz",
+ "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vue/babel-plugin-resolve-type": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz",
+ "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/parser": "^7.28.0",
+ "@vue/compiler-sfc": "^3.5.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-core": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.41.tgz",
+ "integrity": "sha512-q0Xtv/F9w2YO/7htQhtiL+Ev2WCJbe5N2hc+XfgyKkEKqWpSxknmT8QOuGdEKNdjPq0c3F7rNpFkTo3Kfrm7pg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.8",
+ "@vue/shared": "3.5.41",
+ "entities": "^7.0.1",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-dom": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.41.tgz",
+ "integrity": "sha512-oKacVfNglLvGjnS6BXOlGL7EyG2h8X03pqXCjzotRZUaXGjbrTJUnVAQjrCqUnS+lyu31nwQjZY/d817GmCnfw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-core": "3.5.41",
+ "@vue/shared": "3.5.41"
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-sfc": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.41.tgz",
+ "integrity": "sha512-XJhip7R2wy6vX3knCxdZN4KracFaZUef58s1KYewqluedHIJaPIVfXoYT7MF1F8nCvv6k8bWWxDC8opMkg1VTQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.8",
+ "@vue/compiler-core": "3.5.41",
+ "@vue/compiler-dom": "3.5.41",
+ "@vue/compiler-ssr": "3.5.41",
+ "@vue/shared": "3.5.41",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.21",
+ "postcss": "^8.5.19",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-ssr": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.41.tgz",
+ "integrity": "sha512-U3v5OejKEGqOI0Wy0+Sz7hGuIFZHA4LSXzrNM3IMIeDyJEBBfTpX26n3SDgToRpP2bLc9FfI2j/kSgcJ8Emq5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.5.41",
+ "@vue/shared": "3.5.41"
+ }
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/shared": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.41.tgz",
+ "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vue/babel-plugin-resolve-type/node_modules/entities": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
+ "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz",
+ "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.23.9",
+ "@vue/shared": "3.4.21",
+ "entities": "^4.5.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz",
+ "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-core": "3.4.21",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz",
+ "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.23.9",
+ "@vue/compiler-core": "3.4.21",
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/compiler-ssr": "3.4.21",
+ "@vue/shared": "3.4.21",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.7",
+ "postcss": "^8.4.35",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz",
+ "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@vue/consolidate": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@vue/consolidate/-/consolidate-1.0.0.tgz",
+ "integrity": "sha512-oTyUE+QHIzLw2PpV14GD/c7EohDyP64xCniWTcqcEmTd699eFqTIwOmtDYjcO1j3QgdXoJEoWv1/cCdLrRoOfg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "6.6.4",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+ "license": "MIT"
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.41.tgz",
+ "integrity": "sha512-rznsqKM0np0x18EjzF8x88MpEhdNsffbvFbckLL5+oUKz1BxAImEmO7J1ArRYSyo6aQaVoBDp7jEkT91OOxydA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/shared": "3.5.41"
+ }
+ },
+ "node_modules/@vue/reactivity/node_modules/@vue/shared": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.41.tgz",
+ "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==",
+ "license": "MIT"
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.41.tgz",
+ "integrity": "sha512-Vcry58hiAKwGen9Z1jUZE0feFsNArPCMOImYI8el48A9Idf6DuQYD0U05zZIF2Iad1hGhPSvcbBbAOhNr55fhg==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.5.41",
+ "@vue/shared": "3.5.41"
+ }
+ },
+ "node_modules/@vue/runtime-core/node_modules/@vue/shared": {
+ "version": "3.5.41",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.41.tgz",
+ "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==",
+ "license": "MIT"
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz",
+ "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/runtime-core": "3.4.21",
+ "@vue/shared": "3.4.21",
+ "csstype": "^3.1.3"
+ }
+ },
+ "node_modules/@vue/runtime-dom/node_modules/@vue/reactivity": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz",
+ "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@vue/runtime-dom/node_modules/@vue/runtime-core": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz",
+ "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.4.21",
+ "@vue/shared": "3.4.21"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz",
+ "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.4.21",
+ "@vue/shared": "3.4.21"
+ },
+ "peerDependencies": {
+ "vue": "3.4.21"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz",
+ "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==",
+ "license": "MIT"
+ },
+ "node_modules/abab": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
+ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
+ "deprecated": "Use your platform's native atob() and btoa() methods instead",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz",
+ "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-globals": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
+ "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "acorn": "^7.1.1",
+ "acorn-walk": "^7.1.1"
+ }
+ },
+ "node_modules/acorn-globals/node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
+ "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/address": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz",
+ "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/adm-zip": {
+ "version": "0.5.18",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.18.tgz",
+ "integrity": "sha512-ufJnssQGbxzLNS1Ho9bCtX4rQKCCvoVuDLHoJyc3F9dOGDB4BkWs2Ci0kv53lqocAEQ/Cbi+I2XCsNYGqVYqng==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/any-base": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz",
+ "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==",
+ "license": "MIT"
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/anymatch/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.5.4",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.4.tgz",
+ "integrity": "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.28.6",
+ "caniuse-lite": "^1.0.30001806",
+ "fraction.js": "^5.3.4",
+ "picocolors": "^1.1.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/babel-jest": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz",
+ "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/babel__core": "^7.1.14",
+ "babel-plugin-istanbul": "^6.1.1",
+ "babel-preset-jest": "^27.5.1",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.8.0"
+ }
+ },
+ "node_modules/babel-plugin-istanbul": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
+ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-instrument": "^5.0.4",
+ "test-exclude": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-plugin-jest-hoist": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz",
+ "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/template": "^7.3.3",
+ "@babel/types": "^7.3.3",
+ "@types/babel__core": "^7.0.0",
+ "@types/babel__traverse": "^7.0.6"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.17",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz",
+ "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.28.6",
+ "@babel/helper-define-polyfill-provider": "^0.6.8",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.14.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz",
+ "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.8",
+ "core-js-compat": "^3.48.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.6.8",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz",
+ "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.8"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-preset-current-node-syntax": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz",
+ "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-bigint": "^7.8.3",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-import-attributes": "^7.24.7",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/babel-preset-jest": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz",
+ "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "babel-plugin-jest-hoist": "^27.5.1",
+ "babel-preset-current-node-syntax": "^1.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/base64url": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz",
+ "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.11.13",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.13.tgz",
+ "integrity": "sha512-k9HNuUVMlqVjQ9UHzfPjIqiDbWw7WqT1AoT7GL8VwvF3r0ZfArtgiSPAlmupyNquNgOJHTuH4CKYf8ttMTWBTQ==",
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bmp-js": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz",
+ "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==",
+ "license": "MIT"
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.6",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz",
+ "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "~3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "~1.2.0",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.4.24",
+ "on-finished": "~2.4.1",
+ "qs": "~6.15.1",
+ "raw-body": "~2.5.3",
+ "type-is": "~1.6.18",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.18",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz",
+ "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browser-process-hrtime": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.8",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz",
+ "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.11.12",
+ "caniuse-lite": "^1.0.30001809",
+ "electron-to-chromium": "^1.5.402",
+ "node-releases": "^2.0.53",
+ "update-browserslist-db": "^1.3.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/browserslist-to-esbuild": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/browserslist-to-esbuild/-/browserslist-to-esbuild-2.1.1.tgz",
+ "integrity": "sha512-KN+mty6C3e9AN8Z5dI1xeN15ExcRNeISoC3g7V0Kax/MMF9MSoYA2G7lkTTcVUFntiEjkpI0HNgqJC1NjdyNUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "meow": "^13.0.0"
+ },
+ "bin": {
+ "browserslist-to-esbuild": "cli/index.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "browserslist": "*"
+ }
+ },
+ "node_modules/bser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-equal": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
+ "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.9",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.9.tgz",
+ "integrity": "sha512-XN5qEpfNQCJ8jRaZgitSkkukjMRCGio+X3Ks5KUbGGlPbV+pSem1l9VuzooCBXOiMFshUZgyYqg6rgN8rjkb/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001809",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz",
+ "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/centra": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/centra/-/centra-2.7.0.tgz",
+ "integrity": "sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cjs-module-lexer": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz",
+ "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/collect-v8-coverage": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz",
+ "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/compare-versions": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
+ "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==",
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/confbox": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
+ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+ "license": "MIT"
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "license": "MIT"
+ },
+ "node_modules/cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz",
+ "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/copy-anything": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz",
+ "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-what": "^4.1.8"
+ },
+ "engines": {
+ "node": ">=12.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/core-js": {
+ "version": "3.50.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.50.0.tgz",
+ "integrity": "sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.50.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.50.0.tgz",
+ "integrity": "sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.28.7"
+ },
+ "engines": {
+ "node": ">=6.4.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/cross-env": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
+ "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.1"
+ },
+ "bin": {
+ "cross-env": "src/bin/cross-env.js",
+ "cross-env-shell": "src/bin/cross-env-shell.js"
+ },
+ "engines": {
+ "node": ">=10.14",
+ "npm": ">=6",
+ "yarn": ">=1"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/css-font-size-keywords": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz",
+ "integrity": "sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q==",
+ "license": "MIT"
+ },
+ "node_modules/css-font-stretch-keywords": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz",
+ "integrity": "sha512-KmugPO2BNqoyp9zmBIUGwt58UQSfyk1X5DbOlkb2pckDXFSAfjsD5wenb88fNrD6fvS+vu90a/tsPpb9vb0SLg==",
+ "license": "MIT"
+ },
+ "node_modules/css-font-style-keywords": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz",
+ "integrity": "sha512-0Fn0aTpcDktnR1RzaBYorIxQily85M2KXRpzmxQPgh8pxUN9Fcn00I8u9I3grNr1QXVgCl9T5Imx0ZwKU973Vg==",
+ "license": "MIT"
+ },
+ "node_modules/css-font-weight-keywords": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz",
+ "integrity": "sha512-5So8/NH+oDD+EzsnF4iaG4ZFHQ3vaViePkL1ZbZ5iC/KrsCY+WHq/lvOgrtmuOQ9pBBZ1ADGpaf+A4lj1Z9eYA==",
+ "license": "MIT"
+ },
+ "node_modules/css-list-helpers": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/css-list-helpers/-/css-list-helpers-2.0.0.tgz",
+ "integrity": "sha512-9Bj8tZ0jWbAM3u/U6m/boAzAwLPwtjzFvwivr2piSvyVa3K3rChJzQy4RIHkNkKiZCHrEMWDJWtTR8UyVhdDnQ==",
+ "license": "MIT"
+ },
+ "node_modules/css-system-font-keywords": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz",
+ "integrity": "sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA==",
+ "license": "MIT"
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cssom": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
+ "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/cssstyle": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+ "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "cssom": "~0.3.6"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cssstyle/node_modules/cssom": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "license": "MIT"
+ },
+ "node_modules/data-urls": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
+ "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "abab": "^2.0.3",
+ "whatwg-mimetype": "^2.3.0",
+ "whatwg-url": "^8.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decimal.js": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
+ "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/dedent": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
+ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/default-gateway": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
+ "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "execa": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/diff-sequences": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz",
+ "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/dom-walk": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
+ "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
+ },
+ "node_modules/domexception": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
+ "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
+ "deprecated": "Use your platform's native DOMException instead",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "webidl-conversions": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/domexception/node_modules/webidl-conversions": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
+ "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.404",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.404.tgz",
+ "integrity": "sha512-3WJtd7/lVq2Jnuz6wed1l9+1ZD2u2Tet1/1NBc4Iedkmgbu+I7YuAqdAQ8T+VZtnwysMsAf3IqSq9D1gyZjA2g==",
+ "license": "ISC"
+ },
+ "node_modules/emittery": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz",
+ "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/errno": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+ "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "prr": "~1.0.1"
+ },
+ "bin": {
+ "errno": "cli.js"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
+ "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
+ "license": "MIT"
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
+ "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
+ "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.20.2",
+ "@esbuild/android-arm": "0.20.2",
+ "@esbuild/android-arm64": "0.20.2",
+ "@esbuild/android-x64": "0.20.2",
+ "@esbuild/darwin-arm64": "0.20.2",
+ "@esbuild/darwin-x64": "0.20.2",
+ "@esbuild/freebsd-arm64": "0.20.2",
+ "@esbuild/freebsd-x64": "0.20.2",
+ "@esbuild/linux-arm": "0.20.2",
+ "@esbuild/linux-arm64": "0.20.2",
+ "@esbuild/linux-ia32": "0.20.2",
+ "@esbuild/linux-loong64": "0.20.2",
+ "@esbuild/linux-mips64el": "0.20.2",
+ "@esbuild/linux-ppc64": "0.20.2",
+ "@esbuild/linux-riscv64": "0.20.2",
+ "@esbuild/linux-s390x": "0.20.2",
+ "@esbuild/linux-x64": "0.20.2",
+ "@esbuild/netbsd-x64": "0.20.2",
+ "@esbuild/openbsd-x64": "0.20.2",
+ "@esbuild/sunos-x64": "0.20.2",
+ "@esbuild/win32-arm64": "0.20.2",
+ "@esbuild/win32-ia32": "0.20.2",
+ "@esbuild/win32-x64": "0.20.2"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/escodegen": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "license": "MIT"
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/exif-parser": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz",
+ "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw=="
+ },
+ "node_modules/exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/expect": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz",
+ "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/express": {
+ "version": "4.22.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz",
+ "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "~1.20.5",
+ "content-disposition": "~0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "~0.7.1",
+ "cookie-signature": "~1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "~1.3.1",
+ "fresh": "~0.5.2",
+ "http-errors": "~2.0.0",
+ "merge-descriptors": "1.0.3",
+ "methods": "~1.1.2",
+ "on-finished": "~2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "~0.1.12",
+ "proxy-addr": "~2.0.7",
+ "qs": "~6.15.1",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "~0.19.0",
+ "serve-static": "~1.16.2",
+ "setprototypeof": "1.2.0",
+ "statuses": "~2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/express/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/exsolve": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz",
+ "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==",
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/fastq": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
+ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fb-watchman": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "bser": "2.1.1"
+ }
+ },
+ "node_modules/file-type": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz",
+ "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz",
+ "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "~2.0.2",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz",
+ "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.5.tgz",
+ "integrity": "sha512-j23EibVLnp4zNXGW7LjryXYa2X6U/M96yoOX+ybZxwkYajdxRNEqYY3zhh7y0i6kfISKS2jr+EJq1YTUDEv5+w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.4",
+ "mime-types": "^2.1.35"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz",
+ "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/generic-names": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz",
+ "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==",
+ "license": "MIT",
+ "dependencies": {
+ "loader-utils": "^3.2.0"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/global": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
+ "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
+ "license": "MIT",
+ "dependencies": {
+ "min-document": "^2.19.0",
+ "process": "^0.11.10"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "license": "ISC"
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hash-sum": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz",
+ "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
+ "license": "MIT"
+ },
+ "node_modules/hasown": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
+ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/html-encoding-sniffer": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
+ "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "whatwg-encoding": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
+ "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@tootallnate/once": "1",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/icss-replace-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
+ "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==",
+ "license": "ISC"
+ },
+ "node_modules/icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/immutable": {
+ "version": "5.1.9",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz",
+ "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/import-local": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
+ "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/invert-kv": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-3.0.1.tgz",
+ "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/invert-kv?sponsor=1"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.2",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz",
+ "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-function": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
+ "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==",
+ "license": "MIT"
+ },
+ "node_modules/is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/is-what": {
+ "version": "4.1.16",
+ "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz",
+ "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/isbinaryfile": {
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz",
+ "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 18.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/gjtorikian/"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/parser": "^7.14.7",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz",
+ "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest": {
+ "version": "27.0.4",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-27.0.4.tgz",
+ "integrity": "sha512-Px1iKFooXgGSkk1H8dJxxBIrM3tsc5SIuI4kfKYK2J+4rvCvPGr/cXktxh0e9zIPQ5g09kOMNfHQEmusBUf/ZA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/core": "^27.0.4",
+ "import-local": "^3.0.2",
+ "jest-cli": "^27.0.4"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-changed-files": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz",
+ "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "execa": "^5.0.0",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-circus": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz",
+ "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "dedent": "^0.7.0",
+ "expect": "^27.5.1",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-cli": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz",
+ "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/core": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "import-local": "^3.0.2",
+ "jest-config": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "prompts": "^2.0.1",
+ "yargs": "^16.2.0"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-config": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz",
+ "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/core": "^7.8.0",
+ "@jest/test-sequencer": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "babel-jest": "^27.5.1",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.1",
+ "graceful-fs": "^4.2.9",
+ "jest-circus": "^27.5.1",
+ "jest-environment-jsdom": "^27.5.1",
+ "jest-environment-node": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-jasmine2": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-runner": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "parse-json": "^5.2.0",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "peerDependencies": {
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-diff": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz",
+ "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-docblock": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz",
+ "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "detect-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-each": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz",
+ "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-jsdom": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz",
+ "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jsdom": "^16.6.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-environment-node": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz",
+ "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "jest-mock": "^27.5.1",
+ "jest-util": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-get-type": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz",
+ "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-haste-map": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz",
+ "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/graceful-fs": "^4.1.2",
+ "@types/node": "*",
+ "anymatch": "^3.0.3",
+ "fb-watchman": "^2.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-regex-util": "^27.5.1",
+ "jest-serializer": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "micromatch": "^4.0.4",
+ "walker": "^1.0.7"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "^2.3.2"
+ }
+ },
+ "node_modules/jest-jasmine2": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz",
+ "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/source-map": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "expect": "^27.5.1",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "pretty-format": "^27.5.1",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-leak-detector": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz",
+ "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-matcher-utils": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz",
+ "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-message-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz",
+ "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^27.5.1",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^27.5.1",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-mock": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz",
+ "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-pnp-resolver": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+ "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "peerDependencies": {
+ "jest-resolve": "*"
+ },
+ "peerDependenciesMeta": {
+ "jest-resolve": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-regex-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
+ "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-resolve": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz",
+ "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^27.5.1",
+ "jest-validate": "^27.5.1",
+ "resolve": "^1.20.0",
+ "resolve.exports": "^1.1.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-resolve-dependencies": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz",
+ "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-snapshot": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runner": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz",
+ "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/console": "^27.5.1",
+ "@jest/environment": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "emittery": "^0.8.1",
+ "graceful-fs": "^4.2.9",
+ "jest-docblock": "^27.5.1",
+ "jest-environment-jsdom": "^27.5.1",
+ "jest-environment-node": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-leak-detector": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-runtime": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "jest-worker": "^27.5.1",
+ "source-map-support": "^0.5.6",
+ "throat": "^6.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-runtime": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz",
+ "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/environment": "^27.5.1",
+ "@jest/fake-timers": "^27.5.1",
+ "@jest/globals": "^27.5.1",
+ "@jest/source-map": "^27.5.1",
+ "@jest/test-result": "^27.5.1",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "chalk": "^4.0.0",
+ "cjs-module-lexer": "^1.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "execa": "^5.0.0",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-mock": "^27.5.1",
+ "jest-regex-util": "^27.5.1",
+ "jest-resolve": "^27.5.1",
+ "jest-snapshot": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-serializer": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz",
+ "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*",
+ "graceful-fs": "^4.2.9"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz",
+ "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/core": "^7.7.2",
+ "@babel/generator": "^7.7.2",
+ "@babel/plugin-syntax-typescript": "^7.7.2",
+ "@babel/traverse": "^7.7.2",
+ "@babel/types": "^7.0.0",
+ "@jest/transform": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/babel__traverse": "^7.0.4",
+ "@types/prettier": "^2.1.5",
+ "babel-preset-current-node-syntax": "^1.0.0",
+ "chalk": "^4.0.0",
+ "expect": "^27.5.1",
+ "graceful-fs": "^4.2.9",
+ "jest-diff": "^27.5.1",
+ "jest-get-type": "^27.5.1",
+ "jest-haste-map": "^27.5.1",
+ "jest-matcher-utils": "^27.5.1",
+ "jest-message-util": "^27.5.1",
+ "jest-util": "^27.5.1",
+ "natural-compare": "^1.4.0",
+ "pretty-format": "^27.5.1",
+ "semver": "^7.3.2"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jest-util": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
+ "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-util/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/jest-validate": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz",
+ "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^27.5.1",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^27.5.1",
+ "leven": "^3.1.0",
+ "pretty-format": "^27.5.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-validate/node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-watcher": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz",
+ "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jest/test-result": "^27.5.1",
+ "@jest/types": "^27.5.1",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "jest-util": "^27.5.1",
+ "string-length": "^4.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/jimp": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.10.3.tgz",
+ "integrity": "sha512-meVWmDMtyUG5uYjFkmzu0zBgnCvvxwWNi27c4cg55vWNVC9ES4Lcwb+ogx+uBBQE3Q+dLKjXaLl0JVW+nUNwbQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.7.2",
+ "@jimp/custom": "^0.10.3",
+ "@jimp/plugins": "^0.10.3",
+ "@jimp/types": "^0.10.3",
+ "core-js": "^3.4.1",
+ "regenerator-runtime": "^0.13.3"
+ }
+ },
+ "node_modules/jimp/node_modules/regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+ "license": "MIT"
+ },
+ "node_modules/jpeg-js": {
+ "version": "0.3.7",
+ "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.3.7.tgz",
+ "integrity": "sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "3.15.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.1.tgz",
+ "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsdom": {
+ "version": "16.7.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz",
+ "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "abab": "^2.0.5",
+ "acorn": "^8.2.4",
+ "acorn-globals": "^6.0.0",
+ "cssom": "^0.4.4",
+ "cssstyle": "^2.3.0",
+ "data-urls": "^2.0.0",
+ "decimal.js": "^10.2.1",
+ "domexception": "^2.0.1",
+ "escodegen": "^2.0.0",
+ "form-data": "^3.0.0",
+ "html-encoding-sniffer": "^2.0.1",
+ "http-proxy-agent": "^4.0.1",
+ "https-proxy-agent": "^5.0.0",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.0",
+ "parse5": "6.0.1",
+ "saxes": "^5.0.1",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^4.0.0",
+ "w3c-hr-time": "^1.0.2",
+ "w3c-xmlserializer": "^2.0.0",
+ "webidl-conversions": "^6.1.0",
+ "whatwg-encoding": "^1.0.5",
+ "whatwg-mimetype": "^2.3.0",
+ "whatwg-url": "^8.5.0",
+ "ws": "^7.4.6",
+ "xml-name-validator": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "canvas": "^2.5.0"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jsdom/node_modules/ws": {
+ "version": "7.5.13",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.13.tgz",
+ "integrity": "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonc-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz",
+ "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
+ "license": "MIT"
+ },
+ "node_modules/jsonfile": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz",
+ "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lcid": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz",
+ "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==",
+ "license": "MIT",
+ "dependencies": {
+ "invert-kv": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/less": {
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/less/-/less-4.8.1.tgz",
+ "integrity": "sha512-jQ3lRIo1aUtiWVYXZ7mk4+V4BjCGswF3IxTLJ+4RUta8ZiHh8lhkig2G8dya2eCcyR1dYUvzuV46EkJN8PSwww==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "copy-anything": "^3.0.5",
+ "parse-node-version": "^1.0.1"
+ },
+ "bin": {
+ "lessc": "bin/lessc"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "errno": "^0.1.1",
+ "graceful-fs": "^4.1.2",
+ "make-dir": "^5.1.0",
+ "mime": "^1.4.1",
+ "needle": "^3.1.0",
+ "probe-image-size": "^7.2.3",
+ "source-map": "~0.6.0"
+ }
+ },
+ "node_modules/less/node_modules/make-dir": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-5.1.0.tgz",
+ "integrity": "sha512-IfpFq6UM39dUNiphpA6uDezNx/AvWyhwfICWPR3t1VspkgkMZrL+Rk1RbN1bx+aeNYwOrqGJgEgV3yotk+ZUVw==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/less/node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "license": "MIT",
+ "optional": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/licia": {
+ "version": "1.48.1",
+ "resolved": "https://registry.npmjs.org/licia/-/licia-1.48.1.tgz",
+ "integrity": "sha512-euqxHtJMyMOTiEVacSQfPSaHhIuzd9IpuKpQY6V5oj6C3rZs9DxCmegRlbtt2FW9fDdLrQpvKjwXTWglIbypuQ==",
+ "license": "MIT"
+ },
+ "node_modules/lilconfig": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
+ "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz",
+ "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/load-bmfont": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.2.tgz",
+ "integrity": "sha512-qElWkmjW9Oq1F9EI5Gt7aD9zcdHb9spJCW1L/dmPf7KzCCEJxq8nhHz5eCgI9aMf7vrG/wyaCqdsI+Iy9ZTlog==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-equal": "0.0.1",
+ "mime": "^1.3.4",
+ "parse-bmfont-ascii": "^1.0.3",
+ "parse-bmfont-binary": "^1.0.5",
+ "parse-bmfont-xml": "^1.1.4",
+ "phin": "^3.7.1",
+ "xhr": "^2.0.1",
+ "xtend": "^4.0.0"
+ }
+ },
+ "node_modules/load-bmfont/node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/load-bmfont/node_modules/phin": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/phin/-/phin-3.7.1.tgz",
+ "integrity": "sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+ "license": "MIT",
+ "dependencies": {
+ "centra": "^2.7.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz",
+ "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/local-pkg": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz",
+ "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "mlly": "^1.7.4",
+ "pkg-types": "^2.3.0",
+ "quansync": "^0.2.11"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/local-pkg/node_modules/confbox": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz",
+ "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==",
+ "license": "MIT"
+ },
+ "node_modules/local-pkg/node_modules/pkg-types": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz",
+ "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==",
+ "license": "MIT",
+ "dependencies": {
+ "confbox": "^0.2.4",
+ "exsolve": "^1.0.8",
+ "pathe": "^2.0.3"
+ }
+ },
+ "node_modules/localstorage-polyfill": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/localstorage-polyfill/-/localstorage-polyfill-1.0.1.tgz",
+ "integrity": "sha512-m4iHVZxFH5734oQcPKU08025gIz2+4bjWR9lulP8ZYxEJR0BpA0w32oJmkzh8y3UI9ci7xCBehQDc3oA1X+VHw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/makeerror": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "tmpl": "1.0.5"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/meow": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
+ "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz",
+ "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==",
+ "license": "MIT"
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/micromatch/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/mime": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
+ "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/min-document": {
+ "version": "2.19.2",
+ "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.2.tgz",
+ "integrity": "sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==",
+ "license": "MIT",
+ "dependencies": {
+ "dom-walk": "^0.1.0"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/mlly": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz",
+ "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.16.0",
+ "pathe": "^2.0.3",
+ "pkg-types": "^1.3.1",
+ "ufo": "^1.6.3"
+ }
+ },
+ "node_modules/module-alias": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.3.4.tgz",
+ "integrity": "sha512-bOclZt8hkpuGgSSoG07PKmvzTizROilUTvLNyrMqvlC9snhs7y7GzjNWAVbISIOlhCP1T14rH1PDAV9iNyBq/w==",
+ "license": "MIT"
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.18",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz",
+ "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/needle": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/needle/-/needle-3.5.0.tgz",
+ "integrity": "sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "iconv-lite": "^0.6.3",
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "needle": "bin/needle"
+ },
+ "engines": {
+ "node": ">= 4.4.x"
+ }
+ },
+ "node_modules/needle/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/node-addon-api": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.53",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz",
+ "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nwsapi": {
+ "version": "2.2.24",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.24.tgz",
+ "integrity": "sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/omggif": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz",
+ "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==",
+ "license": "MIT"
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/os-locale-s-fix": {
+ "version": "1.0.8-fix-1",
+ "resolved": "https://registry.npmjs.org/os-locale-s-fix/-/os-locale-s-fix-1.0.8-fix-1.tgz",
+ "integrity": "sha512-Sv0OvhPiMutICiwORAUefv02DCPb62IelBmo8ZsSrRHyI3FStqIWZvjqDkvtjU+lcujo7UNir+dCwKSqlEQ/5w==",
+ "license": "MIT",
+ "dependencies": {
+ "lcid": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "yarn": "^1.22.4"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+ "license": "(MIT AND Zlib)"
+ },
+ "node_modules/parse-bmfont-ascii": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz",
+ "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==",
+ "license": "MIT"
+ },
+ "node_modules/parse-bmfont-binary": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz",
+ "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==",
+ "license": "MIT"
+ },
+ "node_modules/parse-bmfont-xml": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.6.tgz",
+ "integrity": "sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==",
+ "license": "MIT",
+ "dependencies": {
+ "xml-parse-from-string": "^1.0.0",
+ "xml2js": "^0.5.0"
+ }
+ },
+ "node_modules/parse-css-font": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-css-font/-/parse-css-font-4.0.0.tgz",
+ "integrity": "sha512-lnY7dTUfjRXsSo5G5C639L8RaBBaVSgL+5hacIFKsNHzeCJQ5SFSZv1DZmc7+wZv/22PFGOq2YbaEHLdaCS/mQ==",
+ "license": "MIT",
+ "dependencies": {
+ "css-font-size-keywords": "^1.0.0",
+ "css-font-stretch-keywords": "^1.0.1",
+ "css-font-style-keywords": "^1.0.1",
+ "css-font-weight-keywords": "^1.0.0",
+ "css-list-helpers": "^2.0.0",
+ "css-system-font-keywords": "^1.0.0",
+ "unquote": "^1.1.1"
+ }
+ },
+ "node_modules/parse-headers": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.6.tgz",
+ "integrity": "sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==",
+ "license": "MIT"
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse-json/node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/parse-node-version": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
+ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+ "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "license": "MIT"
+ },
+ "node_modules/path-to-regexp": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz",
+ "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "license": "MIT"
+ },
+ "node_modules/phin": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz",
+ "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
+ "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pixelmatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz",
+ "integrity": "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==",
+ "license": "ISC",
+ "dependencies": {
+ "pngjs": "^3.0.0"
+ },
+ "bin": {
+ "pixelmatch": "bin/pixelmatch"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-types": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
+ "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "confbox": "^0.1.8",
+ "mlly": "^1.7.4",
+ "pathe": "^2.0.1"
+ }
+ },
+ "node_modules/pngjs": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
+ "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.26",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz",
+ "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.17",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
+ "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
+ "license": "MIT",
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-load-config": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
+ "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
+ "license": "MIT",
+ "dependencies": {
+ "lilconfig": "^2.0.5",
+ "yaml": "^1.10.2"
+ },
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": ">=8.0.9",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-modules": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz",
+ "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "generic-names": "^4.0.0",
+ "icss-replace-symbols": "^1.1.0",
+ "lodash.camelcase": "^4.3.0",
+ "postcss-modules-extract-imports": "^3.0.0",
+ "postcss-modules-local-by-default": "^4.0.0",
+ "postcss-modules-scope": "^3.0.0",
+ "postcss-modules-values": "^4.0.0",
+ "string-hash": "^1.1.1"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-modules-extract-imports": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz",
+ "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==",
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz",
+ "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==",
+ "license": "MIT",
+ "dependencies": {
+ "icss-utils": "^5.0.0",
+ "postcss-selector-parser": "^7.0.0",
+ "postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": {
+ "version": "7.1.5",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz",
+ "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-modules-scope": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz",
+ "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==",
+ "license": "ISC",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": {
+ "version": "7.1.5",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz",
+ "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-modules-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+ "license": "ISC",
+ "dependencies": {
+ "icss-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz",
+ "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "license": "MIT"
+ },
+ "node_modules/pretty-format": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
+ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/probe-image-size": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.3.0.tgz",
+ "integrity": "sha512-7CaDeBwiAbh6ohXsvLbAZhO7wzsZAmaevfxe39qvCwRh8LyaZfDlBGGLU1CCTgrTLtCOdwBBhjOrIHaIIimHfQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodeca"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "lodash.merge": "^4.6.2",
+ "needle": "^2.5.2",
+ "stream-parser": "~0.3.1"
+ }
+ },
+ "node_modules/probe-image-size/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/probe-image-size/node_modules/needle": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz",
+ "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "debug": "^3.2.6",
+ "iconv-lite": "^0.4.4",
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "needle": "bin/needle"
+ },
+ "engines": {
+ "node": ">= 4.4.x"
+ }
+ },
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/psl": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
+ "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "punycode": "^2.3.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/lupomontero"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qrcode-reader": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/qrcode-reader/-/qrcode-reader-1.0.4.tgz",
+ "integrity": "sha512-rRjALGNh9zVqvweg1j5OKIQKNsw3bLC+7qwlnead5K/9cb1cEIAGkwikt/09U0K+2IDWGD9CC6SP7tHAjUeqvQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/qrcode-terminal": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz",
+ "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==",
+ "bin": {
+ "qrcode-terminal": "bin/qrcode-terminal.js"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.15.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz",
+ "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "es-define-property": "^1.0.1",
+ "side-channel": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/quansync": {
+ "version": "0.2.11",
+ "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz",
+ "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/antfu"
+ },
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
+ "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "~3.1.2",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.4.24",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "license": "MIT",
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/readdirp/node_modules/picomatch": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz",
+ "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/regexpu-core": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz",
+ "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.2.2",
+ "regjsgen": "^0.8.0",
+ "regjsparser": "^0.13.0",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/regjsparser": {
+ "version": "0.13.2",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.2.tgz",
+ "integrity": "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "jsesc": "~3.1.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/resolve": {
+ "version": "1.22.12",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz",
+ "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "is-core-module": "^2.16.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve.exports": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz",
+ "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.62.4",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz",
+ "integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.9"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@napi-rs/lzma-linux-x64-gnu": "1.5.1",
+ "@rollup/rollup-android-arm-eabi": "4.62.4",
+ "@rollup/rollup-android-arm64": "4.62.4",
+ "@rollup/rollup-darwin-arm64": "4.62.4",
+ "@rollup/rollup-darwin-x64": "4.62.4",
+ "@rollup/rollup-freebsd-arm64": "4.62.4",
+ "@rollup/rollup-freebsd-x64": "4.62.4",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.62.4",
+ "@rollup/rollup-linux-arm-musleabihf": "4.62.4",
+ "@rollup/rollup-linux-arm64-gnu": "4.62.4",
+ "@rollup/rollup-linux-arm64-musl": "4.62.4",
+ "@rollup/rollup-linux-loong64-gnu": "4.62.4",
+ "@rollup/rollup-linux-loong64-musl": "4.62.4",
+ "@rollup/rollup-linux-ppc64-gnu": "4.62.4",
+ "@rollup/rollup-linux-ppc64-musl": "4.62.4",
+ "@rollup/rollup-linux-riscv64-gnu": "4.62.4",
+ "@rollup/rollup-linux-riscv64-musl": "4.62.4",
+ "@rollup/rollup-linux-s390x-gnu": "4.62.4",
+ "@rollup/rollup-linux-x64-gnu": "4.62.4",
+ "@rollup/rollup-linux-x64-musl": "4.62.4",
+ "@rollup/rollup-openbsd-x64": "4.62.4",
+ "@rollup/rollup-openharmony-arm64": "4.62.4",
+ "@rollup/rollup-win32-arm64-msvc": "4.62.4",
+ "@rollup/rollup-win32-ia32-msvc": "4.62.4",
+ "@rollup/rollup-win32-x64-gnu": "4.62.4",
+ "@rollup/rollup-win32-x64-msvc": "4.62.4",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-area-insets": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/safe-area-insets/-/safe-area-insets-1.4.1.tgz",
+ "integrity": "sha512-r/nRWTjFGhhm3w1Z6Kd/jY11srN+lHt2mNl1E/emQGW8ic7n3Avu4noibklfSM+Y34peNphHD/BSZecav0sXYQ==",
+ "license": "ISC"
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/sass": {
+ "version": "1.102.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.102.0.tgz",
+ "integrity": "sha512-NSOyTnaQF7rTAEOtI2fwb386vL+akyiQLBZu8Na7hXCb+umJy0GAqlcMIaqACZ6Z1VgTBS4K9PG6B3IdjHGJsw==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "chokidar": "^5.0.0",
+ "immutable": "^5.1.5",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=20.19.0"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher": "^2.4.1"
+ }
+ },
+ "node_modules/sass/node_modules/chokidar": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
+ "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/sass/node_modules/readdirp": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz",
+ "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20.19.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz",
+ "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=11.0.0"
+ }
+ },
+ "node_modules/saxes": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
+ "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "xmlchars": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/scule": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz",
+ "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz",
+ "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "~0.5.2",
+ "http-errors": "~2.0.1",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "~2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "~2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/send/node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "1.16.3",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz",
+ "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "~0.19.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz",
+ "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4",
+ "side-channel-list": "^1.0.1",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
+ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true
+ },
+ "node_modules/stack-utils": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "escape-string-regexp": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/stream-parser": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz",
+ "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "debug": "2"
+ }
+ },
+ "node_modules/stream-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/stream-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/string-hash": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz",
+ "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-literal": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz",
+ "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^9.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/strip-literal/node_modules/js-tokens": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
+ "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
+ "license": "MIT"
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-hyperlinks": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
+ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/systemjs": {
+ "version": "6.15.1",
+ "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.15.1.tgz",
+ "integrity": "sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tapable": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
+ "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/terminal-link": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
+ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-escapes": "^4.2.1",
+ "supports-hyperlinks": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.49.2",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.49.2.tgz",
+ "integrity": "sha512-rGbJiKeQ4WDe3EXlDAIaQcwftVfv2Q8o1awFNfvXolJYKkb1AuZY1RTOmqx4LJXZENbWZA7eIsYGHuEzHsi1nQ==",
+ "devOptional": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.15.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/throat": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz",
+ "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/timm": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz",
+ "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==",
+ "license": "MIT"
+ },
+ "node_modules/tinycolor2": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
+ "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==",
+ "license": "MIT"
+ },
+ "node_modules/tmpl": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/tough-cookie": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
+ "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.2.0",
+ "url-parse": "^1.5.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tough-cookie/node_modules/universalify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
+ "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/ufo": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz",
+ "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==",
+ "license": "MIT"
+ },
+ "node_modules/undici-types": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+ "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz",
+ "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz",
+ "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unimport": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/unimport/-/unimport-4.1.1.tgz",
+ "integrity": "sha512-j9+fijH6aDd05yv1fXlyt7HSxtOWtGtrZeYTVBsSUg57Iuf+Ps2itIZjeyu7bEQ4k0WOgYhHrdW8m/pJgOpl5g==",
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "escape-string-regexp": "^5.0.0",
+ "estree-walker": "^3.0.3",
+ "fast-glob": "^3.3.3",
+ "local-pkg": "^1.0.0",
+ "magic-string": "^0.30.17",
+ "mlly": "^1.7.4",
+ "pathe": "^2.0.2",
+ "picomatch": "^4.0.2",
+ "pkg-types": "^1.3.1",
+ "scule": "^1.3.0",
+ "strip-literal": "^3.0.0",
+ "unplugin": "^2.1.2",
+ "unplugin-utils": "^0.2.3"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ }
+ },
+ "node_modules/unimport/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/unimport/node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/unplugin": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz",
+ "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.5",
+ "acorn": "^8.15.0",
+ "picomatch": "^4.0.3",
+ "webpack-virtual-modules": "^0.6.2"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ }
+ },
+ "node_modules/unplugin-utils": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.2.5.tgz",
+ "integrity": "sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==",
+ "license": "MIT",
+ "dependencies": {
+ "pathe": "^2.0.3",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ },
+ "node_modules/unquote": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
+ "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==",
+ "license": "MIT"
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz",
+ "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "node_modules/utif": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz",
+ "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==",
+ "license": "MIT",
+ "dependencies": {
+ "pako": "^1.0.5"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/v8-to-istanbul": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz",
+ "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^1.6.0",
+ "source-map": "^0.7.3"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/v8-to-istanbul/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/v8-to-istanbul/node_modules/source-map": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz",
+ "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/vite": {
+ "version": "5.4.21",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
+ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.43",
+ "rollup": "^4.20.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/aix-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/android-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/android-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/android-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/darwin-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/darwin-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/freebsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-loong64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-mips64el": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-riscv64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-s390x": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/netbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/openbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/sunos-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/win32-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/win32-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/win32-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite/node_modules/esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "node_modules/vue": {
+ "version": "3.4.21",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz",
+ "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.4.21",
+ "@vue/compiler-sfc": "3.4.21",
+ "@vue/runtime-dom": "3.4.21",
+ "@vue/server-renderer": "3.4.21",
+ "@vue/shared": "3.4.21"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/w3c-hr-time": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+ "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+ "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "browser-process-hrtime": "^1.0.0"
+ }
+ },
+ "node_modules/w3c-xmlserializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
+ "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "xml-name-validator": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "makeerror": "1.0.12"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
+ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
+ "engines": {
+ "node": ">=10.4"
+ }
+ },
+ "node_modules/webpack-virtual-modules": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
+ "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
+ "license": "MIT"
+ },
+ "node_modules/whatwg-encoding": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
+ "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+ "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "iconv-lite": "0.4.24"
+ }
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
+ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/whatwg-url": {
+ "version": "8.7.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
+ "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "lodash": "^4.7.0",
+ "tr46": "^2.1.0",
+ "webidl-conversions": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true
+ },
+ "node_modules/write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "node_modules/ws": {
+ "version": "8.21.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz",
+ "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xhr": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz",
+ "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==",
+ "license": "MIT",
+ "dependencies": {
+ "global": "~4.4.0",
+ "is-function": "^1.0.1",
+ "parse-headers": "^2.0.0",
+ "xtend": "^4.0.0"
+ }
+ },
+ "node_modules/xml-name-validator": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
+ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true
+ },
+ "node_modules/xml-parse-from-string": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz",
+ "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==",
+ "license": "MIT"
+ },
+ "node_modules/xml2js": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz",
+ "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
+ "license": "MIT",
+ "dependencies": {
+ "sax": ">=0.6.0",
+ "xmlbuilder": "~11.0.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/xmlbuilder": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/xmlhttprequest": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
+ "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/xregexp": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-3.1.0.tgz",
+ "integrity": "sha512-4Y1x6DyB8xRoxosooa6PlGWqmmSKatbzhrftZ7Purmm4B8R4qIEJG1A2hZsdz5DhmIqS0msC0I7KEq93GphEVg==",
+ "license": "MIT"
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "license": "ISC"
+ },
+ "node_modules/yaml": {
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz",
+ "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "16.2.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.2.tgz",
+ "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ }
+ }
+ }
+}
diff --git a/TongjiUniApp/package.json b/TongjiUniApp/package.json
new file mode 100644
index 000000000..025e4ec00
--- /dev/null
+++ b/TongjiUniApp/package.json
@@ -0,0 +1,55 @@
+{
+ "name": "tongji-uniapp",
+ "version": "1.0.0",
+ "description": "Tongji blood-sugar uni-app extracted from TUICallKit-Vue3",
+ "main": "main.js",
+ "scripts": {
+ "dev:mp-weixin": "cross-env UNI_INPUT_DIR=. uni -p mp-weixin",
+ "dev:h5": "cross-env UNI_INPUT_DIR=. uni",
+ "dev:app": "cross-env UNI_INPUT_DIR=. uni -p app",
+ "build:mp-weixin": "cross-env UNI_INPUT_DIR=. uni build -p mp-weixin",
+ "build:h5": "cross-env UNI_INPUT_DIR=. uni build",
+ "build:app": "cross-env UNI_INPUT_DIR=. uni build -p app"
+ },
+ "keywords": [
+ "uniapp",
+ "tongji"
+ ],
+ "author": "",
+ "license": "ISC",
+ "dependencies": {
+ "@dcloudio/uni-app": "3.0.0-4060620250520001",
+ "@dcloudio/uni-app-harmony": "3.0.0-4060620250520001",
+ "@dcloudio/uni-app-plus": "3.0.0-4060620250520001",
+ "@dcloudio/uni-components": "3.0.0-4060620250520001",
+ "@dcloudio/uni-h5": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-alipay": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-baidu": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-jd": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-kuaishou": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-lark": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-qq": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-toutiao": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-weixin": "3.0.0-4060620250520001",
+ "@dcloudio/uni-mp-xhs": "3.0.0-4060620250520001",
+ "@dcloudio/uni-quickapp-webview": "3.0.0-4060620250520001",
+ "vue": "^3.4.21"
+ },
+ "devDependencies": {
+ "@dcloudio/types": "^3.4.8",
+ "@dcloudio/uni-automator": "3.0.0-4060620250520001",
+ "@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
+ "@dcloudio/uni-stacktracey": "3.0.0-4060620250520001",
+ "@dcloudio/vite-plugin-uni": "3.0.0-4060620250520001",
+ "@types/node": "^20.11.0",
+ "@vue/runtime-core": "^3.4.21",
+ "cross-env": "^7.0.3",
+ "less": "^4.6.4",
+ "sass": "^1.77.8",
+ "typescript": "^5.4.0",
+ "vite": "^5.2.8"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+}
diff --git a/TongjiUniApp/pages.json b/TongjiUniApp/pages.json
new file mode 100644
index 000000000..9e2d131a6
--- /dev/null
+++ b/TongjiUniApp/pages.json
@@ -0,0 +1,157 @@
+{
+ "pages": [
+ {
+ "path": "tongji/pages/weekly",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTitleText": "血糖管理",
+ "backgroundColor": "#f4fbf4",
+ "enablePullDownRefresh": true,
+ "mp-weixin": {
+ "usingPlugins": {
+ "WechatSI": {
+ "version": "0.3.5",
+ "provider": "wx069ba97219f66d99"
+ }
+ }
+ }
+ }
+ },
+ {
+ "path": "pages/user/user",
+ "style": {
+ "navigationBarTitleText": "我的",
+ "backgroundColor": "#e8eaed",
+ "backgroundColorTop": "#e8eaed"
+ }
+ },
+ {
+ "path": "pages/user/userinfo",
+ "style": {
+ "navigationBarTitleText": "个人资料"
+ }
+ },
+ {
+ "path": "pages/Card/Card",
+ "style": {
+ "navigationBarTitleText": "就诊卡"
+ }
+ },
+ {
+ "path": "pages/Card/edit_card",
+ "style": {
+ "navigationBarTitleText": "修改就诊卡"
+ }
+ },
+ {
+ "path": "pages/Card/contact",
+ "style": {
+ "navigationBarTitleText": "服务"
+ }
+ },
+ {
+ "path": "tongji/pages/index",
+ "style": {
+ "navigationBarTitleText": "血糖记录",
+ "navigationBarBackgroundColor": "#204e2b",
+ "navigationBarTextStyle": "white",
+ "backgroundColor": "#faf9f5",
+ "enablePullDownRefresh": true,
+ "mp-weixin": {
+ "usingPlugins": {
+ "WechatSI": {
+ "version": "0.3.5",
+ "provider": "wx069ba97219f66d99"
+ }
+ }
+ }
+ }
+ },
+ {
+ "path": "tongji/pages/more",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTitleText": "日常护理",
+ "backgroundColor": "#f4fbf4",
+ "enablePullDownRefresh": true,
+ "mp-weixin": {
+ "usingPlugins": {
+ "WechatSI": {
+ "version": "0.3.5",
+ "provider": "wx069ba97219f66d99"
+ }
+ }
+ }
+ }
+ },
+ {
+ "path": "tongji/endless-game/index",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTitleText": "识糖小课堂",
+ "backgroundColor": "#eefbf4",
+ "disableScroll": false,
+ "enableShareAppMessage": true,
+ "enableShareTimeline": true
+ }
+ }
+ ],
+ "subPackages": [
+ {
+ "root": "training",
+ "pages": [
+ {
+ "path": "pages/grip-ring",
+ "style": {
+ "navigationBarTitleText": "握力环训练",
+ "navigationBarBackgroundColor": "#f8fafc",
+ "navigationBarTextStyle": "black",
+ "backgroundColor": "#f8fafc"
+ }
+ },
+ {
+ "path": "pages/pilates-ring",
+ "style": {
+ "navigationBarTitleText": "瑜伽环训练",
+ "navigationBarBackgroundColor": "#f8fafc",
+ "navigationBarTextStyle": "black",
+ "backgroundColor": "#f8fafc"
+ }
+ },
+ {
+ "path": "pages/foot-pedal",
+ "style": {
+ "navigationBarTitleText": "脚蹬器训练",
+ "navigationBarBackgroundColor": "#f8fafc",
+ "navigationBarTextStyle": "black",
+ "backgroundColor": "#f8fafc"
+ }
+ },
+ {
+ "path": "pages/dumbbell",
+ "style": {
+ "navigationBarTitleText": "哑铃训练",
+ "navigationBarBackgroundColor": "#f8fafc",
+ "navigationBarTextStyle": "black",
+ "backgroundColor": "#f8fafc"
+ }
+ },
+ {
+ "path": "pages/metronome",
+ "style": {
+ "navigationBarTitleText": "耗糖节拍器",
+ "navigationBarBackgroundColor": "#f8fafc",
+ "navigationBarTextStyle": "black",
+ "backgroundColor": "#f8fafc"
+ }
+ }
+ ]
+ }
+ ],
+ "globalStyle": {
+ "navigationBarTextStyle": "black",
+ "navigationBarTitleText": "甄养堂血糖管理",
+ "navigationBarBackgroundColor": "#F8F8F8",
+ "backgroundColor": "#F8F8F8"
+ }
+}
diff --git a/TongjiUniApp/pages/Card/Card.vue b/TongjiUniApp/pages/Card/Card.vue
new file mode 100644
index 000000000..4e3d38149
--- /dev/null
+++ b/TongjiUniApp/pages/Card/Card.vue
@@ -0,0 +1,455 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 患者姓名:
+ {{ card.patient_name || '-' }}
+
+
+ 性别年龄:
+ {{ card.gender_desc || '-' }} / {{ card.age }}岁
+
+
+ 诊断类型:
+ {{ getDiagnosisTypeName(card.diagnosis_type) }}
+
+
+ 证型:
+ {{ getSyndromeTypeName(card.syndrome_type) }}
+
+
+
+
+
+
+
+
+
+ 📈
+ 日常记录
+
+
+ 📝
+ 查看 / 编辑
+
+
+
+
+
+
+
+ 暂无就诊卡
+ 新建就诊卡
+
+
+
+
+ 加载中...
+
+
+
+
+
+
+
+
diff --git a/TongjiUniApp/pages/Card/contact.vue b/TongjiUniApp/pages/Card/contact.vue
new file mode 100644
index 000000000..34183e3b1
--- /dev/null
+++ b/TongjiUniApp/pages/Card/contact.vue
@@ -0,0 +1,287 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TongjiUniApp/pages/Card/edit_card.vue b/TongjiUniApp/pages/Card/edit_card.vue
new file mode 100644
index 000000000..16913b697
--- /dev/null
+++ b/TongjiUniApp/pages/Card/edit_card.vue
@@ -0,0 +1,2462 @@
+
+
+
+
+
+
+ 加载中...
+
+
+
+
+
+
+ 填写就诊人信息
+
+
+
+
+ 姓名:
+
+
+
+ *性别:
+
+
+ {{ formData.gender === 1 ? '✓' : '' }}
+ 男
+
+
+ {{ formData.gender === 0 ? '✓' : '' }}
+ 女
+
+
+
+
+
+
+
+ 证件类型:
+ 身份证号
+
+
+
+
+
+ 证件号码:
+
+
+
+ 年龄:
+
+
+
+
+ 仅自己可见,会隐藏保护
+
+
+
+
+
+
+
+
+ *就诊人体重:
+
+ KG(千克)
+
+
+
+
+ *就诊人身高:
+
+ CM(厘米)
+
+
+
+
+ 就诊人血压(高压):
+
+ mmHg
+
+
+
+
+ 就诊人血压(低压):
+
+ mmHg
+
+
+
+
+ *空腹血糖:
+
+ mmol/L
+
+
+
+
+
+
+
+ 1、
+ *发现糖尿病患病史
+
+
+
+
+
+
+ 2、
+ *当地医院诊断结果
+
+
+
+ 糖尿病
+
+
+ 消渴病
+
+
+
+
+ 糖尿病前期
+
+
+
+
+
+
+
+ 3、
+ *当地就诊医院名称
+
+
+
+
+
+
+
+ 4、
+ *当地医院就诊时间
+
+
+ 🕐
+ {{ formData.local_hospital_visit_date || '请选择确诊时间' }}
+ ›
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 5、
+ 口腔感觉
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ 6、
+ 饮食情况
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ 7、
+ 每日饮水量
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ 8、
+ 体重变化
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ 9、
+ 脂肪肝程度
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ 10、
+ 肢体感觉
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ 11、
+ 睡眠情况
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ 12、
+ 眼睛情况
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ 13、
+ 头部感觉
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ 14、
+ 出汗情况
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ 15、
+ 皮肤情况
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ 16、
+ 小便情况
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ 17、
+ 大便情况
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ 18、
+ 腰肾情况
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+ 20、
+ 既往史
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+ 21、
+ 外伤史
+
+
+
+ 有
+
+
+ 无
+
+
+
+
+
+
+
+ 22、
+ 手术史
+
+
+
+ 有
+
+
+ 无
+
+
+
+
+
+
+
+ 23、
+ 过敏史
+
+
+
+ 有
+
+
+ 无
+
+
+
+
+
+
+
+ 24、
+ 家族病史
+
+
+
+ 有
+
+
+ 无
+
+
+
+
+
+
+ 25、
+ 妊娠哺乳史
+
+
+
+ 有
+
+
+ 无
+
+
+
+
+
+
+
+
+
+ 26、
+ 舌苔照片
+
+
+
+
+
+
+
+ 预览
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 27、
+ 检查报告
+
+ 请上传线下就诊检查报告、病历、彩超等彩像科检查图片
+
+
+
+
+
+
+ 预览
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 备注
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 是
+
+
+
+
+
+ 否
+
+
+ 我已阅读并同意
+ 《互联网诊疗知情同意书》
+ 及
+ 《中药委托加工和配送协议》
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ year }}
+
+
+ {{ String(month).padStart(2, '0') }}
+
+
+ {{ String(day).padStart(2, '0') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/TongjiUniApp/pages/user/user.vue b/TongjiUniApp/pages/user/user.vue
new file mode 100644
index 000000000..d5e7e1977
--- /dev/null
+++ b/TongjiUniApp/pages/user/user.vue
@@ -0,0 +1,426 @@
+
+
+
+
+
+
+
+ {{ userInfo.balance || 0 }}
+ 钱包(元)
+
+
+ {{ userInfo.points || 0 }}
+ 积分
+
+
+ {{ userInfo.coupons || 0 }}
+ 优惠券
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ item.name }}
+
+
+ {{ item.desc }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TongjiUniApp/pages/user/userinfo.vue b/TongjiUniApp/pages/user/userinfo.vue
new file mode 100644
index 000000000..2077f1329
--- /dev/null
+++ b/TongjiUniApp/pages/user/userinfo.vue
@@ -0,0 +1,495 @@
+
+
+
+
+
+
+
+ 加载中...
+
+
+
+
+
+
+
+ 头像
+
+
+
+
+ 更换头像
+
+
+
+
+
+
+
+ 基本信息
+
+
+
+ 昵称
+
+
+
+
+ 性别
+
+
+ 男
+
+
+ 女
+
+
+
+
+
+ 年龄
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TongjiUniApp/static/RTCCallEngine.wasm.br b/TongjiUniApp/static/RTCCallEngine.wasm.br
new file mode 100644
index 000000000..a2f16946f
Binary files /dev/null and b/TongjiUniApp/static/RTCCallEngine.wasm.br differ
diff --git a/TongjiUniApp/static/background.svg b/TongjiUniApp/static/background.svg
new file mode 100644
index 000000000..05e741c88
--- /dev/null
+++ b/TongjiUniApp/static/background.svg
@@ -0,0 +1,19 @@
+
+
\ No newline at end of file
diff --git a/TongjiUniApp/static/calling-logo.png b/TongjiUniApp/static/calling-logo.png
new file mode 100644
index 000000000..dc6d12604
Binary files /dev/null and b/TongjiUniApp/static/calling-logo.png differ
diff --git a/TongjiUniApp/static/check.png b/TongjiUniApp/static/check.png
new file mode 100644
index 000000000..c4c5a0aec
Binary files /dev/null and b/TongjiUniApp/static/check.png differ
diff --git a/TongjiUniApp/static/images/my/after-sale.png b/TongjiUniApp/static/images/my/after-sale.png
new file mode 100644
index 000000000..ee73b0e63
Binary files /dev/null and b/TongjiUniApp/static/images/my/after-sale.png differ
diff --git a/TongjiUniApp/static/images/my/delivery.png b/TongjiUniApp/static/images/my/delivery.png
new file mode 100644
index 000000000..37b618a95
Binary files /dev/null and b/TongjiUniApp/static/images/my/delivery.png differ
diff --git a/TongjiUniApp/static/images/my/payment.png b/TongjiUniApp/static/images/my/payment.png
new file mode 100644
index 000000000..dc4462e96
Binary files /dev/null and b/TongjiUniApp/static/images/my/payment.png differ
diff --git a/TongjiUniApp/static/images/my/review.png b/TongjiUniApp/static/images/my/review.png
new file mode 100644
index 000000000..4987f0230
Binary files /dev/null and b/TongjiUniApp/static/images/my/review.png differ
diff --git a/TongjiUniApp/static/images/my/shipping.png b/TongjiUniApp/static/images/my/shipping.png
new file mode 100644
index 000000000..2b313004c
Binary files /dev/null and b/TongjiUniApp/static/images/my/shipping.png differ
diff --git a/TongjiUniApp/static/user/home.png b/TongjiUniApp/static/user/home.png
new file mode 100644
index 000000000..bda58485f
Binary files /dev/null and b/TongjiUniApp/static/user/home.png differ
diff --git a/TongjiUniApp/static/user/home_no.png b/TongjiUniApp/static/user/home_no.png
new file mode 100644
index 000000000..fede2f9a3
Binary files /dev/null and b/TongjiUniApp/static/user/home_no.png differ
diff --git a/TongjiUniApp/static/user/user.png b/TongjiUniApp/static/user/user.png
new file mode 100644
index 000000000..daf99420b
Binary files /dev/null and b/TongjiUniApp/static/user/user.png differ
diff --git a/TongjiUniApp/static/user/user_no.png b/TongjiUniApp/static/user/user_no.png
new file mode 100644
index 000000000..a2a035458
Binary files /dev/null and b/TongjiUniApp/static/user/user_no.png differ
diff --git a/TongjiUniApp/static/wjw.png b/TongjiUniApp/static/wjw.png
new file mode 100644
index 000000000..92bbf2376
Binary files /dev/null and b/TongjiUniApp/static/wjw.png differ
diff --git a/TongjiUniApp/static/ys.png b/TongjiUniApp/static/ys.png
new file mode 100644
index 000000000..1620b686c
Binary files /dev/null and b/TongjiUniApp/static/ys.png differ
diff --git a/TongjiUniApp/static/yy.png b/TongjiUniApp/static/yy.png
new file mode 100644
index 000000000..9b3894f16
Binary files /dev/null and b/TongjiUniApp/static/yy.png differ
diff --git a/TongjiUniApp/static/zs.jpg b/TongjiUniApp/static/zs.jpg
new file mode 100644
index 000000000..00b3336ad
Binary files /dev/null and b/TongjiUniApp/static/zs.jpg differ
diff --git a/TongjiUniApp/tongji/components/CelebrateBurst.vue b/TongjiUniApp/tongji/components/CelebrateBurst.vue
new file mode 100644
index 000000000..5132d64ea
--- /dev/null
+++ b/TongjiUniApp/tongji/components/CelebrateBurst.vue
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+ {{ title }}
+ {{ subtitle }}
+
+
+
+
+
+
+
diff --git a/TongjiUniApp/tongji/components/SugarTreeGraphic.vue b/TongjiUniApp/tongji/components/SugarTreeGraphic.vue
new file mode 100644
index 000000000..47a3b09ec
--- /dev/null
+++ b/TongjiUniApp/tongji/components/SugarTreeGraphic.vue
@@ -0,0 +1,199 @@
+
+
+
+
+
+ {{ treeEmoji }}
+
+
+
+
+
+
+
+
+
diff --git a/TongjiUniApp/tongji/components/TongjiIcon.vue b/TongjiUniApp/tongji/components/TongjiIcon.vue
new file mode 100644
index 000000000..f8138a2ae
--- /dev/null
+++ b/TongjiUniApp/tongji/components/TongjiIcon.vue
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/TongjiUniApp/tongji/components/VoiceSpeakMascot.vue b/TongjiUniApp/tongji/components/VoiceSpeakMascot.vue
new file mode 100644
index 000000000..9464bed9a
--- /dev/null
+++ b/TongjiUniApp/tongji/components/VoiceSpeakMascot.vue
@@ -0,0 +1,189 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TongjiUniApp/tongji/composables/useBloodCareAi.js b/TongjiUniApp/tongji/composables/useBloodCareAi.js
new file mode 100644
index 000000000..7e2cfcf8a
--- /dev/null
+++ b/TongjiUniApp/tongji/composables/useBloodCareAi.js
@@ -0,0 +1,203 @@
+import { ref, computed } from 'vue'
+import { requestAiStream, parsePartialBloodCarePlainText } from '../utils/aiStreamRequest.js'
+
+const emptyBloodCarePlan = () => ({
+ summary: '',
+ blood_advice: '',
+ tcm_plan: '',
+ watch_points: [],
+ next_steps: '',
+ control_level: '',
+ control_label: '',
+ disclaimer: '',
+ analysis: [],
+ source: '',
+ date: ''
+})
+
+/** AI 血糖照护建议(累计 7 天有记录后) */
+export function useBloodCareAi(proxy, { diagnosisId, chartUseMockData, showUserToast, formatUserMessage }) {
+ const bloodCarePlan = ref(emptyBloodCarePlan())
+ const bloodCareLoading = ref(false)
+ const bloodCareStreaming = ref(false)
+ const bloodCareStreamField = ref('')
+ let careStreamBuffer = ''
+ /** 用户点击后才展开照护建议卡片 */
+ const bloodCarePanelOpen = ref(false)
+
+ const bloodCareEligible = computed(() => {
+ return !!diagnosisId.value && !chartUseMockData.value
+ })
+
+ const hasBloodCareContent = computed(() => {
+ const p = bloodCarePlan.value
+ return !!(p.summary || p.blood_advice || p.tcm_plan)
+ })
+
+ const bloodCareAnalysis = computed(() => {
+ const list = bloodCarePlan.value?.analysis
+ return Array.isArray(list) ? list : []
+ })
+
+ const bloodCareControlLabel = computed(() => {
+ const label = String(bloodCarePlan.value?.control_label || '').trim()
+ return label
+ })
+
+ const bloodCareDisclaimer = computed(() => {
+ return String(bloodCarePlan.value?.disclaimer || '').trim()
+ })
+
+ function detectCareStreamField(text) {
+ const tail = String(text || '').match(/(?:^|\n)(总评|血糖|中医|留意|复诊)[::]\s*([^\n]*)$/)
+ if (!tail) return 'summary'
+ const map = { '总评': 'summary', '血糖': 'blood_advice', '中医': 'tcm_plan', '留意': 'watch_points', '复诊': 'next_steps' }
+ return map[tail[1]] || 'summary'
+ }
+
+ function mergePartialCareFromStream() {
+ const partial = parsePartialBloodCarePlainText(careStreamBuffer)
+ const next = { ...bloodCarePlan.value }
+ for (const key of ['summary', 'blood_advice', 'tcm_plan', 'next_steps']) {
+ if (partial[key] != null) next[key] = partial[key]
+ }
+ if (Array.isArray(partial.watch_points)) next.watch_points = partial.watch_points
+ bloodCarePlan.value = next
+ bloodCareStreamField.value = detectCareStreamField(careStreamBuffer)
+ }
+
+ function applyBloodCarePayload(payload) {
+ if (!payload) return
+ const prevAnalysis = bloodCarePlan.value.analysis
+ bloodCarePlan.value = {
+ ...emptyBloodCarePlan(),
+ ...payload,
+ watch_points: Array.isArray(payload.watch_points) ? payload.watch_points : [],
+ analysis: Array.isArray(payload.analysis) && payload.analysis.length
+ ? payload.analysis
+ : (Array.isArray(prevAnalysis) ? prevAnalysis : [])
+ }
+ }
+
+ function onBloodCareStreamEvent(event, payload) {
+ if (event === 'analysis') {
+ if (Array.isArray(payload?.analysis)) {
+ bloodCarePlan.value = { ...bloodCarePlan.value, analysis: payload.analysis }
+ }
+ } else if (event === 'delta') {
+ bloodCareStreaming.value = true
+ if (payload.buffer != null) {
+ careStreamBuffer = payload.buffer
+ } else {
+ careStreamBuffer += payload.text || ''
+ }
+ mergePartialCareFromStream()
+ } else if (event === 'done') {
+ applyBloodCarePayload(payload)
+ careStreamBuffer = ''
+ bloodCareStreamField.value = ''
+ } else if (event === 'error') {
+ showUserToast(formatUserMessage(payload?.message, '照护建议加载失败'))
+ }
+ }
+
+ async function fetchBloodCareAiFallback(refresh) {
+ const res = await proxy.apiUrl({
+ url: '/api/tcm/dailyBloodCareAiRecommend',
+ method: 'GET',
+ timeout: 35000,
+ data: {
+ diagnosis_id: diagnosisId.value,
+ refresh: refresh ? 1 : 0,
+ ...(refresh ? { _t: Date.now() } : {})
+ }
+ }, false)
+ if (res?.code === 1 && res.data) {
+ applyBloodCarePayload(res.data)
+ } else if (res?.msg) {
+ showUserToast(res.msg)
+ }
+ }
+
+ function closeBloodCarePanel() {
+ bloodCarePanelOpen.value = false
+ }
+
+ /** 趋势图 AI 按钮:未展开则打开并生成;已展开则收起 */
+ async function toggleBloodCareFromChart() {
+ if (!bloodCareEligible.value || bloodCareLoading.value) return
+ if (bloodCarePanelOpen.value) {
+ closeBloodCarePanel()
+ return
+ }
+ bloodCarePanelOpen.value = true
+ if (!hasBloodCareContent.value) {
+ await fetchBloodCareAi(false)
+ }
+ }
+
+ async function fetchBloodCareAi(refresh = false) {
+ if (!bloodCareEligible.value || bloodCareLoading.value) return
+ bloodCareLoading.value = true
+ bloodCareStreaming.value = false
+ careStreamBuffer = ''
+ bloodCareStreamField.value = ''
+ if (refresh) {
+ applyBloodCarePayload(emptyBloodCarePlan())
+ }
+ try {
+ await requestAiStream({
+ baseUrl: proxy.$url,
+ url: '/api/tcm/dailyBloodCareAiRecommendStream',
+ method: 'GET',
+ data: {
+ diagnosis_id: diagnosisId.value,
+ refresh: refresh ? 1 : 0,
+ ...(refresh ? { _t: Date.now() } : {})
+ },
+ onEvent: onBloodCareStreamEvent,
+ fallback: () => fetchBloodCareAiFallback(refresh)
+ })
+ } catch (e) {
+ try {
+ await fetchBloodCareAiFallback(refresh)
+ } catch (e2) {
+ showUserToast('照护建议加载失败')
+ }
+ } finally {
+ bloodCareLoading.value = false
+ bloodCareStreaming.value = false
+ bloodCareStreamField.value = ''
+ }
+ }
+
+ function refreshBloodCareAi() {
+ if (bloodCareLoading.value) return
+ fetchBloodCareAi(true)
+ }
+
+ function resetBloodCarePlan() {
+ applyBloodCarePayload(emptyBloodCarePlan())
+ careStreamBuffer = ''
+ bloodCareStreamField.value = ''
+ bloodCarePanelOpen.value = false
+ }
+
+ return {
+ bloodCarePlan,
+ bloodCareLoading,
+ bloodCareStreaming,
+ bloodCareStreamField,
+ bloodCareEligible,
+ bloodCarePanelOpen,
+ hasBloodCareContent,
+ bloodCareAnalysis,
+ bloodCareControlLabel,
+ bloodCareDisclaimer,
+ fetchBloodCareAi,
+ toggleBloodCareFromChart,
+ closeBloodCarePanel,
+ refreshBloodCareAi,
+ resetBloodCarePlan
+ }
+}
diff --git a/TongjiUniApp/tongji/composables/useDietAi.js b/TongjiUniApp/tongji/composables/useDietAi.js
new file mode 100644
index 000000000..ba414ed88
--- /dev/null
+++ b/TongjiUniApp/tongji/composables/useDietAi.js
@@ -0,0 +1,317 @@
+import { ref, computed } from 'vue'
+import { requestAiStream, parsePartialDietPlainText } from '../utils/aiStreamRequest.js'
+
+const DIET_AI_PREFILL_KEY = 'tongji_diet_ai_prefill'
+
+const emptyDietAiRecommend = () => ({
+ breakfast: '',
+ drinks: '',
+ lunch: '',
+ dinner: '',
+ tips: '',
+ avoid: [],
+ analysis: [],
+ exercise: null,
+ disclaimer: '',
+ rules_summary: '',
+ source: '',
+ date: ''
+})
+
+/** AI 饮食助手(今日推荐 + 能不能吃) */
+export function useDietAi(proxy, { diagnosisId, showUserToast, formatUserMessage }) {
+ const dietAiRecommend = ref(emptyDietAiRecommend())
+ const dietAiLoading = ref(false)
+ const dietAiStreaming = ref(false)
+ const dietAiReplacing = ref(false)
+ const dietAiStreamField = ref('')
+ let dietStreamBuffer = ''
+ const dietAiAskText = ref('')
+ const dietAiAsking = ref(false)
+ const dietAiAskResult = ref({ advice: '', level: '', level_label: '', portion: '', food: '' })
+
+ const hasDietAiMealContent = computed(() => {
+ const r = dietAiRecommend.value
+ return !!(r.breakfast || r.drinks || r.lunch || r.dinner || r.tips)
+ })
+
+ function detectDietStreamField(text) {
+ const tail = String(text || '').match(/(?:^|\n)(早餐|喝的|午餐|晚餐|提示|少碰)[::]\s*([^\n]*)$/)
+ if (!tail) return 'breakfast'
+ const map = { '早餐': 'breakfast', '喝的': 'drinks', '午餐': 'lunch', '晚餐': 'dinner', '提示': 'tips', '少碰': 'tips' }
+ return map[tail[1]] || 'breakfast'
+ }
+
+ function mergePartialDietFromStream() {
+ const partial = parsePartialDietPlainText(dietStreamBuffer)
+ const next = { ...dietAiRecommend.value }
+ for (const key of ['breakfast', 'drinks', 'lunch', 'dinner', 'tips']) {
+ if (partial[key] != null) next[key] = partial[key]
+ }
+ if (Array.isArray(partial.avoid)) next.avoid = partial.avoid
+ dietAiRecommend.value = next
+ dietAiStreamField.value = detectDietStreamField(dietStreamBuffer)
+ }
+
+ function applyDietRecommendPayload(payload) {
+ if (!payload) return
+ const prevAnalysis = dietAiRecommend.value.analysis
+ const prevExercise = dietAiRecommend.value.exercise
+ dietAiRecommend.value = {
+ ...emptyDietAiRecommend(),
+ ...payload,
+ avoid: Array.isArray(payload.avoid) ? payload.avoid : [],
+ analysis: Array.isArray(payload.analysis) && payload.analysis.length
+ ? payload.analysis
+ : (Array.isArray(prevAnalysis) ? prevAnalysis : []),
+ exercise: (payload.exercise && typeof payload.exercise === 'object')
+ ? payload.exercise
+ : (prevExercise || null)
+ }
+ }
+
+ function resolveDietDonePayload(payload) {
+ if (!payload) return payload
+ if (payload.source !== 'rule' || !dietStreamBuffer) return payload
+
+ const streamed = parsePartialDietPlainText(dietStreamBuffer)
+ if (!streamed.breakfast) return payload
+
+ return {
+ ...emptyDietAiRecommend(),
+ ...payload,
+ breakfast: streamed.breakfast,
+ drinks: streamed.drinks || payload.drinks || '',
+ lunch: streamed.lunch || payload.lunch || '',
+ dinner: streamed.dinner || payload.dinner || '',
+ tips: streamed.tips || payload.tips || '',
+ avoid: (Array.isArray(streamed.avoid) && streamed.avoid.length) ? streamed.avoid : (payload.avoid || []),
+ source: 'ai',
+ disclaimer: 'AI 建议供参考,仍请结合医嘱与血糖监测。'
+ }
+ }
+
+ function onDietAiStreamEvent(event, payload) {
+ if (event === 'analysis') {
+ if (Array.isArray(payload?.analysis)) {
+ dietAiRecommend.value = { ...dietAiRecommend.value, analysis: payload.analysis }
+ }
+ } else if (event === 'exercise') {
+ if (payload?.exercise && typeof payload.exercise === 'object') {
+ dietAiRecommend.value = { ...dietAiRecommend.value, exercise: payload.exercise }
+ }
+ } else if (event === 'delta') {
+ dietAiStreaming.value = true
+ if (payload.buffer != null) {
+ dietStreamBuffer = payload.buffer
+ } else {
+ dietStreamBuffer += payload.text || ''
+ }
+ mergePartialDietFromStream()
+ } else if (event === 'done') {
+ applyDietRecommendPayload(resolveDietDonePayload(payload))
+ dietStreamBuffer = ''
+ dietAiStreamField.value = ''
+ } else if (event === 'error') {
+ showUserToast(formatUserMessage(payload?.message, '饮食建议加载失败'))
+ }
+ }
+
+ async function fetchDietAiRecommendFallback(refresh) {
+ const res = await proxy.apiUrl({
+ url: '/api/tcm/dailyDietAiRecommend',
+ method: 'GET',
+ timeout: 35000,
+ data: {
+ diagnosis_id: diagnosisId.value,
+ refresh: refresh ? 1 : 0,
+ ...(refresh ? { _t: Date.now() } : {})
+ }
+ }, false)
+ if (res?.code === 1 && res.data) {
+ applyDietRecommendPayload(res.data)
+ } else if (res?.msg) {
+ showUserToast(res.msg)
+ }
+ }
+
+ async function fetchDietAiRecommend(refresh = false) {
+ if (!diagnosisId.value || dietAiLoading.value) return
+ dietAiLoading.value = true
+ dietAiStreaming.value = false
+ dietAiReplacing.value = !!refresh
+ dietStreamBuffer = ''
+ dietAiStreamField.value = ''
+ if (refresh) {
+ applyDietRecommendPayload(emptyDietAiRecommend())
+ }
+ try {
+ await requestAiStream({
+ baseUrl: proxy.$url,
+ url: '/api/tcm/dailyDietAiRecommendStream',
+ method: 'GET',
+ data: {
+ diagnosis_id: diagnosisId.value,
+ refresh: refresh ? 1 : 0,
+ ...(refresh ? { _t: Date.now() } : {})
+ },
+ onEvent: onDietAiStreamEvent,
+ fallback: () => fetchDietAiRecommendFallback(refresh)
+ })
+ } catch (e) {
+ try {
+ await fetchDietAiRecommendFallback(refresh)
+ } catch (e2) {
+ showUserToast('饮食建议加载失败')
+ }
+ } finally {
+ dietAiLoading.value = false
+ dietAiStreaming.value = false
+ dietAiReplacing.value = false
+ dietAiStreamField.value = ''
+ }
+ }
+
+ function refreshDietAiRecommend() {
+ if (dietAiLoading.value) return
+ fetchDietAiRecommend(true)
+ }
+
+ async function askDietAiFoodFallback(q) {
+ const res = await proxy.apiUrl({
+ url: '/api/tcm/dailyDietAiAsk',
+ method: 'POST',
+ timeout: 35000,
+ data: {
+ diagnosis_id: diagnosisId.value,
+ question: q
+ }
+ }, false)
+ if (res?.code === 1 && res.data) {
+ dietAiAskResult.value = {
+ advice: res.data.advice || '',
+ level: res.data.level || '',
+ level_label: res.data.level_label || '',
+ portion: res.data.portion || '',
+ food: res.data.food || q
+ }
+ } else {
+ showUserToast(formatUserMessage(res?.msg, '咨询失败'))
+ }
+ }
+
+ async function askDietAiFood() {
+ const q = String(dietAiAskText.value || '').trim()
+ if (!q) {
+ showUserToast('请输入想咨询的食物')
+ return
+ }
+ if (!diagnosisId.value) return
+ // 发送后立即清空输入框
+ dietAiAskText.value = ''
+ dietAiAsking.value = true
+ dietAiAskResult.value = { advice: '', level: '', level_label: '', portion: '', food: '' }
+ try {
+ await requestAiStream({
+ baseUrl: proxy.$url,
+ url: '/api/tcm/dailyDietAiAskStream',
+ method: 'POST',
+ data: {
+ diagnosis_id: diagnosisId.value,
+ question: q
+ },
+ onEvent: (event, payload) => {
+ if (event === 'start' && !dietAiAskResult.value.advice) {
+ dietAiAskResult.value = { ...dietAiAskResult.value, advice: payload.message || '正在想…' }
+ } else if (event === 'delta') {
+ dietAiAskResult.value = {
+ ...dietAiAskResult.value,
+ advice: payload.advice || dietAiAskResult.value.advice
+ }
+ } else if (event === 'done') {
+ dietAiAskResult.value = {
+ advice: payload.advice || '',
+ level: payload.level || '',
+ level_label: payload.level_label || '',
+ portion: payload.portion || '',
+ food: payload.food || q
+ }
+ } else if (event === 'error') {
+ showUserToast(formatUserMessage(payload?.message, '咨询失败'))
+ }
+ },
+ fallback: () => askDietAiFoodFallback(q)
+ })
+ } catch (e) {
+ try {
+ await askDietAiFoodFallback(q)
+ } catch (e2) {
+ showUserToast('网络异常,请稍后再试')
+ }
+ } finally {
+ dietAiAsking.value = false
+ }
+ }
+
+ function onDietAiAskInput(e) {
+ dietAiAskText.value = e?.detail?.value ?? ''
+ }
+
+ function saveDietPrefillToStorage() {
+ const r = dietAiRecommend.value
+ if (!r.breakfast) return
+ try {
+ uni.setStorageSync(DIET_AI_PREFILL_KEY, {
+ breakfast: r.breakfast,
+ drinks: r.drinks || '',
+ lunch: r.lunch,
+ dinner: r.dinner,
+ tips: r.tips || ''
+ })
+ } catch (e) {}
+ }
+
+ function goMoreDietForm(withPrefill = false) {
+ if (withPrefill) saveDietPrefillToStorage()
+ uni.navigateTo({ url: '/tongji/pages/more?openDiet=1' })
+ }
+
+ async function applyDietAiToForm() {
+ if (!dietAiRecommend.value.breakfast) {
+ await fetchDietAiRecommend(false)
+ }
+ goMoreDietForm(true)
+ }
+
+ function openDietForm() {
+ goMoreDietForm(false)
+ }
+
+ return {
+ dietAiRecommend,
+ dietAiLoading,
+ dietAiStreaming,
+ dietAiReplacing,
+ dietAiStreamField,
+ dietAiAskText,
+ dietAiAsking,
+ dietAiAskResult,
+ hasDietAiMealContent,
+ fetchDietAiRecommend,
+ refreshDietAiRecommend,
+ askDietAiFood,
+ onDietAiAskInput,
+ applyDietAiToForm,
+ openDietForm
+ }
+}
+
+/** more 页打开饮食表单时读取并清除预填 */
+export function consumeDietAiPrefill() {
+ try {
+ const data = uni.getStorageSync(DIET_AI_PREFILL_KEY)
+ uni.removeStorageSync(DIET_AI_PREFILL_KEY)
+ if (data && typeof data === 'object' && data.breakfast) return data
+ } catch (e) {}
+ return null
+}
diff --git a/TongjiUniApp/tongji/composables/useSpeechToText.js b/TongjiUniApp/tongji/composables/useSpeechToText.js
new file mode 100644
index 000000000..aa0176411
--- /dev/null
+++ b/TongjiUniApp/tongji/composables/useSpeechToText.js
@@ -0,0 +1,450 @@
+import { ref, onUnmounted } from 'vue'
+
+const MIN_HOLD_MS = 280
+
+/** 短按/过早松手时插件常见错误,不应打扰用户 */
+function isBenignSttError(msg, retcode) {
+ const m = String(msg || '').toLowerCase()
+ if (/internal voice data failed/i.test(m)) return true
+ if (/voice data failed/i.test(m)) return true
+ if (/recordfailed|record failed|record manager/i.test(m)) return true
+ if (/please stop after start/i.test(m)) return true
+ if (/no recognition|not start|未开始|无识别/i.test(m)) return true
+ const code = Number(retcode)
+ if (code === -30002 || code === -30003 || code === -30012) return true
+ return false
+}
+
+function friendlySttError(msg) {
+ const m = String(msg || '').trim()
+ if (!m || isBenignSttError(m)) return ''
+ if (/not allowed|auth|permission|权限|麦克风/i.test(m)) return '请允许使用麦克风'
+ if (/network|网络|timeout/i.test(m)) return '网络异常,请稍后再试'
+ return '语音识别失败,请重试'
+}
+
+// #ifdef MP-WEIXIN
+// WechatSI 录音管理器是全局单例:回调只在模块级绑定一次,
+// 再分发给「当前活跃实例」。否则跨页面(如 more → weekly)后,
+// 回调仍指向已销毁页面的闭包,新页面收不到 onStart/onStop,
+// 其本地状态卡在 recording,表现为一直录制/无法再次语音。
+let sharedManager = null
+let sharedManagerInited = false
+let sharedRecording = false
+let activeCtl = null
+
+function getSharedRecordManager() {
+ if (sharedManagerInited) return sharedManager
+ sharedManagerInited = true
+ try {
+ // eslint-disable-next-line no-undef
+ const plugin = requirePlugin('WechatSI')
+ sharedManager = plugin.getRecordRecognitionManager()
+ } catch (e) {
+ console.warn('WechatSI record recognition not available', e)
+ sharedManager = null
+ return null
+ }
+ if (!sharedManager) return null
+
+ sharedManager.onStart = () => {
+ sharedRecording = true
+ if (activeCtl) activeCtl.handleStart()
+ }
+ sharedManager.onRecognize = (res) => {
+ if (activeCtl) activeCtl.handleRecognize(res)
+ }
+ sharedManager.onStop = (res) => {
+ sharedRecording = false
+ if (activeCtl) activeCtl.handleStop(res)
+ }
+ sharedManager.onError = (res) => {
+ sharedRecording = false
+ if (activeCtl) activeCtl.handleError(res)
+ }
+ return sharedManager
+}
+// #endif
+
+/**
+ * 语音转文字(长按说话):微信小程序 WechatSI;H5 Web Speech API。
+ *
+ * @param {{
+ * onResult?: (text: string) => void,
+ * onSettle?: (text: string, info: { heldMs: number }) => boolean | void,
+ * onPartial?: (text: string) => void,
+ * onError?: (msg: string) => boolean | void,
+ * showToast?: (msg: string) => void
+ * }} options
+ *
+ * onSettle 在每次录音结束时都会触发(含空结果),用于语音一问一答等需要
+ * 完全接管识别结果的场景。若 onSettle 返回 true,则跳过默认的 onResult 回调
+ * 与「没听清」提示,避免与上层流程重复处理。
+ *
+ * onPartial 在录音过程中实时返回中间识别结果(微信 onRecognize / H5 interim),
+ * 用于「抢答打断」等场景:检测到用户已开口作答即可提前结束播报/录音。
+ *
+ * onError 在录音/识别出错时触发(如 "record manager recordfailed")。
+ * 若返回 true,则跳过默认的错误 Toast,由上层自行处理(如自动重试)。
+ */
+export function useSpeechToText({ onResult, onSettle, onPartial, onError, showToast } = {}) {
+ const sttListening = ref(false)
+ const sttHolding = ref(false)
+ const sttSupported = ref(false)
+
+ let wxRecordManager = null
+ let h5Recognition = null
+ let h5GotResult = false
+ let holdStartTs = 0
+ let holdSessionId = 0
+ let startRequested = false
+ let recordAuthorized = null
+ // 快速点按可能残留会话:用排队标记把 start/stop 串行化,
+ // 避免 "please stop after start"
+ let pendingStartSession = 0
+
+ function notify(msg) {
+ if (!msg) return
+ if (typeof showToast === 'function') {
+ showToast(msg)
+ return
+ }
+ uni.showToast({ title: msg, icon: 'none', duration: 2000 })
+ }
+
+ function emitResult(text) {
+ const t = String(text || '').trim()
+ const heldMs = Date.now() - holdStartTs
+ // onSettle 总会收到结果(含空),返回 true 表示已完全接管
+ if (typeof onSettle === 'function') {
+ const handled = onSettle(t, { heldMs })
+ if (handled === true) return
+ }
+ if (!t) {
+ if (heldMs < MIN_HOLD_MS) return
+ notify('没听清,请再试一次')
+ return
+ }
+ if (typeof onResult === 'function') {
+ onResult(t)
+ }
+ }
+
+ function stopListening() {
+ // #ifdef MP-WEIXIN
+ const ownsRecording = sharedRecording && activeCtl === controller
+ // 仅在识别已真正开始后再 stop,避免 -30012 / internal voice data failed
+ if (wxRecordManager && (sttListening.value || ownsRecording)) {
+ try {
+ wxRecordManager.stop()
+ } catch (e) {}
+ }
+ // #endif
+
+ // #ifdef H5
+ if (h5Recognition && sttListening.value) {
+ try {
+ h5Recognition.stop()
+ } catch (e) {}
+ }
+ // #endif
+
+ startRequested = false
+ sttHolding.value = false
+ sttListening.value = false
+ }
+
+ function ensureRecordAuth(onGranted) {
+ // #ifdef MP-WEIXIN
+ if (recordAuthorized === true) {
+ onGranted()
+ return
+ }
+ uni.authorize({
+ scope: 'scope.record',
+ success() {
+ recordAuthorized = true
+ onGranted()
+ },
+ fail() {
+ recordAuthorized = false
+ sttHolding.value = false
+ uni.showModal({
+ title: '需要麦克风权限',
+ content: '请在设置中允许使用麦克风,以便长按说话',
+ confirmText: '去设置',
+ success(res) {
+ if (res.confirm) {
+ uni.openSetting({})
+ }
+ }
+ })
+ }
+ })
+ // #endif
+ // #ifndef MP-WEIXIN
+ onGranted()
+ // #endif
+ }
+
+ // #ifdef MP-WEIXIN
+ function actuallyStartWechat(session) {
+ if (!wxRecordManager || session !== holdSessionId || !sttHolding.value) {
+ return
+ }
+ try {
+ startRequested = true
+ wxRecordManager.start({
+ duration: 60000,
+ lang: 'zh_CN'
+ })
+ } catch (e) {
+ startRequested = false
+ sharedRecording = false
+ sttHolding.value = false
+ notify('无法开始录音')
+ }
+ }
+ // #endif
+
+ function startWechatRecord(session) {
+ // #ifdef MP-WEIXIN
+ if (!wxRecordManager || session !== holdSessionId || !sttHolding.value) {
+ return
+ }
+ // 上一段会话还没结束(含全局单例残留):先停止并排队,
+ // 待 onStop 回调后再真正开始,避免 "please stop after start"
+ if (sharedRecording || startRequested) {
+ pendingStartSession = session
+ try {
+ wxRecordManager.stop()
+ } catch (e) {}
+ return
+ }
+ actuallyStartWechat(session)
+ // #endif
+ }
+
+ function startH5Record() {
+ // #ifdef H5
+ if (!h5Recognition) {
+ notify('当前浏览器不支持语音输入')
+ sttHolding.value = false
+ return
+ }
+ try {
+ startRequested = true
+ h5GotResult = false
+ h5Recognition.start()
+ sttListening.value = true
+ } catch (e) {
+ startRequested = false
+ sttHolding.value = false
+ notify('无法开始语音识别,请检查麦克风权限')
+ }
+ // #endif
+ }
+
+ /** 长按开始:手指按下 */
+ function beginHoldSpeech() {
+ if (!sttSupported.value) {
+ notify('当前环境不支持语音输入')
+ return
+ }
+ if (sttHolding.value) return
+
+ const session = ++holdSessionId
+ holdStartTs = Date.now()
+ sttHolding.value = true
+
+ // #ifdef MP-WEIXIN
+ // 把全局录音回调切到当前实例
+ activeCtl = controller
+ ensureRecordAuth(() => startWechatRecord(session))
+ // #endif
+ // #ifdef H5
+ startH5Record()
+ // #endif
+ // #ifndef MP-WEIXIN
+ // #ifndef H5
+ sttHolding.value = false
+ notify('当前端暂不支持语音输入')
+ // #endif
+ // #endif
+ }
+
+ /** 松手结束:手指抬起;force=true 时强制取消尚未真正开始的按住会话 */
+ function endHoldSpeech(force = false) {
+ let recording = false
+ // #ifdef MP-WEIXIN
+ recording = sharedRecording && activeCtl === controller
+ // #endif
+ if (!force && !sttHolding.value && !sttListening.value && !startRequested && !recording) {
+ return
+ }
+ sttHolding.value = false
+ // 松手后不再补开排队的录音
+ pendingStartSession = 0
+ if (sttListening.value || recording) {
+ stopListening()
+ return
+ }
+ if (startRequested) {
+ // start 已发出但 onStart 未到:取消会话,勿调 stop()
+ startRequested = false
+ holdSessionId += 1
+ return
+ }
+ holdSessionId += 1
+ }
+
+ // #ifdef MP-WEIXIN
+ // 当前实例的回调控制器:全局单例 manager 的事件由模块级分发器
+ // 转发给 activeCtl(最后一次 beginHoldSpeech 的实例)
+ const controller = {
+ handleStart() {
+ if (!sttHolding.value) {
+ // 用户已松手,忽略迟到的 onStart,不再 stop() 以免触发插件报错
+ startRequested = false
+ sttListening.value = false
+ return
+ }
+ startRequested = false
+ sttListening.value = true
+ },
+ handleRecognize(res) {
+ if (typeof onPartial !== 'function') return
+ const t = String(res?.result || '').trim()
+ if (t) onPartial(t)
+ },
+ handleStop(res) {
+ sttListening.value = false
+ startRequested = false
+ // 有排队的开始请求(残留会话已停止 / 用户仍按住):现在再真正开始
+ if (pendingStartSession && pendingStartSession === holdSessionId && sttHolding.value) {
+ const s = pendingStartSession
+ pendingStartSession = 0
+ actuallyStartWechat(s)
+ return
+ }
+ pendingStartSession = 0
+ emitResult(res?.result)
+ },
+ handleError(res) {
+ sttListening.value = false
+ startRequested = false
+ const msg = (res && res.msg) || ''
+ const retcode = res && (res.retcode ?? res.errCode ?? res.code)
+ // 上一段未停止就再次 start 触发:停止后若仍按住则自动重试,不打扰用户
+ if (/please stop after start/i.test(msg)) {
+ try {
+ wxRecordManager.stop()
+ } catch (e) {}
+ pendingStartSession = sttHolding.value ? holdSessionId : 0
+ return
+ }
+ pendingStartSession = 0
+ sttHolding.value = false
+ const heldMs = Date.now() - holdStartTs
+ if (isBenignSttError(msg, retcode) || heldMs < MIN_HOLD_MS) {
+ if (typeof onError === 'function') onError(msg || '')
+ return
+ }
+ // 上层(如一问一答流程)可接管错误并自行重试,返回 true 时不再弹默认提示
+ if (typeof onError === 'function') {
+ const handled = onError(msg || '')
+ if (handled === true) return
+ }
+ const tip = friendlySttError(msg)
+ if (tip) notify(tip)
+ }
+ }
+
+ wxRecordManager = getSharedRecordManager()
+ sttSupported.value = !!wxRecordManager
+ // #endif
+
+ // #ifdef H5
+ try {
+ if (typeof window !== 'undefined') {
+ const SR = window.SpeechRecognition || window.webkitSpeechRecognition
+ if (SR) {
+ h5Recognition = new SR()
+ h5Recognition.lang = 'zh-CN'
+ h5Recognition.interimResults = true
+ h5Recognition.continuous = false
+ h5Recognition.maxAlternatives = 1
+ sttSupported.value = true
+
+ h5Recognition.onresult = (event) => {
+ let interim = ''
+ let finalText = ''
+ for (let i = event.resultIndex; i < event.results.length; i++) {
+ const r = event.results[i]
+ const txt = r?.[0]?.transcript || ''
+ if (r.isFinal) finalText += txt
+ else interim += txt
+ }
+ if (interim && typeof onPartial === 'function') onPartial(interim)
+ if (finalText) {
+ h5GotResult = true
+ emitResult(finalText)
+ }
+ }
+ h5Recognition.onend = () => {
+ sttListening.value = false
+ startRequested = false
+ sttHolding.value = false
+ // 无识别结果也要兜底触发一次 settle,便于一问一答流程重试
+ if (!h5GotResult) {
+ emitResult('')
+ }
+ h5GotResult = false
+ }
+ h5Recognition.onerror = (event) => {
+ sttListening.value = false
+ startRequested = false
+ sttHolding.value = false
+ const err = event?.error || ''
+ if (err === 'aborted') return
+ if (typeof onError === 'function') {
+ const handled = onError(err)
+ if (handled === true) return
+ }
+ if (err === 'not-allowed') {
+ notify('请允许浏览器使用麦克风')
+ } else {
+ notify('语音识别失败')
+ }
+ }
+ }
+ }
+ } catch (e) {
+ console.warn('H5 SpeechRecognition not available', e)
+ }
+ // #endif
+
+ onUnmounted(() => {
+ sttHolding.value = false
+ holdSessionId += 1
+ pendingStartSession = 0
+ stopListening()
+ // #ifdef MP-WEIXIN
+ // 释放全局回调指向,避免事件继续派发给已销毁的实例
+ if (activeCtl === controller) {
+ activeCtl = null
+ }
+ // #endif
+ })
+
+ return {
+ sttListening,
+ sttHolding,
+ sttSupported,
+ beginHoldSpeech,
+ endHoldSpeech,
+ stopSpeechToText: endHoldSpeech
+ }
+}
+
+export { isBenignSttError, friendlySttError }
diff --git a/TongjiUniApp/tongji/composables/useTongjiAuth.js b/TongjiUniApp/tongji/composables/useTongjiAuth.js
new file mode 100644
index 000000000..c886aaf8f
--- /dev/null
+++ b/TongjiUniApp/tongji/composables/useTongjiAuth.js
@@ -0,0 +1,115 @@
+import { ref } from 'vue'
+import { formatUserMessage } from '../utils/tongjiHelpers.js'
+
+/** 登录 / 就诊卡门禁(index 与 more 共用) */
+export function useTongjiAuth(proxy) {
+ const authChecking = ref(false)
+ let gateRedirected = false
+ let authSessionPromise = null
+
+ function hasAuthToken() {
+ return !!String(uni.getStorageSync('token') || '').trim()
+ }
+
+ function clearAuthStorage() {
+ uni.removeStorageSync('token')
+ authSessionPromise = null
+ }
+
+ function wxLoginGetCode() {
+ return new Promise((resolve, reject) => {
+ uni.login({
+ provider: 'weixin',
+ success: (res) => {
+ if (res && res.code) resolve(res.code)
+ else reject(new Error('微信登录未返回 code'))
+ },
+ fail: reject
+ })
+ })
+ }
+
+ async function mnpLoginWithCode(code) {
+ const res = await proxy.apiUrl({
+ url: '/api/login/mnpLogin',
+ method: 'POST',
+ data: { code }
+ }, false)
+ if (res && res.code === 1 && res.data && res.data.token) {
+ uni.setStorageSync('token', res.data.token)
+ uni.setStorageSync('userData', res.data)
+ return res.data
+ }
+ clearAuthStorage()
+ throw new Error(formatUserMessage(res?.msg, '登录失败'))
+ }
+
+ async function doWxLogin() {
+ const code = await wxLoginGetCode()
+ await mnpLoginWithCode(code)
+ return hasAuthToken()
+ }
+
+ async function verifyOrLogin() {
+ if (!hasAuthToken()) {
+ return doWxLogin()
+ }
+ try {
+ const res = await proxy.apiUrl({ url: '/api/user/info', method: 'POST' }, false)
+ if (res && res.code === 1 && res.data) {
+ uni.setStorageSync('userData', res.data)
+ return true
+ }
+ } catch (e) {
+ /* 网络异常走重新登录 */
+ }
+ clearAuthStorage()
+ try {
+ return await doWxLogin()
+ } catch (e2) {
+ return false
+ }
+ }
+
+ async function ensureLoggedIn() {
+ if (authSessionPromise) {
+ return authSessionPromise
+ }
+ authSessionPromise = verifyOrLogin()
+ .then((ok) => {
+ if (!ok) authSessionPromise = null
+ return !!ok
+ })
+ .catch(() => {
+ authSessionPromise = null
+ return false
+ })
+ return authSessionPromise
+ }
+
+ function redirectToCardEntry(returnPath) {
+ if (gateRedirected) return
+ gateRedirected = true
+ const returnUrl = encodeURIComponent(returnPath || '/tongji/pages/index')
+ uni.redirectTo({
+ url: `/pages/Card/edit_card?add=1&returnUrl=${returnUrl}`
+ })
+ }
+
+ function resetGateRedirect() {
+ gateRedirected = false
+ }
+
+ function isGateRedirected() {
+ return gateRedirected
+ }
+
+ return {
+ authChecking,
+ hasAuthToken,
+ ensureLoggedIn,
+ redirectToCardEntry,
+ resetGateRedirect,
+ isGateRedirected
+ }
+}
diff --git a/TongjiUniApp/tongji/design-system/DESIGN.md b/TongjiUniApp/tongji/design-system/DESIGN.md
new file mode 100644
index 000000000..0be4c9257
--- /dev/null
+++ b/TongjiUniApp/tongji/design-system/DESIGN.md
@@ -0,0 +1,28 @@
+# VitalMint Health (Stitch)
+
+Source: Google Stitch MCP · project `Modern WeChat UI Redesign`
+Screen HTML: `design-system/stitch-weekly.html`
+
+## Colors
+
+- background / surface: `#f4fbf4`
+- primary: `#006c49`
+- primary-container: `#10b981`
+- tertiary-container (餐后): `#fc7c78`
+- on-surface: `#161d19`
+- error (high glucose): `#ba1a1a`
+- warning: `#ea580c`
+
+## Layout (weekly.vue)
+
+1. TopAppBar — 头像 + 问候 + 朗读按钮
+2. 录入今日血糖 — 全宽圆角主按钮
+3. 今日血糖 — 双列卡片 + 查看更多
+4. 血糖趋势 — 单卡片内含统计、图表、7/30 切换
+5. AI 饮食 — 渐变边框白底卡片
+6. 能不能吃 — 独立卡片
+
+## Styles
+
+- `styles/stitch-vitalmint-theme.scss` — 设计 token
+- `styles/weekly-stitch.scss` — 页面组件样式 (vm-*)
\ No newline at end of file
diff --git a/TongjiUniApp/tongji/design-system/code.html b/TongjiUniApp/tongji/design-system/code.html
new file mode 100644
index 000000000..1d21d25ea
--- /dev/null
+++ b/TongjiUniApp/tongji/design-system/code.html
@@ -0,0 +1,398 @@
+
+
+
+血糖管理
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+person
+
+
+
下午好,用户16295733
+
今日血糖已记录
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1
+天偏高
+
+
+1
+天正常
+
+
+2
+天有记录
+
+
+
+
+
+
+23.0
+18.0
+13.0
+8.0
+3.0
+
+
+
+
空腹阈 7
+
+
+
+
+05-23
+05-25
+05-27
+05-29
+
+
+
+
+
+
+
+
+
最新测量 · 餐后
+
+
+mmol/L
+
+
+warning
+偏高,请遵医嘱
+
+
+
+
+
+
+
+
+
+
+
+temp_preferences_custom
+
+
AI 饮食建议
+
+
+
+读您近 7 天 · 30 天血糖,定制今日三餐
+
+
+
+light_mode
+早餐
+
+
小米粥(少米多水)加煮鸡蛋一个
+
+
+
+eco
+午餐
+
+
清蒸鱼块、蒜蓉炒苋菜、二米饭(小米掺大米)
+
+
+
+
+
+
+
+ sparkles
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TongjiUniApp/tongji/design-system/more-stitch.html b/TongjiUniApp/tongji/design-system/more-stitch.html
new file mode 100644
index 000000000..e56444b62
--- /dev/null
+++ b/TongjiUniApp/tongji/design-system/more-stitch.html
@@ -0,0 +1,596 @@
+
+
+
+Daily Care - Health Dashboard
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
健康日历
+
2026年5月 · 已记录 3 / 7 天
+
+
+
+
+
一
+
二
+
三
+
四
+
五
+
六
+
日
+
18
+
19
+
20
+
21
+
22
+
23
+
+24
+
+
+
+25
+
+
+
+26
+
+
+
27
+
28
+
+29
+
+
30
+
31
+
+
+今日还没有记录
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+今日控糖任务
+
+
+
+
+
+
+
+
+枝繁叶茂
+
+
还差 15 XP 升级至 Lv.4
+
+
+5/50 XP
+
+
+
+
+
+
+
+
+
+
+eco
+
+
+
+🪴
+
+
+
+
+
+
浇水可消耗 5 积分,获得 10 XP
+
+
+
+
+
+
+
+favorite
+
+
+
邀请家人点赞
+
分享战报给家人,邀请他们为您点赞鼓励
+
+
+chevron_right
+
+
+
+
chat_bubble
+
+
先完成血糖记录,今日第一格就亮起来。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TongjiUniApp/tongji/design-system/stitch-screen.json b/TongjiUniApp/tongji/design-system/stitch-screen.json
new file mode 100644
index 000000000..c8558dfd9
--- /dev/null
+++ b/TongjiUniApp/tongji/design-system/stitch-screen.json
@@ -0,0 +1 @@
+{"name":"projects/15362588878567114380/screens/259c8c233434481881d0bacddb59fa7f","title":"血糖管理重构版","screenshot":{"name":"projects/15362588878567114380/files/c18dd3e3d7774a16897d78b40073b9f2","downloadUrl":"https://lh3.googleusercontent.com/aida/ADBb0ugpswBosy3eCG_j3kJlxCWpntXQGvRJvMuepINJTcB47Nf4ymWU81mrjex1ICPdAXn-p_JjyUokOtms4zIJpXL49692zt16mIJhEC16nfU9kH5hwAj1s7v3PlAZbUGWjYjPTdfVMaOCveS6Ohuh_IeyRTD6MmdsFZ2-H7Whg6zy4MiZeGLxRw0ckCOrNbTRObtuzk_dlUc49eDGeRagYtuL9xyS6pno5CiwBzSkGp872chdZVn9JOK-2n1P"},"htmlCode":{"name":"projects/15362588878567114380/files/ca56c13fc2d6481d9de60727f7b70f3f","downloadUrl":"https://contribution.usercontent.google.com/download?c=CgthaWRhX2NvZGVmeBJ8Eh1hcHBfY29tcGFuaW9uX2dlbmVyYXRlZF9maWxlcxpbCiVodG1sXzk5NTVmZjZjNTFkODQxMmY4MzIxNWNkYmIwNWI2MTMzEgsSBxCEnv3unRAYAZIBJAoKcHJvamVjdF9pZBIWQhQxNTM2MjU4ODg3ODU2NzExNDM4MA&filename=&opi=89354086","mimeType":"text/html"},"width":"780","height":"4122","deviceType":"MOBILE"}
diff --git a/TongjiUniApp/tongji/design-system/stitch-weekly.html b/TongjiUniApp/tongji/design-system/stitch-weekly.html
new file mode 100644
index 000000000..295e699d0
--- /dev/null
+++ b/TongjiUniApp/tongji/design-system/stitch-weekly.html
@@ -0,0 +1,351 @@
+
+
+
+
+
+血糖管理
+
+
+
+
+
+
+
+
+
+
+
+
+
+person
+
+
+
下午好,用户16295733
+
今日血糖已记录
+
+
+
+
+
+
+
+
+
+今日血糖
+
+
+
+
空腹
+
+18.00
+mmol/L
+
+
+warning
+偏高,请遵医嘱
+
+
+
+
+
餐后
+
+20.00
+mmol/L
+
+
+warning
+偏高,请遵医嘱
+
+
+
+
+
+
+
+
+
+
+
+1
+天偏高
+
+
+1
+天正常
+
+
+2
+天有记录
+
+
+
+
+
+
+23.0
+18.0
+13.0
+8.0
+3.0
+
+
+
+05-23
+05-25
+05-27
+05-29
+
+
+
+空腹阈值 7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+auto_awesome
+
+
+
+
AI 饮食建议
+智能定制
+
+
读您近 7 天 · 30 天血糖,定制今日三餐
+
+
+
+
+
+
+
+
+
+
+wb_sunny
+早餐
+
+
小米粥(少米多水)加煮鸡蛋一个
+
+
+
+
+wb_twilight
+午餐
+
+
清蒸鱼块、蒜蓉炒苋菜、二米饭(小米掺大米)
+
+
+
+
+dark_mode
+晚餐
+
+
玉米糝粥(稀)配凉拌黄瓜
+
+
+
+
+
info
+
小贴士:先吃菜和肉再吃主食,每餐七分饱,血糖高就少喝粥汤。
+
+
+
+
+warning 今日尽量少碰
+
+
+白馒头
+油条
+粘豆包
+糯米饭
+西瓜
+含糖饮料
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TongjiUniApp/tongji/endless-game/PLATFORM_INTEGRATION.md b/TongjiUniApp/tongji/endless-game/PLATFORM_INTEGRATION.md
new file mode 100644
index 000000000..f0921fdfa
--- /dev/null
+++ b/TongjiUniApp/tongji/endless-game/PLATFORM_INTEGRATION.md
@@ -0,0 +1,40 @@
+# 识糖小课堂平台接入说明
+
+## 已接入能力
+
+- 复用主小程序 `token` 与微信小程序登录,不创建第二套游戏账号。
+- 按周一日期、性别自动分配最多 7 人的同行组。
+- 首次入组使用数据库分配锁,多个用户同时进入也不会重复分组或超过 7 人。
+- 以真实平台昵称、头像、认糖数和本周最高分排序。
+- 每局用 `session_key` 上报绝对进度,断网重试不会重复加分。
+- 待同步成绩最多本地保留 8 局,重新联网后自动补传。
+- 微信好友与朋友圈分享使用随机分享码,不在链接中暴露用户 ID。
+- 每张周分享卡对同一受邀人只记录一次轻量访问,不自动建立家庭或好友绑定。
+
+## 接口
+
+- `GET /api/tcm/gameWeeklyLeaderboard`:获取或创建当前周同行榜。
+- `POST /api/tcm/gameSubmitProgress`:上报 `session_key`、`learned_count`、`score`、`ended`。
+- `POST /api/tcm/gameRecordShare`:记录分享动作并获取本周分享码。
+- `POST /api/tcm/gameAcceptShare`:受邀用户登录后提交 `invite_code`。
+
+四个接口都使用现有 `LoginMiddleware` 校验主小程序 `token`。
+
+## 部署顺序
+
+1. 执行 `server/sql/1.9.20260717/add_tcm_endless_game_platform.sql`。
+2. 发布 `server/app/api/logic/tcm/GamePlatformLogic.php` 和 `TcmController.php`。
+3. 重新构建并上传小程序前端。
+
+如果数据库已经执行过本功能的旧版建表脚本,再执行一次
+`server/sql/1.9.20260717/upgrade_tcm_endless_game_platform_20260717.sql`,用于补充分组锁并把分享去重范围修正为“每张周分享卡”。
+
+如果后端或数据表尚未发布,游戏仍可离线游玩,榜单会显示“离线记录中”;联网且接口可用后自动补传。
+
+## 上线前检查
+
+- 用男女各两个测试账号进入,确认被分入对应性别组。
+- 同一局重复提交相同 `session_key`,确认周认糖数不重复增加。
+- 断网完成几次消除,再联网打开榜单,确认成绩补传。
+- 分享给另一个微信账号,确认能直接进入游戏且链接中没有用户 ID。
+- 周一验证新周重新分组,旧周成绩不带入新周。
diff --git a/TongjiUniApp/tongji/endless-game/README.md b/TongjiUniApp/tongji/endless-game/README.md
new file mode 100644
index 000000000..7973a6401
--- /dev/null
+++ b/TongjiUniApp/tongji/endless-game/README.md
@@ -0,0 +1,43 @@
+# 识糖小课堂独立功能包
+
+此目录包含“识糖小课堂”无尽三消版的页面与运行代码。食品图片由远端 COS 提供,图标组件复用 `tongji` 分包的公共组件。
+
+## 目录内容
+
+- `index.vue`:页面、棋盘算法、关卡主题、任务、道具、三/四/五连奖励和适老化交互。
+- `game-endless.scss`:完整页面与动画样式。
+- `composables/useGameAuth.js`:复用主小程序账号并处理 token 过期重登。
+- `composables/useGamePlatform.js`:周榜、成绩补传与微信分享的平台连接层。
+- `composables/useGameSfx.js`:滑动、掉落、消除、连击和大奖音效。
+
+## 迁移步骤
+
+1. 复制 `endless-game` 文件夹到目标项目的 `tongji/` 目录,并确保目标项目同时提供 `tongji/components/TongjiIcon.vue` 与 `tongji/utils/svgDataUrl.js`。
+2. 在目标项目 `pages.json` 的 `tongji` 分包 `pages` 数组中加入:
+
+```json
+{
+ "path": "endless-game/index",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTitleText": "识糖小课堂",
+ "backgroundColor": "#eefbf4",
+ "disableScroll": false,
+ "enableShareAppMessage": true,
+ "enableShareTimeline": true
+ }
+}
+```
+
+3. 使用 `/tongji/endless-game/index` 打开游戏。
+4. 微信小程序后台需要将 `https://gz-1349751149.cos.ap-guangzhou.myqcloud.com` 配置为合法的音频与图片下载域名。
+
+## 说明
+
+- 旧版“糖分突袭”页面及其独占依赖已经移除,项目只注册 `/tongji/endless-game/index` 这一款小游戏。
+- 食品图片固定使用 `https://gz-1349751149.cos.ap-guangzhou.myqcloud.com/games/food/` 前缀,文件名必须与 `FOODS` 配置 key 的大小写保持一致。
+- 连消小目标按“连消×2”累计 2 次;连续 6 次普通消除没有连消时,下一次掉落会提供连消机会。“连消×3”保留为额外积分、驼乳粉与撒花惊喜,不阻挡主线任务。
+- 横向 3 个与竖向 3 个相交形成 L/T 形五消时,会在交点生成带高对比 L 标记的范围爆破棋子;该棋子再次被消除时清除周围九格。
+- 进入游戏时展示“本周 7 人同行榜”,包含真实平台昵称、前后名次、差距提示和可切换的同行/亲友鼓励;顶部“本周同行”可再次打开。后端部署方式见 `PLATFORM_INTEGRATION.md`。
+- 本功能包依赖 uni-app Vue 3、`@dcloudio/uni-app` 以及 `tongji` 分包内的公共 `TongjiIcon` 组件。
+- 食物风险等级和科普文案集中在 `index.vue` 的 `FOODS` 配置中,正式上线前仍需由医院医生审核。
diff --git a/TongjiUniApp/tongji/endless-game/composables/useGameAuth.js b/TongjiUniApp/tongji/endless-game/composables/useGameAuth.js
new file mode 100644
index 000000000..4b87d5e0e
--- /dev/null
+++ b/TongjiUniApp/tongji/endless-game/composables/useGameAuth.js
@@ -0,0 +1,71 @@
+/**
+ * 识糖小课堂独立登录适配层。复用主小程序账号,但不依赖 tongji 其他页面代码。
+ */
+export function useGameAuth(proxy) {
+ let loginPromise = null
+
+ function hasToken() {
+ return !!String(uni.getStorageSync('token') || '').trim()
+ }
+
+ function clearToken() {
+ uni.removeStorageSync('token')
+ }
+
+ function wxLoginCode() {
+ return new Promise((resolve, reject) => {
+ uni.login({
+ provider: 'weixin',
+ success: (res) => res?.code ? resolve(res.code) : reject(new Error('微信登录未返回 code')),
+ fail: reject
+ })
+ })
+ }
+
+ async function loginWithCode(code) {
+ const res = await proxy.apiUrl({
+ url: '/api/login/mnpLogin',
+ method: 'POST',
+ data: { code }
+ }, false)
+ if (res?.code !== 1 || !res.data?.token) {
+ clearToken()
+ throw new Error(res?.msg || '登录失败')
+ }
+ uni.setStorageSync('token', res.data.token)
+ uni.setStorageSync('userData', res.data)
+ return true
+ }
+
+ async function verifyOrLogin() {
+ if (hasToken()) {
+ try {
+ const res = await proxy.apiUrl({ url: '/api/user/info', method: 'POST' }, false)
+ if (res?.code === 1 && res.data) {
+ uni.setStorageSync('userData', res.data)
+ return true
+ }
+ // 只有明确的登录失效才重新换取 token;其他业务错误先保留原登录。
+ if (res?.code !== -1) return true
+ } catch (_) {
+ // 断网不清除仍可能有效的 token,成绩由离线队列稍后补传。
+ return true
+ }
+ clearToken()
+ }
+ const code = await wxLoginCode()
+ return loginWithCode(code)
+ }
+
+ async function ensureLoggedIn() {
+ if (loginPromise) return loginPromise
+ loginPromise = verifyOrLogin()
+ .then(ok => !!ok)
+ .catch(() => false)
+ // 只合并同时发生的登录;成功结果不能永久缓存,否则 token 过期后无法恢复。
+ .finally(() => { loginPromise = null })
+ return loginPromise
+ }
+
+ return { ensureLoggedIn }
+}
diff --git a/TongjiUniApp/tongji/endless-game/composables/useGamePlatform.js b/TongjiUniApp/tongji/endless-game/composables/useGamePlatform.js
new file mode 100644
index 000000000..82964786c
--- /dev/null
+++ b/TongjiUniApp/tongji/endless-game/composables/useGamePlatform.js
@@ -0,0 +1,251 @@
+import { ref } from 'vue'
+
+const EMPTY_BOARD = {
+ week_start: '',
+ week_end: '',
+ sex_label: '同行',
+ group_size: 7,
+ member_count: 0,
+ players: [],
+ me: { count: 0, rank: 1, best_score: 0, distance: 0, is_first: true },
+ invite_code: ''
+}
+const PENDING_SYNC_KEY = 'tongji_endless_pending_sync_v1'
+
+function createSessionKey() {
+ const random = Math.random().toString(36).slice(2, 12)
+ return `game_${Date.now().toString(36)}_${random}`
+}
+
+function readPendingPayloads() {
+ try {
+ const stored = uni.getStorageSync(PENDING_SYNC_KEY)
+ if (!Array.isArray(stored)) return []
+ return stored.filter(item => (
+ item
+ && /^[A-Za-z0-9_-]{16,64}$/.test(String(item.session_key || ''))
+ && Number(item.learned_count) >= 0
+ )).slice(-8)
+ } catch (_) {
+ return []
+ }
+}
+
+/**
+ * 小游戏的平台连接层。复用主小程序 token,不在游戏里另建账号。
+ * 每次上报的是本局绝对值,后端按 session_key 去重,断网重试也不会重复加分。
+ */
+export function useGamePlatform(proxy, ensureLoggedIn) {
+ const connected = ref(false)
+ const loading = ref(false)
+ const syncStatus = ref('idle')
+ const leaderboard = ref({ ...EMPTY_BOARD })
+ const confirmedSessionLearned = ref(0)
+
+ let sessionKey = createSessionKey()
+ let syncTimer = null
+ let syncing = false
+ let queuedPayloads = readPendingPayloads()
+ let connectPromise = null
+
+ function persistPendingPayloads() {
+ try { uni.setStorageSync(PENDING_SYNC_KEY, queuedPayloads.slice(-8)) } catch (_) {}
+ }
+
+ async function api(request) {
+ if (!proxy?.apiUrl) throw new Error('平台接口未初始化')
+ return proxy.apiUrl(request, false)
+ }
+
+ function applyLeaderboard(data, confirmedForSession = '') {
+ if (!data || !Array.isArray(data.players)) return
+ const inactiveSessionResponse = confirmedForSession && confirmedForSession !== sessionKey
+ if (!inactiveSessionResponse) {
+ leaderboard.value = {
+ ...EMPTY_BOARD,
+ ...data,
+ me: { ...EMPTY_BOARD.me, ...(data.me || {}) },
+ players: data.players
+ }
+ }
+ if (confirmedForSession === sessionKey && data.confirmed_session_learned != null) {
+ confirmedSessionLearned.value = Number(data.confirmed_session_learned) || 0
+ }
+ connected.value = true
+ syncStatus.value = 'synced'
+ }
+
+ async function refreshLeaderboard() {
+ const res = await api({
+ url: '/api/tcm/gameWeeklyLeaderboard',
+ method: 'GET'
+ })
+ if (res?.code !== 1 || !res.data) {
+ throw new Error(res?.msg || '同行榜加载失败')
+ }
+ applyLeaderboard(res.data)
+ return res.data
+ }
+
+ async function acceptShare(inviteCode) {
+ const code = String(inviteCode || '').trim().toUpperCase()
+ if (!code) return
+ try {
+ await api({
+ url: '/api/tcm/gameAcceptShare',
+ method: 'POST',
+ data: { invite_code: code }
+ })
+ } catch (_) {
+ // 分享关系是辅助能力,不阻断进入游戏。
+ }
+ }
+
+ async function connect(inviteCode = '') {
+ if (connectPromise) return connectPromise
+ connectPromise = (async () => {
+ loading.value = true
+ try {
+ const loggedIn = await ensureLoggedIn()
+ if (!loggedIn) throw new Error('登录失败')
+ await acceptShare(inviteCode)
+ await refreshLeaderboard()
+ if (queuedPayloads.length) flushProgress()
+ return true
+ } catch (_) {
+ connected.value = false
+ syncStatus.value = 'offline'
+ return false
+ } finally {
+ loading.value = false
+ connectPromise = null
+ }
+ })()
+ return connectPromise
+ }
+
+ function beginSession() {
+ if (syncTimer) clearTimeout(syncTimer)
+ sessionKey = createSessionKey()
+ confirmedSessionLearned.value = 0
+ syncStatus.value = queuedPayloads.length ? 'pending' : (connected.value ? 'synced' : 'offline')
+ return sessionKey
+ }
+
+ function queueProgress(learnedCount, score, ended = false) {
+ const nextPayload = {
+ session_key: sessionKey,
+ learned_count: Math.max(0, Number(learnedCount) || 0),
+ score: Math.max(0, Number(score) || 0),
+ ended: ended ? 1 : 0
+ }
+ const existingIndex = queuedPayloads.findIndex(item => item.session_key === sessionKey)
+ if (existingIndex >= 0) {
+ const existing = queuedPayloads[existingIndex]
+ queuedPayloads[existingIndex] = {
+ ...nextPayload,
+ learned_count: Math.max(existing.learned_count, nextPayload.learned_count),
+ score: Math.max(existing.score, nextPayload.score),
+ ended: Math.max(existing.ended, nextPayload.ended)
+ }
+ } else {
+ queuedPayloads.push(nextPayload)
+ }
+ persistPendingPayloads()
+ syncStatus.value = 'pending'
+ if (syncTimer) clearTimeout(syncTimer)
+ if (ended) {
+ flushProgress()
+ } else {
+ syncTimer = setTimeout(flushProgress, 1000)
+ }
+ }
+
+ async function flushProgress() {
+ if (syncTimer) clearTimeout(syncTimer)
+ syncTimer = null
+ if (syncing || !queuedPayloads.length) return
+ const payload = queuedPayloads[0]
+ syncing = true
+ syncStatus.value = 'syncing'
+ try {
+ if (!connected.value) {
+ const loggedIn = await ensureLoggedIn()
+ if (!loggedIn) throw new Error('未登录')
+ }
+ const res = await api({
+ url: '/api/tcm/gameSubmitProgress',
+ method: 'POST',
+ data: payload
+ })
+ if (res?.code !== 1 || !res.data) {
+ throw new Error(res?.msg || '成绩保存失败')
+ }
+ applyLeaderboard(res.data, payload.session_key)
+ // 请求发出后玩家可能又完成了消除。只移除已经被本次请求覆盖的进度,
+ // 不能按 session_key 整局删除,否则会丢失请求进行期间产生的新进度。
+ queuedPayloads = queuedPayloads.filter(item => (
+ item.session_key !== payload.session_key
+ || Number(item.learned_count) > Number(payload.learned_count)
+ || Number(item.score) > Number(payload.score)
+ || Number(item.ended) > Number(payload.ended)
+ ))
+ persistPendingPayloads()
+ } catch (_) {
+ connected.value = false
+ syncStatus.value = 'offline'
+ // 队首保留原绝对值,下次连接或打开榜单时安全重试。
+ persistPendingPayloads()
+ } finally {
+ syncing = false
+ if (queuedPayloads.length && connected.value) {
+ setTimeout(flushProgress, 80)
+ }
+ }
+ }
+
+ async function syncAndRefresh(learnedCount, score) {
+ queueProgress(learnedCount, score, false)
+ await flushProgress()
+ if (!connected.value) {
+ await connect()
+ if (queuedPayloads.length) await flushProgress()
+ } else {
+ try { await refreshLeaderboard() } catch (_) {}
+ }
+ }
+
+ async function recordShare() {
+ try {
+ if (!connected.value && !(await connect())) return
+ const res = await api({ url: '/api/tcm/gameRecordShare', method: 'POST' })
+ if (res?.code === 1 && res.data?.invite_code) {
+ leaderboard.value = { ...leaderboard.value, invite_code: res.data.invite_code }
+ }
+ } catch (_) {
+ // 分享本身仍可进行,统计失败不影响用户。
+ }
+ }
+
+ function dispose() {
+ if (syncTimer) clearTimeout(syncTimer)
+ syncTimer = null
+ persistPendingPayloads()
+ }
+
+ return {
+ connected,
+ loading,
+ syncStatus,
+ leaderboard,
+ confirmedSessionLearned,
+ connect,
+ beginSession,
+ queueProgress,
+ flushProgress,
+ syncAndRefresh,
+ refreshLeaderboard,
+ recordShare,
+ dispose
+ }
+}
diff --git a/TongjiUniApp/tongji/endless-game/composables/useGameSfx.js b/TongjiUniApp/tongji/endless-game/composables/useGameSfx.js
new file mode 100644
index 000000000..c99886452
--- /dev/null
+++ b/TongjiUniApp/tongji/endless-game/composables/useGameSfx.js
@@ -0,0 +1,350 @@
+/**
+ * 糖分突袭 · 游戏音效(InnerAudioContext 池化,H5/小程序通用)
+ * 每种操作独立音轨 + playbackRate 变调,避免“全是同一个声”
+ */
+import { ref, onUnmounted } from 'vue'
+
+const STORAGE_KEY = 'tongji_game_sfx_enabled'
+const COS = 'https://gz-1349751149.cos.ap-guangzhou.myqcloud.com/uploads/file'
+
+/** 9 条基础素材(已上传 COS,小程序域名白名单内) */
+const SRC = {
+ tap: `${COS}/20260526/20260526105128557ef8669.mp3`,
+ swoosh: `${COS}/20260527/202605271539371ebe13672.mp3`,
+ pop: `${COS}/20260526/202605261051282a0a94508.mp3`,
+ buzz: `${COS}/20260527/202605271539376ff628472.mp3`,
+ chime: `${COS}/20260528/202605280937077bad76716.mp3`,
+ fanfare: `${COS}/20260528/20260528093707b021f5794.mp3`,
+ blast: `${COS}/20260528/20260528093707ebd4d5733.mp3`,
+ sparkle: `${COS}/20260528/20260528093707016f07427.mp3`,
+ stinger: `${COS}/20260528/20260528093709c669f4659.mp3`
+}
+
+/**
+ * 音效表:src / volume / rate(playbackRate) / pool
+ * rate 不同可在同一素材上听出明显差异
+ */
+const SFX = {
+ // —— 基础素材别名(供分层音效直接调用)——
+ tap: { src: SRC.tap, volume: 0.32, rate: 1, pool: 3 },
+ pop: { src: SRC.pop, volume: 0.3, rate: 1, pool: 4 },
+ fanfare: { src: SRC.fanfare, volume: 0.56, rate: 1, pool: 2 },
+ blast: { src: SRC.blast, volume: 0.62, rate: 1, pool: 2 },
+ sparkle: { src: SRC.sparkle, volume: 0.5, rate: 1, pool: 2 },
+
+ // —— 交互 ——
+ select: { src: SRC.tap, volume: 0.32, rate: 1.05, pool: 3 },
+ deselect: { src: SRC.tap, volume: 0.22, rate: 0.82, pool: 2 },
+ hint: { src: SRC.tap, volume: 0.26, rate: 1.28, pool: 2 },
+
+ swap: { src: SRC.swoosh, volume: 0.38, rate: 1.0, pool: 3 },
+ swapFail: { src: SRC.buzz, volume: 0.36, rate: 1.18, pool: 2 },
+
+ drop: { src: SRC.pop, volume: 0.3, rate: 0.88, pool: 4 },
+ dropLight: { src: SRC.pop, volume: 0.22, rate: 1.22, pool: 2 },
+
+ // —— 消除(按连数)——
+ match3: { src: SRC.chime, volume: 0.48, rate: 1.0, pool: 4 },
+ match4: { src: SRC.fanfare, volume: 0.54, rate: 1.06, pool: 3 },
+ match5: { src: SRC.blast, volume: 0.62, rate: 1.0, pool: 3 },
+
+ // —— 消除(按 GI 主色)——
+ matchLowGi: { src: SRC.chime, volume: 0.42, rate: 0.86, pool: 2 },
+ matchMidGi: { src: SRC.chime, volume: 0.46, rate: 1.02, pool: 2 },
+ matchHighGi: { src: SRC.buzz, volume: 0.44, rate: 0.92, pool: 2 },
+
+ // —— 连消 ——
+ combo2: { src: SRC.fanfare, volume: 0.56, rate: 1.12, pool: 2 },
+ combo3: { src: SRC.blast, volume: 0.64, rate: 1.08, pool: 2 },
+ comboMega: { src: SRC.blast, volume: 0.72, rate: 1.22, pool: 2 },
+
+ // —— 道具 ——
+ insulin: { src: SRC.sparkle, volume: 0.5, rate: 1.15, pool: 2 },
+ fiber: { src: SRC.swoosh, volume: 0.48, rate: 1.32, pool: 2 },
+ meal: { src: SRC.stinger, volume: 0.42, rate: 1.35, pool: 1 },
+ reshuffle: { src: SRC.swoosh, volume: 0.46, rate: 0.72, pool: 2 },
+
+ // —— 反馈 ——
+ score: { src: SRC.tap, volume: 0.28, rate: 1.38, pool: 2 },
+ goalTick: { src: SRC.chime, volume: 0.36, rate: 1.45, pool: 2 },
+ meterWarn: { src: SRC.buzz, volume: 0.5, rate: 1.0, pool: 2 },
+ meterDanger: { src: SRC.buzz, volume: 0.58, rate: 0.78, pool: 2 },
+ meterStable: { src: SRC.pop, volume: 0.24, rate: 1.05, pool: 1 },
+
+ win: { src: SRC.fanfare, volume: 0.66, rate: 1.0, pool: 1 },
+ winStinger: { src: SRC.stinger, volume: 0.38, rate: 1.5, pool: 1 },
+ lose: { src: SRC.buzz, volume: 0.52, rate: 0.68, pool: 1 },
+
+ // 兼容旧名
+ match: { src: SRC.chime, volume: 0.48, rate: 1.0, pool: 4 },
+ combo: { src: SRC.fanfare, volume: 0.56, rate: 1.1, pool: 3 },
+ heal: { src: SRC.pop, volume: 0.44, rate: 1.18, pool: 2 },
+ boost: { src: SRC.sparkle, volume: 0.52, rate: 1.0, pool: 2 },
+ invalid: { src: SRC.buzz, volume: 0.4, rate: 1.15, pool: 2 },
+ danger: { src: SRC.blast, volume: 0.58, rate: 0.95, pool: 2 }
+}
+
+const WARMUP_SFX = [
+ 'select', 'swap', 'swapFail', 'drop', 'dropLight',
+ 'match3', 'match4', 'match5', 'combo2', 'combo3', 'comboMega',
+ 'insulin', 'sparkle', 'reshuffle', 'lose'
+]
+
+function createAudioContext() {
+ if (typeof Audio !== 'undefined') {
+ const audio = new Audio()
+ audio.preload = 'auto'
+ return {
+ get src() { return audio.src },
+ set src(value) { audio.src = value },
+ get volume() { return audio.volume },
+ set volume(value) { audio.volume = value },
+ get playbackRate() { return audio.playbackRate },
+ set playbackRate(value) { audio.playbackRate = value },
+ play() {
+ const promise = audio.play()
+ if (promise?.catch) promise.catch(() => {})
+ },
+ stop() {
+ audio.pause()
+ try { audio.currentTime = 0 } catch (_) {}
+ },
+ seek(time) {
+ try { audio.currentTime = time } catch (_) {}
+ },
+ destroy() {
+ audio.pause()
+ audio.removeAttribute('src')
+ }
+ }
+ }
+ return uni.createInnerAudioContext()
+}
+
+class SfxPool {
+ constructor(src, size, volume, rate = 1) {
+ this.src = src
+ this.size = size
+ this.volume = volume
+ this.rate = rate
+ this.list = []
+ this.cursor = 0
+ this.warmedUp = false
+ }
+
+ createOne() {
+ const ctx = createAudioContext()
+ ctx.src = this.src
+ ctx.obeyMuteSwitch = false
+ ctx.autoplay = false
+ ctx.volume = this.volume
+ try {
+ ctx.playbackRate = this.rate
+ } catch (_) {}
+ this.list.push(ctx)
+ return ctx
+ }
+
+ create() {
+ while (this.list.length < this.size) this.createOne()
+ }
+
+ warmUp() {
+ if (this.warmedUp) return
+ const ctx = this.list[0] || this.createOne()
+ try {
+ ctx.volume = 0
+ ctx.play()
+ setTimeout(() => {
+ try {
+ ctx.stop()
+ ctx.volume = this.volume
+ } catch (_) {}
+ }, 60)
+ } catch (_) {}
+ if (this.size > 1) this.cursor = 1
+ this.warmedUp = true
+ }
+
+ play(scale = 1, rateMul = 1) {
+ if (this.list.length < this.size) this.create()
+ const ctx = this.list[this.cursor % this.list.length]
+ this.cursor += 1
+ const vol = Math.min(1, this.volume * scale)
+ const rate = Math.min(2, Math.max(0.5, this.rate * rateMul))
+ try {
+ ctx.volume = vol
+ try {
+ ctx.playbackRate = rate
+ } catch (_) {}
+ ctx.stop()
+ ctx.seek(0)
+ ctx.play()
+ } catch (_) {
+ try {
+ ctx.play()
+ } catch (e) {}
+ }
+ }
+
+ destroy() {
+ this.list.forEach((ctx) => {
+ try {
+ ctx.stop()
+ ctx.destroy()
+ } catch (_) {}
+ })
+ this.list = []
+ this.warmedUp = false
+ }
+}
+
+function dominantGi(tiles = []) {
+ const cnt = { low: 0, mid: 0, high: 0 }
+ tiles.forEach((t) => {
+ const g = t?.type?.gi
+ if (g && cnt[g] !== undefined) cnt[g] += 1
+ })
+ let best = 'mid'
+ let max = 0
+ Object.entries(cnt).forEach(([k, v]) => {
+ if (v > max) {
+ max = v
+ best = k
+ }
+ })
+ return best
+}
+
+export function useGameSfx() {
+ const enabled = ref(true)
+ const pools = {}
+
+ try {
+ const stored = uni.getStorageSync(STORAGE_KEY)
+ if (stored === false || stored === '0' || stored === 0) {
+ enabled.value = false
+ }
+ } catch (_) {}
+
+ function ensureAudioOption() {
+ // #ifdef MP-WEIXIN
+ try {
+ uni.setInnerAudioOption({
+ obeyMuteSwitch: false,
+ mixWithOther: true
+ })
+ } catch (_) {}
+ // #endif
+ }
+
+ function getPool(name) {
+ const cfg = SFX[name]
+ if (!cfg) return null
+ if (!pools[name]) {
+ pools[name] = new SfxPool(cfg.src, cfg.pool, cfg.volume, cfg.rate ?? 1)
+ }
+ return pools[name]
+ }
+
+ function warmUp() {
+ if (!enabled.value) return
+ ensureAudioOption()
+ const names = typeof Audio !== 'undefined' ? ['select'] : WARMUP_SFX
+ names.forEach((name) => {
+ getPool(name)?.warmUp()
+ })
+ }
+
+ function play(name, scale = 1, rateMul = 1) {
+ if (!enabled.value) return
+ getPool(name)?.play(scale, rateMul)
+ }
+
+ function playLayer(primary, secondary, delayMs = 70, secScale = 0.6) {
+ play(primary)
+ if (secondary) {
+ setTimeout(() => play(secondary, secScale), delayMs)
+ }
+ }
+
+ function playMatch({ matchCount = 3, chain = 0, tiles = [] } = {}) {
+ if (!enabled.value) return
+ const giTrack = (() => {
+ const gi = dominantGi(tiles)
+ if (gi === 'low') return 'matchLowGi'
+ if (gi === 'high') return 'matchHighGi'
+ return 'matchMidGi'
+ })()
+
+ if (chain >= 3) {
+ playLayer('comboMega', giTrack, 90, 0.55)
+ return
+ }
+ if (chain === 2) {
+ playLayer('combo3', giTrack, 80, 0.5)
+ return
+ }
+ if (chain === 1) {
+ playLayer('combo2', giTrack, 70, 0.45)
+ return
+ }
+
+ if (matchCount >= 5) {
+ playLayer('match5', 'matchHighGi', 85, 0.5)
+ } else if (matchCount >= 4) {
+ playLayer('match4', giTrack, 65, 0.48)
+ } else {
+ play(giTrack, 1, 1)
+ setTimeout(() => play('match3', 0.85), 40)
+ }
+ }
+
+ function playDrop(count = 1) {
+ if (!enabled.value || count <= 0) return
+ const name = count >= 4 ? 'drop' : 'dropLight'
+ play(name, Math.min(1.2, 0.85 + count * 0.04), count >= 6 ? 0.9 : 1)
+ }
+
+ function playMeter(delta, level) {
+ if (!enabled.value) return
+ if (level > 70) play('meterDanger', 1 + (level - 70) * 0.02)
+ else if (level < 30) play('meterWarn', 0.9, 0.95)
+ else if (delta > 8) play('meterWarn', 0.75)
+ else if (delta < -5) play('meterStable', 1.1)
+ }
+
+ function toggleEnabled() {
+ enabled.value = !enabled.value
+ try {
+ uni.setStorageSync(STORAGE_KEY, enabled.value ? '1' : '0')
+ } catch (_) {}
+ if (enabled.value) {
+ warmUp()
+ play('select')
+ }
+ }
+
+ function destroyAll() {
+ Object.keys(pools).forEach((key) => {
+ pools[key]?.destroy()
+ delete pools[key]
+ })
+ }
+
+ onUnmounted(() => {
+ destroyAll()
+ })
+
+ return {
+ enabled,
+ play,
+ playLayer,
+ playMatch,
+ playDrop,
+ playMeter,
+ warmUp,
+ toggleEnabled,
+ destroyAll
+ }
+}
diff --git a/TongjiUniApp/tongji/endless-game/game-endless.scss b/TongjiUniApp/tongji/endless-game/game-endless.scss
new file mode 100644
index 000000000..1c0f0a39d
--- /dev/null
+++ b/TongjiUniApp/tongji/endless-game/game-endless.scss
@@ -0,0 +1,570 @@
+.eg-page {
+ min-height: 100vh;
+ color: #173b32;
+ background: linear-gradient(180deg, #eefbf4 0%, #f9f3dd 56%, #fffaf1 100%);
+ font-family: -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Microsoft YaHei', sans-serif;
+}
+
+.eg-confetti-layer { position: fixed; z-index: 80; inset: 0; overflow: hidden; pointer-events: none; }
+.eg-confetti-piece {
+ position: absolute;
+ top: -70rpx;
+ display: block;
+ border-radius: 3rpx;
+ box-shadow: 0 2rpx 4rpx rgba(0,0,0,.12);
+ animation-name: egConfettiFall;
+ animation-timing-function: cubic-bezier(.18,.72,.35,1);
+ animation-fill-mode: both;
+}
+.eg-confetti-piece.is-emoji { width: auto !important; height: auto !important; background: transparent !important; box-shadow: none; font-size: 42rpx; }
+
+.eg-nav {
+ position: relative;
+ display: grid;
+ box-sizing: border-box;
+ grid-template-columns: 156rpx minmax(0, 1fr) 156rpx;
+ align-items: center;
+ column-gap: 12rpx;
+ padding-right: 28rpx;
+ padding-bottom: 16rpx;
+ padding-left: 28rpx;
+}
+
+.eg-nav-leading { display: flex; width: 156rpx; justify-content: flex-start; }
+
+.eg-nav-btn {
+ display: flex;
+ width: 72rpx;
+ height: 72rpx;
+ align-items: center;
+ justify-content: center;
+ border: 2rpx solid rgba(21, 94, 75, .12);
+ border-radius: 24rpx;
+ background: rgba(255,255,255,.82);
+}
+
+.eg-nav-actions { display: flex; width: 156rpx; flex-shrink: 0; justify-content: flex-end; gap: 10rpx; }
+.eg-nav-btn--small { width: 68rpx; height: 68rpx; border-radius: 22rpx; }
+
+.eg-title-wrap { display: flex; min-width: 0; flex-direction: column; align-items: center; }
+.eg-title, .eg-subtitle { overflow: hidden; max-width: 100%; white-space: nowrap; text-overflow: ellipsis; }
+.eg-title { color: #155e4b; font-size: 40rpx; font-weight: 800; }
+.eg-subtitle { margin-top: 2rpx; color: #648278; font-size: 24rpx; }
+.eg-content { padding: 0 16rpx 48rpx; }
+
+.eg-score-card {
+ display: flex;
+ align-items: center;
+ margin-bottom: 16rpx;
+ padding: 18rpx 24rpx;
+ border: 2rpx solid rgba(21, 94, 75, .1);
+ border-radius: 28rpx;
+ background: rgba(255,255,255,.9);
+ box-shadow: 0 10rpx 28rpx rgba(32, 78, 43, .08);
+}
+
+.eg-stat { display: flex; flex: 1; flex-direction: column; align-items: center; }
+.eg-stat--main { border-right: 2rpx solid #e2eee8; border-left: 2rpx solid #e2eee8; }
+.eg-stat-label { color: #71847d; font-size: 24rpx; }
+.eg-stat-value { margin-top: 4rpx; color: #204e2b; font-size: 38rpx; font-weight: 800; }
+.eg-stat-score { margin-top: 2rpx; color: #e16f24; font-size: 46rpx; font-weight: 900; }
+.eg-stat--rank { position: relative; cursor: pointer; }
+.eg-stat--rank.is-locked { opacity: .52; }
+.eg-stat-rank-value { margin-top: 1rpx; color: #176b52; font-size: 35rpx; font-weight: 1000; line-height: 1.08; }
+.eg-stat-rank-hint { margin-top: 2rpx; color: #df7427; font-size: 18rpx; font-weight: 800; }
+
+.eg-task-card {
+ margin-bottom: 16rpx;
+ padding: 18rpx 22rpx;
+ border-radius: 24rpx;
+ background: rgba(255, 249, 223, .94);
+ box-shadow: 0 8rpx 22rpx rgba(118, 89, 25, .08);
+}
+.eg-task-card { position: relative; overflow: visible; }
+
+.eg-task-reward-flight {
+ position: absolute;
+ z-index: 72;
+ top: 4rpx;
+ left: 42%;
+ display: flex;
+ width: 112rpx;
+ height: 92rpx;
+ align-items: center;
+ justify-content: center;
+ border: 4rpx solid rgba(255,255,255,.96);
+ border-radius: 24rpx;
+ background: #fff7e8;
+ box-shadow: 0 10rpx 24rpx rgba(159,94,23,.28);
+ animation: egTaskRewardFlight 1.12s cubic-bezier(.18,.78,.22,1) both;
+ pointer-events: none;
+}
+.eg-task-reward-flight > image { position: relative; z-index: 2; width: 78rpx; height: 66rpx; }
+.eg-task-reward-flight > text { position: absolute; z-index: 3; top: -14rpx; right: -16rpx; display: flex; width: 48rpx; height: 48rpx; align-items: center; justify-content: center; border: 4rpx solid #fff; border-radius: 50%; color: #fff; background: #ed7625; box-shadow: 0 5rpx 12rpx rgba(191,75,19,.3); font-size: 25rpx; font-weight: 1000; }
+.eg-task-reward-glow { position: absolute; z-index: 1; inset: -15rpx; border-radius: 32rpx; background: radial-gradient(circle, rgba(255,210,67,.52), rgba(255,210,67,0) 68%); animation: egRewardGlow .42s ease-in-out infinite alternate; }
+
+.eg-task-head { display: flex; align-items: center; justify-content: space-between; color: #7c5b1b; font-size: 27rpx; font-weight: 700; }
+.eg-task-name { display: flex; align-items: center; gap: 10rpx; }
+.eg-task-count { color: #9a6718; font-size: 29rpx; }
+.eg-progress { height: 14rpx; margin-top: 12rpx; overflow: hidden; border-radius: 999rpx; background: #eadfbd; }
+.eg-progress-fill { height: 100%; border-radius: inherit; background: linear-gradient(90deg, #f0a128, #f4c34f); transition: width .25s; }
+
+.eg-board-shell {
+ position: relative;
+ padding: 14rpx;
+ border: 2rpx solid rgba(34, 103, 79, .16);
+ border-radius: 34rpx;
+ background: rgba(255,255,255,.92);
+ box-shadow: 0 18rpx 44rpx rgba(29, 78, 59, .12);
+}
+
+.eg-board-top { display: flex; align-items: center; justify-content: space-between; margin: 0 4rpx 14rpx; }
+.eg-board-bonuses { display: flex; align-items: center; gap: 8rpx; }
+.eg-combo { padding: 8rpx 16rpx; border-radius: 999rpx; color: #45685d; background: #e8f3ee; font-size: 25rpx; font-weight: 700; }
+.eg-combo.is-hot { color: #fff; background: linear-gradient(135deg, #f59e0b, #ea580c); }
+.eg-double-state { padding: 8rpx 14rpx; border: 2rpx solid rgba(255,255,255,.9); border-radius: 999rpx; color: #fff; background: linear-gradient(135deg, #7c3aed, #d946ef); box-shadow: 0 4rpx 12rpx rgba(124,58,237,.24); font-size: 23rpx; font-weight: 900; white-space: nowrap; }
+.eg-risk { display: flex; align-items: center; gap: 10rpx; color: #8d512c; font-size: 24rpx; }
+.eg-risk-dots { display: flex; gap: 5rpx; }
+.eg-risk-dot { width: 12rpx; height: 12rpx; border-radius: 50%; background: #ead8c9; }
+.eg-risk-dot.on { background: #e96b3b; box-shadow: 0 0 0 3rpx rgba(233,107,59,.12); }
+.eg-board { display: flex; flex-direction: column; gap: 8rpx; opacity: 1; transition: opacity .15s; }
+.eg-board.is-busy { opacity: .82; }
+.eg-row { display: flex; gap: 8rpx; }
+
+.eg-cell {
+ position: relative;
+ display: flex;
+ height: 166rpx;
+ flex: 1;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ overflow: hidden;
+ border: 5rpx solid transparent;
+ border-radius: 26rpx;
+ box-shadow: inset 0 -5rpx 0 rgba(0,0,0,.05), 0 5rpx 12rpx rgba(31, 66, 53, .08);
+ transition: transform .16s cubic-bezier(.2,.8,.2,1), border-color .15s, opacity .16s, filter .16s;
+ will-change: transform;
+}
+
+.eg-cell.is-dragging { transition: transform .055s linear, border-color .15s; }
+.eg-cell.is-selected { z-index: 2; border-color: #167d61; transform: scale(1.06); box-shadow: 0 0 0 6rpx rgba(22,125,97,.14); }
+.eg-cell.is-camel-target { border-color: #f59e0b; animation: egPulse 1s infinite; }
+.eg-replace-target { position: absolute; z-index: 7; right: 7rpx; bottom: 6rpx; padding: 4rpx 10rpx; border: 2rpx solid #fff; border-radius: 999rpx; color: #fff; background: #1570a6; box-shadow: 0 3rpx 9rpx rgba(20,91,135,.28); font-size: 20rpx; font-weight: 900; }
+.eg-cell.is-clearing {
+ z-index: 8;
+ border-color: #fff;
+ animation: egHit .22s cubic-bezier(.2,.9,.3,1) forwards;
+ filter: brightness(1.28) saturate(1.25);
+}
+.eg-cell.is-yellow,
+.eg-cell.is-cream,
+.eg-cell.is-red,
+.eg-cell.is-purple { background: #fffaf0; }
+.eg-cell.is-level-low { background: #f4faf6; }
+.eg-cell.is-level-mid { background: #fff9eb; }
+.eg-cell.is-orange,
+.eg-cell.is-level-high { background: #fff0e4; }
+.eg-cell.is-milk { background: #edf7ff; }
+.eg-cell.is-high { border-color: #ef7b45; }
+.eg-food-image { width: 132rpx; height: 92rpx; margin-top: 7rpx; border-radius: 17rpx; filter: saturate(1.06) contrast(1.03); }
+.eg-food-name { margin-top: 8rpx; color: #203d34; font-size: 29rpx; font-weight: 900; letter-spacing: 1rpx; line-height: 1.1; }
+.eg-sugar-tag { position: absolute; top: 5rpx; right: 5rpx; min-width: 52rpx; padding: 4rpx 10rpx; border: 2rpx solid #fff; border-radius: 999rpx; color: #fff; box-shadow: 0 3rpx 8rpx rgba(25,55,45,.22); font-size: 23rpx; font-weight: 900; line-height: 1.25; text-align: center; }
+.eg-sugar-tag.is-low { color: #316a54; border-color: rgba(255,255,255,.82); background: #dcefe6; box-shadow: 0 2rpx 5rpx rgba(32,101,75,.1); }
+.eg-sugar-tag.is-mid { color: #735a15; border-color: rgba(255,255,255,.9); background: #f7e7a8; box-shadow: 0 2rpx 6rpx rgba(137,91,0,.15); }
+.eg-sugar-tag.is-high { background: #d9431f; box-shadow: 0 4rpx 10rpx rgba(163,45,21,.32); }
+.eg-sugar-tag.is-prop { background: #2563a8; }
+.eg-special-mark { position: absolute; z-index: 12; bottom: 5rpx; left: 6rpx; display: flex; width: 40rpx; height: 40rpx; align-items: center; justify-content: center; border: 3rpx solid rgba(255,255,255,.96); border-radius: 50%; color: #fff; background: #6d28d9; box-shadow: 0 4rpx 11rpx rgba(73,31,130,.3); font-size: 23rpx; font-weight: 900; }
+.eg-special-mark.is-row { width: 58rpx; height: 40rpx; border-radius: 999rpx; background: linear-gradient(135deg, #ffd64d, #ff8a18 48%, #e83b22); box-shadow: 0 0 0 4rpx rgba(255,172,30,.2), 0 4rpx 15rpx rgba(203,59,26,.45); animation: egFlameReady .7s ease-in-out infinite alternate; }
+.eg-special-mark.is-col { width: 40rpx; height: 58rpx; border-radius: 999rpx; background: linear-gradient(180deg, #ffd64d, #ff8a18 48%, #e83b22); box-shadow: 0 0 0 4rpx rgba(255,172,30,.2), 0 4rpx 15rpx rgba(203,59,26,.45); animation: egFlameReady .7s ease-in-out infinite alternate; }
+.eg-special-mark.is-burst { width: 48rpx; height: 48rpx; border-color: #fff3a8; border-radius: 15rpx 50% 50%; background: linear-gradient(145deg, #7c3aed 5%, #dd3b70 48%, #ff8a18 100%); box-shadow: 0 4rpx 13rpx rgba(108,35,155,.38), 0 0 12rpx rgba(255,179,38,.3); animation: egLReady 1.25s ease-in-out infinite alternate; }
+.eg-mini-flame { position: relative; width: 25rpx; height: 30rpx; border-radius: 70% 32% 68% 40%; background: linear-gradient(135deg, #fff8a8 8%, #ffc21f 42%, #f04420 84%); box-shadow: 0 0 14rpx rgba(255,230,92,.95); transform: rotate(43deg); }
+.eg-mini-flame-core { position: absolute; right: 4rpx; bottom: 3rpx; width: 10rpx; height: 15rpx; border-radius: 70% 35% 70% 42%; background: #fffbd1; box-shadow: 0 0 7rpx rgba(255,255,210,.95); }
+.eg-l-special { position: relative; width: 29rpx; height: 29rpx; filter: drop-shadow(0 1rpx 2rpx rgba(73,22,105,.3)); }
+.eg-l-arm { position: absolute; left: 3rpx; bottom: 3rpx; border-radius: 999rpx; background: #fff9b8; box-shadow: 0 0 6rpx rgba(255,249,184,.92); }
+.eg-l-arm.is-vertical { width: 8rpx; height: 25rpx; }
+.eg-l-arm.is-horizontal { width: 25rpx; height: 8rpx; }
+.eg-l-core { position: absolute; left: 1rpx; bottom: 1rpx; width: 12rpx; height: 12rpx; border: 2rpx solid #fff; border-radius: 50%; background: #ff5b25; }
+.eg-cell.is-fire-clearing { border-color: #ff7a1a; box-shadow: inset 0 0 25rpx rgba(255,102,18,.36), 0 0 18rpx rgba(255,105,20,.48); filter: brightness(1.35) saturate(1.42); }
+.eg-cell.is-clearing.is-fire-clearing { animation: egFireCellHit .36s cubic-bezier(.2,.78,.22,1) forwards; }
+.eg-fire-clear { position: absolute; z-index: 14; inset: 2rpx; overflow: hidden; border: 3rpx solid rgba(255,210,71,.92); border-radius: 22rpx; opacity: .96; background: linear-gradient(180deg, rgba(255,230,86,.12), rgba(239,63,27,.22)); pointer-events: none; }
+.eg-fire-glow { position: absolute; inset: 6%; border-radius: 18rpx; background: radial-gradient(circle, rgba(255,246,177,.74), rgba(255,131,22,.32) 47%, rgba(222,47,23,0) 75%); animation: egFireGlow .34s ease-out both; }
+.eg-fire-sweep { position: absolute; top: 23%; left: -48%; width: 168%; height: 55%; border-radius: 60% 45% 55% 42%; background: linear-gradient(90deg, rgba(255,184,38,0), rgba(255,238,124,.94) 28%, rgba(255,133,22,.92) 53%, rgba(226,54,25,.82) 72%, rgba(255,184,38,0)); box-shadow: 0 0 27rpx rgba(255,91,17,.72); animation: egFireSweep .34s cubic-bezier(.2,.78,.22,1) both; }
+.eg-fire-flame { position: absolute; bottom: 13%; width: 25rpx; height: 39rpx; border-radius: 72% 35% 68% 42%; background: linear-gradient(145deg, #fff7a6 4%, #ffc329 39%, #ff7419 66%, #dc321f 100%); box-shadow: 0 0 15rpx rgba(255,124,21,.88); transform: rotate(42deg); animation: egFireFlame .34s ease-out both; }
+.eg-fire-flame > view { position: absolute; right: 5rpx; bottom: 4rpx; width: 10rpx; height: 18rpx; border-radius: 70% 35% 70% 42%; background: #fffbd6; }
+.eg-fire-flame.is-left { left: 16%; animation-delay: .01s; }
+.eg-fire-flame.is-center { left: 43%; bottom: 19%; transform: rotate(42deg) scale(1.18); animation-delay: .035s; }
+.eg-fire-flame.is-right { right: 15%; animation-delay: .065s; }
+.eg-fire-spark { position: absolute; width: 10rpx; height: 17rpx; border-radius: 70% 35% 70% 42%; background: #ffe45e; box-shadow: 0 0 11rpx rgba(255,139,28,.9); animation: egFireSpark .34s ease-out both; }
+.eg-fire-spark.is-one { top: 46%; left: 25%; }
+.eg-fire-spark.is-two { top: 34%; left: 62%; animation-delay: .035s; }
+.eg-fire-spark.is-three { top: 52%; left: 78%; animation-delay: .07s; }
+.eg-board-tip { display: flex; align-items: center; justify-content: center; gap: 8rpx; min-height: 58rpx; margin-top: 12rpx; color: #684817; font-size: 26rpx; font-weight: 700; text-align: center; }
+.eg-impact-text {
+ position: absolute;
+ z-index: 20;
+ top: 46%;
+ left: 50%;
+ padding: 10rpx 24rpx;
+ border: 4rpx solid rgba(255,255,255,.9);
+ border-radius: 999rpx;
+ color: #fff;
+ background: linear-gradient(135deg, #f59e0b, #e4572e);
+ box-shadow: 0 10rpx 28rpx rgba(190, 70, 25, .35);
+ font-size: 34rpx;
+ font-weight: 900;
+ transform: translate(-50%, -50%);
+ animation: egImpact .52s cubic-bezier(.16,.82,.3,1) forwards;
+ pointer-events: none;
+}
+.eg-impact-text.is-level-2 { font-size: 40rpx; background: linear-gradient(135deg, #8b5cf6, #ec4899); }
+.eg-impact-text.is-level-3 { font-size: 46rpx; background: linear-gradient(135deg, #ef4444, #f59e0b); box-shadow: 0 12rpx 36rpx rgba(239,68,68,.42); }
+.eg-jackpot {
+ position: absolute;
+ z-index: 30;
+ top: 48%;
+ left: 50%;
+ width: 540rpx;
+ padding: 24rpx 22rpx 20rpx;
+ overflow: hidden;
+ border: 7rpx solid #ffd83d;
+ border-radius: 36rpx;
+ color: #fff;
+ background: radial-gradient(circle at 50% 0%, #ef4444, #9f1239 65%, #64102a);
+ box-shadow: 0 0 0 7rpx #fff2a8, 0 22rpx 52rpx rgba(100,16,42,.5);
+ text-align: center;
+ transform: translate(-50%, -50%);
+ animation: egJackpotIn 1.35s cubic-bezier(.16,.85,.25,1) forwards;
+ pointer-events: none;
+}
+.eg-jackpot.is-match-4 { background: radial-gradient(circle at 50% 0%, #8b5cf6, #5b21b6 68%, #35106d); }
+.eg-jackpot.is-match-5 { border-color: #fff36a; background: radial-gradient(circle at 50% 0%, #ff6b24, #d7193f 58%, #760c2a); animation-duration: 1.9s; }
+.eg-jackpot.is-match-3 {
+ width: 414rpx;
+ padding: 20rpx 22rpx 18rpx;
+ border-width: 4rpx;
+ border-color: #f1c663;
+ color: #31574b;
+ background: linear-gradient(155deg, #f7fff9, #fff5d9);
+ box-shadow: 0 0 0 4rpx rgba(255,255,255,.84), 0 14rpx 34rpx rgba(98,82,39,.2);
+ animation: egTripleIn 1.12s cubic-bezier(.2,.82,.28,1) forwards;
+}
+.eg-jackpot.is-match-3 .eg-jackpot-lights { display: none; }
+.eg-jackpot.is-match-3 .eg-jackpot-kicker { color: #5b8c73; font-size: 21rpx; letter-spacing: 3rpx; text-shadow: none; }
+.eg-jackpot.is-match-3 .eg-jackpot-title { color: #365b4e; font-size: 31rpx; text-shadow: none; }
+.eg-jackpot.is-match-3 .eg-jackpot-reward { color: #ad7021; font-size: 25rpx; }
+.eg-jackpot.is-match-3 .eg-jackpot-note { color: #829087; }
+.eg-triple-cans { position: relative; display: flex; justify-content: center; gap: 12rpx; margin: 12rpx 0 10rpx; }
+.eg-triple-can { display: flex; width: 78rpx; height: 76rpx; align-items: center; justify-content: center; border: 3rpx solid #f4d996; border-radius: 19rpx; background: rgba(255,255,255,.9); box-shadow: 0 5rpx 12rpx rgba(128,92,30,.12); animation: egTripleCan .42s cubic-bezier(.2,.86,.26,1) both; }
+.eg-triple-can:nth-child(2) { animation-delay: .07s; }
+.eg-triple-can:nth-child(3) { animation-delay: .14s; }
+.eg-triple-can > image { width: 62rpx; height: 58rpx; }
+
+.eg-jackpot.is-match-4 {
+ width: 548rpx;
+ padding: 25rpx 22rpx 22rpx;
+ border-color: #ffd95b;
+ background: radial-gradient(circle at 50% -10%, #a97cff, #6031b5 58%, #341066);
+ box-shadow: 0 0 0 6rpx #fff0a9, 0 0 36rpx rgba(255,210,76,.5), 0 24rpx 58rpx rgba(53,16,109,.48);
+ animation: egFourIn 1.88s cubic-bezier(.16,.84,.24,1) forwards;
+}
+.eg-jackpot.is-match-4 .eg-jackpot-kicker { color: #ffef8d; font-size: 24rpx; letter-spacing: 3rpx; }
+.eg-jackpot.is-match-4 .eg-jackpot-title { margin-top: 9rpx; color: #fff; font-size: 39rpx; }
+.eg-jackpot.is-match-4 .eg-jackpot-reward { color: #fff2a8; }
+.eg-four-teaser { position: relative; margin-top: 13rpx; }
+.eg-four-cans { display: flex; align-items: center; justify-content: center; gap: 8rpx; }
+.eg-four-can { display: flex; width: 76rpx; height: 92rpx; align-items: center; justify-content: center; border: 4rpx solid #ffe078; border-radius: 18rpx; background: linear-gradient(180deg, #fffef7, #ffe9a5); box-shadow: inset 0 -5rpx 0 rgba(171,106,17,.12), 0 7rpx 13rpx rgba(34,12,67,.28); animation: egFourCan .48s cubic-bezier(.18,.9,.25,1.2) both; }
+.eg-four-can:nth-child(2) { animation-delay: .07s; }
+.eg-four-can:nth-child(3) { animation-delay: .14s; }
+.eg-four-can:nth-child(4) { animation-delay: .21s; }
+.eg-four-can > image { width: 64rpx; height: 70rpx; }
+.eg-four-can.is-locked { border-style: dashed; border-color: rgba(255,241,161,.86); color: #fff6ae; background: rgba(48,18,91,.54); box-shadow: inset 0 0 16rpx rgba(255,225,91,.18), 0 0 18rpx rgba(255,222,91,.36); font-size: 48rpx; font-weight: 1000; animation: egLockedCan .68s .34s ease-in-out infinite alternate; }
+.eg-four-promise { display: inline-flex; margin-top: 15rpx; padding: 8rpx 18rpx; border: 2rpx solid rgba(255,247,184,.72); border-radius: 999rpx; color: #3d176f; background: linear-gradient(90deg, #fff3a3, #ffd85b); box-shadow: 0 5rpx 15rpx rgba(28,7,62,.22); font-size: 25rpx; font-weight: 1000; animation: egPromisePulse .72s ease-in-out infinite alternate; }
+.eg-five-celebration { position: relative; margin: 15rpx 0 10rpx; }
+.eg-five-cans { display: flex; align-items: center; justify-content: center; gap: 8rpx; }
+.eg-five-can { display: flex; width: 78rpx; height: 93rpx; align-items: center; justify-content: center; border: 4rpx solid #fff17b; border-radius: 18rpx; background: linear-gradient(180deg, #fff, #fff2ac); box-shadow: inset 0 -5rpx 0 rgba(184,91,12,.13), 0 7rpx 0 #bd5b13, 0 0 16rpx rgba(255,240,101,.5); animation: egFiveCan .56s cubic-bezier(.16,.92,.24,1.2) both; }
+.eg-five-can:nth-child(2) { animation-delay: .07s; }
+.eg-five-can:nth-child(3) { animation-delay: .14s; }
+.eg-five-can:nth-child(4) { animation-delay: .21s; }
+.eg-five-can:nth-child(5) { animation-delay: .28s; }
+.eg-five-can > image { width: 65rpx; height: 72rpx; }
+.eg-five-sevens { display: flex; justify-content: center; gap: 8rpx; margin-top: 13rpx; }
+.eg-five-sevens > text { display: flex; width: 58rpx; height: 55rpx; align-items: center; justify-content: center; border: 3rpx solid #fff5a7; border-radius: 13rpx; color: #fff36a; background: linear-gradient(155deg, #d7193f, #9f1239); box-shadow: 0 5rpx 0 #70102b, 0 0 13rpx rgba(255,243,106,.45); font-size: 43rpx; font-weight: 1000; line-height: 1; text-shadow: 0 3rpx 0 #8f1733; }
+.eg-jackpot-lights { position: absolute; inset: 8rpx; border: 4rpx dotted rgba(255,255,255,.88); border-radius: 25rpx; animation: egLights .24s steps(2) infinite; }
+.eg-jackpot-kicker { position: relative; display: block; color: #fff36a; font-size: 28rpx; font-weight: 900; letter-spacing: 6rpx; text-shadow: 0 3rpx 0 rgba(83,19,25,.45); }
+.eg-jackpot-reels { position: relative; display: flex; justify-content: center; gap: 12rpx; margin: 13rpx 0; }
+.eg-jackpot-reel { display: flex; width: 112rpx; height: 126rpx; flex-direction: column; align-items: center; justify-content: center; border: 6rpx solid #ffcf31; border-radius: 20rpx; background: linear-gradient(180deg, #fff 0%, #fff7cf 48%, #ffd55e 50%, #fff 53%, #fff8dc 100%); box-shadow: inset 0 0 18rpx rgba(137,78,10,.25), 0 7rpx 0 #a85a0a; animation: egReelStop .52s cubic-bezier(.2,.9,.25,1) both; }
+.eg-jackpot-reel:nth-child(2) { animation-delay: .09s; }
+.eg-jackpot-reel:nth-child(3) { animation-delay: .18s; }
+.eg-jackpot-seven { color: #e11d48; font-size: 61rpx; font-weight: 1000; line-height: .85; text-shadow: 0 3rpx 0 #ffd1d8; }
+.eg-jackpot-milk { width: 54rpx; height: 36rpx; margin-top: 3rpx; border-radius: 7rpx; }
+.eg-jackpot-title { position: relative; display: block; font-size: 37rpx; font-weight: 900; text-shadow: 0 4rpx 0 rgba(73,10,30,.5); }
+.eg-jackpot-points { position: relative; display: block; margin-top: 2rpx; color: #fff36a; font-size: 66rpx; font-weight: 1000; line-height: 1.05; letter-spacing: 2rpx; text-shadow: 0 5rpx 0 #9e2813, 0 0 18rpx rgba(255,243,106,.85); animation: egPointsPop .62s .42s cubic-bezier(.16,.9,.25,1.25) both; }
+.eg-jackpot-reward { position: relative; display: block; margin-top: 7rpx; color: #fff5a5; font-size: 27rpx; font-weight: 800; line-height: 1.35; }
+.eg-jackpot-note { position: relative; display: block; margin-top: 8rpx; color: rgba(255,255,255,.8); font-size: 22rpx; }
+.eg-tools { margin-top: 16rpx; }
+.eg-tool { display: flex; align-items: center; padding: 16rpx 18rpx; border: 3rpx solid #c9e0d6; border-radius: 26rpx; background: rgba(255,255,255,.92); box-shadow: 0 7rpx 18rpx rgba(24, 84, 63, .07); }
+.eg-tool.active { border-color: #f59e0b; background: #fffbeb; }
+.eg-tool.disabled { opacity: .45; }
+.eg-tool-icon { position: relative; display: flex; width: 88rpx; height: 88rpx; align-items: center; justify-content: center; overflow: visible; border-radius: 24rpx; font-size: 46rpx; background: linear-gradient(145deg, #e8f7ff, #d4ecff); box-shadow: inset 0 -4rpx 0 rgba(33,104,151,.08); }
+.eg-tool-food-image { width: 76rpx; height: 58rpx; border-radius: 14rpx; }
+.eg-replace-badge { position: absolute; right: -12rpx; bottom: -8rpx; display: flex; min-width: 78rpx; height: 38rpx; align-items: center; justify-content: center; gap: 2rpx; padding: 0 8rpx; border: 3rpx solid #fff; border-radius: 999rpx; color: #fff; background: linear-gradient(135deg, #2389b9, #145d91); box-shadow: 0 5rpx 12rpx rgba(20,93,145,.3); }
+.eg-replace-badge .tj-icon-wrap { width: 22rpx; height: 22rpx; }
+.eg-replace-badge > text { font-size: 20rpx; font-weight: 900; line-height: 1; }
+.eg-tool-copy { display: flex; flex: 1; flex-direction: column; margin-left: 16rpx; }
+.eg-tool-name { color: #244a3d; font-size: 29rpx; font-weight: 800; }
+.eg-tool-desc { margin-top: 5rpx; color: #6c8179; font-size: 25rpx; }
+.eg-tool-count { color: #155e4b; font-size: 32rpx; font-weight: 900; }
+.eg-legend { display: flex; justify-content: center; gap: 18rpx; margin-top: 18rpx; color: #53685f; font-size: 25rpx; font-weight: 700; }
+.eg-dot--safe { color: #4cae7b; }
+.eg-dot--mid { color: #e2aa19; }
+.eg-dot--high { color: #e4572e; }
+
+.eg-weekly-overlay { position: fixed; z-index: 90; inset: 0; display: flex; align-items: center; justify-content: center; padding: 28rpx; background: rgba(16, 55, 43, .66); backdrop-filter: blur(5px); }
+.eg-weekly-card { width: 100%; max-width: 664rpx; max-height: calc(100vh - 56rpx); overflow-y: auto; padding: 28rpx 26rpx 22rpx; border: 5rpx solid rgba(255,255,255,.96); border-radius: 38rpx; background: linear-gradient(160deg, #f5fff9 0%, #fffdf3 56%, #fff4db 100%); box-shadow: 0 30rpx 80rpx rgba(5,45,32,.38); animation: egWeeklyIn .36s cubic-bezier(.18,.88,.27,1.08) both; }
+.eg-weekly-head { display: flex; align-items: center; justify-content: space-between; }
+.eg-weekly-title-line { display: flex; align-items: center; gap: 10rpx; }
+.eg-weekly-title { color: #155e4b; font-size: 37rpx; font-weight: 1000; }
+.eg-weekly-preview { padding: 5rpx 10rpx; border-radius: 999rpx; color: #9a5b14; background: #fff0bd; font-size: 19rpx; font-weight: 900; }
+.eg-weekly-preview.is-offline { color: #69766f; background: #e8eeeb; }
+.eg-weekly-sub { display: block; margin-top: 5rpx; color: #6b837a; font-size: 23rpx; font-weight: 700; }
+.eg-weekly-medal { display: flex; width: 76rpx; height: 76rpx; align-items: center; justify-content: center; border: 5rpx solid #fff3b2; border-radius: 50%; color: #fff; background: linear-gradient(145deg, #f5ad24, #e26925); box-shadow: 0 8rpx 0 #b85421, 0 12rpx 24rpx rgba(181,84,33,.24); font-size: 39rpx; font-weight: 1000; }
+.eg-weekly-progress-card { display: flex; align-items: center; justify-content: space-between; margin-top: 20rpx; padding: 16rpx 18rpx; border: 3rpx solid #d7ebe2; border-radius: 24rpx; background: rgba(255,255,255,.9); }
+.eg-weekly-progress-label { display: block; color: #657b73; font-size: 22rpx; font-weight: 700; }
+.eg-weekly-progress-value { display: block; margin-top: -2rpx; color: #e06b24; font-size: 43rpx; font-weight: 1000; }
+.eg-weekly-progress-copy { display: flex; flex-direction: column; align-items: flex-end; color: #235b49; font-size: 24rpx; font-weight: 900; line-height: 1.55; }
+.eg-weekly-progress-copy text:last-child { color: #b86820; }
+.eg-weekly-list { display: flex; flex-direction: column; gap: 7rpx; margin-top: 15rpx; }
+.eg-weekly-row { display: flex; min-height: 68rpx; align-items: center; padding: 7rpx 14rpx; border: 2rpx solid transparent; border-radius: 19rpx; color: #345c50; background: rgba(255,255,255,.72); }
+.eg-weekly-row.is-me { border-color: #f2bd48; color: #174f3e; background: linear-gradient(90deg, #fff2bb, #fff9e3); box-shadow: 0 5rpx 14rpx rgba(153,102,17,.12); transform: scale(1.015); }
+.eg-weekly-place { width: 43rpx; color: #6b7d76; font-size: 27rpx; font-weight: 1000; text-align: center; }
+.eg-weekly-row:nth-child(1) .eg-weekly-place { color: #dd7b17; font-size: 31rpx; }
+.eg-weekly-avatar { display: flex; width: 52rpx; height: 52rpx; flex: 0 0 52rpx; align-items: center; justify-content: center; margin-left: 6rpx; border: 3rpx solid rgba(255,255,255,.9); border-radius: 50%; color: #fff; background: #5d9b84; box-shadow: 0 3rpx 9rpx rgba(30,78,61,.16); font-size: 24rpx; font-weight: 1000; }
+.eg-weekly-avatar-image { display: block; width: 100%; height: 100%; border-radius: 50%; }
+.eg-weekly-avatar.is-tone-2 { background: #e39932; }
+.eg-weekly-avatar.is-tone-3 { background: #6c83c8; }
+.eg-weekly-avatar.is-tone-4 { background: #e5683e; }
+.eg-weekly-avatar.is-tone-5 { background: #a673bd; }
+.eg-weekly-avatar.is-tone-6 { background: #448e9c; }
+.eg-weekly-avatar.is-tone-7 { background: #c27b49; }
+.eg-weekly-name { flex: 1; margin-left: 13rpx; overflow: hidden; font-size: 27rpx; font-weight: 850; text-overflow: ellipsis; white-space: nowrap; }
+.eg-weekly-me { margin-right: 8rpx; padding: 3rpx 9rpx; border-radius: 999rpx; color: #fff; background: #dd6b27; font-size: 18rpx; font-weight: 900; }
+.eg-weekly-count { min-width: 70rpx; color: #315b4d; font-size: 29rpx; font-weight: 1000; text-align: right; }
+.eg-cheer-card { margin-top: 16rpx; padding: 15rpx 17rpx 14rpx; border: 3rpx solid #f0d38d; border-radius: 23rpx; background: linear-gradient(135deg, #fff9d9, #fff1c2); }
+.eg-cheer-card.is-family { border-color: #d9c8ef; background: linear-gradient(135deg, #f8f2ff, #efe7ff); }
+.eg-cheer-card.is-bright { border-color: #f4c77b; background: linear-gradient(135deg, #fff8dc, #ffeec7); }
+.eg-cheer-top { display: flex; align-items: center; justify-content: space-between; }
+.eg-cheer-source { color: #8e5c18; font-size: 21rpx; font-weight: 900; }
+.eg-cheer-card.is-family .eg-cheer-source { color: #77539c; }
+.eg-cheer-change { padding: 5rpx 12rpx; border-radius: 999rpx; color: #176b52; background: rgba(255,255,255,.75); font-size: 19rpx; font-weight: 900; }
+.eg-cheer-copy { display: block; margin-top: 7rpx; color: #55462d; font-size: 28rpx; font-weight: 900; line-height: 1.42; }
+.eg-cheer-note { display: block; margin-top: 5rpx; color: #8d7c77; font-size: 18rpx; }
+.eg-weekly-start { display: flex; height: 84rpx; align-items: center; justify-content: center; margin-top: 18rpx; border-radius: 24rpx; color: #fff; background: linear-gradient(135deg, #24906c, #12654a); box-shadow: 0 9rpx 20rpx rgba(18,101,74,.24); font-size: 30rpx; font-weight: 1000; }
+.eg-weekly-share { display: flex; width: 100%; height: 76rpx; align-items: center; justify-content: center; margin: 12rpx 0 0; padding: 0; border: 3rpx solid #b9d9cc; border-radius: 22rpx; color: #17684f; background: rgba(255,255,255,.82); font-size: 27rpx; font-weight: 900; line-height: 1; }
+.eg-weekly-share::after { border: 0; }
+.eg-weekly-footnote { display: block; margin-top: 10rpx; color: #8b8b7d; font-size: 18rpx; text-align: center; }
+
+.eg-stage-overlay { position: fixed; z-index: 58; inset: 0; display: flex; align-items: center; justify-content: center; padding: 40rpx; background: rgba(22,62,50,.42); pointer-events: none; }
+.eg-stage-card { width: 100%; max-width: 620rpx; padding: 34rpx 28rpx 30rpx; border: 6rpx solid #fff; border-radius: 38rpx; background: linear-gradient(155deg, #f5fff9, #fff8da); box-shadow: 0 26rpx 70rpx rgba(10,56,41,.3); text-align: center; animation: egStageIn 1.8s cubic-bezier(.16,.86,.28,1) both; }
+.eg-stage-kicker { display: block; color: #16815f; font-size: 23rpx; font-weight: 900; letter-spacing: 3rpx; }
+.eg-stage-number { display: block; margin-top: 5rpx; color: #e47722; font-size: 48rpx; font-weight: 1000; line-height: 1.1; }
+.eg-stage-title { display: block; margin-top: 7rpx; color: #194e3d; font-size: 38rpx; font-weight: 900; }
+.eg-stage-foods { display: flex; justify-content: center; gap: 9rpx; margin-top: 22rpx; }
+.eg-stage-food { display: flex; width: 92rpx; min-height: 110rpx; flex-direction: column; align-items: center; justify-content: center; border: 3rpx solid #dbece4; border-radius: 20rpx; color: #315b4e; background: #fff; font-size: 20rpx; font-weight: 800; }
+.eg-stage-food > image { width: 72rpx; height: 52rpx; border-radius: 12rpx; }
+.eg-stage-food > text { margin-top: 8rpx; }
+.eg-stage-food.is-danger { border-color: #ef8b52; color: #a43c20; background: #fff1e6; box-shadow: 0 0 0 4rpx rgba(239,139,82,.12); }
+.eg-stage-tip { display: block; margin-top: 20rpx; color: #6e776d; font-size: 21rpx; font-weight: 700; }
+.eg-reshuffle-overlay { position: fixed; z-index: 65; inset: 0; display: flex; align-items: center; justify-content: center; padding: 46rpx; background: rgba(19,55,45,.5); }
+.eg-reshuffle-card { width: 100%; max-width: 540rpx; padding: 38rpx 30rpx; border: 5rpx solid rgba(255,255,255,.95); border-radius: 36rpx; background: linear-gradient(155deg, #f4fff9, #e6f6ef); box-shadow: 0 24rpx 64rpx rgba(10,48,37,.3); text-align: center; }
+.eg-reshuffle-icon { display: flex; width: 94rpx; height: 94rpx; align-items: center; justify-content: center; margin: 0 auto 18rpx; border-radius: 50%; background: linear-gradient(135deg, #2aa87b, #126a50); box-shadow: 0 10rpx 24rpx rgba(18,106,80,.28); animation: egReshuffleSpin .85s linear infinite; }
+.eg-reshuffle-title { display: block; color: #174e3d; font-size: 36rpx; font-weight: 900; }
+.eg-reshuffle-desc { display: block; margin-top: 10rpx; color: #5b746b; font-size: 24rpx; font-weight: 700; }
+
+.eg-overlay { position: fixed; z-index: 50; top: 0; right: 0; bottom: 0; left: 0; display: flex; align-items: center; justify-content: center; padding: 36rpx; background: rgba(20, 48, 40, .62); }
+.eg-modal { width: 100%; max-width: 650rpx; padding: 34rpx 28rpx 28rpx; border-radius: 38rpx; background: #fffdf8; box-shadow: 0 28rpx 70rpx rgba(0,0,0,.22); }
+.eg-modal-icon { display: block; font-size: 68rpx; text-align: center; }
+.eg-modal-title { display: block; margin-top: 6rpx; color: #204e3d; font-size: 38rpx; font-weight: 900; text-align: center; }
+.eg-modal-sub { display: block; margin: 8rpx 0 22rpx; color: #718078; font-size: 24rpx; text-align: center; }
+.eg-result-warning { display: flex; width: 92rpx; height: 92rpx; align-items: center; justify-content: center; margin: 0 auto; border-radius: 50%; color: #fff; background: #e4572e; font-size: 60rpx; font-weight: 900; }
+.eg-result-food { display: block; margin: 12rpx 0 18rpx; color: #c34b27; font-size: 28rpx; font-weight: 800; text-align: center; }
+.eg-knowledge-card { padding: 22rpx; border-radius: 24rpx; background: #fff3e7; }
+.eg-knowledge-title { display: block; color: #8d4427; font-size: 26rpx; font-weight: 800; }
+.eg-knowledge-copy { display: block; margin-top: 9rpx; color: #5f514a; font-size: 23rpx; line-height: 1.65; }
+.eg-knowledge-review { display: block; margin-top: 12rpx; color: #9b7768; font-size: 19rpx; }
+.eg-result-score { display: flex; align-items: center; justify-content: space-between; margin: 20rpx 6rpx; color: #466258; font-size: 25rpx; }
+.eg-result-score text:last-child { color: #e16f24; font-size: 36rpx; font-weight: 900; }
+.eg-result-best { display: flex; align-items: center; justify-content: space-between; margin: -12rpx 6rpx 20rpx; color: #75867f; font-size: 22rpx; }
+.eg-result-best text:last-child { color: #315d4e; font-size: 27rpx; font-weight: 900; }
+.eg-primary-btn, .eg-secondary-btn { display: flex; height: 88rpx; align-items: center; justify-content: center; border-radius: 24rpx; font-size: 28rpx; font-weight: 800; }
+.eg-primary-btn { color: #fff; background: linear-gradient(135deg, #238b68, #126649); box-shadow: 0 10rpx 22rpx rgba(18,102,73,.23); }
+.eg-share-btn { display: flex; width: 100%; height: 80rpx; align-items: center; justify-content: center; margin: 12rpx 0 0; padding: 0; border: 3rpx solid #bddbce; border-radius: 24rpx; color: #17664e; background: #f4fbf7; font-size: 27rpx; font-weight: 900; line-height: 1; }
+.eg-share-btn::after { border: 0; }
+.eg-secondary-btn { margin-top: 12rpx; color: #45665b; background: #edf4f1; }
+@keyframes egPulse {
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(245,158,11,.2); }
+ 50% { box-shadow: 0 0 0 8rpx rgba(245,158,11,.12); }
+}
+
+@keyframes egWeeklyIn {
+ 0% { opacity: 0; transform: translateY(34rpx) scale(.91); }
+ 100% { opacity: 1; transform: translateY(0) scale(1); }
+}
+
+@keyframes egHit {
+ 0% { opacity: 1; transform: scale(1); }
+ 42% { opacity: 1; transform: scale(1.18) rotate(-3deg); }
+ 100% { opacity: 0; transform: scale(.32) rotate(7deg); }
+}
+
+@keyframes egTaskRewardFlight {
+ 0% { opacity: 0; transform: translate3d(-20rpx, 0, 0) scale(.62) rotate(-8deg); }
+ 16% { opacity: 1; transform: translate3d(0, -24rpx, 0) scale(1.1) rotate(3deg); }
+ 72% { opacity: 1; transform: translate3d(270rpx, 900rpx, 0) scale(.68) rotate(8deg); }
+ 100% { opacity: 0; transform: translate3d(350rpx, 1205rpx, 0) scale(.3) rotate(2deg); }
+}
+
+@keyframes egRewardGlow {
+ from { opacity: .4; transform: scale(.86); }
+ to { opacity: .9; transform: scale(1.12); }
+}
+
+@keyframes egFireSweep {
+ 0% { opacity: 0; transform: translate3d(-38%, 20rpx, 0) scaleX(.6); }
+ 28% { opacity: 1; }
+ 72% { opacity: .96; }
+ 100% { opacity: 0; transform: translate3d(58%, -15rpx, 0) scaleX(1.08); }
+}
+
+@keyframes egFireSpark {
+ 0% { opacity: 0; transform: translateY(14rpx) scale(.5) rotate(35deg); }
+ 38% { opacity: 1; }
+ 100% { opacity: 0; transform: translateY(-38rpx) scale(1.05) rotate(58deg); }
+}
+
+@keyframes egFireGlow {
+ 0% { opacity: 0; transform: scale(.72); }
+ 38% { opacity: 1; transform: scale(1.08); }
+ 100% { opacity: 0; transform: scale(1.28); }
+}
+
+@keyframes egFireCellHit {
+ 0% { opacity: 1; transform: scale(1); }
+ 24% { opacity: 1; transform: scale(1.09); }
+ 72% { opacity: 1; transform: scale(1.02); }
+ 100% { opacity: 0; transform: scale(.48); }
+}
+
+@keyframes egFireFlame {
+ 0% { opacity: 0; transform: translateY(20rpx) rotate(42deg) scale(.55); }
+ 38% { opacity: 1; transform: translateY(0) rotate(42deg) scale(1.05); }
+ 100% { opacity: 0; transform: translateY(-31rpx) rotate(48deg) scale(.86); }
+}
+
+@keyframes egFlameReady {
+ from { transform: scale(.94); filter: brightness(.96); }
+ to { transform: scale(1.08); filter: brightness(1.18); }
+}
+
+@keyframes egLReady {
+ from { transform: scale(.94) rotate(-2deg); filter: brightness(.96); }
+ to { transform: scale(1.06) rotate(2deg); filter: brightness(1.12); }
+}
+
+@keyframes egImpact {
+ 0% { opacity: 0; transform: translate(-50%, -42%) scale(.55); }
+ 35% { opacity: 1; transform: translate(-50%, -50%) scale(1.16); }
+ 72% { opacity: 1; transform: translate(-50%, -54%) scale(1); }
+ 100% { opacity: 0; transform: translate(-50%, -76%) scale(.92); }
+}
+
+@keyframes egJackpotIn {
+ 0% { opacity: 0; transform: translate(-50%, -45%) scale(.48) rotate(-4deg); }
+ 20% { opacity: 1; transform: translate(-50%, -50%) scale(1.09) rotate(2deg); }
+ 31% { transform: translate(-50%, -50%) scale(.98) rotate(0); }
+ 78% { opacity: 1; transform: translate(-50%, -53%) scale(1); }
+ 100% { opacity: 0; transform: translate(-50%, -68%) scale(.92); }
+}
+
+@keyframes egTripleIn {
+ 0% { opacity: 0; transform: translate(-50%, -44%) scale(.82); }
+ 20% { opacity: 1; transform: translate(-50%, -50%) scale(1.03); }
+ 74% { opacity: 1; transform: translate(-50%, -52%) scale(1); }
+ 100% { opacity: 0; transform: translate(-50%, -60%) scale(.96); }
+}
+
+@keyframes egTripleCan {
+ 0% { opacity: 0; transform: translateY(18rpx) scale(.72); }
+ 100% { opacity: 1; transform: translateY(0) scale(1); }
+}
+
+@keyframes egFourIn {
+ 0% { opacity: 0; transform: translate(-50%, -44%) scale(.62) rotate(-3deg); }
+ 18% { opacity: 1; transform: translate(-50%, -50%) scale(1.08) rotate(1deg); }
+ 29% { transform: translate(-50%, -50%) scale(.98) rotate(0); }
+ 78% { opacity: 1; transform: translate(-50%, -52%) scale(1); }
+ 100% { opacity: 0; transform: translate(-50%, -65%) scale(.94); }
+}
+
+@keyframes egFourCan {
+ 0% { opacity: 0; transform: translateY(-22rpx) rotate(-7deg) scale(.65); }
+ 75% { opacity: 1; transform: translateY(5rpx) rotate(2deg) scale(1.05); }
+ 100% { opacity: 1; transform: translateY(0) rotate(0) scale(1); }
+}
+
+@keyframes egFiveCan {
+ 0% { opacity: 0; transform: translateY(-40rpx) scale(.52) rotate(-8deg); filter: brightness(1.5); }
+ 70% { opacity: 1; transform: translateY(7rpx) scale(1.08) rotate(2deg); }
+ 100% { opacity: 1; transform: translateY(0) scale(1) rotate(0); filter: brightness(1); }
+}
+
+@keyframes egLockedCan {
+ from { opacity: .62; transform: scale(.92); filter: brightness(.9); }
+ to { opacity: 1; transform: scale(1.06); filter: brightness(1.2); }
+}
+
+@keyframes egPromisePulse {
+ from { transform: scale(.97); box-shadow: 0 5rpx 15rpx rgba(28,7,62,.22); }
+ to { transform: scale(1.03); box-shadow: 0 7rpx 21rpx rgba(255,221,89,.38); }
+}
+
+@keyframes egReelStop {
+ 0% { opacity: .2; transform: translateY(-48rpx) scaleY(1.4); filter: blur(5rpx); }
+ 70% { opacity: 1; transform: translateY(7rpx) scaleY(.94); filter: blur(0); }
+ 100% { transform: translateY(0) scaleY(1); }
+}
+
+@keyframes egLights {
+ 0% { opacity: .35; }
+ 100% { opacity: 1; }
+}
+
+@keyframes egConfettiFall {
+ 0% { opacity: 0; transform: translate3d(0, -8vh, 0) rotate(0deg) scale(.7); }
+ 9% { opacity: 1; }
+ 48% { transform: translate3d(42rpx, 48vh, 0) rotate(420deg) scale(1); }
+ 100% { opacity: .92; transform: translate3d(-28rpx, 112vh, 0) rotate(920deg) scale(.86); }
+}
+
+@keyframes egPointsPop {
+ 0% { opacity: 0; transform: scale(.35) rotate(-7deg); }
+ 55% { opacity: 1; transform: scale(1.28) rotate(3deg); }
+ 78% { transform: scale(.92) rotate(0); }
+ 100% { opacity: 1; transform: scale(1); }
+}
+
+@keyframes egStageIn {
+ 0% { opacity: 0; transform: scale(.7) translateY(34rpx); }
+ 18% { opacity: 1; transform: scale(1.06) translateY(0); }
+ 30%, 76% { opacity: 1; transform: scale(1); }
+ 100% { opacity: 0; transform: scale(.96) translateY(-22rpx); }
+}
+
+@keyframes egReshuffleSpin {
+ from { transform: rotate(0); }
+ to { transform: rotate(360deg); }
+}
+
+@media screen and (max-height: 760px) {
+ .eg-task-card { padding-top: 13rpx; padding-bottom: 13rpx; }
+}
diff --git a/TongjiUniApp/tongji/endless-game/index.vue b/TongjiUniApp/tongji/endless-game/index.vue
new file mode 100644
index 000000000..af938f5f1
--- /dev/null
+++ b/TongjiUniApp/tongji/endless-game/index.vue
@@ -0,0 +1,1594 @@
+
+
+
+ {{ piece.emoji }}
+
+
+
+
+
+
+
+
+ 识糖小课堂
+ 第{{ themeIndex + 1 }}站 · {{ currentTheme.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 本局认糖
+ {{ learned }}
+
+
+ 得分
+ {{ score }}
+
+
+ 本周同行
+ 第{{ weeklyMyRank }}名
+ 点击查看
+
+
+
+
+
+
+
+ 小目标:{{ currentTask.label }}
+
+ {{ Math.min(taskProgress, currentTask.target) }}/{{ currentTask.target }}
+
+
+
+
+
+ +1
+
+
+
+
+
+
+ 连消 ×{{ Math.max(combo, 1) }}
+ 双倍得分 ×{{ feastMoves }}
+
+
+ 高糖食物 {{ highCount }}/3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ✦
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ foodOf(tile.key).short }}
+
+ {{ foodOf(tile.key).levelLabel || '低糖' }}
+
+ 可替换
+
+
+
+
+ {{ impactText }}
+
+
+
+ {{ camelJackpot.kicker }}
+
+
+
+
+
+
+
+
+
+ ?
+
+
+ 还差 1 罐,777 大奖即将开启
+
+
+
+
+
+
+
+
+ 7
+
+
+ {{ camelJackpot.title }}
+ 777 ×2
+ {{ camelJackpot.reward }}
+ 仅为游戏内娱乐奖励
+
+
+
+
+ {{ statusText }}
+
+
+
+
+
+
+
+
+
+ 替换
+
+
+
+ 新疆纯驼乳粉
+ 替换{{ foodOf(currentTheme.danger).short }} · 三杯连消换主题
+
+ ×{{ camelCount }}
+
+
+
+
+ ● 低糖
+ ● 中糖
+ ● 主动三消高糖会结束
+
+
+
+
+
+
+
+
+ 本周7人同行榜
+ {{ weeklyStatusLabel }}
+
+ {{ weeklyRangeLabel }} · {{ weeklySexLabel }} · {{ weeklyMemberCount }}/7人
+
+ {{ weeklyMyRank }}
+
+
+
+
+ 我的本周认糖
+ {{ weeklyMyCount }}
+
+
+ 当前第 {{ weeklyMyRank }} 名 · 本周上升 {{ weeklyRankRise }} 名
+ 当前第 {{ weeklyMyRank }} 名 · 继续积累认糖
+ 太棒了,本周暂列第一!
+ 再认 {{ weeklyDistance }} 个超过上一名
+
+
+
+
+
+ {{ player.rank }}
+
+
+ {{ player.avatar }}
+
+ {{ player.name }}
+ 我
+ {{ player.count }}
+
+
+
+
+
+ {{ currentCheer.source }}
+ 换一句
+
+ “{{ currentCheer.text }}”
+ 亲友自定义内容,不作为医学判断
+
+
+ 开始消除
+
+
+
+
+
+
+
+
+
+
+ {{ reshuffleDone ? '洗牌完成' : '没有可消除组合' }}
+ {{ reshuffleDone ? '新的消除机会已经出现' : '正在为您重新洗牌,请稍候' }}
+
+
+
+
+
+ 新菜单已解锁
+ 第 {{ stageMeta.number }} 站
+ {{ stageMeta.title }}
+
+
+
+ {{ food.short }}
+
+
+ 本组橙框食物可用驼乳粉替换
+
+
+
+
+
+ !
+ 本局结束
+ 你消除了:{{ endedFood.name }}
+
+ 为什么要注意?
+ {{ endedFood.tip }}
+ 科普内容上线前由甄养堂医生审核
+
+ 本局得分{{ score }}
+ 历史最高{{ bestScore }}
+ 再玩一局
+
+ 返回血糖周报
+
+
+
+
+
+
+
+
+
diff --git a/TongjiUniApp/tongji/pages/index.vue b/TongjiUniApp/tongji/pages/index.vue
new file mode 100644
index 000000000..bef5a16fe
--- /dev/null
+++ b/TongjiUniApp/tongji/pages/index.vue
@@ -0,0 +1,6995 @@
+
+
+
+
+
+
+
+
+
+ 家人分享
+
+ {{ invitePreview.viewer_notice || '近7日稳糖记录' }}
+ {{ invitePreview.expires_hint || '邀请码仅今日有效' }}
+
+
+ {{ invitePreview.patient_label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 今日邀请码
+ 凭此码今日可查看
+
+
+ {{ invitePreview.invite_code }}
+
+
+
+
+
+
+
+ 点树听一句鼓励
+
+
+ {{ invitePreview.tree_title || '控糖树' }}
+ {{ invitePreview.tree_desc || '' }}
+ {{ invitePreview.week_label || '' }}
+
+
+
+
+
+
+
+ {{ invitePreview.record_days }}
+ 天有记录
+
+
+
+
+
+ {{ invitePreview.complete_days }}
+ 完整一日
+
+
+
+
+
+ {{ invitePreview.streak_days }}
+ 连续天数
+
+
+
+ {{ invitePreview.quote }}
+
+
+
+
+
+
+
+
+
+
+ 近7日血糖记录
+ 空腹 / 餐后 / 血压
+
+
+
+
+ 暂无记录数据
+
+
+
+
+
+
+
+
+
+ {{ day.date_label }}
+ {{ day.weekday }}
+
+
+
+ 空腹
+
+
+ {{ formatInviteSugar(day.fasting) }}
+
+ mmol/L
+
+
+
+ 偏高
+
+
+
+ 餐后
+
+
+ {{ formatInviteSugar(day.postprandial) }}
+
+ mmol/L
+
+
+
+ 偏高
+
+
+
+ 血压
+
+ {{ day.bp_text }}
+ mmHg
+
+
+
+ 偏高
+
+
+
+
+
+ 当日未记录
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 给 Ta 点个赞
+ 今日 {{ invitePreview.like_count || 0 }} 位家人已鼓励
+
+
+
+
+ {{ n }}
+
+
+
+
+ {{ invitePreview.liked_by_me ? '今日已点赞,谢谢您的鼓励' : '送 Ta 一份鼓励' }}
+
+
+
+
+
+
+
+
+
+
+ 无法查看
+ {{ inviteError || '邀请码无效或已过期' }}
+
+
+
+
+ 正在登录…
+
+
+
+
+
+
+
+
+
+ 录入今日血糖
+
+
+
+ {{ ttsSpeaking ? '停止朗读' : '朗读血糖' }}
+
+
+
+
+
+
+
+
+ 血糖趋势
+ {{ rangeText }} · mmol/L
+
+
+
+
+ 空腹
+
+
+
+ 餐后
+
+
+
+
+
+ {{ bloodHighDayCount }}
+ 天偏高
+
+
+ {{ bloodNormalDayCount }}
+ 天正常
+
+
+ {{ bloodRecordDayCount }}
+ 天有记录
+
+
+
+
+
+ 图表已暂停显示
+
+
+ 当前时间范围暂无血糖数据
+
+
+ {{ hoverInfo.date }}
+
+
+ 空腹 {{ hoverInfo.fasting }}
+
+
+
+ 餐后 {{ hoverInfo.postprandial }}
+
+
+
+
+
+
+ {{ opt.label }}
+
+
+
+
+ 今日血糖
+
+
+ {{ elderFasting.label }}
+
+ {{ elderFasting.value }}
+ mmol/L
+
+ 偏高,请遵医嘱
+
+
+ {{ elderPostprandial.label }}
+
+ {{ elderPostprandial.value }}
+ mmol/L
+
+ 偏高,请遵医嘱
+
+
+
+
+
+
+
+
+ 查看更多
+ 健康日历 · 运动 · 家人互动
+
+ ›
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AI 饮食建议
+
+
+ 智能定制
+
+
+ 读您近 7 天 · 30 天血糖,定制今日三餐
+
+
+
+
+ {{ dietAiLoading ? '生成中' : '换一换' }}
+
+
+
+
+
+
+
+
+
+
+ 正在生成今日饮食建议…
+
+
+
+
+ 今日饮食
+ 生成中…
+
+
+
+
+
+
+
+ 早餐
+
+
+ {{ dietAiRecommend.breakfast || (dietAiLoading ? '…' : '—') }}▍
+
+
+
+
+
+
+
+ 喝的
+
+
+ {{ dietAiRecommend.drinks || '…' }}▍
+
+
+
+
+
+
+
+ 午餐
+
+
+ {{ dietAiRecommend.lunch || (dietAiLoading ? '…' : '—') }}▍
+
+
+
+
+
+
+
+ 晚餐
+
+
+ {{ dietAiRecommend.dinner || (dietAiLoading ? '…' : '—') }}▍
+
+
+
+
+
+
+
+ 小贴士
+
+
+ {{ dietAiRecommend.tips || '…' }}▍
+
+
+
+
+
+
+ 今日尽量少碰
+
+
+ {{ item }}
+
+
+
+
+
+ 填入今日饮食
+
+
+ 手动记录
+
+
+
+
+
+
+
+
+
+
+
+ 运动降糖
+ {{ dietExercise.level_label }}
+
+
+ {{ dietExercise.headline }}
+
+
+ {{ idx + 1 }}
+ {{ it }}
+
+
+
+
+ {{ dietExercise.intensity }}
+
+ {{ dietExercise.note }}
+
+
+
+
+ 能不能吃?
+ 输入食物名称,结合您的档案判断
+
+
+
+
+
+ {{ dietAiAsking ? '…' : '问 AI' }}
+
+
+
+
+ {{ dietAiAskResult.level_label }}
+
+
+ {{ dietAiAskResult.advice || (dietAiAsking ? '正在想…' : '') }}▍
+
+ 建议份量:{{ dietAiAskResult.portion }}
+
+
+
+
+
+
+
+ 以上建议依据 · 血糖回顾
+
+
+
+ {{ s.label }}
+
+
+
+ {{ s.compliance }}
+ %
+
+ 达标率
+
+
+
+ 偏高
+
+ {{ s.high_days }}天
+
+
+
+ 空腹均
+ {{ dietAvgText(s.fasting_avg) }}
+
+
+ 餐后均
+ {{ dietAvgText(s.postprandial_avg) }}
+
+
+ {{ s.record_days }} 天有记录
+
+
+
+ 暂无记录
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 授权手机号
+ 绑定手机号后即可记录血糖,无需先填写就诊卡
+
+
+ ×
+
+
+
+ 微信仅提供手机号,请选择性别以便写入就诊档案。
+
+ 性别
+
+
+ 男
+
+
+ 女
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ inputForm.id ? '修改今日血糖' : '录入今日血糖' }}
+ {{ todayText }} · {{ patientName || '本人' }}
+
+
+ ×
+
+
+
+
+ 加载今日数据中…
+
+
+
+ 请如实填写,留空表示该项不上传。当天可多次修改。
+
+
+ 血糖(mmol/L)
+
+
+
+ 空腹血糖
+
+
+
+
+
+
+
+
+ 餐后血糖
+
+
+
+
+
+
+
+
+ 其他血糖
+
+
+
+
+
+
+ 备注
+
+
+
+
+
+
+
+ 删除
+
+
+ {{ inputForm.submitting ? '提交中…' : (inputForm.id ? '保存修改' : '提交录入') }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TongjiUniApp/tongji/pages/more.vue b/TongjiUniApp/tongji/pages/more.vue
new file mode 100644
index 000000000..9bf7db1a3
--- /dev/null
+++ b/TongjiUniApp/tongji/pages/more.vue
@@ -0,0 +1,8515 @@
+
+
+
+
+
+
+ {{ p.kind === 'south' ? '↓' : '▼' }}
+
+
+ 正在登录…
+
+
+
+
+
+
+
+
+
+
+ 稳糖乐园
+ 用健康打卡浇灌你的稳糖树
+
+
+ {{ gamifyPoints }}
+ 稳糖积分
+
+
+
+
+ 今日控糖任务
+
+
+
+
+
+
+
+ +{{ task.points }}积分
+
+
+
+ {{ task.name }}
+
+ 已完成
+
+ 去浇水
+
+
+ 去记录
+
+
+
+
+
+
+
+
+ Lv.{{ treeLevel }}
+ {{ treeLevelName }}
+
+ {{ currentTreeSpecies.name }}
+
+
+
+ {{ treeXpUpgradeHint }}
+
+ 还差 {{ treeState.pointsToNext }} XP 升级至 Lv.{{ treeLevel + 1 }}
+
+
+ {{ treeProgressLabel }}
+
+
+
+
+
+ 🌿
+
+
+
+
+
+ {{ treeEmoji }}
+
+
+ ✨
+
+
+ -0.5 mmol/L
+
+
+ +{{ floatReward.text }}
+
+
+
+
+ {{ waterHintText }}
+
+
+
+
+
+
+
+ {{ opt.label }}
+
+
+
+
+
+
+
+ 健康日历
+ {{ heatmapMonthLabel }} · 已记录 {{ heatmapTotalRecords }} / {{ heatmapInRangeDays }} 天
+
+
+
+
+ 一
+ 二
+ 三
+ 四
+ 五
+ 六
+ 日
+ 0 ? jumpToDayRecord(cell.date) : null"
+ >
+ {{ cell.day }}
+
+
+
+
+
+
+
+
+
+ 血糖明细
+ 共 {{ bloodRecordDays.length }} 天
+
+
+ 加载中…
+
+
+ 该时段暂无血糖记录
+
+
+
+
+ {{ day.dateLabel }}
+ {{ day.weekday }}
+
+
+
+ 空腹
+
+ 偏高
+ 偏低
+ {{ formatBloodMetric(day.blood.fasting_blood_sugar) }}
+ mmol/L
+
+
+
+ 餐后
+
+ 偏高
+ 偏低
+ {{ formatBloodMetric(day.blood.postprandial_blood_sugar) }}
+ mmol/L
+
+
+ ——
+ mmol/L
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 邀请家人点赞
+ 分享战报给家人,邀请他们为您点赞鼓励
+
+
+
+
+
+
+
+
+
+ 💬
+
+
+
+ {{ encourageParts.prefix }}{{ encourageParts.highlight }}{{ encourageParts.suffix }}
+
+
+
+
+
+
+
+
+
+ 就诊卡
+ {{ cards.length }} 张
+
+
+ {{ card.patient_name || '未填' }}
+ {{ card.age }}岁
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ inputForm.id ? '修改今日血糖' : '录入今日血糖' }}
+ {{ todayText }} · {{ patientName || '本人' }}
+
+
+ ×
+
+
+
+ 加载今日数据中…
+
+
+
+ 请如实填写,留空表示该项不上传。当天可多次修改。
+
+
+
+
+
+ 语音录入
+ 选一种方式,自动填入下方字段
+
+
+
+
+ 推荐
+
+
+
+
+ {{ isVoiceBarLive('glucose') ? '正在聆听…松手结束' : '长按说话,自动填写' }}
+ 例:空腹6.5,餐后8.2
+
+
+
+
+
+
+
+
+ 血糖(mmol/L)
+
+
+
+ 空腹血糖
+
+
+
+
+
+
+
+
+ 餐后血糖
+
+
+
+
+
+
+
+
+ 其他血糖
+
+
+
+
+
+ 备注
+
+
+
+
+
+
+ 删除
+
+
+ {{ inputForm.submitting ? '提交中…' : (inputForm.id ? '保存修改' : '提交录入') }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ bpForm.id ? '修改今日血压' : '录入今日血压' }}
+ {{ todayText }} · {{ patientName || '本人' }}
+
+ ×
+
+ 加载中…
+
+
+
+
+
+
+ {{ isVoiceBarLive('bp') ? '正在聆听…松手结束' : '长按说话,自动填写' }}
+ 例:高压120,低压80
+
+
+ 血压(mmHg)
+
+
+ 高压
+
+
+
+
+
+ 低压
+
+
+
+
+
+ 用药(选填)
+
+ 西药
+
+
+
+
+
+ 胰岛素
+
+
+
+
+
+
+ 删除
+ {{ bpForm.submitting ? '提交中…' : '保存' }}
+
+
+
+
+
+
+
+
+
+
+ 记今日饮食
+ {{ todayText }}
+
+ ×
+
+ 加载中…
+
+
+ AI 推荐
+ 早 {{ dietAiPrefill.breakfast }} · 喝 {{ dietAiPrefill.drinks }} · 午 {{ dietAiPrefill.lunch }} · 晚 {{ dietAiPrefill.dinner }}
+
+ 一键填入
+
+
+ 至少填写一餐,完成后可浇水领取积分。
+
+
+
+
+
+ {{ isVoiceBarLive('diet') ? '正在聆听…松手结束' : '长按说话,自动填写' }}
+ 例:早餐鸡蛋粥,午餐米饭炒青菜
+
+
+
+ 早餐
+
+
+
+
+
+ 午餐
+
+
+
+
+
+ 晚餐
+
+
+
+
+
+
+
+
+
+
+ {{ dietForm.submitting ? '提交中…' : '保存饮食' }}
+
+
+
+
+
+
+
+
+
+
+
+ 记今日运动
+ {{ todayText }}
+
+ ×
+
+ 加载中…
+
+ 填写运动类型或时长,完成后可浇水领取积分。
+
+
+
+
+
+ {{ isVoiceBarLive('exercise') ? '正在聆听…松手结束' : '长按说话,自动填写' }}
+ 例:散步30分钟,中强度
+
+
+
+ 运动类型
+
+
+
+
+
+ 时长(分钟)
+
+
+
+
+ 运动强度
+
+
+ {{ opt.label }}
+
+
+
+
+
+ {{ exerciseForm.submitting ? '提交中…' : '保存运动' }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ sttListening ? '正在聆听…' : '准备录音…' }}
+ 松开手指结束并识别
+
+
+
+
+
+
+
+ 本周稳糖战报
+ ×
+
+
+
+
+ {{ weeklyReportData.patientLabel }}
+
+ {{ weeklyReportData.weekLabel }}
+
+
+ {{ weeklyReportData.recordDays }}
+ 天有记录
+
+
+ {{ weeklyReportData.completeDays }}
+ 完整一日
+
+
+ {{ weeklyReportData.streakDays }}
+ 连续天数
+
+
+ {{ weeklyReportData.quote }}
+ 习惯参考,不替代医嘱 · 家人打开分享可查看近7日记录
+
+
+
+
+
+
+ 分享给家人
+
+ 关闭
+
+
+
+
+
+
+
+
+ 今日稳糖进度
+
+ ×
+
+
+ {{ waterStatusSummary }}
+
+
+
+
+ {{ row.name }}
+ {{ row.statusSub }}
+
+ {{ row.statusLabel }}
+
+
+
+ {{ waterStatusGrowthHint }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 选择你的稳糖树
+
+ ×
+
+
+
+ 全勤打卡约 {{ speciesDaysToMax }} 天满级 · 每级 {{ TREE_XP_PER_LEVEL }} 积分 · 从小到大的 10 个阶段见下方
+
+
+
+
+ {{ speciesEmojiAtLevel(sp.id, treeLevel) }}
+
+ {{ sp.name }}
+ {{ sp.tagline }}
+
+
+
+
+ {{ stage.emoji }}
+ Lv.{{ stage.level }}
+ {{ stage.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TongjiUniApp/tongji/pages/weekly.vue b/TongjiUniApp/tongji/pages/weekly.vue
new file mode 100644
index 000000000..0e2d0559f
--- /dev/null
+++ b/TongjiUniApp/tongji/pages/weekly.vue
@@ -0,0 +1,2819 @@
+
+
+
+ 正在登录…
+
+
+
+
+
+
+
+
+
+ {{ card.patient_name || '就诊卡' }}
+
+
+
+
+
+
+
+
+
+ {{ dailyContextError }}
+
+
+
+
+
+
+ 血糖趋势
+ {{ rangeText }} · mmol/L
+
+
+
+
+
+ 空腹
+
+
+
+ 餐后
+
+
+
+
+
+
+ 图表已暂停显示
+
+
+ 当前时间范围暂无血糖数据
+
+
+
+
+
+
+
+
+
+ 识糖小课堂
+ 三消认食物,学习哪些食物含糖高
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AI 饮食建议
+
+
+
+ {{ dietAiLoading ? '生成中' : '换一换' }}
+
+
+ 读您近 7 天 · 30 天血糖,定制早餐(含驼奶粉)、喝的与三餐
+
+
+
+ 正在生成今日饮食建议…
+
+
+
+
+
+ 早餐
+
+
+ {{ dietAiRecommend.breakfast || (dietAiLoading ? '…' : '—') }}▍
+
+
+
+
+
+ 喝的
+
+
+ {{ dietAiRecommend.drinks || '…' }}▍
+
+
+
+
+
+ 午餐
+
+
+ {{ dietAiRecommend.lunch || (dietAiLoading ? '…' : '—') }}▍
+
+
+
+
+
+ 晚餐
+
+
+ {{ dietAiRecommend.dinner || '…' }}▍
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ×
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ sttListening ? '松手结束' : '准备录音…' }}
+
+
+
+ {{ dietAiAskResult.level_label }}
+
+
+ {{ dietAiAskResult.advice || (dietAiAsking ? '正在想…' : '') }}▍
+
+
+
+
+
+
+
+
+
+
+ {{ sttListening ? '正在聆听…' : '准备录音…' }}
+ 松开手指结束并识别
+
+
+
+
+
+
+
+
+
+ 授权手机号
+ 绑定手机号后即可记录血糖,无需先填写就诊卡
+
+
+ ×
+
+
+
+
+ {{ dailyContextError }}
+
+ 微信仅提供手机号,请选择性别以便写入就诊档案。
+
+ 性别
+
+
+ 男
+
+
+ 女
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ inputForm.id ? '修改今日血糖' : '录入今日血糖' }}
+ {{ todayText }} · {{ patientName || '本人' }}
+
+
+ ×
+
+
+
+
+ 加载今日数据中…
+
+
+
+ 请如实填写,留空表示该项不上传。当天可多次修改。
+
+
+ 血糖(mmol/L)
+
+
+
+ 空腹血糖
+
+
+
+
+
+
+
+
+ 餐后血糖
+
+
+
+
+
+
+
+
+ 其他血糖
+
+
+
+
+
+
+ 备注
+
+
+
+
+
+
+
+ 删除
+
+
+ {{ inputForm.submitting ? '提交中…' : (inputForm.id ? '保存修改' : '提交录入') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TongjiUniApp/tongji/styles/daily-theme.scss b/TongjiUniApp/tongji/styles/daily-theme.scss
new file mode 100644
index 000000000..e88d9825f
--- /dev/null
+++ b/TongjiUniApp/tongji/styles/daily-theme.scss
@@ -0,0 +1,993 @@
+/**
+
+ * 日常记录统一主题 — 与甄养堂小程序 TCM Care 品牌色一致
+
+ * 来源:pages/index/index.vue · tabBar selectedColor #204e2b
+
+ */
+
+
+
+.daily-page {
+
+ /* 品牌主色 */
+
+ --primary: #204e2b;
+
+ --primary-dark: #163d22;
+
+ --primary-container: #386641;
+
+ --primary-grad: linear-gradient(160deg, #204e2b 0%, #386641 100%);
+
+ --primary-light: #eef6ef;
+
+ --primary-soft: #cfe8d3;
+
+ --primary-glow: rgba(32, 78, 43, 0.14);
+
+ --on-primary-container: #afe2b3;
+
+
+
+ --success: #386641;
+
+ --success-light: #eef6ef;
+
+
+
+ --danger: #dc2626;
+
+ --danger-light: #fef2f2;
+
+ --danger-glow: rgba(220, 38, 38, 0.1);
+
+
+
+ --warning: #d97706;
+
+ --warning-light: #fff7ed;
+
+
+
+ --text-primary: #1b1c1a;
+
+ --text-secondary: #414941;
+
+ --text-muted: #727970;
+
+
+
+ --surface: #ffffff;
+
+ --surface-muted: #f4f4f0;
+
+ --border: #e3e2df;
+
+ --border-soft: rgba(32, 78, 43, 0.12);
+
+
+
+ --slate-50: #faf9f5;
+
+ --slate-100: #f4f4f0;
+
+ --slate-200: #e9e8e4;
+
+ --slate-300: #e3e2df;
+
+ --slate-400: #727970;
+
+ --slate-600: #414941;
+
+ --slate-900: #1b1c1a;
+
+
+
+ --shadow-premium: 0 8rpx 28rpx rgba(32, 78, 43, 0.06);
+
+ --shadow-sm: 0 4rpx 16rpx rgba(32, 78, 43, 0.05);
+
+ --shadow-glow-primary: 0 8rpx 20rpx rgba(32, 78, 43, 0.18);
+
+ --shadow-glow-danger: 0 8rpx 20rpx rgba(220, 38, 38, 0.12);
+
+ --border-premium: 1rpx solid var(--border-soft);
+
+
+
+ background: var(--slate-50);
+
+}
+
+
+
+/* Hero:品牌绿渐变 */
+
+.daily-page .hero-bg {
+
+ background: var(--primary-grad);
+
+ &::after {
+
+ background: radial-gradient(circle at 88% 12%, rgba(255, 255, 255, 0.1) 0%, transparent 55%);
+
+ }
+
+}
+
+
+
+.daily-page .hero-orb {
+
+ display: none;
+
+}
+
+
+
+.daily-page .hero-pill.voice.speaking {
+
+ background: rgba(255, 255, 255, 0.92);
+
+ border-color: rgba(255, 255, 255, 0.95);
+
+ animation: none;
+
+ box-shadow: 0 0 0 3rpx rgba(255, 255, 255, 0.35);
+
+}
+
+
+
+.daily-page .hero-status-chip.pending {
+
+ background: rgba(255, 255, 255, 0.16);
+
+ border-color: rgba(255, 255, 255, 0.28);
+
+}
+
+
+
+.daily-page .hero-status-chip.done {
+
+ background: rgba(255, 255, 255, 0.2);
+
+ border-color: rgba(255, 255, 255, 0.32);
+
+}
+
+
+
+/* 指标卡 */
+
+.daily-page .stat-fasting,
+
+.daily-page .stat-postprandial,
+
+.daily-page .stat-other {
+
+ background: var(--surface);
+
+}
+
+
+
+.daily-page .stat-fasting .stat-card-tag,
+
+.daily-page .stat-postprandial .stat-card-tag,
+
+.daily-page .stat-other .stat-card-tag {
+
+ background: var(--primary-light);
+
+ color: var(--primary-dark);
+
+}
+
+
+
+.daily-page .stat-card-value {
+
+ background: none;
+
+ -webkit-background-clip: unset;
+
+ background-clip: unset;
+
+ color: var(--text-primary);
+
+}
+
+
+
+.daily-page .stat-card-value.is-high {
+
+ background: none;
+
+ color: var(--danger);
+
+}
+
+
+
+.daily-page .stat-card-trend.trend-down {
+
+ background: var(--primary-light);
+
+ .stat-card-trend-arrow,
+
+ .stat-card-trend-delta {
+
+ color: var(--primary-dark);
+
+ }
+
+}
+
+
+
+.daily-page .more-entry-arrow {
+
+ color: var(--primary);
+
+}
+
+
+
+.daily-page .card-chip.active {
+
+ background: var(--primary);
+
+ box-shadow: var(--shadow-glow-primary);
+
+}
+
+
+
+.daily-page .range-item.active {
+
+ background: var(--primary);
+
+ box-shadow: var(--shadow-glow-primary);
+
+}
+
+
+
+.daily-page .legend-dot-fasting {
+
+ background: var(--primary);
+
+}
+
+
+
+.daily-page .legend-dot-postprandial {
+
+ background: var(--warning);
+
+}
+
+
+
+.daily-page .streak-strip {
+
+ background: var(--surface);
+
+ border-color: var(--border-soft);
+
+ &::after {
+
+ background: radial-gradient(circle, rgba(32, 78, 43, 0.08) 0%, transparent 70%);
+
+ }
+
+}
+
+
+
+.daily-page .streak-num {
+
+ color: var(--primary-dark);
+
+}
+
+
+
+/* 日历:品牌绿深浅 */
+
+.daily-page .calendar-cell.level-1 .calendar-cell-mark,
+
+.daily-page .calendar-legend-cell.level-1 {
+
+ background: var(--primary-soft);
+
+ border-color: #b8dcc0;
+
+}
+
+
+
+.daily-page .calendar-cell.level-2 .calendar-cell-mark,
+
+.daily-page .calendar-legend-cell.level-2 {
+
+ background: var(--on-primary-container);
+
+ border-color: #86c992;
+
+}
+
+
+
+.daily-page .calendar-cell.level-3 .calendar-cell-mark,
+
+.daily-page .calendar-legend-cell.level-3 {
+
+ background: var(--primary);
+
+ border-color: var(--primary-dark);
+
+}
+
+
+
+.daily-page .day-block-tag.tag-blood,
+
+.daily-page .day-block-tag.tag-diet,
+
+.daily-page .day-block-tag.tag-exercise,
+
+.daily-page .day-block-tag.tag-tracking {
+
+ background: var(--primary-light);
+
+ color: var(--primary-dark);
+
+ border: 1rpx solid var(--border-soft);
+
+}
+
+
+
+.daily-page .day-block-tag.tag-diet,
+
+.daily-page .day-block-tag.tag-exercise {
+
+ background: var(--surface-muted);
+
+ color: var(--text-secondary);
+
+ border-color: var(--border);
+
+}
+
+
+
+.daily-page .pg-points-badge {
+
+ background: var(--primary-light);
+
+ border-color: var(--border-soft);
+
+}
+
+
+
+.daily-page .pg-points-num {
+
+ color: var(--primary-dark);
+
+}
+
+
+
+.daily-page .record-quick-chip.pending {
+
+ border-color: var(--border);
+
+ background: var(--surface-muted);
+
+}
+
+
+
+.daily-page .record-quick-chip.done {
+
+ border-color: rgba(56, 102, 65, 0.35);
+
+ background: var(--success-light);
+
+}
+
+
+
+.daily-page .task-action-btn.pending {
+
+ background: var(--primary);
+
+}
+
+
+
+.daily-page .water-btn {
+
+ background: var(--primary);
+
+}
+
+
+
+.daily-page .family-like-strip,
+
+.daily-page .encourage-strip {
+
+ background: var(--surface);
+
+ border: 1rpx solid var(--border);
+
+ box-shadow: var(--shadow-premium);
+
+}
+
+
+
+.daily-page .card-title,
+
+.daily-page .hero-title {
+
+ color: inherit;
+
+}
+
+
+
+.daily-page .report-share-btn,
+
+.daily-page .report-share-btn::after {
+
+ background: var(--primary);
+
+ box-shadow: var(--shadow-glow-primary);
+
+}
+
+
+
+.daily-page .input-modal-btn.primary {
+
+ background: var(--primary);
+
+}
+
+
+
+.daily-page .input-field-dot-fasting {
+
+ background: var(--primary);
+
+}
+
+
+
+.daily-page .input-field-dot-postprandial {
+
+ background: var(--primary-container);
+
+}
+
+
+
+.daily-page .input-field-dot-other {
+
+ background: var(--text-muted);
+
+}
+
+
+
+.daily-page .voice-switch.on .voice-switch-track {
+
+ background: var(--primary);
+
+}
+
+
+
+.daily-page .heatmap-foot-cta {
+
+ background: var(--primary);
+
+}
+
+
+
+/* ========== 适老极简首页(index) ========== */
+
+.daily-page .elder-header {
+
+ padding: 48rpx 32rpx 24rpx;
+
+}
+
+
+
+.daily-page .elder-greet {
+
+ display: block;
+
+ font-size: 44rpx;
+
+ font-weight: 700;
+
+ color: var(--text-primary);
+
+ line-height: 1.35;
+
+}
+
+
+
+.daily-page .elder-status {
+
+ display: block;
+
+ margin-top: 16rpx;
+
+ font-size: 32rpx;
+
+ font-weight: 600;
+
+ line-height: 1.4;
+
+
+
+ &.is-done {
+
+ color: var(--success);
+
+ }
+
+
+
+ &.is-pending {
+
+ color: var(--text-secondary);
+
+ }
+
+}
+
+
+
+.daily-page .elder-card-scroll {
+
+ margin-top: 24rpx;
+
+ width: 100%;
+
+ white-space: nowrap;
+
+}
+
+
+
+.daily-page .elder-card-row {
+
+ display: inline-flex;
+
+ flex-wrap: nowrap;
+
+ gap: 16rpx;
+
+ padding: 2rpx 0;
+
+}
+
+
+
+.daily-page .elder-card-chip {
+
+ flex-shrink: 0;
+
+ padding: 12rpx 28rpx;
+
+ border-radius: 999rpx;
+
+ background: var(--surface);
+
+ border: 2rpx solid var(--border);
+
+
+
+ text {
+
+ font-size: 28rpx;
+
+ color: var(--text-secondary);
+
+ }
+
+
+
+ &.active {
+
+ background: var(--primary);
+
+ border-color: var(--primary);
+
+
+
+ text {
+
+ color: #fff;
+
+ font-weight: 600;
+
+ }
+
+ }
+
+}
+
+
+
+.daily-page .elder-actions {
+
+ padding: 0 32rpx 24rpx;
+
+ display: flex;
+
+ flex-direction: row;
+
+ align-items: stretch;
+
+ gap: 16rpx;
+
+}
+
+
+
+.daily-page .elder-btn {
+
+ display: flex;
+
+ align-items: center;
+
+ justify-content: center;
+
+ gap: 12rpx;
+
+ min-height: 112rpx;
+
+ min-width: 0;
+
+ border-radius: 24rpx;
+
+ box-shadow: var(--shadow-sm);
+
+ box-sizing: border-box;
+
+}
+
+
+
+.daily-page .elder-btn-text {
+
+ font-size: 36rpx;
+
+ font-weight: 700;
+
+}
+
+
+
+.daily-page .elder-btn-primary {
+
+ flex: 8;
+
+ background: var(--primary);
+
+
+
+ .elder-btn-text {
+
+ color: #fff;
+
+ }
+
+}
+
+
+
+.daily-page .elder-btn-voice {
+
+ flex: 2;
+
+ flex-direction: column;
+
+ gap: 8rpx;
+
+ padding: 12rpx 8rpx;
+
+ background: var(--surface);
+
+ border: 2rpx solid var(--border-soft);
+
+
+
+ .elder-btn-text {
+
+ color: var(--primary-dark);
+
+ font-size: 24rpx;
+
+ line-height: 1.25;
+
+ text-align: center;
+
+ }
+
+
+
+ &.speaking {
+
+ border-color: var(--primary);
+
+ background: var(--primary-light);
+
+ }
+
+
+
+ &.disabled {
+
+ opacity: 0.45;
+
+ }
+
+}
+
+
+
+.daily-page .elder-today-panel {
+
+ margin: 0 32rpx 24rpx;
+
+ padding: 32rpx;
+
+ background: var(--surface);
+
+ border-radius: 24rpx;
+
+ border: 1rpx solid var(--border);
+
+ box-shadow: var(--shadow-premium);
+
+}
+
+
+
+.daily-page .elder-panel-title {
+
+ display: block;
+
+ font-size: 34rpx;
+
+ font-weight: 700;
+
+ color: var(--text-primary);
+
+ margin-bottom: 24rpx;
+
+}
+
+
+
+.daily-page .elder-today-grid {
+
+ display: grid;
+
+ grid-template-columns: 1fr 1fr;
+
+ gap: 20rpx;
+
+}
+
+
+
+.daily-page .elder-metric {
+
+ padding: 24rpx;
+
+ border-radius: 20rpx;
+
+ background: var(--surface-muted);
+
+ border: 2rpx solid var(--border);
+
+
+
+ &.is-high {
+
+ border-color: rgba(220, 38, 38, 0.35);
+
+ background: var(--danger-light);
+
+ }
+
+}
+
+
+
+.daily-page .elder-metric-label {
+
+ display: block;
+
+ font-size: 28rpx;
+
+ color: var(--text-secondary);
+
+ margin-bottom: 12rpx;
+
+}
+
+
+
+.daily-page .elder-metric-value-row {
+
+ display: flex;
+
+ align-items: baseline;
+
+ gap: 8rpx;
+
+}
+
+
+
+.daily-page .elder-metric-value {
+
+ font-size: 56rpx;
+
+ font-weight: 800;
+
+ color: var(--text-primary);
+
+ line-height: 1.1;
+
+}
+
+
+
+.daily-page .elder-metric.is-high .elder-metric-value {
+
+ color: var(--danger);
+
+}
+
+
+
+.daily-page .elder-metric-unit {
+
+ font-size: 26rpx;
+
+ color: var(--text-muted);
+
+}
+
+
+
+.daily-page .elder-metric-flag {
+
+ display: block;
+
+ margin-top: 12rpx;
+
+ font-size: 26rpx;
+
+ color: var(--danger);
+
+ font-weight: 600;
+
+}
+
+
+
+.daily-page .elder-more-link {
+
+ margin: 0 32rpx 16rpx;
+
+ padding: 28rpx 32rpx;
+
+ display: flex;
+
+ align-items: center;
+
+ justify-content: space-between;
+
+ background: var(--surface);
+
+ border-radius: 24rpx;
+
+ border: 1rpx solid var(--border);
+
+}
+
+
+
+.daily-page .elder-more-title {
+
+ display: block;
+
+ font-size: 32rpx;
+
+ font-weight: 700;
+
+ color: var(--text-primary);
+
+}
+
+
+
+.daily-page .elder-more-sub {
+
+ display: block;
+
+ margin-top: 8rpx;
+
+ font-size: 26rpx;
+
+ color: var(--text-muted);
+
+ line-height: 1.45;
+
+}
+
+
+
+.daily-page .elder-more-arrow {
+
+ font-size: 48rpx;
+
+ color: var(--primary);
+
+ font-weight: 300;
+
+ padding-left: 16rpx;
+
+}
+
+
+
+.daily-page .footer-tip {
+
+ text-align: center;
+
+ font-size: 26rpx;
+
+ color: var(--text-muted);
+
+ padding: 16rpx 32rpx 48rpx;
+
+ line-height: 1.6;
+
+}
+
+
+
+
+
+.daily-page .elder-chart-block .range-bar {
+ margin-bottom: 16rpx;
+}
+
+.daily-page .glucose-history-block {
+
+ padding-bottom: 8rpx;
+
+}
+
+
diff --git a/TongjiUniApp/tongji/styles/more-stitch.scss b/TongjiUniApp/tongji/styles/more-stitch.scss
new file mode 100644
index 000000000..88074bba7
--- /dev/null
+++ b/TongjiUniApp/tongji/styles/more-stitch.scss
@@ -0,0 +1,1426 @@
+/**
+ * more.vue — Daily Care · Stitch Modern WeChat UI (code.html)
+ */
+
+.more-page {
+ /* 与 code.html .ambient-shadow (0 20px 30px -10px) 1:1 */
+ --mc-shadow-ambient: 0 40rpx 60rpx -20rpx rgba(0, 108, 73, 0.08);
+ min-height: 100vh;
+ background: var(--surface);
+ color: var(--on-surface);
+ padding-bottom: calc(48rpx + env(safe-area-inset-bottom));
+}
+
+/* ===== 浇水特效(对应 code.html @keyframes fall / pulse-growth / shimmer / float-up-fade / fall-arrow) ===== */
+.more-page .mc-rain {
+ position: absolute;
+ inset: 0;
+ pointer-events: none;
+ z-index: 4;
+}
+
+.more-page .mc-droplet {
+ position: absolute;
+ top: 0;
+ width: 8rpx;
+ height: 20rpx;
+ background: #3b82f6;
+ border-radius: 50%;
+ animation: mc-fall 0.6s linear infinite;
+}
+
+@keyframes mc-fall {
+ 0% { transform: translateY(-40rpx); opacity: 0; }
+ 50% { opacity: 1; }
+ 100% { transform: translateY(80rpx); opacity: 0; }
+}
+
+.more-page .mc-sparkle {
+ position: absolute;
+ font-size: 28rpx;
+ pointer-events: none;
+ z-index: 5;
+ color: #4edea3;
+ animation: mc-shimmer 1s ease-out forwards;
+}
+
+@keyframes mc-shimmer {
+ 0% { opacity: 0; transform: scale(0) rotate(0deg); }
+ 50% { opacity: 1; transform: scale(1.2) rotate(180deg); }
+ 100% { opacity: 0; transform: scale(0) rotate(360deg); }
+}
+
+.more-page .mc-sugar-decrease-float {
+ position: absolute;
+ left: 50%;
+ top: 8%;
+ transform: translateX(-50%);
+ color: #10b981;
+ font-weight: 800;
+ font-size: 48rpx;
+ line-height: 1.2;
+ pointer-events: none;
+ z-index: 12;
+ text-shadow: 0 8rpx 24rpx rgba(16, 185, 129, 0.3);
+ animation: mc-float-up-fade-local 2s ease-out forwards;
+}
+
+@keyframes mc-float-up-fade-local {
+ 0% { transform: translate(-50%, 40rpx); opacity: 0; }
+ 20% { opacity: 1; }
+ 80% { opacity: 1; }
+ 100% { transform: translate(-50%, -200rpx); opacity: 0; }
+}
+
+.more-page .mc-sugar-particles {
+ position: fixed;
+ inset: 0;
+ pointer-events: none;
+ z-index: 90;
+ overflow: hidden;
+}
+
+.more-page .mc-sugar-particle {
+ position: absolute;
+ top: 0;
+ color: var(--primary-container);
+ font-weight: 700;
+ line-height: 1;
+ animation: mc-fall-arrow 1.5s linear forwards;
+}
+
+.more-page .mc-sugar-particle.is-south {
+ font-weight: 400;
+}
+
+@keyframes mc-fall-arrow {
+ 0% { transform: translateY(-50vh) scale(0.5); opacity: 0; }
+ 50% { opacity: 0.8; }
+ 100% { transform: translateY(110vh) scale(1.2); opacity: 0; }
+}
+
+/* ===== Fixed green header ===== */
+.more-page .mc-header {
+ position: fixed;
+ left: 0;
+ right: 0;
+ top: 0;
+ z-index: 40;
+ display: flex;
+ align-items: flex-end;
+ box-sizing: border-box;
+ background: var(--primary);
+ border-radius: 0 0 48rpx 48rpx;
+ overflow: hidden;
+}
+
+.more-page .mc-header-inner {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 16rpx;
+ width: 100%;
+ padding: 0 var(--st-container-margin) 48rpx;
+ box-sizing: border-box;
+}
+
+.more-page .mc-header-left {
+ display: flex;
+ align-items: center;
+ gap: var(--st-inline-gap);
+ flex: 1;
+ min-width: 0;
+ overflow: hidden;
+}
+
+.more-page .mc-header-back {
+ width: 80rpx;
+ height: 80rpx;
+ border-radius: 50%;
+ background: rgba(255, 255, 255, 0.12);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.more-page .mc-header-back:active {
+ opacity: 0.85;
+ transform: scale(0.98);
+}
+
+.more-page .mc-avatar {
+ width: 80rpx;
+ height: 80rpx;
+ border-radius: 50%;
+ border: 4rpx solid var(--on-primary);
+ background: rgba(255, 255, 255, 0.15);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+ overflow: hidden;
+}
+
+.more-page .mc-header-text {
+ flex: 1;
+ min-width: 0;
+ overflow: hidden;
+}
+
+.more-page .mc-header-title {
+ display: block;
+ max-width: 100%;
+ font-size: 36rpx;
+ font-weight: 700;
+ line-height: 1.25;
+ color: var(--on-primary);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.more-page .mc-header-name {
+ display: block;
+ margin-top: 4rpx;
+ font-size: 28rpx;
+ font-weight: 500;
+ color: rgba(255, 255, 255, 0.85);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.more-page .mc-header-actions {
+ display: flex;
+ align-items: center;
+ gap: 12rpx;
+ flex-shrink: 0;
+ margin-left: 8rpx;
+}
+
+.more-page .mc-header-pill {
+ display: inline-flex;
+ align-items: center;
+ gap: 8rpx;
+ padding: 12rpx 24rpx;
+ border-radius: 999rpx;
+ background: rgba(255, 255, 255, 0.12);
+ color: var(--on-primary);
+ font-size: 24rpx;
+ font-weight: 600;
+ line-height: 1;
+ flex-shrink: 0;
+ white-space: nowrap;
+}
+
+.more-page .mc-header-pill:active,
+.more-page .mc-header-icon-btn:active {
+ opacity: 0.85;
+ transform: scale(0.98);
+}
+
+.more-page .mc-header-icon-btn {
+ width: 80rpx;
+ height: 80rpx;
+ border-radius: 50%;
+ background: rgba(255, 255, 255, 0.12);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+/* ===== Main scroll area ===== */
+.more-page .mc-main {
+ padding-left: var(--st-container-margin);
+ padding-right: var(--st-container-margin);
+ display: flex;
+ flex-direction: column;
+ gap: 48rpx;
+}
+
+/* Range toggle */
+.more-page .mc-range-toggle {
+ display: flex;
+ padding: 8rpx;
+ border-radius: 999rpx;
+ background: var(--surface-container-high);
+}
+
+.more-page .mc-range-opt {
+ flex: 1;
+ text-align: center;
+ padding: 16rpx 0;
+ border-radius: 999rpx;
+ font-size: 24rpx;
+ font-weight: 700;
+ color: var(--on-surface-variant);
+ transition: all 0.2s ease;
+}
+
+.more-page .mc-range-opt.active {
+ background: var(--primary);
+ color: var(--on-primary);
+ box-shadow: 0 8rpx 16rpx rgba(0, 108, 73, 0.2);
+}
+
+/* Card base */
+.more-page .mc-card {
+ background: var(--surface-container-lowest);
+ border-radius: var(--st-radius-2xl);
+ padding: var(--st-card-padding);
+ box-shadow: var(--mc-shadow-ambient);
+}
+
+.more-page .mc-card-head {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ margin-bottom: 32rpx;
+}
+
+.more-page .mc-card-title {
+ display: block;
+ font-size: 40rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+}
+
+.more-page .mc-card-sub {
+ display: block;
+ margin-top: 4rpx;
+ font-size: 28rpx;
+ color: var(--outline);
+}
+
+/* Calendar — 与 code.html 同一 7 列 grid(星期 + 日期) */
+.more-page .mc-cal-grid--full {
+ display: grid;
+ grid-template-columns: repeat(7, 1fr);
+ gap: 8rpx;
+ text-align: center;
+ margin-bottom: 32rpx;
+}
+
+.more-page .mc-cal-weekday {
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--outline);
+ padding: 8rpx 0;
+}
+
+.more-page .mc-cal-weekday.is-weekend {
+ color: var(--tertiary);
+}
+
+.more-page .mc-cal-grid {
+ display: grid;
+ grid-template-columns: repeat(7, 1fr);
+ gap: 8rpx;
+ text-align: center;
+ margin-bottom: 32rpx;
+}
+
+.more-page .mc-cal-cell {
+ position: relative;
+ padding: 16rpx 0;
+ border-radius: var(--st-radius-lg);
+ font-size: 28rpx;
+ color: var(--on-surface);
+}
+
+.more-page .mc-cal-cell.off {
+ color: rgba(108, 122, 113, 0.3);
+}
+
+.more-page .mc-cal-cell.future-off {
+ color: rgba(108, 122, 113, 0.4);
+}
+
+.more-page .mc-cal-cell.in-range {
+ color: var(--on-surface);
+}
+
+.more-page .mc-cal-cell.recorded {
+ background: rgba(16, 185, 129, 0.12);
+ color: var(--primary);
+ font-weight: 700;
+}
+
+.more-page .mc-cal-cell.recorded-high {
+ background: rgba(186, 26, 26, 0.12);
+ color: var(--error);
+ font-weight: 700;
+}
+
+.more-page .mc-cal-cell.today-empty {
+ background: var(--tertiary-container);
+ color: var(--on-tertiary);
+ font-weight: 700;
+}
+
+.more-page .mc-cal-dot {
+ position: absolute;
+ bottom: 8rpx;
+ left: 50%;
+ transform: translateX(-50%);
+ width: 8rpx;
+ height: 8rpx;
+ border-radius: 50%;
+ background: var(--primary);
+}
+
+.more-page .mc-cal-dot.is-high {
+ background: var(--error);
+}
+
+.more-page .mc-cal-foot {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding-top: 32rpx;
+ border-top: 1rpx solid rgba(187, 202, 191, 0.3);
+}
+
+.more-page .mc-cal-foot-text {
+ font-size: 28rpx;
+ color: var(--outline);
+}
+
+.more-page .mc-cal-foot-btn {
+ padding: 24rpx 48rpx;
+ border-radius: 32rpx;
+ background: var(--primary);
+ color: var(--on-primary);
+ font-size: 24rpx;
+ font-weight: 700;
+}
+
+.more-page .mc-cal-foot-btn:active {
+ opacity: 0.9;
+ transform: scale(0.98);
+}
+
+/* Blood records */
+.more-page .mc-blood-section {
+ display: flex;
+ flex-direction: column;
+ gap: 32rpx;
+}
+
+.more-page .mc-section-head {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 0;
+}
+
+.more-page .mc-blood-list {
+ display: flex;
+ flex-direction: column;
+ gap: 32rpx;
+}
+
+.more-page .mc-section-count {
+ font-size: 28rpx;
+ color: var(--outline);
+}
+
+.more-page .mc-day-card {
+ margin-bottom: 0;
+}
+
+.more-page .mc-day-card:last-child {
+ margin-bottom: 0;
+}
+
+.more-page .mc-day-head {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 32rpx;
+}
+
+.more-page .mc-day-date {
+ font-size: 40rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+}
+
+.more-page .mc-day-weekday {
+ font-size: 28rpx;
+ color: var(--outline);
+}
+
+.more-page .mc-metric-stack {
+ display: flex;
+ flex-direction: column;
+ gap: 16rpx;
+}
+
+.more-page .mc-metric-row {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 32rpx;
+ margin-bottom: 0;
+ border-radius: 32rpx;
+ background: rgba(244, 251, 244, 0.55);
+ border: 1rpx solid rgba(187, 202, 191, 0.2);
+}
+
+.more-page .mc-metric-row.is-abnormal-high {
+ background: rgba(255, 218, 214, 0.22);
+ border-color: rgba(186, 26, 26, 0.22);
+}
+
+.more-page .mc-metric-row.is-abnormal-low {
+ background: rgba(219, 234, 254, 0.35);
+ border-color: rgba(37, 99, 235, 0.22);
+}
+
+.more-page .mc-metric-row:last-child {
+ margin-bottom: 0;
+}
+
+.more-page .mc-metric-label {
+ font-size: 28rpx;
+ color: var(--outline);
+}
+
+.more-page .mc-metric-value-wrap {
+ display: flex;
+ align-items: center;
+ justify-content: flex-end;
+ flex-wrap: wrap;
+ gap: 8rpx 12rpx;
+ text-align: right;
+}
+
+.more-page .mc-metric-badge {
+ padding: 4rpx 12rpx;
+ border-radius: 999rpx;
+ font-size: 20rpx;
+ font-weight: 700;
+ line-height: 1.2;
+}
+
+.more-page .mc-metric-badge.is-high {
+ color: var(--error);
+ background: rgba(186, 26, 26, 0.12);
+}
+
+.more-page .mc-metric-badge.is-low {
+ color: #1d4ed8;
+ background: rgba(37, 99, 235, 0.12);
+}
+
+.more-page .mc-metric-value {
+ font-size: 48rpx;
+ font-weight: 800;
+ color: var(--on-surface);
+}
+
+.more-page .mc-metric-value.is-high {
+ color: var(--error);
+}
+
+.more-page .mc-metric-value.is-low {
+ color: #1d4ed8;
+}
+
+.more-page .mc-metric-empty {
+ text-align: right;
+}
+
+.more-page .mc-metric-empty-val {
+ font-size: 40rpx;
+ font-weight: 700;
+ color: var(--outline-variant);
+}
+
+.more-page .mc-metric-empty-unit {
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--outline);
+}
+
+.more-page .mc-metric-value.is-empty {
+ font-size: 40rpx;
+ font-weight: 700;
+ color: var(--outline-variant);
+}
+
+.more-page .mc-metric-unit {
+ margin-left: 8rpx;
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--outline);
+}
+
+.more-page .mc-state-card {
+ padding: 64rpx 32rpx;
+ text-align: center;
+ font-size: 28rpx;
+ color: var(--outline);
+}
+
+/* Paradise */
+.more-page .mc-paradise-card {
+ overflow: hidden;
+ position: relative;
+}
+
+.more-page .mc-paradise-head {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ margin-bottom: 48rpx;
+}
+
+.more-page .mc-points-badge {
+ padding: 8rpx 24rpx;
+ border-radius: var(--st-radius-xl);
+ background: rgba(0, 108, 73, 0.1);
+ text-align: center;
+ flex-shrink: 0;
+}
+
+.more-page .mc-points-num {
+ display: block;
+ font-size: 48rpx;
+ font-weight: 800;
+ color: var(--primary);
+ line-height: 1.1;
+}
+
+.more-page .mc-points-label {
+ display: block;
+ font-size: 20rpx;
+ font-weight: 700;
+ color: rgba(0, 108, 73, 0.7);
+}
+
+.more-page .mc-quick-grid {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 16rpx;
+ margin-bottom: 64rpx;
+}
+
+.more-page .mc-quick-item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 8rpx;
+ padding: 24rpx 12rpx;
+ border-radius: 32rpx;
+ background: var(--surface-container-low);
+}
+
+.more-page .mc-quick-item:active {
+ transform: scale(0.98);
+ opacity: 0.9;
+}
+
+.more-page .mc-quick-label {
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--on-surface);
+}
+
+.more-page .mc-tasks-title {
+ font-size: 24rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+ margin-bottom: 16rpx;
+ display: block;
+}
+
+.more-page .mc-tasks-section {
+ margin-top: 0;
+ margin-bottom: 32rpx;
+}
+
+.more-page .mc-tasks-grid {
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ gap: 12rpx;
+ margin-bottom: 0;
+}
+
+.more-page .mc-task-block {
+ display: flex;
+ flex-direction: column;
+ gap: 8rpx;
+ padding: 16rpx 12rpx;
+ border-radius: 24rpx;
+ background: var(--surface-container-low);
+ border: 1rpx solid rgba(0, 108, 73, 0.08);
+}
+
+.more-page .mc-task-block:active {
+ transform: scale(0.98);
+ opacity: 0.92;
+}
+
+.more-page .mc-task-block.is-done {
+ border-color: rgba(0, 108, 73, 0.18);
+}
+
+.more-page .mc-task-block-top {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.more-page .mc-task-block .mc-task-check {
+ width: 32rpx;
+ height: 32rpx;
+ border-width: 3rpx;
+}
+
+.more-page .mc-task-block .mc-task-dot {
+ width: 12rpx;
+ height: 12rpx;
+}
+
+.more-page .mc-task-block-points {
+ font-size: 20rpx;
+ font-weight: 700;
+ color: var(--primary);
+}
+
+.more-page .mc-task-block-body {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 6rpx;
+ padding: 4rpx 0;
+}
+
+.more-page .mc-task-block-name {
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--on-surface);
+ text-align: center;
+ line-height: 1.2;
+}
+
+.more-page .mc-task-block-status {
+ align-self: center;
+ font-size: 20rpx;
+ font-weight: 700;
+ font-style: italic;
+ color: var(--outline);
+ line-height: 1.2;
+}
+
+.more-page .mc-task-block-action {
+ align-self: center;
+ padding: 4rpx 20rpx;
+ border-radius: 999rpx;
+ background: var(--on-surface);
+ color: var(--surface);
+ font-size: 20rpx;
+ font-weight: 700;
+ line-height: 1.3;
+}
+
+.more-page .mc-task-block-action.is-water {
+ background: var(--primary);
+ color: var(--on-primary);
+}
+
+.more-page .mc-tasks-list {
+ display: flex;
+ flex-direction: column;
+ gap: 24rpx;
+}
+
+.more-page .mc-task-row {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.more-page .mc-task-left {
+ display: flex;
+ align-items: center;
+ gap: 24rpx;
+ flex: 1;
+ min-width: 0;
+}
+
+.more-page .mc-task-check {
+ width: 40rpx;
+ height: 40rpx;
+ line-height: 40rpx;
+ border-radius: 50%;
+ border: 4rpx solid var(--primary);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.more-page .mc-task-check.pending {
+ border-color: rgba(187, 202, 191, 0.3);
+}
+
+.more-page .mc-task-dot {
+ width: 16rpx;
+ height: 16rpx;
+ border-radius: 50%;
+ background: var(--outline-variant);
+}
+
+.more-page .mc-task-name {
+ font-size: 28rpx;
+ color: var(--on-surface);
+}
+
+.more-page .mc-task-right {
+ display: flex;
+ align-items: center;
+ gap: 24rpx;
+ flex-shrink: 0;
+}
+
+.more-page .mc-task-points {
+ font-size: 24rpx;
+ font-weight: 700;
+ color: var(--primary);
+}
+
+.more-page .mc-task-done {
+ font-size: 24rpx;
+ font-weight: 700;
+ font-style: italic;
+ color: var(--outline);
+}
+
+.more-page .mc-task-btn {
+ padding: 8rpx 32rpx;
+ border-radius: 999rpx;
+ background: var(--on-surface);
+ color: var(--surface);
+ font-size: 24rpx;
+ font-weight: 700;
+ line-height: 1.4;
+}
+
+.more-page .mc-tree-zone {
+ margin-top: 0;
+ padding: 35rpx;
+ border-radius: var(--st-radius-2xl);
+ background: linear-gradient(135deg, rgba(0, 108, 73, 0.05) 0%, rgba(0, 108, 73, 0.2) 100%);
+ border: 1rpx solid rgba(0, 108, 73, 0.1);
+ position: relative;
+ overflow: visible;
+}
+
+.more-page .mc-tree-level-head {
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-between;
+ margin-bottom: 48rpx;
+}
+
+.more-page .mc-tree-level-row {
+ display: flex;
+ align-items: center;
+ gap: 16rpx;
+}
+
+.more-page .mc-tree-lv-badge {
+ padding: 4rpx 16rpx;
+ border-radius: 999rpx;
+ background: var(--primary);
+ color: var(--on-primary);
+ font-size: 20rpx;
+ font-weight: 800;
+}
+
+.more-page .mc-tree-stage-name {
+ font-size: 32rpx;
+ font-weight: 800;
+ color: var(--primary);
+}
+
+.more-page .mc-tree-xp-hint {
+ display: block;
+ margin-top: 8rpx;
+ font-size: 22rpx;
+ color: rgba(0, 108, 73, 0.6);
+}
+
+.more-page .mc-tree-xp-bold {
+ font-weight: 700;
+ color: rgba(0, 108, 73, 0.85);
+}
+
+.more-page .mc-tree-xp-text {
+ font-size: 24rpx;
+ font-weight: 700;
+ color: var(--primary);
+}
+
+.more-page .mc-tree-progress-track {
+ width: 100%;
+ height: 20rpx;
+ border-radius: 999rpx;
+ background: rgba(255, 255, 255, 0.5);
+ border: 1rpx solid rgba(255, 255, 255, 0.2);
+ overflow: hidden;
+ margin-bottom: 64rpx;
+}
+
+.more-page .mc-tree-progress-bar {
+ height: 100%;
+ border-radius: 999rpx;
+ background: linear-gradient(90deg, var(--primary) 0%, var(--primary-container) 100%);
+ transition: width 0.5s ease;
+}
+
+.more-page .mc-tree-display {
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ min-height: 200rpx;
+ padding: 64rpx 0;
+ margin-bottom: 48rpx;
+ overflow: visible;
+}
+
+.more-page .mc-tree-display-bg {
+ position: absolute;
+ inset: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ opacity: 0.1;
+ font-size: 240rpx;
+ line-height: 1;
+ pointer-events: none;
+}
+
+.more-page .mc-tree-emoji-wrap {
+ position: relative;
+ z-index: 2;
+ transition: transform 0.3s ease;
+}
+
+.more-page .mc-tree-emoji-wrap.is-watering {
+ animation: mc-growth-pulse 0.8s ease-out;
+}
+
+.more-page .mc-tree-emoji {
+ font-size: 144rpx;
+ line-height: 1;
+ filter: drop-shadow(0 16rpx 32rpx rgba(0, 0, 0, 0.2));
+}
+
+/* 对应 code.html pulse-growth:放大 + 绿色光晕 */
+@keyframes mc-growth-pulse {
+ 0% { transform: scale(1); filter: drop-shadow(0 0 0 rgba(78, 222, 163, 0)); }
+ 50% { transform: scale(1.15); filter: drop-shadow(0 0 30rpx rgba(78, 222, 163, 0.6)); }
+ 100% { transform: scale(1); filter: drop-shadow(0 0 0 rgba(78, 222, 163, 0)); }
+}
+
+.more-page .mc-tree-graphic {
+ position: relative;
+ z-index: 2;
+}
+
+.more-page .mc-float-reward {
+ position: absolute;
+ top: 20%;
+ left: 50%;
+ transform: translateX(-50%);
+ font-size: 32rpx;
+ font-weight: 800;
+ color: var(--primary);
+ z-index: 5;
+ animation: mc-float-up 1.2s ease-out forwards;
+}
+
+@keyframes mc-float-up {
+ 0% { opacity: 0; transform: translate(-50%, 20rpx); }
+ 30% { opacity: 1; }
+ 100% { opacity: 0; transform: translate(-50%, -80rpx); }
+}
+
+.more-page .mc-water-btn {
+ width: 100%;
+ padding: 32rpx 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 24rpx;
+ border-radius: 32rpx;
+ background: var(--primary);
+ color: var(--on-primary);
+ font-size: 32rpx;
+ font-weight: 700;
+ line-height: 1.2;
+ box-shadow: 0 16rpx 32rpx rgba(0, 108, 73, 0.25);
+ border: none;
+}
+
+.more-page .mc-water-btn.disabled {
+ opacity: 0.5;
+}
+
+.more-page .mc-water-btn:active {
+ transform: scale(0.96);
+ background: var(--primary-container);
+}
+
+.more-page .mc-water-btn:active .tj-icon-wrap {
+ transform: rotate(-12deg);
+}
+
+.more-page .mc-water-action {
+ position: relative;
+ z-index: 6;
+}
+
+.more-page .mc-water-btn.pulse {
+ animation: mc-water-pulse 2s ease-in-out infinite;
+}
+
+@keyframes mc-water-pulse {
+ 0%, 100% { box-shadow: 0 16rpx 32rpx rgba(0, 108, 73, 0.25); }
+ 50% { box-shadow: 0 16rpx 48rpx rgba(0, 108, 73, 0.45); }
+}
+
+.more-page .mc-water-hint {
+ display: block;
+ margin-top: 24rpx;
+ text-align: center;
+ font-size: 22rpx;
+ font-style: italic;
+ color: var(--outline);
+}
+
+/* Social / encourage / cards */
+.more-page .mc-social-card {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 24rpx;
+}
+
+.more-page .mc-social-left {
+ display: flex;
+ align-items: center;
+ gap: 24rpx;
+ flex: 1;
+ min-width: 0;
+}
+
+.more-page .mc-social-icon {
+ width: 80rpx;
+ height: 80rpx;
+ border-radius: 32rpx;
+ background: rgba(252, 124, 120, 0.2);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.more-page .mc-social-title {
+ display: block;
+ font-size: 28rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+}
+
+.more-page .mc-social-sub {
+ display: block;
+ margin-top: 4rpx;
+ font-size: 24rpx;
+ color: var(--outline);
+}
+
+.more-page .mc-encourage {
+ display: flex;
+ align-items: flex-start;
+ gap: 24rpx;
+ padding: 0 8rpx;
+}
+
+.more-page .mc-encourage-icon-wrap {
+ width: 40rpx;
+ height: 40rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+ margin-top: 4rpx;
+}
+
+.more-page .mc-encourage-icon {
+ font-size: 40rpx;
+ line-height: 1;
+ color: var(--primary-container);
+}
+
+.more-page .mc-encourage-body {
+ flex: 1;
+ min-width: 0;
+}
+
+.more-page .mc-encourage-text {
+ font-size: 28rpx;
+ line-height: 1.5;
+ color: var(--on-surface);
+}
+
+.more-page .mc-encourage-highlight {
+ color: var(--primary);
+ font-weight: 700;
+}
+
+.more-page .mc-encourage-tip {
+ display: block;
+ margin-top: 8rpx;
+ font-size: 24rpx;
+ color: var(--outline);
+}
+
+.more-page .mc-card-scroll {
+ margin: 0 calc(-1 * var(--st-container-margin));
+ padding: 0 var(--st-container-margin) 8rpx;
+ white-space: nowrap;
+}
+
+.more-page .mc-card-row {
+ display: inline-flex;
+ gap: 24rpx;
+}
+
+.more-page .mc-card-chip {
+ display: inline-flex;
+ align-items: center;
+ gap: 8rpx;
+ padding: 16rpx 24rpx;
+ border-radius: var(--st-radius-xl);
+ background: var(--surface-container-lowest);
+ border: 1rpx solid rgba(187, 202, 191, 0.2);
+ box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.04);
+ font-size: 24rpx;
+ font-weight: 700;
+ color: var(--on-surface-variant);
+}
+
+.more-page .mc-card-chip-count-only {
+ background: var(--surface-container-lowest);
+ border: 1rpx solid rgba(187, 202, 191, 0.2);
+ box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.04);
+ color: var(--on-surface);
+}
+
+.more-page .mc-card-chip-num {
+ font-weight: 800;
+ color: var(--on-surface);
+}
+
+.more-page .mc-card-chip.active {
+ background: var(--primary);
+ color: var(--on-primary);
+ border-color: var(--primary);
+ box-shadow: 0 8rpx 20rpx rgba(0, 108, 73, 0.25);
+}
+
+.more-page .mc-card-chip-meta {
+ font-size: 20rpx;
+ font-weight: 600;
+ padding: 2rpx 8rpx;
+ border-radius: 8rpx;
+ background: rgba(255, 255, 255, 0.2);
+}
+
+.more-page .mc-card-chip:not(.active) .mc-card-chip-meta {
+ background: transparent;
+ color: var(--outline);
+}
+
+.more-page .mc-card-chip-count {
+ color: var(--outline);
+ font-weight: 600;
+}
+
+.more-page .mc-card-chip:not(.active):not(.mc-card-chip-count-only) {
+ background: var(--surface-container-high);
+ border: 1rpx solid rgba(187, 202, 191, 0.3);
+ color: var(--on-surface-variant);
+}
+
+.more-page .mc-footer-tip {
+ margin-top: 64rpx;
+ text-align: center;
+ padding: 0 var(--st-container-margin) 96rpx;
+ font-size: 22rpx;
+ color: rgba(108, 122, 113, 0.6);
+}
+
+.more-page .mc-tree-species-btn {
+ display: inline-flex;
+ align-items: center;
+ gap: 4rpx;
+ margin-left: 8rpx;
+ padding: 4rpx 12rpx;
+ border-radius: 999rpx;
+ background: rgba(0, 108, 73, 0.08);
+ font-size: 20rpx;
+ font-weight: 700;
+ color: var(--primary);
+}
+
+.more-page .mc-water-panel,
+.more-page .mc-species-panel {
+ width: calc(100% - 48rpx);
+ max-width: 680rpx;
+ margin: 0 auto;
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ max-height: 78vh;
+ background: var(--surface);
+ border-radius: 32rpx 32rpx 0 0;
+ padding: 32rpx 28rpx calc(32rpx + env(safe-area-inset-bottom));
+ box-shadow: 0 -12rpx 40rpx rgba(15, 23, 42, 0.12);
+}
+
+.more-page .mc-water-panel-head {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 20rpx;
+}
+
+.more-page .mc-water-panel-title {
+ font-size: 34rpx;
+ font-weight: 800;
+ color: var(--on-surface);
+}
+
+.more-page .mc-water-panel-close {
+ width: 56rpx;
+ height: 56rpx;
+ border-radius: 50%;
+ background: var(--surface-container-low);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 36rpx;
+ color: var(--outline);
+}
+
+.more-page .mc-water-panel-summary {
+ display: block;
+ font-size: 26rpx;
+ line-height: 1.5;
+ color: var(--on-surface-variant);
+ margin-bottom: 24rpx;
+}
+
+.more-page .mc-water-panel-list {
+ display: flex;
+ flex-direction: column;
+ gap: 12rpx;
+ margin-bottom: 20rpx;
+}
+
+.more-page .mc-water-panel-row {
+ display: flex;
+ align-items: center;
+ gap: 16rpx;
+ padding: 18rpx 16rpx;
+ border-radius: 20rpx;
+ background: var(--surface-container-low);
+ border: 1rpx solid rgba(0, 108, 73, 0.08);
+}
+
+.more-page .mc-water-panel-row.is-water {
+ border-color: rgba(0, 108, 73, 0.22);
+ background: rgba(0, 108, 73, 0.06);
+}
+
+.more-page .mc-water-panel-row.is-claimed {
+ opacity: 0.72;
+}
+
+.more-page .mc-water-panel-row-main {
+ flex: 1;
+ min-width: 0;
+}
+
+.more-page .mc-water-panel-row-name {
+ display: block;
+ font-size: 28rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+}
+
+.more-page .mc-water-panel-row-sub {
+ display: block;
+ margin-top: 4rpx;
+ font-size: 22rpx;
+ color: var(--outline);
+}
+
+.more-page .mc-water-panel-row-tag {
+ flex-shrink: 0;
+ font-size: 22rpx;
+ font-weight: 700;
+ color: var(--primary);
+}
+
+.more-page .mc-water-panel-row.is-pending .mc-water-panel-row-tag {
+ color: #b45309;
+}
+
+.more-page .mc-water-panel-growth {
+ padding: 16rpx 18rpx;
+ border-radius: 16rpx;
+ background: rgba(0, 108, 73, 0.06);
+ margin-bottom: 20rpx;
+ font-size: 24rpx;
+ line-height: 1.45;
+ color: var(--primary);
+}
+
+.more-page .mc-water-panel-actions {
+ display: flex;
+ flex-direction: column;
+ gap: 12rpx;
+}
+
+.more-page .mc-water-panel-btn {
+ width: 100%;
+ height: 88rpx;
+ line-height: 88rpx;
+ border-radius: 999rpx;
+ font-size: 28rpx;
+ font-weight: 700;
+ background: var(--on-surface);
+ color: var(--surface);
+ border: none;
+}
+
+.more-page .mc-water-panel-btn.primary {
+ background: var(--primary);
+ color: var(--on-primary);
+}
+
+.more-page .mc-water-panel-btn.ghost {
+ background: var(--surface-container-low);
+ color: var(--on-surface);
+}
+
+.more-page .mc-species-panel-tip {
+ display: block;
+ font-size: 22rpx;
+ line-height: 1.45;
+ color: var(--outline);
+ margin-bottom: 20rpx;
+}
+
+.more-page .mc-species-scroll {
+ max-height: 56vh;
+}
+
+.more-page .mc-species-card {
+ padding: 20rpx;
+ border-radius: 24rpx;
+ border: 2rpx solid rgba(0, 108, 73, 0.1);
+ background: var(--surface-container-low);
+ margin-bottom: 16rpx;
+}
+
+.more-page .mc-species-card.active {
+ border-color: var(--primary);
+ background: rgba(0, 108, 73, 0.06);
+}
+
+.more-page .mc-species-card-head {
+ display: flex;
+ align-items: center;
+ gap: 16rpx;
+ margin-bottom: 16rpx;
+}
+
+.more-page .mc-species-card-emoji {
+ font-size: 56rpx;
+ line-height: 1;
+}
+
+.more-page .mc-species-card-name {
+ display: block;
+ font-size: 30rpx;
+ font-weight: 800;
+ color: var(--on-surface);
+}
+
+.more-page .mc-species-card-tagline {
+ display: block;
+ margin-top: 4rpx;
+ font-size: 22rpx;
+ color: var(--outline);
+}
+
+.more-page .mc-species-stages {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10rpx;
+}
+
+.more-page .mc-species-stage {
+ width: calc(20% - 8rpx);
+ min-width: 96rpx;
+ padding: 10rpx 6rpx;
+ border-radius: 16rpx;
+ background: rgba(255, 255, 255, 0.7);
+ text-align: center;
+ opacity: 0.45;
+}
+
+.more-page .mc-species-stage.reached {
+ opacity: 1;
+}
+
+.more-page .mc-species-stage.current {
+ box-shadow: 0 0 0 2rpx var(--primary);
+ background: rgba(0, 108, 73, 0.1);
+}
+
+.more-page .mc-species-stage-emoji {
+ display: block;
+ font-size: 32rpx;
+ line-height: 1.1;
+}
+
+.more-page .mc-species-stage-lv {
+ display: block;
+ font-size: 18rpx;
+ font-weight: 700;
+ color: var(--primary);
+ margin-top: 4rpx;
+}
+
+.more-page .mc-species-stage-name {
+ display: block;
+ font-size: 18rpx;
+ color: var(--outline);
+ margin-top: 2rpx;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
diff --git a/TongjiUniApp/tongji/styles/stitch-vitalmint-theme.scss b/TongjiUniApp/tongji/styles/stitch-vitalmint-theme.scss
new file mode 100644
index 000000000..58eb01752
--- /dev/null
+++ b/TongjiUniApp/tongji/styles/stitch-vitalmint-theme.scss
@@ -0,0 +1,51 @@
+/**
+ * Google Stitch MCP · VitalMint Health
+ * 设计 token 与 stitch-weekly.html tailwind.config 一一对应
+ */
+
+.stitch-vitalmint {
+ --primary: #006c49;
+ --on-primary: #ffffff;
+ --on-primary-fixed-variant: #005236;
+ --primary-container: #10b981;
+ --on-primary-container: #00422b;
+ --inverse-primary: #4edea3;
+
+ --surface: #f4fbf4;
+ --on-surface: #161d19;
+ --on-surface-variant: #3c4a42;
+ --surface-container-lowest: #ffffff;
+ --surface-container-low: #eef6ee;
+ --surface-container: #e8f0e9;
+ --surface-container-high: #e3eae3;
+ --surface-container-highest: #dde4dd;
+ --surface-variant: #dde4dd;
+
+ --outline: #6c7a71;
+ --outline-variant: #bbcabf;
+
+ --error: #ba1a1a;
+ --on-error-container: #93000a;
+ --error-container: #ffdad6;
+ --tertiary: #a43a3a;
+ --tertiary-container: #fc7c78;
+ --on-tertiary: #ffffff;
+ --on-tertiary-container: #711419;
+
+ --st-container-margin: 40rpx;
+ --st-section-gap: 64rpx;
+ --st-card-padding: 40rpx;
+ --st-stack-gap: 32rpx;
+ --st-inline-gap: 24rpx;
+ --st-radius-2xl: 48rpx;
+ --st-radius-xl: 24rpx;
+ --st-radius-lg: 16rpx;
+ --st-shadow-ambient: 0 20rpx 60rpx -20rpx rgba(0, 108, 73, 0.08);
+}
+
+.weekly-page.stitch-vitalmint {
+ min-height: 100vh;
+ background: var(--surface);
+ color: var(--on-surface);
+ padding-bottom: calc(200rpx + env(safe-area-inset-bottom));
+}
diff --git a/TongjiUniApp/tongji/styles/weekly-input-modal.scss b/TongjiUniApp/tongji/styles/weekly-input-modal.scss
new file mode 100644
index 000000000..f16db6e4b
--- /dev/null
+++ b/TongjiUniApp/tongji/styles/weekly-input-modal.scss
@@ -0,0 +1,309 @@
+/* weekly.vue 录入弹窗 — 沿用 MCP 主色 */
+
+.weekly-page .input-modal-mask {
+ position: fixed;
+ inset: 0;
+ background: rgba(15, 23, 42, 0.45);
+ backdrop-filter: blur(12px);
+ z-index: 2000;
+ display: flex;
+ align-items: flex-end;
+ justify-content: center;
+ animation: input-modal-mask-in 0.38s cubic-bezier(0.22, 1, 0.36, 1) both;
+}
+
+.weekly-page .input-modal {
+ width: 100%;
+ max-width: 750rpx;
+ background: var(--surface-container-lowest);
+ border-radius: 36rpx 36rpx 0 0;
+ padding: 16rpx 0 calc(20rpx + env(safe-area-inset-bottom));
+ box-shadow: 0 -12rpx 36rpx rgba(15, 23, 42, 0.12);
+ max-height: 88vh;
+ display: flex;
+ flex-direction: column;
+ animation: input-modal-rise 0.46s cubic-bezier(0.22, 1, 0.36, 1) both;
+}
+
+@keyframes input-modal-mask-in {
+ from { opacity: 0; }
+ to { opacity: 1; }
+}
+
+@keyframes input-modal-rise {
+ from { transform: translate3d(0, 100%, 0); opacity: 0.96; }
+ to { transform: translate3d(0, 0, 0); opacity: 1; }
+}
+
+@keyframes input-modal-content-in {
+ from { opacity: 0; transform: translate3d(0, 24rpx, 0); }
+ to { opacity: 1; transform: translate3d(0, 0, 0); }
+}
+
+.weekly-page .input-modal-grip {
+ width: 80rpx;
+ height: 6rpx;
+ border-radius: 999rpx;
+ background: var(--surface-container-highest);
+ margin: 0 auto 8rpx;
+}
+
+.weekly-page .input-modal-head {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 12rpx 32rpx 16rpx;
+ border-bottom: 1rpx solid var(--surface-container-low);
+}
+
+.weekly-page .input-modal-title {
+ font-size: 40rpx;
+ font-weight: 800;
+ color: var(--on-surface);
+}
+
+.weekly-page .input-modal-sub {
+ font-size: 26rpx;
+ color: var(--on-surface-variant);
+ margin-top: 4rpx;
+}
+
+.weekly-page .input-modal-close {
+ width: 80rpx;
+ height: 80rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 999rpx;
+ background: var(--surface-container-low);
+}
+
+.weekly-page .input-modal-close-icon {
+ font-size: 42rpx;
+ color: var(--outline);
+ line-height: 1;
+ font-weight: 700;
+}
+
+.weekly-page .phone-gate-body {
+ padding: 32rpx;
+}
+
+.weekly-page .phone-gate-error {
+ margin-bottom: 20rpx;
+ padding: 20rpx 22rpx;
+ border-radius: 16rpx;
+ background: #fef2f2;
+ border: 1rpx solid rgba(220, 38, 38, 0.2);
+ box-sizing: border-box;
+
+ text {
+ font-size: 26rpx;
+ font-weight: 600;
+ color: #991b1b;
+ line-height: 1.45;
+ }
+}
+
+.weekly-page .phone-gate-tip {
+ display: block;
+ font-size: 28rpx;
+ color: var(--on-surface-variant);
+ line-height: 1.6;
+ margin-bottom: 24rpx;
+}
+
+.weekly-page .phone-gate-gender-label {
+ display: block;
+ font-size: 28rpx;
+ font-weight: 700;
+ color: var(--primary);
+ margin-bottom: 16rpx;
+}
+
+.weekly-page .phone-gate-gender-row {
+ display: flex;
+ gap: 20rpx;
+ margin-bottom: 32rpx;
+}
+
+.weekly-page .phone-gate-gender-opt {
+ flex: 1;
+ min-height: 88rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: var(--st-radius-xl);
+ background: var(--surface-container-lowest);
+ border: 2rpx solid var(--outline-variant);
+ color: var(--on-surface-variant);
+ font-size: 32rpx;
+ font-weight: 600;
+}
+
+.weekly-page .phone-gate-gender-opt.active {
+ border-color: var(--primary);
+ color: var(--primary);
+}
+
+.weekly-page .phone-gate-btn {
+ width: 100%;
+ min-height: 96rpx;
+ line-height: 96rpx;
+ border-radius: var(--st-radius-xl);
+ background: var(--primary);
+ color: var(--on-primary);
+ font-size: 32rpx;
+ font-weight: 700;
+ border: none;
+}
+
+.weekly-page .phone-gate-btn::after {
+ border: none;
+}
+
+.weekly-page .input-modal-loading {
+ min-height: 520rpx;
+ padding: 120rpx 0;
+ text-align: center;
+ color: var(--outline);
+ font-size: 30rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.weekly-page .input-modal-body {
+ flex: 1;
+ min-height: 520rpx;
+ padding: 20rpx 32rpx 28rpx;
+ box-sizing: border-box;
+ width: 100%;
+}
+
+.weekly-page .input-modal-body-ready {
+ animation: input-modal-content-in 0.34s cubic-bezier(0.22, 1, 0.36, 1) both;
+}
+
+.weekly-page .input-modal-tip {
+ background: var(--surface-container-low);
+ border: 1rpx dashed var(--outline-variant);
+ border-radius: 14rpx;
+ padding: 18rpx 20rpx;
+ font-size: 26rpx;
+ color: var(--on-surface-variant);
+ line-height: 1.5;
+ margin-bottom: 22rpx;
+}
+
+.weekly-page .input-section-title {
+ font-size: 28rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+ margin: 18rpx 0 14rpx;
+}
+
+.weekly-page .input-field {
+ display: flex;
+ align-items: center;
+ gap: 18rpx;
+ padding: 14rpx 0;
+ border-bottom: 1rpx solid var(--surface-container-low);
+ min-height: 88rpx;
+}
+
+.weekly-page .input-field-label {
+ display: flex;
+ align-items: center;
+ gap: 10rpx;
+ width: 180rpx;
+ font-size: 30rpx;
+ color: var(--on-surface);
+ font-weight: 700;
+}
+
+.weekly-page .input-field-dot {
+ width: 14rpx;
+ height: 14rpx;
+ border-radius: 999rpx;
+}
+
+.weekly-page .input-field-dot-fasting {
+ background: var(--primary);
+}
+
+.weekly-page .input-field-dot-postprandial {
+ background: var(--tertiary-container);
+}
+
+.weekly-page .input-field-dot-other {
+ background: var(--outline);
+}
+
+.weekly-page .input-field-input {
+ flex: 1;
+ min-width: 0;
+ background: var(--surface);
+ border-radius: 16rpx;
+ padding: 18rpx 20rpx;
+ min-height: 76rpx;
+ border: 2rpx solid transparent;
+}
+
+.weekly-page .input-field-input input {
+ width: 100%;
+ font-size: 34rpx;
+ color: var(--on-surface);
+ text-align: right;
+ font-weight: 600;
+}
+
+.weekly-page .input-placeholder {
+ color: var(--outline);
+ font-size: 28rpx;
+}
+
+.weekly-page .input-field-textarea textarea {
+ width: 100%;
+ min-height: 140rpx;
+ background: var(--surface);
+ border-radius: 14rpx;
+ padding: 20rpx 22rpx;
+ font-size: 30rpx;
+ color: var(--on-surface);
+ border: 2rpx solid var(--outline-variant);
+}
+
+.weekly-page .input-modal-actions {
+ display: flex;
+ gap: 18rpx;
+ padding: 20rpx 32rpx 0;
+ border-top: 1rpx solid var(--surface-container-low);
+}
+
+.weekly-page .input-modal-btn {
+ flex: 1;
+ height: 100rpx;
+ border-radius: var(--st-radius-xl);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 32rpx;
+ font-weight: 700;
+}
+
+.weekly-page .input-modal-btn.primary {
+ background: var(--primary);
+ color: var(--on-primary);
+}
+
+.weekly-page .input-modal-btn.danger {
+ flex: 0 0 180rpx;
+ background: var(--error-container);
+ color: var(--error);
+}
+
+.weekly-page .input-modal-btn.disabled {
+ opacity: 0.5;
+ pointer-events: none;
+}
diff --git a/TongjiUniApp/tongji/styles/weekly-stitch.scss b/TongjiUniApp/tongji/styles/weekly-stitch.scss
new file mode 100644
index 000000000..ce1da2cb1
--- /dev/null
+++ b/TongjiUniApp/tongji/styles/weekly-stitch.scss
@@ -0,0 +1,981 @@
+/**
+ * weekly.vue — 与 code.html (Stitch Modern WeChat UI) 1:1
+ */
+
+.weekly-page {
+ --st-shadow-ambient: 0 24rpx 60rpx -20rpx rgba(0, 108, 73, 0.08), 0 8rpx 20rpx -8rpx rgba(0, 0, 0, 0.03);
+ --st-shadow-cta: 0 16rpx 32rpx rgba(0, 108, 73, 0.2);
+ --st-shadow-float: 0 16rpx 64rpx rgba(0, 108, 73, 0.15);
+ --tab-dock-full-offset: calc(220rpx + env(safe-area-inset-bottom));
+ padding-bottom: var(--tab-dock-full-offset);
+}
+
+/* ===== Header ===== */
+.weekly-page .st-header {
+ position: relative;
+ display: flex;
+ align-items: center;
+ padding-left: var(--st-container-margin);
+ padding-right: var(--st-container-margin);
+ padding-bottom: 32rpx;
+ /* padding-top / padding-right 由 initHeaderSafeArea 动态设置 */
+ background: var(--surface);
+}
+
+.weekly-page .st-header-text {
+ flex: 1;
+ min-width: 0;
+ overflow: hidden;
+}
+
+.weekly-page .st-header-left {
+ display: flex;
+ align-items: center;
+ gap: var(--st-inline-gap);
+ flex: 1;
+ min-width: 0;
+}
+
+.weekly-page .st-avatar {
+ width: 80rpx;
+ height: 80rpx;
+ border-radius: 50%;
+ background: var(--primary-container);
+ border: 4rpx solid var(--surface-container-lowest);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.weekly-page .st-greet {
+ display: block;
+ font-size: 40rpx;
+ font-weight: 700;
+ line-height: 1.27;
+ color: var(--on-surface);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.weekly-page .st-status {
+ display: block;
+ margin-top: 4rpx;
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+ opacity: 0.8;
+}
+
+.weekly-page .st-voice-round {
+ width: 80rpx;
+ height: 80rpx;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.weekly-page .st-voice-round.disabled {
+ opacity: 0.45;
+}
+
+.weekly-page .st-card-scroll {
+ margin: 0 var(--st-container-margin) 8rpx;
+ white-space: nowrap;
+}
+
+.weekly-page .st-card-row {
+ display: inline-flex;
+ gap: 16rpx;
+}
+
+.weekly-page .st-card-chip {
+ padding: 12rpx 28rpx;
+ border-radius: 999rpx;
+ font-size: 26rpx;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+ background: var(--surface-container-lowest);
+ border: 1rpx solid var(--outline-variant);
+}
+
+.weekly-page .st-card-chip.active {
+ background: var(--primary);
+ border-color: var(--primary);
+ color: var(--on-primary);
+}
+
+/* ===== 居家训练(DEV 内嵌) ===== */
+.weekly-page .st-training-section {
+ width: 100%;
+ box-sizing: border-box;
+}
+
+.weekly-page .st-training-section .dev-entry-inline--weekly {
+ overflow: hidden;
+}
+
+.weekly-page .st-training-section .inline-scroll {
+ margin-left: -4rpx;
+ margin-right: -4rpx;
+ width: calc(100% + 8rpx);
+}
+
+.weekly-page .st-training-section .inline-card:first-child {
+ border-color: rgba(0, 108, 73, 0.22);
+ background: linear-gradient(160deg, rgba(0, 108, 73, 0.08) 0%, #f4f7f5 55%);
+}
+
+/* ===== Main ===== */
+.weekly-page .st-main {
+ padding: 0 var(--st-container-margin) 32rpx;
+ display: flex;
+ flex-direction: column;
+ gap: 48rpx;
+ margin-top: 16rpx;
+}
+
+.weekly-page .st-daily-context-error {
+ padding: 24rpx 28rpx;
+ border-radius: 24rpx;
+ background: #fef2f2;
+ border: 1rpx solid rgba(220, 38, 38, 0.22);
+ box-sizing: border-box;
+}
+
+.weekly-page .st-daily-context-error-text {
+ font-size: 28rpx;
+ font-weight: 600;
+ color: #991b1b;
+ line-height: 1.5;
+}
+
+.weekly-page .st-main-spacer {
+ height: 32rpx;
+}
+
+/* CTA — rounded-2xl h-14 */
+.weekly-page .st-cta {
+ width: 100%;
+ height: 112rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 16rpx;
+ border-radius: var(--st-radius-2xl);
+ background: var(--primary);
+ color: var(--on-primary);
+ font-size: 32rpx;
+ font-weight: 700;
+ box-shadow: var(--st-shadow-cta);
+}
+
+.weekly-page .st-cta:active {
+ transform: scale(0.98);
+}
+
+/* 游戏入口 */
+.weekly-page .st-game-entry {
+
+ margin-top: 24rpx;
+ padding: 28rpx 32rpx;
+ display: flex;
+ align-items: center;
+ gap: 24rpx;
+ border-radius: var(--st-radius-2xl);
+ background: var(--surface-container-lowest);
+ border: 1rpx solid rgba(0, 108, 73, 0.14);
+ box-shadow: var(--st-shadow-ambient);
+ box-sizing: border-box;
+}
+
+.weekly-page .st-game-entry:active {
+ transform: scale(0.98);
+ opacity: 0.92;
+}
+
+.weekly-page .st-game-entry-icon {
+ width: 88rpx;
+ height: 88rpx;
+ border-radius: 24rpx;
+ background: rgba(0, 108, 73, 0.1);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.weekly-page .st-game-entry-body {
+ flex: 1;
+ min-width: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 6rpx;
+}
+
+.weekly-page .st-game-entry-title {
+ font-size: 32rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+ line-height: 1.25;
+}
+
+.weekly-page .st-game-entry-sub {
+ font-size: 24rpx;
+ font-weight: 500;
+ color: var(--on-surface-variant, #64748b);
+ line-height: 1.35;
+}
+
+/* ===== Chart card — rounded-3xl ===== */
+.weekly-page .st-chart-card {
+ padding: 40rpx 10rpx 40rpx 10rpx;
+ border-radius: 48rpx;
+ background: var(--surface-container-lowest);
+ border: 1rpx solid rgba(221, 228, 221, 0.3);
+ box-shadow: var(--st-shadow-ambient);
+ display: flex;
+ flex-direction: column;
+ gap: 0;
+ overflow: hidden;
+}
+
+.weekly-page .st-chart-head {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 12rpx;
+ gap: 16rpx;
+}
+
+.weekly-page .st-chart-title {
+ display: block;
+ font-size: 30rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+}
+
+.weekly-page .st-chart-sub {
+ display: block;
+ margin-top: 4rpx;
+ font-size: 22rpx;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .st-chart-more {
+ display: inline-flex;
+ align-items: center;
+ gap: 4rpx;
+ margin-top: 6rpx;
+}
+
+.weekly-page .st-chart-more-text {
+ font-size: 22rpx;
+ font-weight: 600;
+ color: var(--primary);
+}
+
+.weekly-page .st-chart-more:active {
+ opacity: 0.75;
+}
+
+.weekly-page .st-chart-legend {
+ display: flex;
+ gap: var(--st-inline-gap);
+}
+
+.weekly-page .st-legend-item {
+ display: flex;
+ align-items: center;
+ gap: 8rpx;
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .st-legend-item.inactive {
+ opacity: 0.4;
+}
+
+.weekly-page .st-dot {
+ width: 16rpx;
+ height: 16rpx;
+ border-radius: 50%;
+}
+
+.weekly-page .st-dot-fasting {
+ background: var(--primary);
+}
+
+.weekly-page .st-dot-post {
+ background: var(--tertiary);
+}
+
+.weekly-page .st-chart-summary {
+ display: flex;
+ padding: 32rpx;
+ margin-bottom: 48rpx;
+ border-radius: var(--st-radius-xl);
+ background: var(--surface-container-low);
+}
+
+.weekly-page .st-chart-summary-item {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ border-right: 1rpx solid var(--surface-container-highest);
+}
+
+.weekly-page .st-chart-summary-item:last-child {
+ border-right: none;
+}
+
+.weekly-page .st-chart-summary-num {
+ font-size: 40rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+}
+
+.weekly-page .st-chart-summary-num.is-high {
+ color: var(--tertiary);
+}
+
+.weekly-page .st-chart-summary-num.is-good {
+ color: var(--primary);
+}
+
+.weekly-page .st-chart-summary-label {
+ margin-top: 8rpx;
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .st-chart-foot {
+ padding: 20rpx 0 20rpx;
+}
+
+.weekly-page .st-chart-mock-hint {
+ display: block;
+ margin: 0;
+ font-size: 30rpx;
+ font-weight: 600;
+ color: var(--outline);
+ line-height: 1.35;
+ text-align: center;
+}
+
+.weekly-page .st-chart-area {
+ position: relative;
+ height: 360rpx;
+ overflow: hidden;
+ cursor: pointer;
+}
+
+.weekly-page .st-chart-area:active {
+ opacity: 0.92;
+}
+
+.weekly-page .st-chart-canvas {
+ width: 100%;
+ height: 360rpx;
+ display: block;
+}
+
+/* 识糖入口嵌在趋势卡内:轻量分隔,避免大块留白 */
+.weekly-page .st-chart-card .st-game-entry-list {
+ display: flex;
+ flex-direction: column;
+ gap: 12rpx;
+ margin: 12rpx 20rpx 0;
+}
+
+.weekly-page .st-chart-card .st-game-entry--in-card {
+ margin-top: 0;
+ padding: 16rpx 20rpx;
+ gap: 16rpx;
+ border-radius: 24rpx;
+ background: var(--surface-container-low);
+ border: 1rpx solid rgba(0, 108, 73, 0.08);
+ box-shadow: none;
+}
+
+.weekly-page .st-chart-card .st-game-entry--in-card .st-game-entry-icon {
+ width: 64rpx;
+ height: 64rpx;
+ border-radius: 16rpx;
+}
+
+.weekly-page .st-chart-card .st-game-entry--in-card .st-game-entry-title {
+ font-size: 28rpx;
+}
+
+.weekly-page .st-chart-card .st-game-entry--in-card .st-game-entry-sub {
+ font-size: 22rpx;
+}
+
+.weekly-page .st-chart-empty,
+.weekly-page .st-chart-placeholder {
+ position: absolute;
+ inset: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 26rpx;
+ color: var(--outline);
+}
+
+/* ===== 最新测量 ===== */
+.weekly-page .st-latest-section {
+ display: flex;
+ flex-direction: column;
+ gap: 32rpx;
+}
+
+.weekly-page .st-latest-hero {
+ position: relative;
+ overflow: hidden;
+ min-height: 320rpx;
+ padding: 48rpx 40rpx;
+ border-radius: 48rpx;
+ background: var(--surface-container-lowest);
+ box-shadow: var(--st-shadow-ambient);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+}
+
+.weekly-page .st-latest-hero.is-high {
+ background: var(--error-container);
+ color: var(--on-error-container);
+}
+
+.weekly-page .st-latest-hero-pattern {
+ position: absolute;
+ inset: 0;
+ opacity: 0.1;
+ background-image: radial-gradient(circle at 4rpx 4rpx, currentColor 2rpx, transparent 0);
+ background-size: 32rpx 32rpx;
+ pointer-events: none;
+}
+
+.weekly-page .st-latest-label {
+ position: relative;
+ z-index: 1;
+ font-size: 24rpx;
+ font-weight: 600;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ opacity: 0.9;
+ margin-bottom: 8rpx;
+}
+
+.weekly-page .st-latest-value-row {
+ position: relative;
+ z-index: 1;
+ display: flex;
+ align-items: baseline;
+ gap: 8rpx;
+}
+
+.weekly-page .st-latest-value {
+ font-size: 112rpx;
+ font-weight: 800;
+ line-height: 1;
+ letter-spacing: -0.02em;
+}
+
+.weekly-page .st-latest-hero.is-high .st-latest-value,
+.weekly-page .st-latest-hero.is-high .st-latest-unit {
+ color: var(--on-error-container);
+}
+
+.weekly-page .st-latest-unit {
+ font-size: 32rpx;
+ font-weight: 500;
+ opacity: 0.8;
+}
+
+.weekly-page .st-latest-flag {
+ position: relative;
+ z-index: 1;
+ margin-top: 24rpx;
+ display: inline-flex;
+ align-items: center;
+ gap: 12rpx;
+ padding: 8rpx 24rpx;
+ border-radius: 999rpx;
+ background: rgba(255, 255, 255, 0.3);
+ font-size: 24rpx;
+ font-weight: 700;
+}
+
+.weekly-page .st-summary-grid {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 24rpx;
+}
+
+.weekly-page .st-summary-card {
+ padding: 32rpx;
+ border-radius: var(--st-radius-2xl);
+ background: var(--surface-container-lowest);
+ border: 1rpx solid rgba(221, 228, 221, 0.5);
+ box-shadow: var(--st-shadow-ambient);
+ display: flex;
+ flex-direction: column;
+ gap: 8rpx;
+}
+
+.weekly-page .st-summary-label {
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .st-summary-value {
+ font-size: 48rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+}
+
+.weekly-page .st-summary-value.is-high {
+ color: var(--tertiary);
+}
+
+.weekly-page .st-summary-tag {
+ align-self: flex-start;
+ padding: 4rpx 16rpx;
+ border-radius: 8rpx;
+ font-size: 20rpx;
+ font-weight: 600;
+ color: var(--tertiary);
+ background: rgba(255, 218, 214, 0.5);
+}
+
+/* ===== AI 饮食 ===== */
+.weekly-page .st-ai-section {
+ position: relative;
+ overflow: hidden;
+ padding: 40rpx;
+ border-radius: 48rpx;
+ background: linear-gradient(135deg, rgba(0, 108, 73, 0.1) 0%, rgba(0, 108, 73, 0.05) 100%);
+ border: 1rpx solid rgba(0, 108, 73, 0.1);
+}
+
+.weekly-page .st-ai-deco {
+ position: absolute;
+ width: 256rpx;
+ height: 256rpx;
+ top: -64rpx;
+ right: -64rpx;
+ border-radius: 50%;
+ background: rgba(78, 222, 163, 0.2);
+ filter: blur(40rpx);
+ pointer-events: none;
+}
+
+.weekly-page .st-ai-head {
+ position: relative;
+ z-index: 1;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 16rpx;
+}
+
+.weekly-page .st-ai-head-left {
+ display: flex;
+ align-items: center;
+ gap: 16rpx;
+}
+
+.weekly-page .st-ai-icon {
+ width: 64rpx;
+ height: 64rpx;
+ border-radius: 50%;
+ background: var(--primary);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.weekly-page .st-ai-icon.thinking {
+ animation: st-pulse 1.2s ease-in-out infinite;
+}
+
+@keyframes st-pulse {
+ 50% { opacity: 0.65; }
+}
+
+.weekly-page .st-ai-title {
+ font-size: 40rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+}
+
+.weekly-page .st-ai-refresh {
+ display: flex;
+ align-items: center;
+ gap: 8rpx;
+ padding: 12rpx 24rpx;
+ border-radius: 999rpx;
+ background: rgba(255, 255, 255, 0.5);
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--primary);
+}
+
+.weekly-page .st-ai-refresh.disabled {
+ opacity: 0.5;
+}
+
+.weekly-page .st-ai-sub {
+ position: relative;
+ z-index: 1;
+ display: block;
+ margin-bottom: 32rpx;
+ font-size: 28rpx;
+ line-height: 1.43;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .st-meal-list {
+ position: relative;
+ z-index: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 24rpx;
+}
+
+.weekly-page .st-meal-glass {
+ padding: 32rpx;
+ border-radius: var(--st-radius-2xl);
+ background: rgba(255, 255, 255, 0.8);
+ border: 1rpx solid #ffffff;
+ box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.04);
+}
+
+.weekly-page .st-meal-glass--drinks {
+ background: rgba(224, 242, 254, 0.65);
+ border-color: rgba(14, 165, 233, 0.15);
+}
+
+.weekly-page .st-meal-head {
+ display: flex;
+ align-items: center;
+ gap: 16rpx;
+ margin-bottom: 16rpx;
+}
+
+.weekly-page .st-meal-label {
+ font-size: 28rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+}
+
+.weekly-page .st-meal-text {
+ font-size: 28rpx;
+ line-height: 1.43;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .st-skeleton-line {
+ height: 28rpx;
+ margin-bottom: 16rpx;
+ border-radius: 8rpx;
+ background: rgba(255, 255, 255, 0.5);
+}
+
+.weekly-page .st-skeleton-hint {
+ font-size: 26rpx;
+ color: var(--outline);
+ text-align: center;
+}
+
+/* ===== 底部浮动输入 ===== */
+.weekly-page .st-float-ask {
+ position: fixed;
+ left: var(--st-container-margin);
+ right: var(--st-container-margin);
+ bottom: var(--tab-dock-full-offset);
+ z-index: 210;
+}
+
+.weekly-page .st-float-close {
+ position: absolute;
+ top: -18rpx;
+ right: -6rpx;
+ width: 44rpx;
+ height: 44rpx;
+ border-radius: 50%;
+ background: rgba(0, 0, 0, 0.45);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 2;
+}
+
+.weekly-page .st-float-close-icon {
+ color: #ffffff;
+ font-size: 30rpx;
+ line-height: 1;
+}
+
+.weekly-page .st-float-reopen {
+ position: fixed;
+ right: var(--st-container-margin);
+ bottom: var(--tab-dock-full-offset);
+ width: 88rpx;
+ height: 88rpx;
+ border-radius: 50%;
+ background: linear-gradient(180deg, #2d7340 0%, #006c49 100%);
+ box-shadow: var(--st-shadow-float);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 210;
+}
+
+.weekly-page .st-float-inner {
+ display: flex;
+ align-items: center;
+ gap: 16rpx;
+ padding: 16rpx 16rpx 16rpx 28rpx;
+ border-radius: 999rpx;
+ background: rgba(255, 255, 255, 0.9);
+ backdrop-filter: blur(20rpx);
+ border: 1rpx solid rgba(0, 108, 73, 0.1);
+ box-shadow: var(--st-shadow-float);
+ transition: border-radius 0.22s ease, padding 0.22s ease, border-color 0.22s ease;
+}
+
+/* 聚焦/有内容时展开:底部对齐让输入框向上增高,圆角收敛为圆角矩形 */
+.weekly-page .st-float-inner.is-expanded {
+ align-items: flex-end;
+ border-radius: 32rpx;
+ padding: 18rpx 16rpx 18rpx 32rpx;
+ border-color: rgba(0, 108, 73, 0.28);
+}
+
+.weekly-page .st-float-icon {
+ width: 64rpx;
+ height: 64rpx;
+ border-radius: 50%;
+ background: rgba(0, 108, 73, 0.1);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.weekly-page .st-float-input {
+ flex: 1;
+ min-width: 0;
+ width: 100%;
+ min-height: 64rpx;
+ max-height: 240rpx;
+ font-size: 28rpx;
+ line-height: 40rpx;
+ color: var(--on-surface);
+ background: transparent;
+ padding: 12rpx 0;
+ box-sizing: border-box;
+ transition: min-height 0.2s ease;
+}
+
+/* 聚焦时输入框变大;内容超长时由 auto-height 继续向上增高,超过上限可滚动 */
+.weekly-page .st-float-inner.is-expanded .st-float-input {
+ min-height: 104rpx;
+}
+
+.weekly-page .st-float-placeholder {
+ color: rgba(60, 74, 66, 0.6);
+ font-size: 26rpx;
+ line-height: 40rpx;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.weekly-page .st-float-mic {
+ width: 72rpx;
+ height: 72rpx;
+ border-radius: 50%;
+ background: rgba(0, 108, 73, 0.1);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+ transition: background 0.2s ease, transform 0.15s ease;
+}
+
+.weekly-page .st-float-mic.listening {
+ background: var(--primary);
+ animation: st-float-mic-pulse 1.2s ease-in-out infinite;
+}
+
+.weekly-page .st-float-mic.disabled {
+ opacity: 0.45;
+ pointer-events: none;
+}
+
+.weekly-page .st-float-mic:active {
+ transform: scale(0.94);
+}
+
+.weekly-page .st-float-hold-hint {
+ margin-top: 12rpx;
+ text-align: center;
+ font-size: 24rpx;
+ color: var(--primary);
+ line-height: 1.4;
+}
+
+.weekly-page .st-voice-overlay {
+ position: fixed;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ z-index: 3000;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: rgba(0, 0, 0, 0.32);
+ pointer-events: none;
+}
+
+.weekly-page .st-voice-card {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 20rpx;
+ padding: 56rpx 64rpx;
+ border-radius: 32rpx;
+ background: rgba(20, 24, 22, 0.86);
+ box-shadow: 0 16rpx 48rpx rgba(0, 0, 0, 0.35);
+}
+
+.weekly-page .st-voice-icon {
+ width: 120rpx;
+ height: 120rpx;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: linear-gradient(180deg, #2d7340 0%, #006c49 100%);
+}
+
+.weekly-page .st-voice-icon.active {
+ animation: st-voice-pulse 1.1s ease-in-out infinite;
+}
+
+@keyframes st-voice-pulse {
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(0, 108, 73, 0.45); }
+ 50% { box-shadow: 0 0 0 20rpx rgba(0, 108, 73, 0); }
+}
+
+.weekly-page .st-voice-title {
+ font-size: 32rpx;
+ font-weight: 700;
+ color: #ffffff;
+ line-height: 1.3;
+}
+
+.weekly-page .st-voice-sub {
+ font-size: 24rpx;
+ color: rgba(255, 255, 255, 0.7);
+ line-height: 1.3;
+}
+
+@keyframes st-float-mic-pulse {
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(0, 108, 73, 0.35); }
+ 50% { box-shadow: 0 0 0 12rpx rgba(0, 108, 73, 0); }
+}
+
+.weekly-page .st-float-send {
+ width: 80rpx;
+ height: 80rpx;
+ border-radius: 50%;
+ background: var(--primary);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+ box-shadow: 0 4rpx 12rpx rgba(0, 108, 73, 0.2);
+ line-height: 0;
+ overflow: hidden;
+}
+
+.weekly-page .st-float-send.disabled {
+ opacity: 0.55;
+}
+
+.weekly-page .st-float-send:active {
+ transform: scale(0.95);
+}
+
+.weekly-page .st-float-result {
+ margin-top: 16rpx;
+ padding: 24rpx 32rpx;
+ border-radius: var(--st-radius-xl);
+ background: rgba(255, 255, 255, 0.95);
+ border: 1rpx solid var(--outline-variant);
+ box-shadow: var(--st-shadow-ambient);
+}
+
+.weekly-page .st-float-badge {
+ display: inline-block;
+ margin-bottom: 8rpx;
+ padding: 4rpx 12rpx;
+ border-radius: 8rpx;
+ font-size: 22rpx;
+ font-weight: 700;
+ color: var(--primary);
+ background: rgba(0, 108, 73, 0.1);
+}
+
+.weekly-page .st-float-advice {
+ font-size: 28rpx;
+ line-height: 1.5;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .ai-stream-cursor {
+ animation: st-blink 0.8s step-end infinite;
+}
+
+@keyframes st-blink {
+ 50% { opacity: 0; }
+}
+
+.weekly-page .chart-tip {
+ position: absolute;
+ z-index: 10;
+ padding: 12rpx 16rpx;
+ border-radius: 12rpx;
+ background: rgba(22, 29, 25, 0.88);
+ color: #fff;
+ font-size: 22rpx;
+ pointer-events: none;
+}
+
+.weekly-page .chart-tip-date {
+ font-weight: 700;
+ margin-bottom: 8rpx;
+}
+
+.weekly-page .chart-tip-row {
+ display: flex;
+ align-items: center;
+ gap: 8rpx;
+ margin-top: 4rpx;
+}
diff --git a/TongjiUniApp/tongji/utils/aiStreamRequest.js b/TongjiUniApp/tongji/utils/aiStreamRequest.js
new file mode 100644
index 000000000..08dc26125
--- /dev/null
+++ b/TongjiUniApp/tongji/utils/aiStreamRequest.js
@@ -0,0 +1,168 @@
+/** 拼接 API 根路径与相对路径,避免双斜杠 */
+export function joinApiUrl(base, path) {
+ const b = String(base || '').replace(/\/+$/, '')
+ const p = String(path || '').replace(/^\/+/, '')
+ return p ? `${b}/${p}` : b
+}
+
+function appendQuery(url, data) {
+ if (!data || typeof data !== 'object') return url
+ const keys = Object.keys(data)
+ if (!keys.length) return url
+ const qs = keys
+ .map((k) => `${encodeURIComponent(k)}=${encodeURIComponent(data[k] ?? '')}`)
+ .join('&')
+ return url + (url.includes('?') ? '&' : '?') + qs
+}
+
+function decodeChunkData(data) {
+ if (typeof data === 'string') return data
+ if (!data) return ''
+ if (typeof TextDecoder !== 'undefined' && data instanceof ArrayBuffer) {
+ return new TextDecoder('utf-8').decode(new Uint8Array(data))
+ }
+ if (data instanceof ArrayBuffer) {
+ const bytes = new Uint8Array(data)
+ let str = ''
+ for (let i = 0; i < bytes.length; i++) str += String.fromCharCode(bytes[i])
+ try {
+ return decodeURIComponent(escape(str))
+ } catch (e) {
+ return str
+ }
+ }
+ return ''
+}
+
+/** 从 SSE 文本缓冲中解析并消费完整事件 */
+export function consumeSseBuffer(buffer, onEvent) {
+ let rest = buffer
+ let idx = rest.indexOf('\n\n')
+ while (idx !== -1) {
+ const block = rest.slice(0, idx)
+ rest = rest.slice(idx + 2)
+ let event = 'message'
+ let dataLine = ''
+ block.split('\n').forEach((line) => {
+ if (line.startsWith('event:')) event = line.slice(6).trim()
+ else if (line.startsWith('data:')) dataLine += line.slice(5).trim()
+ })
+ if (dataLine) {
+ try {
+ onEvent(event, JSON.parse(dataLine))
+ } catch (e) {
+ onEvent(event, dataLine)
+ }
+ }
+ idx = rest.indexOf('\n\n')
+ }
+ return rest
+}
+
+/** 从流式纯文本中提取三餐(支持未写完的最后一行) */
+export function parsePartialDietPlainText(text) {
+ const out = {}
+ if (!text) return out
+
+ const lineRe = /^(早餐|喝的|午餐|晚餐|提示|少碰)[::]\s*(.*)$/gm
+ let match
+ while ((match = lineRe.exec(text)) !== null) {
+ const key = { '早餐': 'breakfast', '喝的': 'drinks', '午餐': 'lunch', '晚餐': 'dinner', '提示': 'tips', '少碰': 'avoid' }[match[1]]
+ const val = (match[2] || '').trim()
+ if (key === 'avoid') {
+ out.avoid = val.split(/[、,,;;\s]+/).map((s) => s.trim()).filter(Boolean)
+ } else {
+ out[key] = val
+ }
+ }
+
+ const tail = text.match(/(?:^|\n)(早餐|喝的|午餐|晚餐|提示|少碰)[::]\s*([^\n]*)$/)
+ if (tail) {
+ const key = { '早餐': 'breakfast', '喝的': 'drinks', '午餐': 'lunch', '晚餐': 'dinner', '提示': 'tips', '少碰': 'avoid' }[tail[1]]
+ const val = (tail[2] || '').trim()
+ if (key === 'avoid') {
+ if (val) out.avoid = val.split(/[、,,;;\s]+/).map((s) => s.trim()).filter(Boolean)
+ } else {
+ out[key] = val
+ }
+ }
+
+ return out
+}
+
+/** @deprecated 使用 parsePartialDietPlainText */
+export function parsePartialDietJson(text) {
+ return parsePartialDietPlainText(text)
+}
+
+/**
+ * SSE 流式请求(微信小程序 enableChunked;其它端走 fallback)
+ *
+ * @param {object} opts
+ * @param {string} opts.baseUrl
+ * @param {string} opts.url
+ * @param {string} [opts.method]
+ * @param {object} [opts.data]
+ * @param {function(string, object):void} opts.onEvent
+ * @param {function():Promise