@mybricks/to-code-taro 1.1.0 → 1.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/core/comlib/{index.js → Index.js} +6 -6
- package/dist/cjs/core/utils/PopupRenderer.js +1 -1
- package/dist/cjs/core/utils/hooks.js +102 -38
- package/dist/cjs/core/utils/slots.js +11 -4
- package/dist/cjs/core/utils/useContext.js +6 -4
- package/dist/cjs/core/utils/with.js +3 -3
- package/dist/cjs/generate/generateTaroProjectJson.js +36 -11
- package/dist/cjs/generate/utils/commonDir.js +14 -10
- package/dist/cjs/generate/utils/pageImages.d.ts +14 -0
- package/dist/cjs/generate/utils/pageImages.js +36 -0
- package/dist/cjs/handleCom.js +37 -14
- package/dist/cjs/handleDom.d.ts +2 -0
- package/dist/cjs/handleDom.js +5 -2
- package/dist/cjs/handleGlobal.js +4 -2
- package/dist/cjs/handleSlot.d.ts +3 -0
- package/dist/cjs/handleSlot.js +38 -10
- package/dist/cjs/processors/processScene.js +3 -1
- package/dist/cjs/taro-template.json +313 -13
- package/dist/cjs/toCodeTaro.d.ts +4 -1
- package/dist/cjs/toCodeTaro.js +80 -1
- package/dist/cjs/utils/builder/buildResult.js +3 -16
- package/dist/cjs/utils/config/content/converter.js +2 -2
- package/dist/cjs/utils/config/content/pageConfig.js +4 -1
- package/dist/cjs/utils/config/content/saveBase64Image.d.ts +10 -0
- package/dist/cjs/utils/config/content/saveBase64Image.js +44 -3
- package/dist/cjs/utils/config/content/tabBarConfig.js +8 -2
- package/dist/cjs/utils/config/handlePageConfig.js +5 -3
- package/dist/cjs/utils/context/collectJSModules.d.ts +4 -0
- package/dist/cjs/utils/context/collectJSModules.js +4 -2
- package/dist/cjs/utils/logic/genJSModules.d.ts +8 -4
- package/dist/cjs/utils/logic/genJSModules.js +31 -33
- package/dist/cjs/utils/logic/handleProcess.js +4 -4
- package/dist/cjs/utils/logic/processChildren.d.ts +14 -1
- package/dist/cjs/utils/logic/processChildren.js +30 -6
- package/dist/cjs/utils/style/converter.js +34 -72
- package/dist/cjs/utils/templates/index.d.ts +1 -0
- package/dist/cjs/utils/templates/index.js +11 -2
- package/dist/cjs/utils/templates/renderManager.d.ts +4 -0
- package/dist/cjs/utils/templates/renderManager.js +10 -3
- package/dist/cjs/utils/templates/scene.js +13 -1
- package/dist/esm/core/comlib/{index.js → Index.js} +1 -1
- package/dist/esm/core/utils/PopupRenderer.js +1 -1
- package/dist/esm/core/utils/hooks.js +137 -53
- package/dist/esm/core/utils/popupRouter.js +2 -1
- package/dist/esm/core/utils/slots.js +24 -22
- package/dist/esm/core/utils/useContext.js +8 -10
- package/dist/esm/core/utils/with.js +3 -3
- package/dist/esm/generate/generateTaroProjectJson.js +28 -8
- package/dist/esm/generate/utils/commonDir.js +18 -14
- package/dist/esm/generate/utils/pageImages.d.ts +14 -0
- package/dist/esm/generate/utils/pageImages.d.ts.map +1 -0
- package/dist/esm/generate/utils/pageImages.js +15 -0
- package/dist/esm/handleCom.js +44 -17
- package/dist/esm/handleDom.d.ts +2 -0
- package/dist/esm/handleDom.js +6 -4
- package/dist/esm/handleGlobal.js +4 -2
- package/dist/esm/handleSlot.d.ts +3 -0
- package/dist/esm/handleSlot.js +57 -12
- package/dist/esm/processors/processComEvents.d.ts.map +1 -0
- package/dist/esm/processors/processScene.d.ts.map +1 -1
- package/dist/esm/processors/processScene.js +13 -3
- package/dist/esm/processors/processSceneLogic.d.ts.map +1 -0
- package/dist/esm/taro-template.json +313 -13
- package/dist/esm/toCodeTaro.d.ts +4 -1
- package/dist/esm/toCodeTaro.d.ts.map +1 -1
- package/dist/esm/toCodeTaro.js +89 -4
- package/dist/esm/utils/builder/buildResult.d.ts.map +1 -1
- package/dist/esm/utils/builder/buildResult.js +5 -14
- package/dist/esm/utils/common/helper.d.ts.map +1 -0
- package/dist/esm/utils/config/content/converter.js +2 -2
- package/dist/esm/utils/config/content/pageConfig.js +4 -1
- package/dist/esm/utils/config/content/saveBase64Image.d.ts +10 -0
- package/dist/esm/utils/config/content/saveBase64Image.js +42 -1
- package/dist/esm/utils/config/content/tabBarConfig.js +7 -2
- package/dist/esm/utils/config/handlePageConfig.d.ts.map +1 -1
- package/dist/esm/utils/config/handlePageConfig.js +5 -3
- package/dist/esm/utils/context/collectJSModules.d.ts +4 -0
- package/dist/esm/utils/context/collectJSModules.d.ts.map +1 -1
- package/dist/esm/utils/context/collectJSModules.js +1 -1
- package/dist/esm/utils/logic/genJSModules.d.ts +8 -4
- package/dist/esm/utils/logic/genJSModules.d.ts.map +1 -1
- package/dist/esm/utils/logic/genJSModules.js +16 -27
- package/dist/esm/utils/logic/handleProcess.js +4 -4
- package/dist/esm/utils/logic/processChildren.d.ts +14 -1
- package/dist/esm/utils/logic/processChildren.js +45 -8
- package/dist/esm/utils/style/converter.js +57 -106
- package/dist/esm/utils/templates/index.d.ts +1 -0
- package/dist/esm/utils/templates/index.js +9 -2
- package/dist/esm/utils/templates/renderManager.d.ts +4 -0
- package/dist/esm/utils/templates/renderManager.js +17 -4
- package/dist/esm/utils/templates/scene.js +8 -2
- package/package.json +1 -1
- package/dist/esm/generate/generateTaroProjectJson.d.ts.map +0 -1
- package/dist/esm/generate/utils/commonDir.d.ts.map +0 -1
- package/dist/esm/handleDom.d.ts.map +0 -1
- package/dist/esm/handleGlobal.d.ts.map +0 -1
- package/dist/esm/utils/config/content/converter.d.ts.map +0 -1
- package/dist/esm/utils/config/content/pageConfig.d.ts.map +0 -1
- package/dist/esm/utils/config/content/saveBase64Image.d.ts.map +0 -1
- package/dist/esm/utils/config/content/tabBarConfig.d.ts.map +0 -1
- package/dist/esm/utils/logic/processChildren.d.ts.map +0 -1
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
},
|
|
10
10
|
{
|
|
11
11
|
"path": "config/index.ts",
|
|
12
|
-
"content": "import { defineConfig, type UserConfigExport } from '@tarojs/cli'\nimport
|
|
12
|
+
"content": "import { defineConfig, type UserConfigExport } from '@tarojs/cli'\nimport path from 'path'\nimport devConfig from './dev'\nimport prodConfig from './prod'\n\n// https://taro-docs.jd.com/docs/next/config#defineconfig-辅助函数\nexport default defineConfig<'webpack5'>(async (merge, { command, mode }) => {\n const baseConfig: UserConfigExport<'webpack5'> = {\n projectName: 'checkCom',\n date: '2025-12-24',\n designWidth: 375,\n deviceRatio: {\n 640: 2.34 / 2,\n 750: 1,\n 375: 2,\n 828: 1.81 / 2\n },\n sourceRoot: 'src',\n outputRoot: 'dist',\n plugins: [\n \"@tarojs/plugin-generator\"\n ],\n defineConstants: {\n },\n copy: {\n patterns: [\n ],\n options: {\n }\n },\n framework: 'react',\n compiler: {\n type: 'webpack5',\n prebundle: {\n exclude: ['brickd-mobile', '@taroify/icons']\n }\n },\n cache: {\n enable: false // Webpack 持久化缓存配置,建议开启。默认配置请参考:https://docs.taro.zone/docs/config-detail#cache\n },\n mini: {\n postcss: {\n pxtransform: {\n enable: true,\n config: {\n\n }\n },\n cssModules: {\n enable: true, // 默认为 false,如需使用 css modules 功能,则设为 true\n config: {\n namingPattern: 'global', // 转换模式,取值为 global/module\n generateScopedName: '[name]__[local]___[hash:base64:5]'\n }\n }\n },\n webpackChain(chain) {\n chain.resolve.alias\n .set('@', path.resolve(__dirname, '../src'))\n }\n },\n h5: {\n publicPath: '/',\n staticDirectory: 'static',\n output: {\n filename: 'js/[name].[hash:8].js',\n chunkFilename: 'js/[name].[chunkhash:8].js'\n },\n miniCssExtractPluginOption: {\n ignoreOrder: true,\n filename: 'css/[name].[hash].css',\n chunkFilename: 'css/[name].[chunkhash].css'\n },\n postcss: {\n autoprefixer: {\n enable: true,\n config: {}\n },\n cssModules: {\n enable: true, // 默认为 false,如需使用 css modules 功能,则设为 true\n config: {\n namingPattern: 'module', // 转换模式,取值为 global/module\n generateScopedName: '[name]__[local]___[hash:base64:5]'\n }\n }\n },\n webpackChain(chain) {\n chain.resolve.alias\n .set('@', path.resolve(__dirname, '../src'))\n }\n },\n rn: {\n appName: 'taroDemo',\n postcss: {\n cssModules: {\n enable: false, // 默认为 false,如需使用 css modules 功能,则设为 true\n }\n }\n }\n }\n\n process.env.BROWSERSLIST_ENV = process.env.NODE_ENV\n\n if (process.env.NODE_ENV === 'development') {\n // 本地开发构建配置(不混淆压缩)\n return merge({}, baseConfig, devConfig)\n }\n // 生产构建配置(默认开启压缩混淆等)\n return merge({}, baseConfig, prodConfig)\n})\n"
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
"path": "config/prod.ts",
|
|
@@ -21,6 +21,16 @@
|
|
|
21
21
|
"path": "src",
|
|
22
22
|
"content": null,
|
|
23
23
|
"children": [
|
|
24
|
+
{
|
|
25
|
+
"path": "src/common",
|
|
26
|
+
"content": null,
|
|
27
|
+
"children": [
|
|
28
|
+
{
|
|
29
|
+
"path": "src/common/pageLife.ts",
|
|
30
|
+
"content": "import Taro, { useDidShow, useDidHide, useRouter } from '@tarojs/taro';\n\n/**\n * 页面生命周期 Hook\n * 用于监听页面的 DidShow 和 DidHide 事件,并通过 Taro.eventCenter 触发全局事件\n */\nexport const usePageLife = () => {\n const router = useRouter();\n\n useDidShow(() => {\n Taro.eventCenter.trigger('pageDidShow', {\n path: router.path,\n query: router.params\n });\n });\n\n useDidHide(() => {\n Taro.eventCenter.trigger('pageDidHide', {\n path: router.path,\n query: router.params\n });\n });\n};\n\n"
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
},
|
|
24
34
|
{
|
|
25
35
|
"path": "src/components",
|
|
26
36
|
"content": null,
|
|
@@ -367,6 +377,296 @@
|
|
|
367
377
|
}
|
|
368
378
|
]
|
|
369
379
|
},
|
|
380
|
+
{
|
|
381
|
+
"path": "src/components/chart",
|
|
382
|
+
"content": null,
|
|
383
|
+
"children": [
|
|
384
|
+
{
|
|
385
|
+
"path": "src/components/chart/chart-column",
|
|
386
|
+
"content": null,
|
|
387
|
+
"children": [
|
|
388
|
+
{
|
|
389
|
+
"path": "src/components/chart/chart-column/com.json",
|
|
390
|
+
"content": "{\n \"title\": \"柱状图\",\n \"namespace\": \"mybricks.taro.chart.column\",\n \"author\": \"mybricks-team\",\n \"author_name\": \"板砖团队\",\n \"icon\": \"./icon.svg\",\n \"version\": \"1.0.0\",\n \"description\": \"柱状图\",\n \"runtime\": \"./runtime.tsx\",\n \"runtime.edit\": \"./runtime.edit.tsx\",\n \"data\": \"./data.json\",\n \"editors\": \"./editors.tsx\",\n \"inputs\": [\n {\n \"id\": \"data\",\n \"title\": \"输入数据\",\n \"schema\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"xField\": {\n \"title\": \"x轴字段名\",\n \"type\": \"string\"\n },\n \"yField\": {\n \"title\": \"y轴字段名\",\n \"type\": \"string\"\n }\n }\n }\n },\n \"rels\": [\"afterrender\"]\n },\n {\n \"id\": \"loading\",\n \"title\": \"切换到加载中\",\n \"desc\": \"提示用户正在加载中\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"id\": \"noMore\",\n \"title\": \"切换到没有数据\",\n \"desc\": \"提示用户当前没有数据\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"id\": \"error\",\n \"title\": \"切换到加载报错\",\n \"desc\": \"提示用户报错信息\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n }\n ],\n \"outputs\": [\n {\n \"id\": \"afterrender\",\n \"title\": \"渲染完成\"\n }\n ]\n}\n"
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
"path": "src/components/chart/chart-column/data.json",
|
|
394
|
+
"content": "{\n \"type\": \"column\",\n \"config\": {\n \"xField\": \"label\",\n \"yField\": \"value\",\n \"xAxis\": {},\n \"yAxis\": {},\n \"legend\": {\n \"position\": \"right\"\n },\n \"seriesField\": \"\",\n \"padding\": \"auto\",\n \"label\": false,\n \"xFieldScrollable\": false,\n \"smooth\": false,\n \"xFieldTickCount\": 0\n },\n \"useCustomTooltip\": false,\n \"showTooltipTitle\": false\n}\n"
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
"path": "src/components/chart/chart-column/editors.tsx",
|
|
398
|
+
"content": "import {\n getNormalDataEditors,\n getLegendEditors,\n getChartTypeEditors,\n} from \"./../utils/editor\";\nimport { ChartType } from \"./../types\";\n\nexport default {\n \"@init\"({ style }) {\n style.height = 400;\n style.width = \"100%\";\n },\n \"@resize\": {\n options: [\"width\", \"height\"],\n },\n \":root\"({ data, output, style }, cate0, cate1, cate2) {\n cate0.title = \"常规\";\n cate0.items = [\n getChartTypeEditors({\n options: [\n {\n label: \"柱状图\",\n value: ChartType.Column,\n },\n {\n label: \"堆叠柱状图\",\n value: ChartType.ColumnStack,\n },\n {\n label: \"分组柱状图\",\n value: ChartType.ColumnGroup,\n },\n ],\n }),\n getNormalDataEditors({\n xFieldRotate: true,\n xFieldScrollable: true,\n yFieldDisplay: true,\n }),\n getLegendEditors({}),\n {\n title: \"Tooltip显示标题\",\n type: \"switch\",\n value: {\n get({ data }) {\n return data.showTooltipTitle;\n },\n set({ data, outputs }, value) {\n data.showTooltipTitle = value;\n },\n },\n },\n {\n title: \"自定义 Tooltip\",\n type: \"switch\",\n value: {\n get({ data }) {\n return data.useCustomTooltip;\n },\n set({ data, outputs }, value) {\n data.useCustomTooltip = value;\n\n if (value) {\n output.add(\"onTooltipShow\", \"Tooltip 显示\", { type: \"any\" });\n output.add(\"onTooltipHide\", \"Tooltip 隐藏\", { type: \"any\" });\n } else {\n output.remove(\"onTooltipShow\");\n output.remove(\"onTooltipHide\");\n }\n },\n },\n },\n {\n ifVisible({ data }) {\n return data.useCustomTooltip;\n },\n title: \"Tooltip 显示\",\n type: \"_event\",\n options: {\n outputId: \"onTooltipShow\",\n },\n },\n {\n ifVisible({ data }) {\n return data.useCustomTooltip;\n },\n title: \"Tooltip 隐藏\",\n type: \"_event\",\n options: {\n outputId: \"onTooltipHide\",\n },\n },\n ];\n\n cate1.title = \"高级\";\n cate1.items = [\n {\n title: \"升级\",\n type: \"button\",\n value: {\n set({ data, inputs, outputs }) {\n if (output.get(\"afterrender\")) {\n return;\n }\n\n outputs.add(\"afterrender\", \"渲染完成\", { type: \"any\" });\n inputs.get(\"data\").setRels([\"afterrender\"]);\n },\n },\n },\n ];\n },\n};\n"
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
"path": "src/components/chart/chart-column/icon.svg",
|
|
402
|
+
"content": "<?xml version=\"1.0\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg t=\"1637217879270\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"3860\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"200\" height=\"200\"><defs><style type=\"text/css\"></style></defs><path d=\"M85.312 938.688H1024V1024H0V0h85.312v938.688zM256 341.312h85.312V768H256V341.312zM512 128h85.312v640H512V128z m256 213.312h85.312V768H768V341.312z\" fill=\"#555555\" p-id=\"3861\"></path></svg>"
|
|
403
|
+
},
|
|
404
|
+
{
|
|
405
|
+
"path": "src/components/chart/chart-column/runtime.edit.tsx",
|
|
406
|
+
"content": "import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { mockChart } from './../utils/mock'\nimport Runtime from './runtime'\n\nexport default function ({ data, ...others }) {\n return <Runtime data={data} {...others} mockData={mockChart(data.type, data)} />;\n}\n\n"
|
|
407
|
+
},
|
|
408
|
+
{
|
|
409
|
+
"path": "src/components/chart/chart-column/runtime.tsx",
|
|
410
|
+
"content": "import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { ChartStatus, LoadStatus } from \"./../components/chart-status\";\nimport { useChart, getChartConfigFromData } from \"./../utils/chartLine\";\nimport { ChartType, isGroupChart } from \"./../types\";\nimport css from \"./style.less\";\n\nexport default function ({\n env,\n data,\n inputs,\n outputs,\n title,\n style,\n mockData = [],\n}) {\n const { chart, Canvas, events, ...props } = useChart(env);\n\n const [dataSource, setDataSource] = useState(env.edit ? mockData : []);\n const [status, setStatus] = useState(LoadStatus.IDLE);\n\n const tickit = useRef(null);\n\n const changeSize = useCallback(\n (width, height) => {\n if (!chart) {\n return;\n }\n chart.changeSize(width, height);\n },\n [chart]\n );\n\n useMemo(() => {\n inputs[\"loading\"]?.((bool) => {\n setStatus(LoadStatus.LOADING);\n });\n\n inputs[\"noMore\"]?.((bool) => {\n setStatus(LoadStatus.NOMORE);\n });\n\n inputs[\"error\"]?.((bool) => {\n setStatus(LoadStatus.ERROR);\n });\n\n inputs[\"data\"]((val, outputRels) => {\n if (Array.isArray(val)) {\n tickit.current = outputRels[\"afterrender\"];\n\n setDataSource(val);\n setStatus(LoadStatus.IDLE);\n }\n });\n }, []);\n\n useEffect(() => {\n if (!chart) {\n return;\n }\n\n chart.clear();\n\n let sourceParams = {\n [data.config.xField]: {\n tickCount: data.config.xFieldTickCount || 0,\n },\n } as any;\n\n if (data.config.xFieldScrollable) {\n sourceParams[data.config.xField].values = (\n env.edit ? mockData : dataSource\n )\n .slice(0, data.config.xFieldCount || 10)\n .map((d) => d[data.config.xField]);\n }\n\n chart.source(env.edit ? mockData : dataSource, {\n ...sourceParams,\n });\n\n // 配置 X 轴标签的旋转角度\n if (data.config.xFieldRotate) {\n chart.axis(data.config.xField, {\n label: function (text, index, total) {\n const cfg = {\n rotate: Math.PI / data.config.xFieldRotate, // 45度\n textAlign: \"start\",\n };\n return cfg;\n },\n });\n }\n\n const { legend } = getChartConfigFromData(data);\n\n const color = isGroupChart(data.type) ? data.config.seriesField : false;\n\n let adjust: any = null;\n switch (data.type) {\n case ChartType.ColumnStack:\n adjust = \"stack\";\n break;\n case ChartType.ColumnGroup:\n adjust = {\n type: \"dodge\",\n };\n break;\n }\n\n // 定义进度条\n if (data.config.xFieldScrollable) {\n chart.interaction(\"pan\");\n\n chart.scrollBar({\n mode: \"x\",\n xStyle: {\n offsetY: -5,\n },\n });\n }\n\n if (data.config.yFieldDisplay) {\n chart.guide().text({\n position: [\"min\", \"max\"], // 位置为 Y 轴的顶部\n content: data.config.yField, // 名称内容\n style: {\n textAlign: \"center\",\n textBaseline: \"bottom\",\n fontSize: 12,\n fill: \"#808080\",\n },\n offsetY: -12, // 向上偏移,避免与 Y 轴的刻度重叠\n });\n }\n\n chart\n .interval()\n .position(`${data.config.xField}*${data.config.yField}`)\n .color(color)\n .adjust(adjust);\n\n if (data.useCustomTooltip) {\n // 自定义 tooltip\n chart.tooltip({\n custom: true,\n onShow: (ev) => {\n outputs[\"onTooltipShow\"]?.(ev.items[0]);\n },\n onHide: () => {\n outputs[\"onTooltipHide\"]?.();\n },\n });\n } else {\n chart.tooltip({\n showTitle: data.showTooltipTitle ?? false,\n });\n }\n\n chart.legend(...legend);\n\n // 监听 afterrender 事件\n chart.on(\"afterrender\", () => {\n console.log(\"图表渲染完成\");\n if (typeof tickit.current === \"function\") {\n tickit.current();\n tickit.current = null;\n }\n });\n\n chart.render();\n }, [\n chart,\n mockData,\n dataSource,\n data.type,\n data.config.seriesField,\n data.config.xField,\n data.config.yField,\n data.config?.legend,\n\n data.config.xFieldScrollable,\n data.config.xFieldCount,\n data.config.xFieldRotate,\n data.config.yFieldDisplay,\n tickit.current,\n\n data.config.xFieldTickCount,\n ]);\n\n return (\n <ChartStatus env={env} status={status} {...events} onResize={changeSize}>\n <Canvas className={css.chart_line} {...props} />\n </ChartStatus>\n );\n}\n"
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
"path": "src/components/chart/chart-column/style.less",
|
|
414
|
+
"content": ".chart_line {\n width: 100%;\n height: 100%;\n}"
|
|
415
|
+
}
|
|
416
|
+
]
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
"path": "src/components/chart/chart-line",
|
|
420
|
+
"content": null,
|
|
421
|
+
"children": [
|
|
422
|
+
{
|
|
423
|
+
"path": "src/components/chart/chart-line/com.json",
|
|
424
|
+
"content": "{\n \"title\": \"折线图\",\n \"namespace\": \"mybricks.taro.chart.line\",\n \"author\": \"mybricks-team\",\n \"author_name\": \"板砖团队\",\n \"icon\": \"./icon.svg\",\n \"version\": \"1.0.0\",\n \"description\": \"折线图\",\n \"runtime\": \"./runtime.tsx\",\n \"runtime.edit\": \"./runtime.edit.tsx\",\n \"data\": \"./data.json\",\n \"editors\": \"./editors.tsx\",\n \"inputs\": [\n {\n \"id\": \"data\",\n \"title\": \"输入数据\",\n \"schema\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"xField\": {\n \"title\": \"x轴字段名\",\n \"type\": \"string\"\n },\n \"yField\": {\n \"title\": \"y轴字段名\",\n \"type\": \"string\"\n }\n }\n }\n },\n \"rels\": [\"afterrender\"]\n },\n {\n \"id\": \"loading\",\n \"title\": \"切换到加载中\",\n \"desc\": \"提示用户正在加载中\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"id\": \"noMore\",\n \"title\": \"切换到没有数据\",\n \"desc\": \"提示用户当前没有数据\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"id\": \"error\",\n \"title\": \"切换到加载报错\",\n \"desc\": \"提示用户报错信息\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n }\n ],\n \"outputs\": [\n {\n \"id\": \"afterrender\",\n \"title\": \"渲染完成\"\n }\n ]\n}\n"
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
"path": "src/components/chart/chart-line/data.json",
|
|
428
|
+
"content": "{\n \"type\": \"line\",\n \"config\": {\n \"xField\": \"label\",\n \"yField\": \"value\",\n \"xAxis\": {},\n \"yAxis\": {},\n \"legend\": {\n \"position\": \"right\"\n },\n \"seriesField\": \"\",\n \"padding\": \"auto\",\n \"label\": false,\n \"xFieldScrollable\": false,\n \"xFieldTickCount\": 0\n },\n \"geo\": {\n \"line\": {\n \"show\": true,\n \"smooth\": false\n },\n \"dot\": {\n \"show\": true\n },\n \"area\": {\n \"show\": false\n }\n },\n \"useCustomTooltip\": false,\n \"showTooltipTitle\": false\n}\n"
|
|
429
|
+
},
|
|
430
|
+
{
|
|
431
|
+
"path": "src/components/chart/chart-line/editors.tsx",
|
|
432
|
+
"content": "import {\n getNormalDataEditors,\n getLegendEditors,\n getChartTypeEditors,\n getGeoEditors,\n} from \"./../utils/editor\";\nimport { ChartType } from \"./../types\";\n\nexport default {\n \"@init\"({ style }) {\n style.height = 400;\n style.width = \"100%\";\n },\n \"@resize\": {\n options: [\"width\", \"height\"],\n },\n \":root\"({ data, output, style }, cate0, cate1, cate2) {\n cate0.title = \"常规\";\n cate0.items = [\n getChartTypeEditors({\n options: [\n {\n label: \"折线图\",\n value: ChartType.Line,\n },\n {\n label: \"对比折线图\",\n value: ChartType.LineMuti,\n },\n ],\n }),\n getGeoEditors({}),\n getNormalDataEditors({\n xFieldRotate: true,\n xFieldScrollable: true,\n yFieldDisplay: true,\n }),\n getLegendEditors({}),\n {\n title: \"Tooltip显示标题\",\n type: \"switch\",\n value: {\n get({ data }) {\n return data.showTooltipTitle;\n },\n set({ data, outputs }, value) {\n data.showTooltipTitle = value;\n },\n },\n },\n {\n title: \"自定义 Tooltip\",\n type: \"switch\",\n value: {\n get({ data }) {\n return data.useCustomTooltip;\n },\n set({ data, outputs }, value) {\n data.useCustomTooltip = value;\n\n if (value) {\n output.add(\"onTooltipShow\", \"Tooltip 显示\", { type: \"any\" });\n output.add(\"onTooltipHide\", \"Tooltip 隐藏\", { type: \"any\" });\n } else {\n output.remove(\"onTooltipShow\");\n output.remove(\"onTooltipHide\");\n }\n },\n },\n },\n {\n ifVisible({ data }) {\n return data.useCustomTooltip;\n },\n title: \"Tooltip 显示\",\n type: \"_event\",\n options: {\n outputId: \"onTooltipShow\",\n },\n },\n {\n ifVisible({ data }) {\n return data.useCustomTooltip;\n },\n title: \"Tooltip 隐藏\",\n type: \"_event\",\n options: {\n outputId: \"onTooltipHide\",\n },\n },\n ];\n\n cate1.title = \"高级\";\n cate1.items = [\n {\n title: \"升级\",\n type: \"button\",\n value: {\n set({ data, inputs, outputs }) {\n if (output.get(\"afterrender\")) {\n return;\n }\n\n outputs.add(\"afterrender\", \"渲染完成\", { type: \"any\" });\n inputs.get(\"data\").setRels([\"afterrender\"]);\n },\n },\n },\n ];\n },\n};\n"
|
|
433
|
+
},
|
|
434
|
+
{
|
|
435
|
+
"path": "src/components/chart/chart-line/icon.svg",
|
|
436
|
+
"content": "<?xml version=\"1.0\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg t=\"1637218065080\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4722\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"200\" height=\"200\"><defs><style type=\"text/css\"></style></defs><path d=\"M888 792H200V168c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v688c0 4.4 3.6 8 8 8h752c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z\" p-id=\"4723\"></path><path d=\"M305.8 637.7c3.1 3.1 8.1 3.1 11.3 0l138.3-137.6L583 628.5c3.1 3.1 8.2 3.1 11.3 0l275.4-275.3c3.1-3.1 3.1-8.2 0-11.3l-39.6-39.6c-3.1-3.1-8.2-3.1-11.3 0l-230 229.9L461.4 404c-3.1-3.1-8.2-3.1-11.3 0L266.3 586.7c-3.1 3.1-3.1 8.2 0 11.3l39.5 39.7z\" p-id=\"4724\"></path></svg>"
|
|
437
|
+
},
|
|
438
|
+
{
|
|
439
|
+
"path": "src/components/chart/chart-line/runtime.edit.tsx",
|
|
440
|
+
"content": "import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { mockChart } from \"./../utils/mock\";\nimport Runtime from \"./runtime\";\n\nexport default function ({ data, ...others }) {\n \n let mockData = mockChart(data.type, data);\n if (data.type === \"line\") {\n mockData = mockData.map((item, index) => {\n return {\n ...item,\n type: \"line\",\n };\n });\n }\n\n return <Runtime data={data} {...others} mockData={mockData} />;\n}\n"
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
"path": "src/components/chart/chart-line/runtime.tsx",
|
|
444
|
+
"content": "import React, {\n useCallback,\n useEffect,\n useMemo,\n useState,\n useRef,\n} from \"react\";\nimport { ChartStatus, LoadStatus } from \"./../components/chart-status\";\nimport { useChart, getChartConfigFromData } from \"./../utils/chartLine\";\nimport { ChartType, isGroupChart } from \"./../types\";\nimport css from \"./style.less\";\n\nexport default function ({\n env,\n data,\n inputs,\n outputs,\n title,\n style,\n mockData = [],\n}) {\n const { chart, Canvas, events, ...props } = useChart(env);\n\n const [dataSource, setDataSource] = useState([]);\n const [status, setStatus] = useState(LoadStatus.IDLE);\n\n const tickit = useRef(null);\n\n const changeSize = useCallback(\n (width, height) => {\n if (!chart) {\n return;\n }\n chart.changeSize(width, height);\n },\n [chart]\n );\n\n useMemo(() => {\n inputs[\"loading\"]?.((bool) => {\n setStatus(LoadStatus.LOADING);\n });\n\n inputs[\"noMore\"]?.((bool) => {\n setStatus(LoadStatus.NOMORE);\n });\n\n inputs[\"error\"]?.((bool) => {\n setStatus(LoadStatus.ERROR);\n });\n\n inputs[\"data\"]((val, outputRels) => {\n if (Array.isArray(val)) {\n tickit.current = outputRels[\"afterrender\"];\n\n setDataSource(val);\n setStatus(LoadStatus.IDLE);\n }\n });\n }, []);\n\n useEffect(() => {\n if (!chart) {\n return;\n }\n\n chart.clear();\n\n let sourceParams = {\n [data.config.xField]: {\n tickCount: data.config.xFieldTickCount || 0,\n },\n } as any;\n if (data.config.xFieldScrollable) {\n sourceParams[data.config.xField].values = (\n env.edit ? mockData : dataSource\n )\n .slice(0, data.config.xFieldCount || 10)\n .map((d) => d[data.config.xField]);\n }\n\n chart.source(env.edit ? mockData : dataSource, {\n ...sourceParams,\n });\n\n // 配置 X 轴标签的旋转角度\n if (data.config.xFieldRotate) {\n chart.axis(data.config.xField, {\n label: function (text, index, total) {\n const cfg = {\n rotate: Math.PI / data.config.xFieldRotate, // 45度\n textAlign: \"start\",\n };\n return cfg;\n },\n });\n }\n\n const { legend } = getChartConfigFromData(data);\n\n const color = isGroupChart(data.type) ? data.config.seriesField : \"\";\n\n chart\n .line()\n .position(`${data.config.xField}*${data.config.yField}`)\n .color(color)\n .shape(data?.geo?.line?.smooth ? \"smooth\" : \"line\")\n .animate({\n appear: {\n animation: \"groupWaveIn\",\n },\n });\n\n if (data.geo.dot?.show) {\n chart\n .point()\n .position(`${data.config.xField}*${data.config.yField}`)\n .color(color)\n .style({\n stroke: \"#fff\",\n lineWidth: 1,\n })\n .animate({\n appear: {\n animation: \"groupWaveIn\",\n },\n });\n }\n\n if (data.geo.area?.show) {\n chart\n .area()\n .position(`${data.config.xField}*${data.config.yField}`)\n .color(color)\n .animate({\n appear: {\n animation: \"groupWaveIn\",\n },\n });\n }\n\n // 定义进度条\n if (data.config.xFieldScrollable) {\n chart.interaction(\"pan\");\n\n chart.scrollBar({\n mode: \"x\",\n xStyle: {\n offsetY: -5,\n },\n });\n }\n\n if (data.config.yFieldDisplay) {\n chart.guide().text({\n position: [\"min\", \"max\"], // 位置为 Y 轴的顶部\n content: data.config.yField, // 名称内容\n style: {\n textAlign: \"center\",\n textBaseline: \"bottom\",\n fontSize: 12,\n fill: \"#808080\",\n },\n offsetY: -12, // 向上偏移,避免与 Y 轴的刻度重叠\n });\n }\n\n if (data.useCustomTooltip) {\n // 自定义 tooltip\n chart.tooltip({\n custom: true,\n onShow: (ev) => {\n let result;\n if (ev.items.length > 1) {\n result = ev.items;\n } else {\n result = ev.items[0];\n }\n\n outputs[\"onTooltipShow\"]?.(result);\n },\n onHide: () => {\n outputs[\"onTooltipHide\"]?.();\n },\n });\n } else {\n chart.tooltip({\n showTitle: data.showTooltipTitle ?? false,\n });\n }\n\n chart.legend(...legend);\n\n // 监听 afterrender 事件\n chart.on(\"afterrender\", () => {\n console.log(\"图表渲染完成\");\n if (typeof tickit.current === \"function\") {\n tickit.current();\n tickit.current = null;\n }\n });\n\n chart.render();\n }, [\n chart,\n mockData,\n dataSource,\n data.type,\n data.config.seriesField,\n data.config.xField,\n data.config.yField,\n data.config?.legend,\n\n data.geo?.line,\n data.geo?.dot,\n data.geo?.area,\n\n data.config.xFieldScrollable,\n data.config.xFieldCount,\n data.config.xFieldRotate,\n data.config.yFieldDisplay,\n\n data.config.xFieldTickCount,\n\n tickit.current,\n ]);\n\n return (\n <ChartStatus env={env} status={status} {...events} onResize={changeSize}>\n <Canvas className={css.chart_line} {...props} />\n </ChartStatus>\n );\n}\n"
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
"path": "src/components/chart/chart-line/style.less",
|
|
448
|
+
"content": ".chart_line {\n width: 100%;\n height: 100%;\n}"
|
|
449
|
+
}
|
|
450
|
+
]
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
"path": "src/components/chart/chart-pie",
|
|
454
|
+
"content": null,
|
|
455
|
+
"children": [
|
|
456
|
+
{
|
|
457
|
+
"path": "src/components/chart/chart-pie/com.json",
|
|
458
|
+
"content": "{\n \"title\": \"饼图\",\n \"namespace\": \"mybricks.taro.chart.pie\",\n \"author\": \"mybricks-team\",\n \"author_name\": \"板砖团队\",\n \"icon\": \"./icon.svg\",\n \"version\": \"1.0.0\",\n \"description\": \"饼图\",\n \"runtime\": \"./runtime.tsx\",\n \"runtime.edit\": \"./runtime.edit.tsx\",\n \"data\": \"./data.json\",\n \"editors\": \"./editors.tsx\",\n \"inputs\": [\n {\n \"id\": \"data\",\n \"title\": \"输入数据\",\n \"schema\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"xField\": {\n \"title\": \"x轴字段名\",\n \"type\": \"string\"\n },\n \"yField\": {\n \"title\": \"y轴字段名\",\n \"type\": \"string\"\n }\n }\n }\n },\n \"rels\": [\"afterrender\"]\n },\n {\n \"id\": \"loading\",\n \"title\": \"切换到加载中\",\n \"desc\": \"提示用户正在加载中\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"id\": \"noMore\",\n \"title\": \"切换到没有数据\",\n \"desc\": \"提示用户当前没有数据\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"id\": \"error\",\n \"title\": \"切换到加载报错\",\n \"desc\": \"提示用户报错信息\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n }\n ],\n \"outputs\": [\n {\n \"id\": \"afterrender\",\n \"title\": \"渲染完成\"\n }\n ]\n}\n"
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
"path": "src/components/chart/chart-pie/data.json",
|
|
462
|
+
"content": "{\n \"type\": \"pie\",\n \"config\": {\n \"xField\": \"label\",\n \"yField\": \"value\",\n \"xAxis\": {},\n \"yAxis\": {},\n \"legend\": {\n \"position\": \"right\"\n },\n \"seriesField\": \"\",\n \"padding\": \"auto\",\n \"label\": false,\n \"smooth\": false\n }\n}"
|
|
463
|
+
},
|
|
464
|
+
{
|
|
465
|
+
"path": "src/components/chart/chart-pie/editors.tsx",
|
|
466
|
+
"content": "import {\n getNormalDataEditors,\n getLegendEditors,\n getChartTypeEditors,\n} from \"./../utils/editor\";\nimport { ChartType } from \"./../types\";\n\nexport default {\n \"@init\"({ style }) {\n style.height = 400;\n style.width = \"100%\";\n },\n \"@resize\": {\n options: [\"width\", \"height\"],\n },\n \":root\"({ data, output, style }, cate0, cate1, cate2) {\n cate0.title = \"常规\";\n cate0.items = [\n getChartTypeEditors({\n options: [\n {\n label: \"饼图\",\n value: ChartType.Pie,\n },\n {\n label: \"环形图\",\n value: ChartType.Circle,\n },\n ],\n }),\n {\n title: \"环形半径\",\n type: \"inputNumber\",\n ifVisible({ data }: EditorResult<Data>) {\n return data.type === ChartType.Circle;\n },\n options: [\n { min: 0, max: 1, step: 0.05, title: \"外环半径\" },\n { min: 0, max: 1, step: 0.05, title: \"内环半径\" },\n ],\n value: {\n get({ data }: EditorResult<Data>) {\n return [data.radius ?? 1, data.innerRadius ?? 0.7];\n },\n set({ data }: EditorResult<Data>, value: number[]) {\n [data.radius, data.innerRadius] = value;\n },\n },\n },\n getNormalDataEditors({}),\n getLegendEditors({}),\n {\n title: \"内容配置\",\n ifVisible({ data }: EditorResult<Data>) {\n return data.type === ChartType.Circle;\n },\n items: [\n {\n title: \"开启\",\n type: \"switch\",\n value: {\n get({ data }: EditorResult<Data>) {\n return data.guide?.open ?? false;\n },\n set({ data, input, output }: EditorResult<Data>, value: string) {\n if (!data.guide) {\n data.guide = {\n title: \"总计\",\n };\n }\n data.guide.open = value;\n },\n },\n },\n // {\n // title: '标题文本',\n // type: 'text',\n // ifVisible({ data }: EditorResult<Data>) {\n // return !!data.guide?.open\n // },\n // value: {\n // get({ data }: EditorResult<Data>) {\n // return data.guide?.title;\n // },\n // set({ data, input, output }: EditorResult<Data>, value: string) {\n // data.guide.title = value\n // }\n // }\n // },\n ],\n },\n ];\n\n cate1.title = \"高级\";\n cate1.items = [\n {\n title: \"升级\",\n type: \"button\",\n value: {\n set({ data, inputs, outputs }) {\n if (output.get(\"afterrender\")) {\n return;\n }\n\n outputs.add(\"afterrender\", \"渲染完成\", { type: \"any\" });\n inputs.get(\"data\").setRels([\"afterrender\"]);\n },\n },\n },\n ];\n },\n};\n"
|
|
467
|
+
},
|
|
468
|
+
{
|
|
469
|
+
"path": "src/components/chart/chart-pie/icon.svg",
|
|
470
|
+
"content": "<?xml version=\"1.0\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg t=\"1636618022830\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2352\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"200\" height=\"200\"><defs><style type=\"text/css\"></style></defs><path d=\"M864 518H506V160c0-4.4-3.6-8-8-8h-26c-54 0-106.4 10.6-155.7 31.4-47.6 20.1-90.4 49-127.1 85.7-36.7 36.7-65.6 79.5-85.7 127.1C82.6 445.6 72 498 72 552c0 54 10.6 106.4 31.4 155.7 20.1 47.6 49 90.4 85.7 127.1 36.7 36.7 79.5 65.6 127.1 85.7C365.6 941.4 418 952 472 952c54 0 106.4-10.6 155.7-31.4 47.6-20.1 90.4-49 127.1-85.7 36.7-36.7 65.6-79.5 85.7-127.1C861.4 658.4 872 606 872 552v-26c0-4.4-3.6-8-8-8zM705.7 787.8c-62.6 62.1-147.1 96.6-235.3 96.2-88.1-0.4-170.9-34.9-233.2-97.2C174.5 724.1 140 640.7 140 552c0-88.7 34.5-172.1 97.2-234.8 54.6-54.6 124.9-87.9 200.8-95.5V586h364.3c-7.7 76.3-41.3 147-96.6 201.8z\" p-id=\"2353\" fill=\"#555555\"></path><path d=\"M952 462.4l-2.6-28.2c-8.5-92.1-49.4-179-115.2-244.6-65.8-65.7-152.8-106.5-245.2-115L560.7 72c-4.7-0.4-8.7 3.2-8.7 7.9V464c0 4.4 3.6 8 8 8l384-1c4.7 0 8.4-4 8-8.6z m-332.2-58.2V147.6c62.6 13.1 120.7 44.2 166.4 89.8 45.7 45.6 77 103.6 90 166.1l-256.4 0.7z\" p-id=\"2354\" fill=\"#555555\"></path></svg>"
|
|
471
|
+
},
|
|
472
|
+
{
|
|
473
|
+
"path": "src/components/chart/chart-pie/runtime.edit.tsx",
|
|
474
|
+
"content": "import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { mockPieChart } from './../utils/mock'\nimport Runtime from './runtime'\n\nexport default function ({ data, ...others }) {\n return <Runtime data={data} {...others} mockData={mockPieChart(data.type, data)} />;\n}\n\n"
|
|
475
|
+
},
|
|
476
|
+
{
|
|
477
|
+
"path": "src/components/chart/chart-pie/runtime.tsx",
|
|
478
|
+
"content": "import React, {\n useCallback,\n useEffect,\n useMemo,\n useState,\n useRef,\n} from \"react\";\nimport { ChartStatus, LoadStatus } from \"./../components/chart-status\";\nimport { useChart } from \"./../utils/chartPie\";\nimport { ChartType, isGroupChart } from \"./../types\";\nimport css from \"./style.less\";\n\nexport default function ({\n env,\n data,\n inputs,\n outputs,\n title,\n style,\n mockData = [],\n}) {\n const { chart, Canvas, events, ...props } = useChart(env);\n\n const [dataSource, setDataSource] = useState(env.edit ? mockData : []);\n const [status, setStatus] = useState(LoadStatus.IDLE);\n\n const tickit = useRef(null);\n\n const changeSize = useCallback(\n (width, height) => {\n if (!chart) {\n return;\n }\n chart.changeSize(width, height);\n },\n [chart]\n );\n\n useMemo(() => {\n inputs[\"loading\"]?.((bool) => {\n setStatus(LoadStatus.LOADING);\n });\n\n inputs[\"noMore\"]?.((bool) => {\n setStatus(LoadStatus.NOMORE);\n });\n\n inputs[\"error\"]?.((bool) => {\n setStatus(LoadStatus.ERROR);\n });\n\n inputs[\"data\"]((val, outputRels) => {\n if (Array.isArray(val)) {\n tickit.current = outputRels[\"afterrender\"];\n\n setDataSource(val);\n setStatus(LoadStatus.IDLE);\n }\n });\n }, []);\n\n useEffect(() => {\n if (!chart) {\n return;\n }\n\n chart.clear();\n\n let _data: any[] = env.edit ? mockData : dataSource;\n\n const total = _data.reduce((a, c) => a + c?.[data.config.yField], 0);\n _data = _data.map((item) => {\n return {\n ...item,\n total: total,\n };\n });\n\n chart.source(_data);\n\n chart.tooltip(false);\n\n if (data.type === ChartType.Circle) {\n chart.coord(\"polar\", {\n transposed: true,\n innerRadius: data.innerRadius ?? 0.7,\n radius: data.radius ?? 1,\n });\n } else if (data.type === ChartType.Pie) {\n chart.coord(\"polar\", {\n transposed: true,\n radius: data.radius ?? 1,\n });\n }\n\n chart.axis(false);\n\n chart\n .interval()\n .position(`total*${data.config.yField}`)\n .color(data.config.xField)\n .adjust(\"stack\")\n .style({\n lineWidth: 1,\n stroke: \"#fff\",\n lineJoin: \"round\",\n lineCap: \"round\",\n })\n .animate({\n appear: {\n duration: 1200,\n easing: \"bounceOut\",\n },\n });\n\n if (data.guide?.open && data.type === ChartType.Circle) {\n chart.pieLabel({\n sidePadding: 30,\n activeShape: true,\n lineStyle: {\n lineWidth: 0,\n },\n anchorStyle: {\n fill: \"\",\n },\n onClick(ev) {\n const itemData = ev.data;\n if (itemData) {\n // 设置 guíde,并重新渲染\n chart.guide().clear();\n\n chart.guide().text({\n position: [\"50%\", \"46%\"],\n content: itemData[data.config.xField],\n style: {\n fontSize: 13,\n textAlign: \"center\",\n fill: \"#8C8C8C\",\n },\n });\n\n chart.guide().text({\n position: [\"50%\", \"54%\"],\n content: \"\" + itemData[data.config.yField], // 类型转为字符串,避免出现数字异常\n style: {\n fontSize: 24,\n textAlign: \"center\",\n fontWeight: 500,\n fill: \"#1F1F1F\",\n },\n });\n\n chart.repaint();\n }\n },\n });\n }\n\n const legendConfig = getLegendFromData(data.config?.legend);\n if (!legendConfig) {\n chart.legend(false);\n } else {\n chart.legend(data.config.xField, legendConfig);\n }\n\n // 监听 afterrender 事件\n chart.on(\"afterrender\", () => {\n console.log(\"图表渲染完成\");\n if (typeof tickit.current === \"function\") {\n tickit.current();\n tickit.current = null;\n }\n });\n\n chart.render();\n }, [\n chart,\n dataSource,\n data.type,\n data.radius,\n data.innerRadius,\n data.config.xField,\n data.config.yField,\n data.config?.legend,\n data.guide,\n data.guide?.open,\n data.guide?.title,\n\n tickit.current,\n ]);\n\n return (\n <ChartStatus env={env} status={status} {...events} onResize={changeSize}>\n <Canvas className={css.chart_line} {...props} />\n </ChartStatus>\n );\n}\n\nfunction getColorFromData(config) {}\n\nfunction getLegendFromData(legendConfig) {\n if (!legendConfig) {\n return false;\n }\n\n let result = {};\n let posParams = {};\n\n if (legendConfig.position) {\n switch (legendConfig.position) {\n case \"top-left\":\n posParams = {\n position: \"top\",\n align: \"left\",\n };\n break;\n case \"top\":\n posParams = {\n position: \"top\",\n align: \"center\",\n };\n break;\n case \"top-right\":\n posParams = {\n position: \"top\",\n align: \"right\",\n };\n break;\n case \"bottom-left\":\n posParams = {\n position: \"bottom\",\n align: \"left\",\n };\n break;\n case \"bottom\":\n posParams = {\n position: \"bottom\",\n align: \"center\",\n };\n break;\n case \"bottom-right\":\n posParams = {\n position: \"bottom\",\n align: \"right\",\n };\n break;\n default:\n posParams = {\n position: legendConfig.position,\n };\n break;\n }\n }\n\n return { ...result, ...posParams };\n}\n"
|
|
479
|
+
},
|
|
480
|
+
{
|
|
481
|
+
"path": "src/components/chart/chart-pie/style.less",
|
|
482
|
+
"content": ".chart_line {\n width: 100%;\n height: 100%;\n}"
|
|
483
|
+
}
|
|
484
|
+
]
|
|
485
|
+
},
|
|
486
|
+
{
|
|
487
|
+
"path": "src/components/chart/chart-radar",
|
|
488
|
+
"content": null,
|
|
489
|
+
"children": [
|
|
490
|
+
{
|
|
491
|
+
"path": "src/components/chart/chart-radar/com.json",
|
|
492
|
+
"content": "{\n \"title\": \"雷达图\",\n \"namespace\": \"mybricks.taro.chart.radar\",\n \"author\": \"mybricks-team\",\n \"author_name\": \"板砖团队\",\n \"icon\": \"./icon.svg\",\n \"version\": \"1.0.0\",\n \"description\": \"雷达图\",\n \"runtime\": \"./runtime.tsx\",\n \"runtime.edit\": \"./runtime.edit.tsx\",\n \"data\": \"./data.json\",\n \"editors\": \"./editors.tsx\",\n \"inputs\": [\n {\n \"id\": \"data\",\n \"title\": \"输入数据\",\n \"schema\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"xField\": {\n \"title\": \"x轴字段名\",\n \"type\": \"string\"\n },\n \"yField\": {\n \"title\": \"y轴字段名\",\n \"type\": \"string\"\n }\n }\n }\n }\n },\n {\n \"id\": \"loading\",\n \"title\": \"切换到加载中\",\n \"desc\": \"提示用户正在加载中\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"id\": \"noMore\",\n \"title\": \"切换到没有数据\",\n \"desc\": \"提示用户当前没有数据\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"id\": \"error\",\n \"title\": \"切换到加载报错\",\n \"desc\": \"提示用户报错信息\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n }\n ],\n \"outputs\": [\n \n ]\n}"
|
|
493
|
+
},
|
|
494
|
+
{
|
|
495
|
+
"path": "src/components/chart/chart-radar/data.json",
|
|
496
|
+
"content": "{\n \"type\": \"radar\",\n \"config\": {\n \"xField\": \"label\",\n \"yField\": \"value\",\n \"xAxis\": {},\n \"yAxis\": {},\n \"legend\": {\n \"position\": \"right\"\n },\n \"seriesField\": \"\",\n \"padding\": \"auto\",\n \"label\": false\n },\n \"geo\": {\n \"line\": {\n \"show\": true,\n \"smooth\": false\n },\n \"dot\": {\n \"show\": true\n },\n \"area\": {\n \"show\": false\n }\n }\n}\n"
|
|
497
|
+
},
|
|
498
|
+
{
|
|
499
|
+
"path": "src/components/chart/chart-radar/editors.tsx",
|
|
500
|
+
"content": "import { getNormalDataEditors, getLegendEditors, getChartTypeEditors, getGeoEditors } from './../utils/editor'\nimport { ChartType } from './../types'\n\nexport default {\n \"@init\"({ style }) {\n style.height = 400;\n style.width = '100%';\n },\n \"@resize\": {\n options: [\"width\", \"height\"],\n },\n \":root\"({ data, output, style }, cate0, cate1, cate2) {\n cate0.title = \"常规\";\n cate0.items = [\n getChartTypeEditors({\n options: [\n {\n label: '雷达图',\n value: ChartType.Radar,\n },\n // {\n // label: '对比雷达图',\n // value: ChartType.RadarMuti,\n // }\n ]\n }),\n getGeoEditors({}),\n getNormalDataEditors({}),\n getLegendEditors({})\n ];\n\n cate1.title = \"样式\";\n cate1.items = [];\n\n cate2.title = \"动作\";\n cate2.items = [];\n },\n};\n"
|
|
501
|
+
},
|
|
502
|
+
{
|
|
503
|
+
"path": "src/components/chart/chart-radar/icon.svg",
|
|
504
|
+
"content": "<?xml version=\"1.0\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg class=\"icon\" width=\"200px\" height=\"200.00px\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"><path fill=\"#555555\" d=\"M548.547685 0v1.316493a511.969648 511.969648 0 0 1 350.333516 845.920135l2.779264 2.706125-51.708934 51.708935-2.706126-2.706125A511.969648 511.969648 0 1 1 475.409164 1.316493L475.409164 0h73.138521z m96.250294 696.498136l-248.597833 81.915144-74.455015 129.089489c57.560016 27.792638 122.14133 43.298004 190.233294 43.298005 108.025596 0 206.982015-39.05597 283.411769-103.783561L644.797979 696.498136zM78.047579 445.998702a438.319157 438.319157 0 0 0 180.652147 424.349699l66.190362-114.900617L138.606275 462.235453l-60.558696-16.236751z m867.861691 0l-95.665185 25.598482-139.621437 187.307752 136.403342 136.476481a437.075802 437.075802 0 0 0 98.88328-349.382715zM517.098121 568.871417L444.837262 694.084565l148.544337-49.002809-76.210339-76.210339zM245.681069 490.905753l121.556222 191.257233 79.428434-137.427281-200.984656-53.829952z m495.220927 9.873701l-148.544337 39.860494 68.091963 68.091963 80.452374-107.952457zM548.547685 254.814607v221.902273l224.169567-60.046725L548.547685 254.814607z m-73.138521-5.558527L235.295399 412.42812l240.113765 64.28876v-227.4608z m73.138521-174.58165v97.347372l307.913174 222.194827 72.480274-19.381708a439.196819 439.196819 0 0 0-380.320309-300.160491z m-73.138521 0A439.196819 439.196819 0 0 0 95.088855 374.834921l57.194323 15.359089L475.409164 170.485893v-95.811463z\" /></svg>"
|
|
505
|
+
},
|
|
506
|
+
{
|
|
507
|
+
"path": "src/components/chart/chart-radar/runtime.edit.tsx",
|
|
508
|
+
"content": "import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { mockLineChart } from './../utils/mock'\nimport Runtime from './runtime'\n\nexport default function ({ data, ...others }) {\n return <Runtime data={data} {...others} mockData={mockLineChart(data.config)} />;\n}\n\n"
|
|
509
|
+
},
|
|
510
|
+
{
|
|
511
|
+
"path": "src/components/chart/chart-radar/runtime.tsx",
|
|
512
|
+
"content": "import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { ChartStatus, LoadStatus } from \"./../components/chart-status\";\nimport { useChart } from \"./../utils/chart\";\nimport { ChartType, isGroupChart } from \"./../types\";\nimport css from \"./style.less\";\n\nexport default function ({\n env,\n data,\n inputs,\n outputs,\n title,\n style,\n mockData = [],\n}) {\n const { chart, Canvas, events, ...props } = useChart(env);\n\n const [dataSource, setDataSource] = useState(env.edit ? mockData : []);\n const [status, setStatus] = useState(LoadStatus.IDLE);\n\n const changeSize = useCallback(\n (width, height) => {\n if (!chart) {\n return;\n }\n chart.changeSize(width, height);\n },\n [chart]\n );\n\n useMemo(() => {\n inputs[\"loading\"]?.((bool) => {\n setStatus(LoadStatus.LOADING);\n });\n\n inputs[\"noMore\"]?.((bool) => {\n setStatus(LoadStatus.NOMORE);\n });\n\n inputs[\"error\"]?.((bool) => {\n setStatus(LoadStatus.ERROR);\n });\n\n inputs[\"data\"]((val) => {\n if (Array.isArray(val)) {\n setDataSource(val);\n setStatus(LoadStatus.IDLE);\n }\n });\n }, []);\n\n useEffect(() => {\n if (!chart) {\n return;\n }\n\n chart.clear();\n\n chart.source(env.edit ? mockData : dataSource);\n\n chart.tooltip(false);\n chart.coord(\"polar\");\n chart.axis(data.config.yField);\n\n const color = isGroupChart(data.type) ? data.config.seriesField : false;\n\n chart\n .line()\n .position(`${data.config.xField}*${data.config.yField}`)\n .color(color)\n .shape(data?.geo?.line?.smooth ? \"smooth\" : \"line\")\n .animate({\n appear: {\n animation: \"groupWaveIn\",\n },\n });\n\n if (data.geo.dot?.show) {\n chart\n .point()\n .position(`${data.config.xField}*${data.config.yField}`)\n .color(color)\n .animate({\n appear: {\n animation: \"groupWaveIn\",\n },\n })\n .style({\n stroke: \"#fff\",\n lineWidth: 1,\n });\n }\n\n if (data.geo.area?.show) {\n chart\n .area()\n .position(`${data.config.xField}*${data.config.yField}`)\n .color(color)\n .animate({\n appear: {\n animation: \"groupWaveIn\",\n },\n });\n }\n\n const legendConfig = getLegendFromData(data.config?.legend);\n if (!legendConfig) {\n chart.legend(false);\n } else {\n chart.legend(data.config.xField, legendConfig);\n }\n\n chart.render();\n }, [\n chart,\n mockData,\n dataSource,\n data.type,\n data.config.seriesField,\n data.config.xField,\n data.config.yField,\n data.config?.legend,\n\n data.geo?.line,\n data.geo?.dot,\n data.geo?.area,\n ]);\n\n return (\n <ChartStatus env={env} status={status} {...events} onResize={changeSize}>\n <Canvas className={css.chart_line} {...props} />\n </ChartStatus>\n );\n}\n\nfunction getColorFromData(config) {}\n\nfunction getLegendFromData(legendConfig) {\n if (!legendConfig) {\n return false;\n }\n\n let result = {};\n let posParams = {};\n\n if (legendConfig.position) {\n switch (legendConfig.position) {\n case \"top-left\":\n posParams = {\n position: \"top\",\n align: \"left\",\n };\n break;\n case \"top\":\n posParams = {\n position: \"top\",\n align: \"center\",\n };\n break;\n case \"top-right\":\n posParams = {\n position: \"top\",\n align: \"right\",\n };\n break;\n case \"bottom-left\":\n posParams = {\n position: \"bottom\",\n align: \"left\",\n };\n break;\n case \"bottom\":\n posParams = {\n position: \"bottom\",\n align: \"center\",\n };\n break;\n case \"bottom-right\":\n posParams = {\n position: \"bottom\",\n align: \"right\",\n };\n break;\n default:\n posParams = {\n position: legendConfig.position,\n };\n break;\n }\n }\n\n return { ...result, ...posParams };\n}\n"
|
|
513
|
+
},
|
|
514
|
+
{
|
|
515
|
+
"path": "src/components/chart/chart-radar/style.less",
|
|
516
|
+
"content": ".chart_line {\n width: 100%;\n height: 100%;\n}"
|
|
517
|
+
}
|
|
518
|
+
]
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
"path": "src/components/chart/chart-ringProgress",
|
|
522
|
+
"content": null,
|
|
523
|
+
"children": [
|
|
524
|
+
{
|
|
525
|
+
"path": "src/components/chart/chart-ringProgress/com.json",
|
|
526
|
+
"content": "{\n \"title\": \"环形进度图\",\n \"namespace\": \"mybricks.taro.chart.ringProgress\",\n \"author\": \"mybricks-team\",\n \"author_name\": \"板砖团队\",\n \"icon\": \"./icon.svg\",\n \"version\": \"1.0.0\",\n \"description\": \"环形进度图\",\n \"runtime\": \"./runtime.tsx\",\n \"runtime.edit\": \"./runtime.edit.tsx\",\n \"data\": \"./data.json\",\n \"editors\": \"./editors.tsx\",\n \"inputs\": [\n {\n \"id\": \"data\",\n \"title\": \"输入数据\",\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"value\": {\n \"title\": \"数值\",\n \"type\": \"number\"\n },\n \"label\": {\n \"title\": \"标签\",\n \"type\": \"string\"\n },\n \"config\": {\n \"title\": \"颜色字体等配置\",\n \"type\": \"object\"\n }\n }\n }\n } \n ],\n \"outputs\": [\n \n {\n \"id\": \"afterrender\",\n \"title\": \"渲染完成\"\n }\n ]\n}"
|
|
527
|
+
},
|
|
528
|
+
{
|
|
529
|
+
"path": "src/components/chart/chart-ringProgress/data.json",
|
|
530
|
+
"content": "{\n \"type\": \"ringProgress\",\n \"config\": {\n \"color\": \"#1E90FF\",\n \"backgroundColor\": \"#eee\",\n \"size\": 100,\n \"strokeWidth\": 10,\n \"isShowLabel\" : true,\n \"isShowSubLabel\" :true,\n \"labelDistance\" : 10,\n \"labelSize\" : 14, \n \"labelColor\" :\"#eee\",\n \"subLabelSize\" :30,\n \"subLabelColor\":\"#000\",\n \"label\":\"\",\n \"subLabel\":\"\"\n },\n \"value\": 0,\n \"label\": \"进度\"\n}\n "
|
|
531
|
+
},
|
|
532
|
+
{
|
|
533
|
+
"path": "src/components/chart/chart-ringProgress/editors.tsx",
|
|
534
|
+
"content": "import { getNormalDataEditors, getLegendEditors, getChartTypeEditors, getGeoEditors } from './../utils/editor'\nimport { ChartType } from './../types'\n\nexport default {\n \"@init\"({ style }) {\n style.height = 'auto';\n style.width = 'auto';\n },\n \"@resize\": {\n options: [\"width\", \"height\"],\n },\n \":root\"({ data, output, style }, cate0, cate1, cate2) {\n cate0.title = \"常规\";\n cate0.items = [\n getChartTypeEditors({\n options: [\n {\n label: '圆形进度图',\n value: \"RingProgress\",\n },\n // {\n // label: '对比雷达图',\n // value: ChartType.RadarMuti,\n // }\n ]\n }),\n // getGeoEditors({}),\n // getNormalDataEditors({}),\n // getLegendEditors({})\n ];\n\n cate1.title = \"样式\";\n cate1.items = [];\n\n cate2.title = \"动作\";\n cate2.items = [];\n },\n};\n"
|
|
535
|
+
},
|
|
536
|
+
{
|
|
537
|
+
"path": "src/components/chart/chart-ringProgress/icon.svg",
|
|
538
|
+
"content": "<?xml version=\"1.0\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg class=\"icon\" width=\"200px\" height=\"200.00px\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"><path fill=\"#555555\" d=\"M548.547685 0v1.316493a511.969648 511.969648 0 0 1 350.333516 845.920135l2.779264 2.706125-51.708934 51.708935-2.706126-2.706125A511.969648 511.969648 0 1 1 475.409164 1.316493L475.409164 0h73.138521z m96.250294 696.498136l-248.597833 81.915144-74.455015 129.089489c57.560016 27.792638 122.14133 43.298004 190.233294 43.298005 108.025596 0 206.982015-39.05597 283.411769-103.783561L644.797979 696.498136zM78.047579 445.998702a438.319157 438.319157 0 0 0 180.652147 424.349699l66.190362-114.900617L138.606275 462.235453l-60.558696-16.236751z m867.861691 0l-95.665185 25.598482-139.621437 187.307752 136.403342 136.476481a437.075802 437.075802 0 0 0 98.88328-349.382715zM517.098121 568.871417L444.837262 694.084565l148.544337-49.002809-76.210339-76.210339zM245.681069 490.905753l121.556222 191.257233 79.428434-137.427281-200.984656-53.829952z m495.220927 9.873701l-148.544337 39.860494 68.091963 68.091963 80.452374-107.952457zM548.547685 254.814607v221.902273l224.169567-60.046725L548.547685 254.814607z m-73.138521-5.558527L235.295399 412.42812l240.113765 64.28876v-227.4608z m73.138521-174.58165v97.347372l307.913174 222.194827 72.480274-19.381708a439.196819 439.196819 0 0 0-380.320309-300.160491z m-73.138521 0A439.196819 439.196819 0 0 0 95.088855 374.834921l57.194323 15.359089L475.409164 170.485893v-95.811463z\" /></svg>"
|
|
539
|
+
},
|
|
540
|
+
{
|
|
541
|
+
"path": "src/components/chart/chart-ringProgress/runtime.edit.tsx",
|
|
542
|
+
"content": "import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { mockLineChart } from './../utils/mock'\nimport Runtime from './runtime'\n\nexport default function ({ data, ...others }) {\n return <Runtime data={data} {...others} mockData={mockLineChart(data.config)} />;\n}\n\n"
|
|
543
|
+
},
|
|
544
|
+
{
|
|
545
|
+
"path": "src/components/chart/chart-ringProgress/runtime.tsx",
|
|
546
|
+
"content": "import React, { useCallback, useEffect, useMemo, useState, useRef } from \"react\";\nimport * as Taro from '@tarojs/taro';\nimport { createSelectorQuery } from '@tarojs/taro'\nimport { View } from '@tarojs/components';\nimport RingProgress from \"./../components/ring-progress\";\nimport { useChart } from \"./../utils/chart\";\nimport { ChartType, isGroupChart } from './../types'\nimport { Base64 } from 'js-base64'\nimport css from \"./style.less\";\nconst isWeapp = (Taro.getEnv() === Taro.ENV_TYPE.WEAPP || Taro.getEnv() === 'weapp2');\n// 判断是否为小程序环境 最新小程序类型 是 weapp2\nexport default function ({\n env,\n data,\n inputs,\n outputs,\n title,\n style,\n mockData = [],\n logger\n}) {\n const [value, setValue] = useState(data.value)\n const [label, setLabel] = useState(data.label)\n const [config, setConfig] = useState<any>(data.config)\n inputs[\"data\"]((val) => {\n\n logger.info(\"🚀 ~ inputs['data'] ~ val:\", val)\n const { value, label, config } = val\n setValue(value)\n setLabel(label)\n setConfig(config)\n });\n\n return (\n // 自定义样式\n <RingProgress\n percent={value}\n size={config.size}\n strokeWidth={config.strokeWidth}\n color={config.color}\n backgroundColor={config.backgroundColor}\n isShowLabel={config.isShowLabel}\n isShowSubLabel={config.isShowSubLabel}\n labelDistance={config.labelDistance}\n labelSize={config.labelSize}\n labelColor={config.labelColor}\n subLabelSize={config.subLabelSize}\n subLabelColor={config.subLabelColor}\n label={config.label}\n subLabel={config.subLabel}\n canvasContainerBorder={config.canvasContainerBorder}\n canvasBorder={config.canvasBorder}\n // {...config}\n >\n {/* <View>{value}</View>\n <View>{label}</View> */}\n </RingProgress>\n );\n}\n"
|
|
547
|
+
},
|
|
548
|
+
{
|
|
549
|
+
"path": "src/components/chart/chart-ringProgress/style.less",
|
|
550
|
+
"content": ".chart_line {\n width: 100%;\n height: 100%;\n}"
|
|
551
|
+
}
|
|
552
|
+
]
|
|
553
|
+
},
|
|
554
|
+
{
|
|
555
|
+
"path": "src/components/chart/components",
|
|
556
|
+
"content": null,
|
|
557
|
+
"children": [
|
|
558
|
+
{
|
|
559
|
+
"path": "src/components/chart/components/chart-status",
|
|
560
|
+
"content": null,
|
|
561
|
+
"children": [
|
|
562
|
+
{
|
|
563
|
+
"path": "src/components/chart/components/chart-status/index.less",
|
|
564
|
+
"content": ".chart_wrap {\n width: 100%;\n height: 100%;\n position: relative !important;\n}\n\n.chart_wrap_empty {\n position: absolute;\n top: 0px;\n left: 0px;\n right: 0px;\n bottom: 0px;\n color: #eee;\n}\n\n.chart_wrap_loading {\n position: absolute;\n top: 0px;\n left: 0px;\n right: 0px;\n bottom: 0px;\n color: #eee;\n}"
|
|
565
|
+
},
|
|
566
|
+
{
|
|
567
|
+
"path": "src/components/chart/components/chart-status/index.tsx",
|
|
568
|
+
"content": "import React, { useEffect, useRef } from \"react\";\nimport { View } from \"@tarojs/components\";\nimport css from \"./index.less\";\n\nconst Empty = () => {\n return <View className={css.chart_wrap_empty}>暂无数据</View>;\n};\n\nconst Loading = () => {\n return <View className={css.chart_wrap_loading}>加载中</View>;\n};\n\nexport const ChartStatus = ({\n env,\n className,\n children,\n status = LoadStatus.IDLE,\n onResize,\n ...props\n}: {\n className?;\n children?;\n status?;\n onResize?: (width: number, height: number) => void;\n [keyname: string]: any;\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n // 监听容器尺寸变化\n let resizeTimer: any;\n useEffect(() => {\n if (!containerRef.current || !env.edit) return;\n\n // 使用 ResizeObserver 监听尺寸变化\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n // 防抖处理\n clearTimeout(resizeTimer);\n resizeTimer = setTimeout(() => {\n onResize?.(width, height);\n }, 200);\n }\n });\n\n resizeObserver.observe(containerRef.current);\n\n // 组件卸载时清理\n return () => {\n resizeObserver.disconnect();\n };\n }, [onResize]);\n\n return (\n <View\n ref={containerRef}\n className={`${css.chart_wrap} ${className}`}\n {...props}\n >\n {status === LoadStatus.LOADING && <Loading />}\n {status === LoadStatus.NOMORE && <Empty />}\n {children}\n </View>\n );\n};\n\nexport enum LoadStatus {\n IDLE = \"idle\",\n LOADING = \"loading\",\n ERROR = \"error\",\n NOMORE = \"noMore\",\n}\n\nexport default ChartStatus;\n"
|
|
569
|
+
}
|
|
570
|
+
]
|
|
571
|
+
},
|
|
572
|
+
{
|
|
573
|
+
"path": "src/components/chart/components/ring-progress",
|
|
574
|
+
"content": null,
|
|
575
|
+
"children": [
|
|
576
|
+
{
|
|
577
|
+
"path": "src/components/chart/components/ring-progress/index.tsx",
|
|
578
|
+
"content": "import React, { useEffect, useRef } from 'react';\nimport * as Taro from '@tarojs/taro';\nimport { View, Canvas } from '@tarojs/components';\nimport { RingProgressProps } from './types';\nimport './style.less';\nfunction uuid(pre = \"c_\", len = 6) {\n const seed = \"abcdefhijkmnprstwxyz0123456789\",\n maxPos = seed.length;\n let rtn = \"\";\n for (let i = 0; i < len; i++) {\n rtn += seed.charAt(Math.floor(Math.random() * maxPos));\n }\n return pre + rtn;\n}\nfunction isDesigner(env): Boolean {\n if (env?.edit || env?.runtime?.debug) {\n return true;\n } else {\n return false;\n }\n}\nfunction createWebCanvas(canvasRef: any, size: number,\n strokeWidth: number, percent: number, color: string,\n backgroundColor: string, isShowLabel: boolean, labelSize: number,\n labelColor: string, label: string, isShowSubLabel: boolean,\n subLabelSize: number, subLabelColor: string, subLabel: string, labelDistance: number) {\n // const canvas:any = document.getElementById(\"#\"+canvasId);\n console.log(\"🚀 ~ createWebCanvas ~ canvasRef:\", canvasRef)\n const canvas = canvasRef.current;\n // const canvas = document.getElementById(canvasId) as HTMLCanvasElement;\n const pixelRatio = window.devicePixelRatio\n console.log(\"🚀 ~ createWebCanvas ~ pixelRatio:\", pixelRatio,canvas)\n canvas.width = size * pixelRatio;\n canvas.height = size * pixelRatio;\n const ctx = canvas.getContext('2d');\n // 计算中心点和半径\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n const radius = (canvas.width - strokeWidth) / 2;\n\n // 清除画布\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // 绘制背景圆环\n ctx.beginPath();\n ctx.arc(centerX, centerY, radius, 0, Math.PI * 2);\n ctx.strokeStyle = backgroundColor;\n ctx.lineWidth = strokeWidth;\n ctx.stroke();\n\n // 绘制进度圆环\n const startAngle = -Math.PI / 2;\n const endAngle = startAngle + (Math.PI * 2 * percent) / 100;\n\n ctx.beginPath();\n ctx.arc(centerX, centerY, radius, startAngle, endAngle);\n ctx.strokeStyle = color;\n ctx.lineWidth = strokeWidth;\n ctx.lineCap = 'round';\n ctx.stroke();\n\n\n // 绘制文字\n if (isShowLabel) {\n ctx.beginPath();\n ctx.font = `${labelSize}px`;\n ctx.fillStyle = labelColor;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(`${label}`, centerX, centerY);\n ctx.stroke();\n }\n if (isShowSubLabel) {\n ctx.beginPath();\n ctx.font = `${subLabelSize}px`;\n ctx.fillStyle = subLabelColor;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(`${subLabel}`, centerX, centerY + labelDistance);\n ctx.stroke();\n }\n\n}\nfunction createTaroCanvas(canvasId: string, size: number,\n strokeWidth: number, percent: number, color: string,\n backgroundColor: string, isShowLabel: boolean, labelSize: number,\n labelColor: string, label: string, isShowSubLabel: boolean,\n subLabelSize: number, subLabelColor: string, subLabel: string, labelDistance: number) {\n const query = Taro.createSelectorQuery();\n query.select('.mybricks_com >>> .' + canvasId)\n .fields({ node: true, size: true })\n .exec((res) => {\n const canvas = res[0].node;\n const ctx = canvas.getContext('2d');\n\n\n // 设置canvas尺寸\n\n console.log(\"🚀 ~ .exec ~ pixelRatio:\", pixelRatio, canvas)\n canvas.width = size * pixelRatio;\n canvas.height = size * pixelRatio;\n // canvas.width = size;\n // canvas.height = size;\n\n // 计算中心点和半径\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n const radius = (canvas.width - strokeWidth) / 2;\n\n // 清除画布\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // 绘制背景圆环\n ctx.beginPath();\n ctx.arc(centerX, centerY, radius, 0, Math.PI * 2);\n ctx.strokeStyle = backgroundColor;\n ctx.lineWidth = strokeWidth;\n ctx.stroke();\n\n // 绘制进度圆环\n const startAngle = -Math.PI / 2;\n const endAngle = startAngle + (Math.PI * 2 * percent) / 100;\n\n ctx.beginPath();\n ctx.arc(centerX, centerY, radius, startAngle, endAngle);\n ctx.strokeStyle = color;\n ctx.lineWidth = strokeWidth;\n ctx.lineCap = 'round';\n ctx.stroke();\n\n\n // 绘制文字\n if (isShowLabel) {\n ctx.beginPath();\n ctx.font = `${labelSize}px`;\n ctx.fillStyle = labelColor;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(`${label}`, centerX, centerY);\n ctx.stroke();\n }\n if (isShowSubLabel) {\n ctx.beginPath();\n ctx.font = `${subLabelSize}px`;\n ctx.fillStyle = subLabelColor;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(`${subLabel}`, centerX, centerY + labelDistance);\n ctx.stroke();\n }\n });\n}\nconst isWeapp = (Taro.getEnv() === Taro.ENV_TYPE.WEAPP || Taro.getEnv() === 'weapp2');\n\nconst pixelRatio = Taro.getSystemInfoSync().pixelRatio;\nconst RingProgress: React.FC<RingProgressProps> = ({\n isShowLabel = true,\n isShowSubLabel = true,\n labelDistance = 10,\n labelSize = 14,\n labelColor = '#eee',\n subLabelSize = 30,\n subLabelColor = '#000',\n label = \"\",\n subLabel = \"\",\n percent = 0,\n size = 120,\n strokeWidth = 8,\n color = '#1890ff',\n backgroundColor = '#f5f5f5',\n canvasBorder='',\n canvasContainerBorder='',\n children\n}) => {\n // const pixelRatioSize = size * pixelRatio;\n const canvasRef: any = useRef<HTMLElement>(null);\n const canvasId = uuid('ring-progress-canvas', 6)\n useEffect(() => {\n if (!isWeapp) {\n createWebCanvas(canvasRef, size, strokeWidth, percent, color, backgroundColor, isShowLabel, labelSize, labelColor, label, isShowSubLabel, subLabelSize, subLabelColor, subLabel, labelDistance);\n } else {\n createTaroCanvas(canvasId, size, strokeWidth, percent, color, backgroundColor, isShowLabel, labelSize, labelColor, label, isShowSubLabel, subLabelSize, subLabelColor, subLabel, labelDistance);\n }\n\n\n }, [percent, size, strokeWidth, color, backgroundColor]);\n\n return (\n <View className=\"ring-progress\" \n style={{ width: '100%', height: '100%',\n display: 'flex', justifyContent: 'center', alignItems: 'center',\n border:canvasContainerBorder }}>\n {isWeapp ?\n\n (<Canvas\n type=\"2d\"\n id={canvasId}\n canvasId={canvasId}\n className={`ring-progress-canvas ${canvasId}`}\n style={{ width: `${size}px`, height: `${size}px`,border:canvasBorder }}\n />) :\n (<canvas ref={canvasRef} id={canvasId} \n width={size} height={size}\n style={{border:canvasBorder}} />\n // { width: `${size}px`, height: `${size}px` }\n\n )}\n\n\n {/* {children && <View className=\"ring-progress-content\">{children}</View>} */}\n </View>\n );\n};\n\nexport default RingProgress;"
|
|
579
|
+
},
|
|
580
|
+
{
|
|
581
|
+
"path": "src/components/chart/components/ring-progress/README.md",
|
|
582
|
+
"content": "环形进度条"
|
|
583
|
+
},
|
|
584
|
+
{
|
|
585
|
+
"path": "src/components/chart/components/ring-progress/style.less",
|
|
586
|
+
"content": ".ring-progress {\n position: relative;\n display: inline-block;\n\n &-canvas {\n display: block;\n }\n\n &-content {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n text-align: center;\n }\n}"
|
|
587
|
+
},
|
|
588
|
+
{
|
|
589
|
+
"path": "src/components/chart/components/ring-progress/types.ts",
|
|
590
|
+
"content": "export interface RingProgressProps {\n isShowLabel?: boolean;// 是否显示文字说明\n isShowSubLabel?: boolean;// 是否显示百分比\n labelDistance?: number; // 文字说明距离圆心的距离\n labelSize?: number; // 文字说明大小\n labelColor?: string; // 文字说明颜色\n subLabelSize?: number; // 百分比大小\n subLabelColor?: string; // 百分比颜色\n canvasContainerBorder?: string; // 画布容器边框\n canvasBorder?: string; // 画布边框\n /**\n * 进度百分比,范围 0-100\n */\n percent?: number;\n /**文字说明 */\n label?: string; \n subLabel?: string; \n /**\n * 环形进度条的尺寸\n */\n size?: number;\n /**\n * 环形进度条的宽度\n */\n strokeWidth?: number;\n /**\n * 进度条颜色\n */\n color?: string;\n /**\n * 背景色\n */\n backgroundColor?: string;\n /**\n * 自定义内容\n */\n children?: React.ReactNode;\n} "
|
|
591
|
+
}
|
|
592
|
+
]
|
|
593
|
+
}
|
|
594
|
+
]
|
|
595
|
+
},
|
|
596
|
+
{
|
|
597
|
+
"path": "src/components/chart/types",
|
|
598
|
+
"content": null,
|
|
599
|
+
"children": [
|
|
600
|
+
{
|
|
601
|
+
"path": "src/components/chart/types/index.ts",
|
|
602
|
+
"content": "export enum ColumnChartType {\n Column = 'column',\n ColumnStack = 'column-stack',\n ColumnGroup = 'column-group'\n}\n\nexport enum LineChartType {\n Line = 'line',\n LineMuti = 'line-muti',\n}\n\nexport enum PieChartType {\n Pie = 'pie',\n /** 环形图 */\n Circle = 'circle'\n}\n\nexport enum RadarChartType {\n Radar = 'radar',\n RadarMuti = 'radar-muti'\n}\n\ntype _ChartType = LineChartType | ColumnChartType | PieChartType | RadarChartType\n\nexport const ChartType = { ...ColumnChartType, ...LineChartType, ...PieChartType, ...RadarChartType }\n\nexport const isGroupChart = (type: _ChartType) => {\n return [ChartType.ColumnGroup, ChartType.ColumnStack, ChartType.LineMuti].includes(type)\n}"
|
|
603
|
+
}
|
|
604
|
+
]
|
|
605
|
+
},
|
|
606
|
+
{
|
|
607
|
+
"path": "src/components/chart/utils",
|
|
608
|
+
"content": null,
|
|
609
|
+
"children": [
|
|
610
|
+
{
|
|
611
|
+
"path": "src/components/chart/utils/chart",
|
|
612
|
+
"content": null,
|
|
613
|
+
"children": [
|
|
614
|
+
{
|
|
615
|
+
"path": "src/components/chart/utils/chart/config.ts",
|
|
616
|
+
"content": "import { isGroupChart } from './../../types'\n\n/**\n * @description 获取真实的图表配置\n */\nexport function getChartConfigFromData(data) {\n return {\n legend: getLegendFromData(data.config.legend, {\n field: isGroupChart(data.type) ? data.config.seriesField : data.config.xField,\n })\n }\n}\n\nfunction getLegendFromData (legendConfig, { field }) {\n if (!legendConfig) {\n return [false];\n }\n\n let result = {}\n let posParams = {};\n\n if (legendConfig.position) {\n switch (legendConfig.position) {\n case \"top-left\":\n posParams = {\n position: \"top\",\n align: \"left\",\n };\n break;\n case \"top\":\n posParams = {\n position: \"top\",\n align: \"center\",\n };\n break;\n case \"top-right\":\n posParams = {\n position: \"top\",\n align: \"right\",\n };\n break;\n case \"bottom-left\":\n posParams = {\n position: \"bottom\",\n align: \"left\",\n };\n break;\n case \"bottom\":\n posParams = {\n position: \"bottom\",\n align: \"center\",\n };\n break;\n case \"bottom-right\":\n posParams = {\n position: \"bottom\",\n align: \"right\",\n };\n break;\n default:\n posParams = {\n position: legendConfig.position\n }\n break;\n }\n }\n\n return [field, { ...result, ...posParams }]\n}\n"
|
|
617
|
+
},
|
|
618
|
+
{
|
|
619
|
+
"path": "src/components/chart/utils/chart/index.tsx",
|
|
620
|
+
"content": "import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n} from \"react\";\nimport { Canvas as TaroCanvas } from \"@tarojs/components\";\nimport * as Taro from \"@tarojs/taro\";\nimport F2 from \"@antv/f2\";\nimport ScrollBar from \"@antv/f2/lib/plugin/scroll-bar\";\nimport Pan from \"@antv/f2/lib/interaction/pan\";\nimport PieLabel from \"@antv/f2/lib/plugin/pie-label\";\n\nF2.Chart.registerInteraction(\"pan\", Pan);\n\nexport * from \"./config\";\n\nconst getCanvasInTaro = async (id) => {\n return new Promise((resolve, reject) => {\n Taro.createSelectorQuery()\n .select(`#${id}`)\n .fields({\n node: true,\n size: true,\n })\n .exec((res) => {\n const { width, height } = res[0];\n const canvas = res[0].node;\n\n const pixelRatio = Taro.getSystemInfoSync().pixelRatio;\n\n canvas.width = width * pixelRatio;\n canvas.height = height * pixelRatio;\n resolve({\n context: canvas.getContext(\"2d\"),\n pixelRatio,\n width,\n height,\n });\n });\n });\n};\n\nconst getCanvasInDesn = async (el: HTMLElement) => {\n const { width, height } = el.getBoundingClientRect();\n return Promise.resolve({\n el,\n width: width,\n height: height,\n pixelRatio: 2,\n });\n};\n\nexport const useChart = (env) => {\n const chartEl = useRef<HTMLElement>(null);\n\n const canvasEl = useRef(null);\n const [chart, setChart] = useState<any>(null);\n\n const chartId = useRef(uuid());\n\n useEffect(() => {\n let _chart = {\n ref: {},\n };\n\n (async () => {\n const options = await (isDesigner(env)\n ? getCanvasInDesn(chartEl.current)\n : getCanvasInTaro(chartId.current));\n _chart.ref = new F2.Chart({\n ...options,\n plugins: [ScrollBar, PieLabel],\n });\n\n if (!_chart.ref) {\n return;\n }\n\n canvasEl.current = _chart.ref.get(\"el\");\n setChart(_chart.ref);\n })();\n\n return () => {\n _chart.ref?.destroy?.();\n };\n }, []);\n\n const Canvas = useCallback((props) => {\n if (isDesigner(env)) {\n return <canvas ref={chartEl} {...props} />;\n }\n return <TaroCanvas {...props} />;\n }, []);\n\n const handleEvent = useCallback((type) => {\n return isDesigner(env)\n ? (e) => {}\n : (e) => canvasEl.current?.dispatchEvent(type, wrapEvent(e));\n }, []);\n\n const events = useMemo(() => {\n return {\n onClick: handleEvent(\"click\"),\n onTouchStart: handleEvent(\"touchstart\"),\n onTouchMove: handleEvent(\"touchmove\"),\n onTouchEnd: handleEvent(\"touchend\"),\n };\n }, []);\n\n return {\n chart,\n id: chartId.current,\n type: \"2d\",\n Canvas,\n events,\n };\n};\n\nfunction wrapEvent(e: any) {\n if (!e) return;\n if (!e.preventDefault) {\n e.preventDefault = function () {};\n }\n return e;\n}\n\nfunction uuid(pre = \"c_\", len = 6) {\n const seed = \"abcdefhijkmnprstwxyz0123456789\",\n maxPos = seed.length;\n let rtn = \"\";\n for (let i = 0; i < len; i++) {\n rtn += seed.charAt(Math.floor(Math.random() * maxPos));\n }\n return pre + rtn;\n}\n\nfunction isDesigner(env): Boolean {\n if (env?.edit || env?.runtime?.debug) {\n return true;\n } else {\n return false;\n }\n}\n"
|
|
621
|
+
}
|
|
622
|
+
]
|
|
623
|
+
},
|
|
624
|
+
{
|
|
625
|
+
"path": "src/components/chart/utils/chartLine",
|
|
626
|
+
"content": null,
|
|
627
|
+
"children": [
|
|
628
|
+
{
|
|
629
|
+
"path": "src/components/chart/utils/chartLine/config.ts",
|
|
630
|
+
"content": "import { isGroupChart } from './../../types'\n\n/**\n * @description 获取真实的图表配置\n */\nexport function getChartConfigFromData(data) {\n return {\n legend: getLegendFromData(data.config.legend, {\n field: isGroupChart(data.type) ? data.config.seriesField : data.config.xField,\n })\n }\n}\n\nfunction getLegendFromData (legendConfig, { field }) {\n if (!legendConfig) {\n return [false];\n }\n\n let result = {}\n let posParams = {};\n\n if (legendConfig.position) {\n switch (legendConfig.position) {\n case \"top-left\":\n posParams = {\n position: \"top\",\n align: \"left\",\n };\n break;\n case \"top\":\n posParams = {\n position: \"top\",\n align: \"center\",\n };\n break;\n case \"top-right\":\n posParams = {\n position: \"top\",\n align: \"right\",\n };\n break;\n case \"bottom-left\":\n posParams = {\n position: \"bottom\",\n align: \"left\",\n };\n break;\n case \"bottom\":\n posParams = {\n position: \"bottom\",\n align: \"center\",\n };\n break;\n case \"bottom-right\":\n posParams = {\n position: \"bottom\",\n align: \"right\",\n };\n break;\n default:\n posParams = {\n position: legendConfig.position\n }\n break;\n }\n }\n\n return [field, { ...result, ...posParams }]\n}\n"
|
|
631
|
+
},
|
|
632
|
+
{
|
|
633
|
+
"path": "src/components/chart/utils/chartLine/index.tsx",
|
|
634
|
+
"content": "import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n} from \"react\";\nimport { Canvas as TaroCanvas } from \"@tarojs/components\";\nimport * as Taro from \"@tarojs/taro\";\nimport F2 from \"@antv/f2\";\nimport ScrollBar from \"@antv/f2/lib/plugin/scroll-bar\";\nimport Pan from \"@antv/f2/lib/interaction/pan\";\n\nF2.Chart.registerInteraction(\"pan\", Pan);\n\nexport * from \"./config\";\n\nconst getCanvasInTaro = async (id) => {\n return new Promise((resolve, reject) => {\n Taro.createSelectorQuery()\n .select(`#${id}`)\n .fields({\n node: true,\n size: true,\n })\n .exec((res) => {\n const { width, height } = res[0];\n const canvas = res[0].node;\n\n const pixelRatio = Taro.getSystemInfoSync().pixelRatio;\n\n canvas.width = width * pixelRatio;\n canvas.height = height * pixelRatio;\n resolve({\n context: canvas.getContext(\"2d\"),\n pixelRatio,\n width,\n height,\n });\n });\n });\n};\n\nconst getCanvasInDesn = async (el: HTMLElement) => {\n const { width, height } = el.getBoundingClientRect();\n return Promise.resolve({\n el,\n width: width,\n height: height,\n pixelRatio: 2,\n });\n};\n\nexport const useChart = (env) => {\n const chartEl = useRef<HTMLElement>(null);\n\n const canvasEl = useRef(null);\n const [chart, setChart] = useState<any>(null);\n\n const chartId = useRef(uuid());\n\n useEffect(() => {\n let _chart = {\n ref: {},\n };\n\n (async () => {\n const options = await (isDesigner(env)\n ? getCanvasInDesn(chartEl.current)\n : getCanvasInTaro(chartId.current));\n _chart.ref = new F2.Chart({\n ...options,\n plugins: [ScrollBar],\n });\n\n if (!_chart.ref) {\n return;\n }\n\n canvasEl.current = _chart.ref.get(\"el\");\n setChart(_chart.ref);\n })();\n\n return () => {\n _chart.ref?.destroy?.();\n };\n }, []);\n\n const Canvas = useCallback((props) => {\n if (isDesigner(env)) {\n return <canvas ref={chartEl} {...props} />;\n }\n return <TaroCanvas {...props} />;\n }, []);\n\n const handleEvent = useCallback((type) => {\n return isDesigner(env)\n ? (e) => {}\n : (e) => canvasEl.current?.dispatchEvent(type, wrapEvent(e));\n }, []);\n\n const events = useMemo(() => {\n return {\n onClick: handleEvent(\"click\"),\n onTouchStart: handleEvent(\"touchstart\"),\n onTouchMove: handleEvent(\"touchmove\"),\n onTouchEnd: handleEvent(\"touchend\"),\n };\n }, []);\n\n return {\n chart,\n id: chartId.current,\n type: \"2d\",\n Canvas,\n events,\n };\n};\n\nfunction wrapEvent(e: any) {\n if (!e) return;\n if (!e.preventDefault) {\n e.preventDefault = function () {};\n }\n return e;\n}\n\nfunction uuid(pre = \"c_\", len = 6) {\n const seed = \"abcdefhijkmnprstwxyz0123456789\",\n maxPos = seed.length;\n let rtn = \"\";\n for (let i = 0; i < len; i++) {\n rtn += seed.charAt(Math.floor(Math.random() * maxPos));\n }\n return pre + rtn;\n}\n\nfunction isDesigner(env): Boolean {\n if (env?.edit || env?.runtime?.debug) {\n return true;\n } else {\n return false;\n }\n}\n"
|
|
635
|
+
}
|
|
636
|
+
]
|
|
637
|
+
},
|
|
638
|
+
{
|
|
639
|
+
"path": "src/components/chart/utils/chartPie",
|
|
640
|
+
"content": null,
|
|
641
|
+
"children": [
|
|
642
|
+
{
|
|
643
|
+
"path": "src/components/chart/utils/chartPie/config.ts",
|
|
644
|
+
"content": "import { isGroupChart } from './../../types'\n\n/**\n * @description 获取真实的图表配置\n */\nexport function getChartConfigFromData(data) {\n return {\n legend: getLegendFromData(data.config.legend, {\n field: isGroupChart(data.type) ? data.config.seriesField : data.config.xField,\n })\n }\n}\n\nfunction getLegendFromData (legendConfig, { field }) {\n if (!legendConfig) {\n return [false];\n }\n\n let result = {}\n let posParams = {};\n\n if (legendConfig.position) {\n switch (legendConfig.position) {\n case \"top-left\":\n posParams = {\n position: \"top\",\n align: \"left\",\n };\n break;\n case \"top\":\n posParams = {\n position: \"top\",\n align: \"center\",\n };\n break;\n case \"top-right\":\n posParams = {\n position: \"top\",\n align: \"right\",\n };\n break;\n case \"bottom-left\":\n posParams = {\n position: \"bottom\",\n align: \"left\",\n };\n break;\n case \"bottom\":\n posParams = {\n position: \"bottom\",\n align: \"center\",\n };\n break;\n case \"bottom-right\":\n posParams = {\n position: \"bottom\",\n align: \"right\",\n };\n break;\n default:\n posParams = {\n position: legendConfig.position\n }\n break;\n }\n }\n\n return [field, { ...result, ...posParams }]\n}\n"
|
|
645
|
+
},
|
|
646
|
+
{
|
|
647
|
+
"path": "src/components/chart/utils/chartPie/index.tsx",
|
|
648
|
+
"content": "import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n} from \"react\";\nimport { Canvas as TaroCanvas } from \"@tarojs/components\";\nimport * as Taro from \"@tarojs/taro\";\nimport F2 from \"@antv/f2\";\nimport PieLabel from \"@antv/f2/lib/plugin/pie-label\";\n\nexport * from \"./config\";\n\nconst getCanvasInTaro = async (id) => {\n return new Promise((resolve, reject) => {\n Taro.createSelectorQuery()\n .select(`#${id}`)\n .fields({\n node: true,\n size: true,\n })\n .exec((res) => {\n const { width, height } = res[0];\n const canvas = res[0].node;\n\n const pixelRatio = Taro.getSystemInfoSync().pixelRatio;\n\n canvas.width = width * pixelRatio;\n canvas.height = height * pixelRatio;\n resolve({\n context: canvas.getContext(\"2d\"),\n pixelRatio,\n width,\n height,\n });\n });\n });\n};\n\nconst getCanvasInDesn = async (el: HTMLElement) => {\n const { width, height } = el.getBoundingClientRect();\n return Promise.resolve({\n el,\n width: width,\n height: height,\n pixelRatio: 2,\n });\n};\n\nexport const useChart = (env) => {\n const chartEl = useRef<HTMLElement>(null);\n\n const canvasEl = useRef(null);\n const [chart, setChart] = useState<any>(null);\n\n const chartId = useRef(uuid());\n\n useEffect(() => {\n let _chart = {\n ref: {},\n };\n\n (async () => {\n const options = await (isDesigner(env)\n ? getCanvasInDesn(chartEl.current)\n : getCanvasInTaro(chartId.current));\n _chart.ref = new F2.Chart({\n ...options,\n plugins: [PieLabel],\n });\n\n if (!_chart.ref) {\n return;\n }\n\n canvasEl.current = _chart.ref.get(\"el\");\n setChart(_chart.ref);\n })();\n\n return () => {\n _chart.ref?.destroy?.();\n };\n }, []);\n\n const Canvas = useCallback((props) => {\n if (isDesigner(env)) {\n return <canvas ref={chartEl} {...props} />;\n }\n return <TaroCanvas {...props} />;\n }, []);\n\n const handleEvent = useCallback((type) => {\n return isDesigner(env)\n ? (e) => {}\n : (e) => canvasEl.current?.dispatchEvent(type, wrapEvent(e));\n }, []);\n\n const events = useMemo(() => {\n return {\n onClick: handleEvent(\"click\"),\n onTouchStart: handleEvent(\"touchstart\"),\n onTouchMove: handleEvent(\"touchmove\"),\n onTouchEnd: handleEvent(\"touchend\"),\n };\n }, []);\n\n return {\n chart,\n id: chartId.current,\n type: \"2d\",\n Canvas,\n events,\n };\n};\n\nfunction wrapEvent(e: any) {\n if (!e) return;\n if (!e.preventDefault) {\n e.preventDefault = function () {};\n }\n return e;\n}\n\nfunction uuid(pre = \"c_\", len = 6) {\n const seed = \"abcdefhijkmnprstwxyz0123456789\",\n maxPos = seed.length;\n let rtn = \"\";\n for (let i = 0; i < len; i++) {\n rtn += seed.charAt(Math.floor(Math.random() * maxPos));\n }\n return pre + rtn;\n}\n\nfunction isDesigner(env): Boolean {\n if (env?.edit || env?.runtime?.debug) {\n return true;\n } else {\n return false;\n }\n}\n"
|
|
649
|
+
}
|
|
650
|
+
]
|
|
651
|
+
},
|
|
652
|
+
{
|
|
653
|
+
"path": "src/components/chart/utils/editor",
|
|
654
|
+
"content": null,
|
|
655
|
+
"children": [
|
|
656
|
+
{
|
|
657
|
+
"path": "src/components/chart/utils/editor/index.ts",
|
|
658
|
+
"content": "import { ChartType, isGroupChart } from \"./../../types\";\n\nexport const getChartTypeEditors = ({ options }) => {\n return {\n title: \"类型\",\n type: \"Select\",\n options: options,\n value: {\n get({ data }: EditorResult<Data>) {\n return data.type;\n },\n set({ data, input, output }: EditorResult<Data>, value: string) {\n if (isGroupChart(value as any)) {\n if (!data.config?.seriesField) {\n data.config.seriesField = \"type\";\n }\n }\n\n data.type = value;\n\n // if (value === 'step') {\n // data.config = {\n // ...data.config,\n // stepType: 'vh',\n // seriesField: ''\n // };\n // } else if (value === 'more') {\n // data.config = {\n // ...data.config,\n // stepType: '',\n // seriesField: data.config.seriesField || 'category'\n // };\n // } else {\n // data.config = {\n // ...data.config,\n // stepType: '',\n // seriesField: ''\n // };\n // }\n // setSchema(data, input, output);\n },\n },\n };\n};\n\nexport const getNormalDataEditors = (config) => {\n return {\n title: \"数据映射\",\n items: [\n {\n title: \"x横轴字段名\",\n type: \"Text\",\n description: \"横轴映射对应的数据字段名\",\n value: {\n get({ data }: EditorResult<Data>) {\n return data.config.xField || \"label\";\n },\n set({ data, input, output }: EditorResult<Data>, value: string) {\n data.config.xField = value;\n // setSchema(data, input, output);\n },\n },\n },\n {\n ifVisible({ data }) {\n return [\n ChartType.Column,\n ChartType.ColumnStack,\n ChartType.ColumnGroup,\n ChartType.Line,\n ChartType.LineMuti,\n ].includes(data.type);\n },\n title: \"x轴刻度线的条数\",\n description: \"0显示全部\",\n type: \"text\",\n options: {\n type: \"number\",\n },\n value: {\n get({ data }) {\n return data.config.xFieldTickCount || 0;\n },\n set({ data }, value) {\n data.config.xFieldTickCount = value;\n },\n },\n },\n {\n ifVisible({ data }) {\n return config.xFieldScrollable;\n },\n title: \"x横轴支持平移\",\n type: \"Switch\",\n value: {\n get({ data }) {\n return data.config.xFieldScrollable;\n },\n set({ data }, value) {\n data.config.xFieldScrollable = value;\n },\n },\n },\n {\n ifVisible({ data }) {\n return data.config.xFieldScrollable;\n },\n title: \"每屏展示个数\",\n type: \"text\",\n options: {\n type: \"number\",\n },\n value: {\n get({ data }) {\n return data.config.xFieldCount;\n },\n set({ data }, value) {\n data.config.xFieldCount = value;\n },\n },\n },\n {\n ifVisible({ data }) {\n return config.xFieldRotate;\n },\n title: \"x轴顺时针旋转角度\",\n type: \"radio\",\n options: [\n { label: \"不旋转\", value: 0 },\n { label: \"45度\", value: 4 },\n { label: \"90度\", value: 2 },\n ],\n value: {\n get({ data }) {\n return data.config.xFieldRotate || 0;\n },\n set({ data }, value) {\n data.config.xFieldRotate = value;\n },\n },\n },\n {\n title: \"y纵轴字段名\",\n type: \"Text\",\n description: \"纵轴映射对应的数据字段名\",\n value: {\n get({ data }: EditorResult<Data>) {\n return data.config.yField || \"value\";\n },\n set({ data, input, output }: EditorResult<Data>, value: string) {\n data.config.yField = value;\n // setSchema(data, input, output);\n },\n },\n },\n {\n ifVisible({ data }) {\n return config.yFieldDisplay;\n },\n title: \"Y 轴显示字段名\",\n type: \"switch\",\n value: {\n get({ data }) {\n return data.config.yFieldDisplay;\n },\n set({ data }, value) {\n data.config.yFieldDisplay = value;\n },\n },\n },\n {\n title: \"分组字段名\",\n type: \"Text\",\n description: \"聚合维度对应的数据字段名\",\n ifVisible({ data }) {\n return [\n ChartType.ColumnGroup,\n ChartType.ColumnStack,\n ChartType.LineMuti,\n ].includes(data.type);\n },\n value: {\n get({ data }: EditorResult<Data>) {\n return data.config.seriesField || \"type\";\n },\n set({ data, input, output }: EditorResult<Data>, value: string) {\n data.config.seriesField = value;\n // setSchema(data, input, output);\n },\n },\n },\n ],\n };\n};\n\nexport const getLegendEditors = ({}) => {\n return {\n title: \"图例\",\n // ifVisible({ data }: EditorResult<Data>) {\n // console.log(data.type)\n // return [ChartType.Column, ChartType.ColumnStack, ChartType.ColumnGroup, ChartType.LineMuti].includes(data.type);\n // },\n items: [\n {\n title: \"图例\",\n type: \"Switch\",\n value: {\n get({ data }: EditorResult<Data>) {\n if (typeof data.config.legend === \"boolean\") {\n return data.config.legend;\n } else {\n return true;\n }\n },\n set({ data }: EditorResult<Data>, value: boolean) {\n if (!value) {\n data.config.legend = false;\n } else {\n data.config.legend = { position: \"right\" };\n }\n },\n },\n },\n // {\n // title: '单击图例复制名称',\n // type: 'Switch',\n // ifVisible({ data }: EditorResult<Data>) {\n // return !!data.config.legend;\n // },\n // value: {\n // get({ data }: EditorResult<Data>) {\n // return data.copyLegendTextOnClick;\n // },\n // set({ data }: EditorResult<Data>, value: boolean) {\n // data.copyLegendTextOnClick = value;\n // }\n // }\n // },\n {\n title: \"位置\",\n type: \"Select\",\n ifVisible({ data }: EditorResult<Data>) {\n return !!data.config.legend;\n },\n options: [\n { label: \"左上\", value: \"top-left\" },\n { label: \"顶部\", value: \"top\" },\n { label: \"右上\", value: \"top-right\" },\n { label: \"底部\", value: \"bottom\" },\n { label: \"左下\", value: \"bottom-left\" },\n { label: \"左侧\", value: \"left\" },\n { label: \"右下\", value: \"bottom-right\" },\n { label: \"右侧\", value: \"right\" },\n ],\n value: {\n get({ data }: EditorResult<Data>) {\n if (typeof data.config.legend === \"boolean\") {\n return data.config.legend;\n }\n\n return data.config.legend?.position;\n },\n set({ data }: EditorResult<Data>, value: any) {\n if (typeof data.config.legend !== \"boolean\") {\n data.config.legend.position = value;\n data.config.legend = { ...data.config.legend };\n }\n },\n },\n },\n // {\n // title: 'x轴方向偏移',\n // type: 'text',\n // ifVisible({ data }: EditorResult<Data>) {\n // return !!data.config.legend;\n // },\n // value: {\n // get({ data }: EditorResult<Data>) {\n // return data.config.legend.offsetX;\n // },\n // set({ data }: EditorResult<Data>, value: string) {\n // data.config.legend.offsetX = Number(value);\n // data.config.legend = { ...data.config.legend };\n // }\n // }\n // },\n // {\n // title: 'y轴方向偏移',\n // type: 'text',\n // ifVisible({ data }: EditorResult<Data>) {\n // return !!data.config.legend;\n // },\n // value: {\n // get({ data }: EditorResult<Data>) {\n // return data.config.legend.offsetY;\n // },\n // set({ data }: EditorResult<Data>, value: string) {\n // data.config.legend.offsetY = Number(value);\n // data.config.legend = { ...data.config.legend };\n // }\n // }\n // }\n ],\n };\n};\n\nexport const getGeoEditors = ({}) => {\n return {\n title: \"图形配置\",\n items: [\n {\n title: \"线条\",\n catelog: \"线条\",\n items: [\n {\n title: \"展示\",\n type: \"switch\",\n value: {\n get({ data }: EditorResult<Data>) {\n return !!data.geo?.line?.show;\n },\n set({ data, input, output }: EditorResult<Data>, value: string) {\n data.geo.line = {\n ...data.geo.line,\n show: value,\n };\n },\n },\n },\n {\n title: \"顺滑曲线\",\n type: \"switch\",\n value: {\n get({ data }: EditorResult<Data>) {\n return !!data.geo?.line?.smooth;\n },\n set({ data, input, output }: EditorResult<Data>, value: string) {\n data.geo.line = {\n ...data.geo.line,\n smooth: value,\n };\n },\n },\n },\n ],\n },\n {\n title: \"节点\",\n catelog: \"节点\",\n items: [\n {\n title: \"展示\",\n type: \"switch\",\n value: {\n get({ data }: EditorResult<Data>) {\n return !!data.geo?.dot?.show;\n },\n set({ data, input, output }: EditorResult<Data>, value: string) {\n data.geo.dot = {\n ...data.geo.dot,\n show: value,\n };\n },\n },\n },\n ],\n },\n {\n title: \"面积\",\n catelog: \"面积\",\n items: [\n {\n title: \"展示\",\n type: \"switch\",\n value: {\n get({ data }: EditorResult<Data>) {\n return !!data.geo?.area?.show;\n },\n set({ data, input, output }: EditorResult<Data>, value: string) {\n data.geo.area = {\n ...data.geo.area,\n show: value,\n };\n },\n },\n },\n ],\n },\n ],\n };\n};\n"
|
|
659
|
+
}
|
|
660
|
+
]
|
|
661
|
+
},
|
|
662
|
+
{
|
|
663
|
+
"path": "src/components/chart/utils/mock.ts",
|
|
664
|
+
"content": "import { ChartType, isGroupChart } from './../types'\n\nexport const MockData = {\n default: [\n { label: '1991', value: 3 },\n { label: '1992', value: 4 },\n { label: '1993', value: 3.5 },\n { label: '1994', value: 5 },\n { label: '1995', value: 4.9 },\n { label: '1996', value: 6 },\n { label: '1997', value: 7 },\n { label: '1998', value: 9 },\n { label: '1999', value: 13 }\n ],\n group: [\n { label: '1991', value: 3, type: 'London' },\n { label: '1992', value: 4, type: 'London' },\n { label: '1993', value: 3.5, type: 'London' },\n { label: '1994', value: 5, type: 'London' },\n { label: '1995', value: 4.9, type: 'London' },\n { label: '1996', value: 6, type: 'London' },\n { label: '1997', value: 7, type: 'London' },\n { label: '1998', value: 9, type: 'London' },\n { label: '1999', value: 13, type: 'London' },\n { label: '1991', value: 1, type: 'Paris' },\n { label: '1992', value: 3, type: 'Paris' },\n { label: '1993', value: 4.6, type: 'Paris' },\n { label: '1994', value: 5, type: 'Paris' },\n { label: '1995', value: 8, type: 'Paris' },\n { label: '1996', value: 13, type: 'Paris' },\n { label: '1997', value: 12, type: 'Paris' },\n { label: '1998', value: 19, type: 'Paris' },\n { label: '1999', value: 20, type: 'Paris' },\n ],\n percent: [\n { label: '极氪001', value: 60 },\n { label: '小米su7', value: 30 },\n { label: 'model3', value: 90 },\n { label: '小鹏P7i', value: 5 },\n { label: '蔚来ET5', value: 17 },\n { label: '海豹', value: 13 },\n ]\n}\n\n\n/**\n *\n * @param arr 原数据\n * @param Field 新key 按 x,y,分类\n * @param defaultKey 原数据key 按 x,y,分类\n * @returns\n */\nexport const changeMockDataField = (\n arr: Array<Record<string, any>>,\n Field: { xField: string; yField: string; seriesField?: string },\n defaultKey?: { x?: string; y?: string; category?: string }\n): Array<Record<string, any>> => {\n const { xField, yField, seriesField } = Field;\n const { x = 'label', y = 'value', category = 'type' } = defaultKey || {};\n\n return arr.map((item) => ({\n [xField]: item[x],\n [yField]: item[y],\n [seriesField]: item?.[category]\n }));\n};\n\n\nexport const mockLineChart = (config) => {\n return changeMockDataField(MockData.default, config)\n}\n\n\nexport const mockPieChart = (chartType, data) => {\n return changeMockDataField(MockData.percent, data.config);\n}\n\nexport const mockChart = (chartType, data) => {\n return changeMockDataField(isGroupChart(chartType) ? MockData.group : MockData.default, data.config)\n}"
|
|
665
|
+
}
|
|
666
|
+
]
|
|
667
|
+
}
|
|
668
|
+
]
|
|
669
|
+
},
|
|
370
670
|
{
|
|
371
671
|
"path": "src/components/checkList",
|
|
372
672
|
"content": null,
|
|
@@ -3287,7 +3587,7 @@
|
|
|
3287
3587
|
},
|
|
3288
3588
|
{
|
|
3289
3589
|
"path": "src/components/qrcode/runtime.tsx",
|
|
3290
|
-
"content": "import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { View, Image } from \"@tarojs/components\";\
|
|
3590
|
+
"content": "import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { View, Image } from \"@tarojs/components\";\nimport QRCode from \"qrcode-generator\";\nimport { isString } from \"./../utils/core\";\nimport css from \"./style.less\";\n\nexport default function ({ env, data, inputs, outputs, title, style }) {\n const [qrCode, setQrCode] = useState(\"\");\n useMemo(() => {\n inputs[\"setValue\"]?.((val) => {\n if (isString(val)) {\n data.text = val;\n }\n });\n }, []);\n\n useEffect(() => {\n if (data.text) {\n const qr = QRCode(0, \"L\");\n const utf8Text = unescape(encodeURIComponent(data.text));\n qr.addData(utf8Text, \"Byte\");\n qr.make();\n const url = qr.createDataURL(10, 0);\n setQrCode(url);\n } else {\n setQrCode(\"\");\n }\n }, [data.text]);\n\n return (\n <View className={css.code}>\n {data.mode === \"qrcode\" && qrCode && (\n <Image\n mode=\"widthFix\"\n style={{ display: \"block\", width: \"100%\", height: \"100%\" }}\n src={qrCode}\n ></Image>\n )}\n </View>\n );\n}\n"
|
|
3291
3591
|
},
|
|
3292
3592
|
{
|
|
3293
3593
|
"path": "src/components/qrcode/style.less",
|
|
@@ -5193,7 +5493,7 @@
|
|
|
5193
5493
|
},
|
|
5194
5494
|
{
|
|
5195
5495
|
"path": "src/components/index.ts",
|
|
5196
|
-
"content": "// 系统\nexport { default as SystemPage } from \"./system/systemPage/runtime\";\n\n// 基础\nexport { default as Image } from \"./image/runtime\";\nexport { default as Video } from \"./video/runtime\";\nexport { default as Button } from \"./button/runtime\";\nexport { default as Text } from \"./text/runtime\";\nexport { default as RichText } from \"./richText/runtime\";\nexport { default as Swiper } from \"./swiper/runtime\";\nexport { default as Icon } from \"./icon/runtime\";\n\n// 容器\nexport { default as ContainerBasic } from \"./containerBasic/runtime\";\nexport { default as Tabs2 } from \"./tabs2/runtime\";\nexport { default as ContainerList } from \"./containerList/runtime\";\nexport { default as Popup } from \"./popup/runtime\";\
|
|
5496
|
+
"content": "// 系统\nexport { default as SystemPage } from \"./system/systemPage/runtime\";\n\n// 基础\nexport { default as Image } from \"./image/runtime\";\nexport { default as Video } from \"./video/runtime\";\nexport { default as Button } from \"./button/runtime\";\nexport { default as Text } from \"./text/runtime\";\nexport { default as RichText } from \"./richText/runtime\";\nexport { default as Swiper } from \"./swiper/runtime\";\nexport { default as Icon } from \"./icon/runtime\";\n\n// 容器\nexport { default as ContainerBasic } from \"./containerBasic/runtime\";\nexport { default as Tabs2 } from \"./tabs2/runtime\";\nexport { default as ContainerList } from \"./containerList/runtime\";\nexport { default as Popup } from \"./popup/runtime\";\nexport { default as ContainerWaterfall } from \"./containerWaterfall/runtime\";\nexport { default as ContainerCondition2 } from \"./containerCondition2/runtime\";\nexport { default as Sidebar2 } from \"./sidebar2/runtime\";\n\n// 数据录入\nexport { default as FormContainer } from \"./formContainer/runtime\";\nexport { default as FormInput } from \"./formInput/runtime\";\nexport { default as FormStepper } from \"./formStepper/runtime\";\nexport { default as FormTextarea } from \"./formTextarea/runtime\";\nexport { default as FormPassword } from \"./formPassword/runtime\";\nexport { default as FormRadio } from \"./formRadio/runtime\";\nexport { default as FormCheckbox } from \"./formCheckbox/runtime\";\nexport { default as FormSwitch } from \"./formSwitch/runtime\";\nexport { default as FormRate } from \"./formRate/runtime\";\nexport { default as FormSelect } from \"./formSelect/runtime\";\nexport { default as FormDatetime } from \"./formDatetime/runtime\";\nexport { default as FormLocation } from \"./formLocation/runtime\";\nexport { default as FormPhoneNumber } from \"./formPhoneNumber/runtime\";\nexport { default as FormPhoneSMS } from \"./formPhoneSMS/runtime\";\nexport { default as FormImageUploader } from \"./formImageUploader/runtime\";\nexport { default as FormFileUploader } from \"./formFileUploader/runtime\";\nexport { default as FormEditor } from \"./formEditor/runtime\";\nexport { default as SearchBar } from \"./searchBar/runtime\";\nexport { default as SmsInput } from \"./smsInput/runtime\";\nexport { default as FormItemContainer } from \"./formItemContainer/runtime\";\nexport { default as FormAdditionContainer } from \"./formAdditionContainer/runtime\";\n\n// 数据展示\nexport { default as Table } from \"./table/runtime\";\nexport { default as Cell } from \"./cell/runtime\";\nexport { default as CheckList } from \"./checkList/runtime\";\nexport { default as FilterContainer } from \"./filter-coms/contaniner/runtime\";\nexport { default as FilterSort } from \"./filter-coms/sort/runtime\";\nexport { default as FilterSwitch } from \"./filter-coms/switch/runtime\";\nexport { default as FilterCustom } from \"./filter-coms/custom/runtime\";\nexport { default as Calendar } from \"./calendar/runtime\";\nexport { default as Cascader } from \"./cascader/runtime\";\nexport { default as Qrcode } from \"./qrcode/runtime\";\n\n// 微信\nexport { default as Map } from \"./map/runtime\";\nexport { default as AdPopup } from \"./ad-popup/runtime\";\nexport { default as ChannelVideo } from \"./channelVideo/runtime\";\n\n// 其它\nexport { default as Line } from \"./line/runtime\";\nexport { default as Anchor } from \"./anchor/runtime\";\nexport { default as Support } from \"./support/runtime\";\n\n// 图表组件\nexport { default as ChartColumn } from \"./chart/chart-column/runtime\";\nexport { default as ChartLine } from \"./chart/chart-line/runtime\";\nexport { default as ChartPie } from \"./chart/chart-pie/runtime\";\nexport { default as ChartRadar } from \"./chart/chart-radar/runtime\";\nexport { default as ChartRingProgress } from \"./chart/chart-ringProgress/runtime\";\n"
|
|
5197
5497
|
}
|
|
5198
5498
|
]
|
|
5199
5499
|
},
|
|
@@ -5310,8 +5610,8 @@
|
|
|
5310
5610
|
"content": "import Taro from '@tarojs/taro';\n\nexport type DataType = {\n type?: 'short' | 'long';\n duration?: number;\n};\n\nexport interface Inputs {\n vibrate?: (fn: (config: DataType, relOutputs?: any) => void) => void;\n}\n\nexport interface Outputs {\n onSuccess: (value?: any) => void;\n onFail: (value?: any) => void;\n}\n\ninterface IOContext {\n data: DataType;\n inputs: Inputs;\n outputs: Outputs;\n}\n\nexport default (context: IOContext) => {\n const data: DataType = context.data;\n const inputs: Inputs = context.inputs;\n const outputs: Outputs = context.outputs;\n\n inputs.vibrate?.((val: DataType) => {\n try {\n const type = val?.type || data.type || 'short';\n\n if (type === 'long') {\n Taro.vibrateLong({\n success: () => outputs.onSuccess('长振动成功'),\n fail: (err) => outputs.onFail(err.errMsg || '长振动失败'),\n });\n } else {\n Taro.vibrateShort({\n success: () => outputs.onSuccess('短振动成功'),\n fail: (err) => outputs.onFail(err.errMsg || '短振动失败'),\n });\n }\n } catch (error: any) {\n console.error('设备振动失败:', error);\n outputs.onFail(error?.message || '设备振动失败');\n }\n });\n};\n"
|
|
5311
5611
|
},
|
|
5312
5612
|
{
|
|
5313
|
-
"path": "src/core/comlib/
|
|
5314
|
-
"content": "// 显示提示消息\nexport { default as mybricks_taro_showToast } from './_ShowToast';\nexport type { DataType as mybricks_taro_showToast_DataType } from './_ShowToast';\n\n// 扫码\nexport { default as mybricks_taro_scanQrcode } from './_ScanQrcode';\nexport type { DataType as mybricks_taro_scanQrcode_DataType } from './_ScanQrcode';\n\n// 本地存储\nexport { default as mybricks_taro_setStorage } from './_SetStorage';\nexport type { DataType as mybricks_taro_setStorage_DataType } from './_SetStorage';\n\nexport { default as mybricks_taro_getStorage } from './_GetStorage';\nexport type { DataType as mybricks_taro_getStorage_DataType } from './_GetStorage';\n\nexport { default as mybricks_taro_removeStorage } from './_RemoveStorage';\nexport type { DataType as mybricks_taro_removeStorage_DataType } from './_RemoveStorage';\n\n// 地理位置\nexport { default as mybricks_taro_getLocation } from './_GetLocation';\nexport type { DataType as mybricks_taro_getLocation_DataType } from './_GetLocation';\n\n// 设备功能\nexport { default as mybricks_taro_vibrate } from './_Vibrate';\nexport type { DataType as mybricks_taro_vibrate_DataType } from './_Vibrate';\n\nexport { default as mybricks_taro_callPhone } from './_CallPhone';\nexport type { DataType as mybricks_taro_callPhone_DataType } from './_CallPhone';\n\nexport { default as mybricks_taro_openCamera } from './_OpenCamera';\nexport type { DataType as mybricks_taro_openCamera_DataType } from './_OpenCamera';\n\n// 系统功能\nexport { default as mybricks_taro_openUrl } from './_OpenUrl';\nexport type { DataType as mybricks_taro_openUrl_DataType } from './_OpenUrl';\n\nexport { default as mybricks_taro_share } from './_Share';\nexport type { DataType as mybricks_taro_share_DataType } from './_Share';\n\nexport { default as mybricks_taro_getSystemInfo } from './_GetSystemInfo';\nexport type { DataType as mybricks_taro_getSystemInfo_DataType } from './_GetSystemInfo';\n\n// 数据处理\nexport { default as mybricks_taro_aesEncode } from './_AesEncode';\nexport type { DataType as mybricks_taro_aesEncode_DataType } from './_AesEncode';\n\n// 模态对话框\nexport { default as mybricks_taro_modal } from './_Modal';\nexport type { DataType as mybricks_taro_modal_DataType } from './_Modal';\n\nexport { default as mybricks_taro_format } from './_Format';\nexport type { DataType as mybricks_taro_format_DataType } from './_Format';\n\n// 文件和媒体\nexport { default as mybricks_taro_chooseFile } from './_ChooseFile';\nexport type { DataType as mybricks_taro_chooseFile_DataType } from './_ChooseFile';\n\nexport { default as mybricks_taro_chooseMedia } from './_ChooseMedia';\nexport type { DataType as mybricks_taro_chooseMedia_DataType } from './_ChooseMedia';\n\n// 网络请求\nexport { default as mybricks_taro_connector } from './_Connector';\nexport type { DataType as mybricks_taro_connector_DataType } from './_Connector';\n\nexport { default as mybricks_taro_connectorGlobalHeaders } from './_ConnectorGlobalHeaders';\nexport type { DataType as mybricks_taro_connectorGlobalHeaders_DataType } from './_ConnectorGlobalHeaders';\n\n// 导航和路由\nexport { default as
|
|
5613
|
+
"path": "src/core/comlib/Index.ts",
|
|
5614
|
+
"content": "// 显示提示消息\nexport { default as mybricks_taro_showToast } from './_ShowToast';\nexport type { DataType as mybricks_taro_showToast_DataType } from './_ShowToast';\n\n// 扫码\nexport { default as mybricks_taro_scanQrcode } from './_ScanQrcode';\nexport type { DataType as mybricks_taro_scanQrcode_DataType } from './_ScanQrcode';\n\n// 本地存储\nexport { default as mybricks_taro_setStorage } from './_SetStorage';\nexport type { DataType as mybricks_taro_setStorage_DataType } from './_SetStorage';\n\nexport { default as mybricks_taro_getStorage } from './_GetStorage';\nexport type { DataType as mybricks_taro_getStorage_DataType } from './_GetStorage';\n\nexport { default as mybricks_taro_removeStorage } from './_RemoveStorage';\nexport type { DataType as mybricks_taro_removeStorage_DataType } from './_RemoveStorage';\n\n// 地理位置\nexport { default as mybricks_taro_getLocation } from './_GetLocation';\nexport type { DataType as mybricks_taro_getLocation_DataType } from './_GetLocation';\n\n// 设备功能\nexport { default as mybricks_taro_vibrate } from './_Vibrate';\nexport type { DataType as mybricks_taro_vibrate_DataType } from './_Vibrate';\n\nexport { default as mybricks_taro_callPhone } from './_CallPhone';\nexport type { DataType as mybricks_taro_callPhone_DataType } from './_CallPhone';\n\nexport { default as mybricks_taro_openCamera } from './_OpenCamera';\nexport type { DataType as mybricks_taro_openCamera_DataType } from './_OpenCamera';\n\n// 系统功能\nexport { default as mybricks_taro_openUrl } from './_OpenUrl';\nexport type { DataType as mybricks_taro_openUrl_DataType } from './_OpenUrl';\n\nexport { default as mybricks_taro_share } from './_Share';\nexport type { DataType as mybricks_taro_share_DataType } from './_Share';\n\nexport { default as mybricks_taro_getSystemInfo } from './_GetSystemInfo';\nexport type { DataType as mybricks_taro_getSystemInfo_DataType } from './_GetSystemInfo';\n\n// 数据处理\nexport { default as mybricks_taro_aesEncode } from './_AesEncode';\nexport type { DataType as mybricks_taro_aesEncode_DataType } from './_AesEncode';\n\n// 模态对话框\nexport { default as mybricks_taro_modal } from './_Modal';\nexport type { DataType as mybricks_taro_modal_DataType } from './_Modal';\n\nexport { default as mybricks_taro_format } from './_Format';\nexport type { DataType as mybricks_taro_format_DataType } from './_Format';\n\n// 文件和媒体\nexport { default as mybricks_taro_chooseFile } from './_ChooseFile';\nexport type { DataType as mybricks_taro_chooseFile_DataType } from './_ChooseFile';\n\nexport { default as mybricks_taro_chooseMedia } from './_ChooseMedia';\nexport type { DataType as mybricks_taro_chooseMedia_DataType } from './_ChooseMedia';\n\n// 网络请求\nexport { default as mybricks_taro_connector } from './_Connector';\nexport type { DataType as mybricks_taro_connector_DataType } from './_Connector';\n\nexport { default as mybricks_taro_connectorGlobalHeaders } from './_ConnectorGlobalHeaders';\nexport type { DataType as mybricks_taro_connectorGlobalHeaders_DataType } from './_ConnectorGlobalHeaders';\n\n// 导航和路由\nexport { default as mybricks_taro_navigateBack } from './_BackTo';\nexport type { DataType as mybricks_taro_navigateBack_DataType } from './_BackTo';\n\nexport { default as mybricks_taro_router } from './_Router';\nexport type { DataType as mybricks_taro_router_DataType } from './_Router';\n\nexport { default as mybricks_taro_openPetalMap } from './_OpenPetalMap';\nexport type { DataType as mybricks_taro_openPetalMap_DataType } from './_OpenPetalMap';\n\n// 语音和多媒体\nexport { default as mybricks_taro_textToSpeech } from './_TextToSpeech';\nexport type { DataType as mybricks_taro_textToSpeech_DataType } from './_TextToSpeech';\n\n// 定时器\nexport { default as mybricks_taro_timerDebounce } from './_TimerDebounce';\nexport type { DataType as mybricks_taro_timerDebounce_DataType } from './_TimerDebounce';\n\nexport { default as mybricks_taro_timerDelay } from './_TimerDelay';\nexport type { DataType as mybricks_taro_timerDelay_DataType } from './_TimerDelay';\n\nexport { default as mybricks_taro_timerThrottle } from './_TimerThrottle';\nexport type { DataType as mybricks_taro_timerThrottle_DataType } from './_TimerThrottle';\n\n"
|
|
5315
5615
|
}
|
|
5316
5616
|
]
|
|
5317
5617
|
},
|
|
@@ -5353,7 +5653,7 @@
|
|
|
5353
5653
|
},
|
|
5354
5654
|
{
|
|
5355
5655
|
"path": "src/core/mybricks/log.js",
|
|
5356
|
-
"content": "export const log = (...args) => {\n console.log(\"[MyBricks]\", ...args)\n}\n\nexport const logger = {\n info: log,\n warn: log,\n error: log,\n}\n\n"
|
|
5656
|
+
"content": "export const log = (...args) => {\n // console.log(\"[MyBricks]\", ...args)\n}\n\nexport const logger = {\n info: log,\n warn: log,\n error: log,\n}\n\n"
|
|
5357
5657
|
},
|
|
5358
5658
|
{
|
|
5359
5659
|
"path": "src/core/mybricks/MyBricksDescriptor.js",
|
|
@@ -5383,7 +5683,7 @@
|
|
|
5383
5683
|
},
|
|
5384
5684
|
{
|
|
5385
5685
|
"path": "src/core/utils/hooks.ts",
|
|
5386
|
-
"content": "import { useState, useRef, useMemo } from 'react';\nimport { createReactiveInputHandler } from '../mybricks/createReactiveInputHandler';\n\n
|
|
5686
|
+
"content": "import { useState, useRef, useMemo, useEffect } from 'react';\nimport { createReactiveInputHandler } from '../mybricks/createReactiveInputHandler';\nimport { useAppContext, useParentSlot } from './ComContext';\n\n/** 深度代理:支持响应式更新 */\nexport function deepProxy(target: any, onSet?: () => void): any {\n if (target === null || typeof target !== 'object' || target.__isProxy) return target;\n\n return new Proxy(target, {\n get(obj, prop) {\n if (prop === '__isProxy') return true;\n if (prop === 'toJSON') return () => obj;\n\n const value = obj[prop];\n if (typeof value === 'object' && value !== null && !value.__isProxy) {\n obj[prop] = deepProxy(value, onSet);\n }\n return obj[prop];\n },\n set(obj, prop, value) {\n const result = Reflect.set(obj, prop, value);\n onSet?.();\n return result;\n }\n });\n}\n\n/** 状态 Hook:提供响应式数据能力 */\nexport function useModel(rawData: any) {\n const [, forceUpdate] = useState({});\n const dataRef = useRef(rawData || {});\n\n return useMemo(() => deepProxy(dataRef.current, () => forceUpdate({})), []);\n}\n\n/** \n * 组件引用代理:\n * 1. 自动缓冲:访问未渲染组件时返回影子对象,缓冲后续指令\n * 2. 引用渗透:子作用域注册的真实引用自动同步至父级\n * 3. 自动同步清理:卸载时从作用域链中彻底移除,防止僵尸引用\n */\nexport function proxyRefs(target: any, parentComRefs?: any, globalTodoPool?: Map<string, any[]>): any {\n return new Proxy(target, {\n get(obj, prop) {\n if (prop === '__isProxy') return true;\n if (prop === 'toJSON') return () => obj;\n\n if (typeof prop === 'string' && prop.startsWith('u_') && obj[prop] === undefined) {\n // 懒加载影子对象\n return (obj[prop] = new Proxy({ __isShadow: true }, {\n get(_, method: string) {\n if (method === '__isShadow') return true;\n return (...args: any[]) => {\n if (!(globalTodoPool instanceof Map)) return;\n\n const instances = globalTodoPool.get(prop) || [];\n if (!globalTodoPool.has(prop)) globalTodoPool.set(prop, instances);\n\n const index = obj.$index ?? 0;\n const todo = instances[index] || (instances[index] = {});\n todo[method] = args;\n };\n }\n }));\n }\n return obj[prop];\n },\n set(obj, prop, value) {\n const result = Reflect.set(obj, prop, value);\n const isRealRef = typeof prop === 'string' && !prop.startsWith('$') && value?.__isShadow !== true;\n\n if (isRealRef && parentComRefs?.current) {\n try { parentComRefs.current[prop] = value; } catch {}\n }\n return result;\n },\n deleteProperty(obj, prop) {\n const result = Reflect.deleteProperty(obj, prop);\n const isRealRef = typeof prop === 'string' && !prop.startsWith('$');\n\n if (isRealRef && parentComRefs?.current) {\n try { delete parentComRefs.current[prop]; } catch {}\n }\n return result;\n }\n });\n}\n\n/** \n * 组件输入绑定 Hook:\n * 1. 注册输入执行器\n * 2. 自动重放缓冲指令(精准索引匹配)\n * 3. 生命周期自动化:卸载时自动注销引用渗透路径\n */\nexport function useBindInputs(scope: any, id: string, initialHandlers?: Record<string, any>) {\n const handlersRef = useRef<Record<string, any>>({ ...initialHandlers });\n const { globalTodoInputs } = useAppContext();\n const parentSlot = useParentSlot();\n const index = parentSlot?.params?.inputValues?.index ?? 0;\n\n useEffect(() => {\n return () => {\n if (scope?.current) {\n delete scope.current[id];\n }\n };\n }, [scope, id]);\n\n return useMemo(() => {\n const proxy = new Proxy({}, {\n get: (target, pin: string) => {\n if (pin === '__isShadow') return false;\n if (pin === 'toJSON') return () => target;\n\n return (arg: any, ...args: any[]) => {\n if (typeof arg === 'function') {\n handlersRef.current[pin] = arg;\n\n // 处理指令重放\n const instances = globalTodoInputs?.get(id);\n const todo = instances?.[index] || instances?.[0];\n if (todo?.[pin]) {\n const pendingArgs = todo[pin];\n if (pin === '_setData') {\n arg(...pendingArgs);\n } else {\n createReactiveInputHandler({ input: arg, value: pendingArgs[0], rels: {}, title: id });\n }\n delete todo[pin];\n\n // 检查全局清理\n const hasTasks = instances?.some((inst: any) => inst && Object.keys(inst).length > 0);\n if (!hasTasks) globalTodoInputs.delete(id);\n }\n } else {\n const handler = handlersRef.current[pin];\n if (typeof handler === 'function') {\n return pin === '_setData' \n ? handler(arg, ...args) \n : createReactiveInputHandler({ input: handler, value: arg, rels: {}, title: id });\n }\n }\n };\n }\n });\n\n if (scope?.current) scope.current[id] = proxy;\n if (initialHandlers) {\n Object.keys(initialHandlers).forEach(pin => (proxy as any)[pin](initialHandlers[pin]));\n }\n\n return proxy;\n }, [scope, id, globalTodoInputs, index]);\n}\n\n/** 组件事件绑定 Hook */\nexport function useBindEvents(props: any, context?: { id: string, name: string, parentSlot?: any }) {\n return useMemo(() => {\n const events: Record<string, any> = {};\n\n Object.keys(props).forEach(key => {\n if (typeof props[key] === 'function') {\n const handler = props[key];\n const wrapped = (original: any) => {\n const value = context?.parentSlot?.params?.itemWrap \n ? { id: context.id, name: context.name, value: original } \n : original;\n return handler(value);\n };\n wrapped.getConnections = () => [{ id: 'default' }];\n events[key] = wrapped;\n }\n });\n\n return new Proxy(events, {\n get(target, key: string) {\n if (typeof key === 'string' && key.startsWith('on')) {\n if (target[key]) return target[key];\n const fn: any = () => {};\n fn.getConnections = () => [];\n return fn;\n }\n return target[key];\n }\n });\n }, [props, context]);\n}\n"
|
|
5387
5687
|
},
|
|
5388
5688
|
{
|
|
5389
5689
|
"path": "src/core/utils/index.ts",
|
|
@@ -5403,15 +5703,15 @@
|
|
|
5403
5703
|
},
|
|
5404
5704
|
{
|
|
5405
5705
|
"path": "src/core/utils/slots.tsx",
|
|
5406
|
-
"content": "import React, { useMemo, useRef } from \"react\";\nimport ComContext, { SlotProvider, useAppContext, useParentSlot } from \"./ComContext\";\nimport { createReactiveInputHandler } from \"../mybricks/createReactiveInputHandler\";\n\ntype AnyRecord = Record<string, any>;\n\ntype SlotState = {\n inputs: any;\n outputs: any;\n _inputs: any;\n /** scopeId -> scoped comRefs(每个 scope 一套,避免列表多实例覆盖) */\n _scopedComRefs?: Record<string, any>;\n _render?: any;\n render: (params?: any) => any;\n};\n\nfunction SlotParamsBridge(props: {\n state: SlotState;\n params: any;\n render?: any;\n children?: React.ReactNode;\n}) {\n const parentSlot = useParentSlot<any>();\n const mergedParams =\n props.params?.inputValues === undefined && parentSlot?.params?.inputValues\n ? { ...(props.params || {}), inputValues: parentSlot.params.inputValues }\n : props.params;\n\n const SlotComp = props.render;\n const content = SlotComp ? <SlotComp {...(mergedParams || {})} /> : props.children ?? null;\n\n return <SlotProvider value={{ ...props.state, params: mergedParams }}>{content}</SlotProvider>;\n}\n\nfunction createChannelProxy(title: string) {\n const handlersMap: Record<string, any> = {};\n return new Proxy(\n {},\n {\n get: (_t, pin: string) => {\n return (arg: any) => {\n if (typeof arg === \"function\") {\n handlersMap[pin] = arg;\n return;\n }\n const handler = handlersMap[pin];\n if (typeof handler === \"function\") {\n return createReactiveInputHandler({\n input: handler,\n value: arg,\n rels: {},\n title,\n });\n }\n };\n },\n },\n );\n}\n\
|
|
5706
|
+
"content": "import React, { useMemo, useRef } from \"react\";\nimport ComContext, { SlotProvider, useAppContext, useParentSlot } from \"./ComContext\";\nimport { createReactiveInputHandler } from \"../mybricks/createReactiveInputHandler\";\nimport { proxyRefs } from \"./hooks\";\n\ntype AnyRecord = Record<string, any>;\n\ntype SlotState = {\n inputs: any;\n outputs: any;\n _inputs: any;\n /** scopeId -> scoped comRefs(每个 scope 一套,避免列表多实例覆盖) */\n _scopedComRefs?: Record<string, any>;\n _render?: any;\n render: (params?: any) => any;\n};\n\n/**\n * 创建一个具有“向上渗透”和“隔离 Todo 池”能力的 comRefs 对象\n */\nfunction createPenetratingComRefs(parentComRefs: any, globalTodoPool?: Map<string, any>, index: number = 0) {\n const localTarget = { $inputs: {}, $outputs: {}, $index: index };\n return { current: proxyRefs(localTarget, parentComRefs, globalTodoPool) };\n}\n\nfunction SlotParamsBridge(props: {\n state: SlotState;\n params: any;\n render?: any;\n children?: React.ReactNode;\n}) {\n const parentSlot = useParentSlot<any>();\n const mergedParams =\n props.params?.inputValues === undefined && parentSlot?.params?.inputValues\n ? { ...(props.params || {}), inputValues: parentSlot.params.inputValues }\n : props.params;\n\n const SlotComp = props.render;\n const content = SlotComp ? <SlotComp {...(mergedParams || {})} /> : props.children ?? null;\n\n return <SlotProvider value={{ ...props.state, params: mergedParams }}>{content}</SlotProvider>;\n}\n\nfunction createChannelProxy(title: string) {\n const handlersMap: Record<string, any> = {};\n return new Proxy(\n {},\n {\n get: (_t, pin: string) => {\n return (arg: any) => {\n if (typeof arg === \"function\") {\n handlersMap[pin] = arg;\n return;\n }\n const handler = handlersMap[pin];\n if (typeof handler === \"function\") {\n return createReactiveInputHandler({\n input: handler,\n value: arg,\n rels: {},\n title,\n });\n }\n };\n },\n },\n );\n}\n\nexport function useEnhancedSlots(rawSlots: any, id: string) {\n const { comRefs: parentComRefs, globalTodoInputs } = useAppContext();\n const slotStoreRef = useRef<Record<string, SlotState>>({});\n\n return useMemo(() => {\n if (!rawSlots) return {};\n const nextSlots: AnyRecord = {};\n\n Object.entries(rawSlots).forEach(([slotKey, slotDef]: any) => {\n const state =\n slotStoreRef.current[slotKey] ||\n (slotStoreRef.current[slotKey] = {\n inputs: createChannelProxy(`${id}.${slotKey}.inputs`),\n outputs: createChannelProxy(`${id}.${slotKey}.outputs`),\n _inputs: createChannelProxy(`${id}.${slotKey}._inputs`),\n _scopedComRefs: {},\n _render: undefined,\n render: (params?: any) => {\n const r = state._render;\n // 只有存在 key 或 index 时才认为是“多实例作用域插槽”,需要实例隔离\n const rawScope = params?.key ?? params?.inputValues?.index ?? params?.inputValues?.itemData?.id;\n \n if (rawScope === undefined || rawScope === null) {\n return (\n <SlotParamsBridge state={state} params={params} render={r} />\n );\n }\n\n const scopeId = `${id}.${slotKey}::${String(rawScope)}`;\n const index = params?.inputValues?.index ?? 0;\n const scopedComRefs =\n (state._scopedComRefs![scopeId] ||= createPenetratingComRefs(parentComRefs, globalTodoInputs, index));\n\n return (\n <ScopedComContextProvider comRefs={scopedComRefs} scopeId={scopeId}>\n <SlotParamsBridge state={state} params={params} render={r} />\n </ScopedComContextProvider>\n );\n },\n });\n\n state._render = slotDef?.render;\n nextSlots[slotKey] = {\n ...(slotDef || {}),\n render: state.render,\n inputs: state.inputs,\n outputs: state.outputs,\n _inputs: state._inputs,\n };\n });\n\n return nextSlots;\n }, [rawSlots, id, parentComRefs, globalTodoInputs]);\n}\n\nexport function ScopedComContextProvider(props: {\n comRefs?: any;\n scopeId: string;\n children: React.ReactNode;\n}) {\n const parent = useAppContext();\n const value = useMemo(() => {\n return {\n ...parent,\n comRefs: props.comRefs || parent.comRefs,\n $scopeId: props.scopeId,\n } as any;\n }, [parent, props.comRefs, props.scopeId]);\n\n return <ComContext.Provider value={value}>{props.children}</ComContext.Provider>;\n}\n\n/** parentSlot 解析:props 优先,其次用 SlotProvider 注入的 context */\nexport function useResolvedParentSlot(parentSlotProp: any) {\n const parentSlotFromCtx = useParentSlot();\n return parentSlotProp ?? parentSlotFromCtx;\n}\n"
|
|
5407
5707
|
},
|
|
5408
5708
|
{
|
|
5409
5709
|
"path": "src/core/utils/useContext.ts",
|
|
5410
|
-
"content": "import { useRef, useState, useMemo } from 'react'\nimport {
|
|
5710
|
+
"content": "import { useRef, useState, useMemo } from 'react'\nimport { proxyRefs } from './hooks'\n\nconst GLOBAL_TODO_POOL = new Map<string, any[]>();\n\nexport interface ComContextStore {\n comRefs: any;\n $vars: any;\n $fxs: any;\n appContext: any; \n popupState: {\n visible: boolean;\n name: string;\n value: any;\n controller: any;\n };\n setPopupState: (state: any) => void;\n globalTodoInputs: Map<string, any[]>;\n}\n\nexport function useAppCreateContext(id: string): ComContextStore {\n const globalTodoInputs = useRef<Map<string, any[]>>(GLOBAL_TODO_POOL);\n const comRefs = useRef<any>(proxyRefs({ $inputs: {}, $outputs: {} }, undefined, globalTodoInputs.current));\n const $vars = useRef<any>({});\n const $fxs = useRef<any>({});\n\n const [popupState, setPopupState] = useState({\n visible: false,\n name: '',\n value: null,\n controller: null\n });\n\n const appContext = useRef({\n canvas: {\n id,\n },\n runtime: {\n debug: false,\n },\n edit: false,\n isH5: false,\n isDesigner: false,\n isPreview: false,\n isRelease: false,\n isDebug: false,\n isLocal: false,\n isTest: false,\n tabBar: [],\n useTabBar: false,\n }).current;\n\n return useMemo(() => ({\n comRefs,\n $vars,\n $fxs,\n globalTodoInputs: globalTodoInputs.current,\n appContext,\n popupState,\n setPopupState\n }), [popupState]);\n}\n"
|
|
5411
5711
|
},
|
|
5412
5712
|
{
|
|
5413
5713
|
"path": "src/core/utils/with.tsx",
|
|
5414
|
-
"content": "import React, { useState, useEffect } from 'react';\n// @ts-ignore 运行时由宿主项目提供 @tarojs/components\nimport { View } from '@tarojs/components';\nimport { useModel, useBindInputs, useBindEvents, subscribePopupRouter, closeActivePopupRouter } from './index';\nimport { useAppCreateContext } from './useContext';\nimport ComContext, { useAppContext } from './ComContext';\nimport { useEnhancedSlots, useResolvedParentSlot } from './slots';\n// @ts-ignore 运行时由宿主项目提供 @tarojs/taro\nimport { useTabItemTap } from '@tarojs/taro';\n\ninterface WithComProps {\n component: React.ComponentType<any>;\n intputRef?: any;\n id?: string;\n data?: any;\n className?: string;\n style?: any;\n [key: string]: any;\n}\n\nexport const WithCom: React.FC<WithComProps> = (props) => {\n const { component: Component, id = '', data, className, style, ...rest } = props;\n const { comRefs, appContext } = useAppContext();\n const env = appContext; //TODO: 需要根据实际情况修改\n\n const isPopup = (Component as any).isPopup;\n const [show, setShow] = useState(true);\n const [dynamicStyle, setDynamicStyle] = useState({});\n\n\n //数据模型\n const _data = useModel(data || {});\n\n // 内置通用能力\n const handlers = {\n _setStyle: (style: any) => {\n setDynamicStyle((prev) => ({ ...prev, ...style }));\n },\n _setData: (path: string, value: any) => {\n const paths = path.split('.');\n let current = _data;\n for (let i = 0; i < paths.length - 1; i++) {\n if (!current[paths[i]]) current[paths[i]] = {};\n current = current[paths[i]];\n }\n current[paths[paths.length - 1]] = value;\n }\n };\n\n if (!isPopup) {\n Object.assign(handlers, {\n show: () => setShow(true),\n hide: () => setShow(false),\n showOrHide: () => setShow((prev) => !prev),\n });\n }\n\n // 绑定输入,传入初始 handlers\n const inputProxy = useBindInputs(comRefs, id, handlers);\n\n const { slots: rawSlots, parentSlot: parentSlotProp, ...restProps } = rest as any;\n const parentSlot = useResolvedParentSlot(parentSlotProp);\n\n // 绑定事件,带上上下文(用于事件流自动封装 id/name)\n const eventProxy = useBindEvents(restProps, { \n id, \n name: props.name || id, \n parentSlot \n });\n\n // 注册 outputs 到注册表(按组件 id)\n if (comRefs?.current?.$outputs) {\n comRefs.current.$outputs[id] = eventProxy;\n }\n\n // 鸿蒙规范:确保 comRefs 中挂载的是最新的 inputProxy\n comRefs.current[id] = inputProxy;\n\n const enhancedSlots = useEnhancedSlots(rawSlots, id);\n\n const jsx = (\n <Component\n {...restProps}\n inputs={inputProxy}\n outputs={eventProxy}\n slots={enhancedSlots}\n parentSlot={parentSlot}\n data={_data}\n env={env}\n id={id}\n style={style}\n />\n );\n\n // 鸿蒙化处理:支持 itemWrap 协议\n if (parentSlot?.params?.itemWrap) {\n return parentSlot.params.itemWrap({\n id,\n name: props.name || id,\n jsx,\n def: (Component as any).def,\n inputs: inputProxy,\n outputs: eventProxy,\n style\n });\n }\n\n return (\n show || isPopup ? (\n <View className={className} style={{ ...style, ...dynamicStyle }} >\n {jsx}\n </View>\n ) : null\n );\n};\n\nexport const WithWrapper = (id: string, Component: React.ComponentType<any>) => {\n return function WrappedComponent(props: any) {\n const contextStore = useAppCreateContext(id);\n const { setPopupState } = contextStore;\n const isPopup = (Component as any).isPopup;\n\n // 通过发布订阅模式解耦弹窗状态变化\n useEffect(() => {\n return subscribePopupRouter((state) => setPopupState(state));\n }, [setPopupState]);\n\n // 点击 TabBar 时自动关闭弹窗(自定义 TabBar 或原生 TabBar 点击均会触发)\n useTabItemTap(() => {\n if (isPopup) return;\n closeActivePopupRouter();\n });\n\n return (\n <ComContext.Provider value={contextStore}>\n <Component {...props} />\n </ComContext.Provider>\n );\n };\n};\n"
|
|
5714
|
+
"content": "import React, { useState, useEffect } from 'react';\n// @ts-ignore 运行时由宿主项目提供 @tarojs/components\nimport { View } from '@tarojs/components';\nimport { useModel, useBindInputs, useBindEvents, subscribePopupRouter, closeActivePopupRouter } from './index';\nimport { useAppCreateContext } from './useContext';\nimport ComContext, { useAppContext } from './ComContext';\nimport { useEnhancedSlots, useResolvedParentSlot } from './slots';\n// @ts-ignore 运行时由宿主项目提供 @tarojs/taro\nimport { useTabItemTap } from '@tarojs/taro';\n\ninterface WithComProps {\n component: React.ComponentType<any>;\n intputRef?: any;\n id?: string;\n data?: any;\n className?: string;\n style?: any;\n [key: string]: any;\n}\n\nexport const WithCom: React.FC<WithComProps> = (props) => {\n const { component: Component, id = '', data, className, style, ...rest } = props;\n const { comRefs, appContext } = useAppContext();\n const env = appContext; //TODO: 需要根据实际情况修改\n\n const isPopup = (Component as any).isPopup;\n const [show, setShow] = useState(true);\n const [dynamicStyle, setDynamicStyle] = useState({});\n\n\n //数据模型\n const _data = useModel(data || {});\n\n // 内置通用能力\n const handlers = {\n _setStyle: (style: any) => {\n setDynamicStyle((prev) => ({ ...prev, ...style }));\n },\n _setData: (path: string, value: any) => {\n const paths = path.split('.');\n let current = _data;\n for (let i = 0; i < paths.length - 1; i++) {\n if (!current[paths[i]]) current[paths[i]] = {};\n current = current[paths[i]];\n }\n current[paths[paths.length - 1]] = value;\n }\n };\n\n if (!isPopup) {\n Object.assign(handlers, {\n show: () => setShow(true),\n hide: () => setShow(false),\n showOrHide: () => setShow((prev) => !prev),\n });\n }\n\n // 绑定输入,传入初始 handlers\n const inputProxy = useBindInputs(comRefs, id, handlers);\n\n const { slots: rawSlots, parentSlot: parentSlotProp, ...restProps } = rest as any;\n const parentSlot = useResolvedParentSlot(parentSlotProp);\n\n // 绑定事件,带上上下文(用于事件流自动封装 id/name)\n const eventProxy = useBindEvents(restProps, { \n id, \n name: props.name || id, \n parentSlot \n });\n\n // 注册 outputs 到注册表(按组件 id)\n if (comRefs?.current?.$outputs) {\n comRefs.current.$outputs[id] = eventProxy;\n }\n\n // 鸿蒙规范:确保 comRefs 中挂载的是最新的 inputProxy\n comRefs.current[id] = inputProxy;\n\n const enhancedSlots = useEnhancedSlots(rawSlots, id);\n\n const jsx = (\n <Component\n {...restProps}\n inputs={inputProxy}\n outputs={eventProxy}\n slots={enhancedSlots}\n parentSlot={parentSlot}\n data={_data}\n env={env}\n id={id}\n style={style}\n />\n );\n\n // 鸿蒙化处理:支持 itemWrap 协议\n if (parentSlot?.params?.itemWrap) {\n return parentSlot.params.itemWrap({\n id,\n name: props.name || id,\n jsx,\n def: (Component as any).def,\n inputs: inputProxy,\n outputs: eventProxy,\n style\n });\n }\n\n return (\n show || isPopup ? (\n <View className={className} style={{ ...style, ...dynamicStyle }} >\n {jsx}\n {props.children}\n </View>\n ) : null\n );\n};\n\nexport const WithWrapper = (id: string, Component: React.ComponentType<any>) => {\n return function WrappedComponent(props: any) {\n const contextStore = useAppCreateContext(id);\n const { setPopupState } = contextStore;\n const isPopup = (Component as any).isPopup;\n\n // 通过发布订阅模式解耦弹窗状态变化\n useEffect(() => {\n return subscribePopupRouter((state) => setPopupState(state));\n }, [setPopupState]);\n\n // 点击 TabBar 时自动关闭弹窗(自定义 TabBar 或原生 TabBar 点击均会触发)\n useTabItemTap(() => {\n if (isPopup) return;\n closeActivePopupRouter();\n });\n\n return (\n <ComContext.Provider value={contextStore}>\n <Component {...props} />\n </ComContext.Provider>\n );\n };\n};\n"
|
|
5415
5715
|
}
|
|
5416
5716
|
]
|
|
5417
5717
|
}
|
|
@@ -5473,7 +5773,7 @@
|
|
|
5473
5773
|
},
|
|
5474
5774
|
{
|
|
5475
5775
|
"path": "src/app.global.less",
|
|
5476
|
-
"content": "/* 隐藏 React Refresh 的全屏错误遮罩 */\n#react-refresh-overlay, \niframe[id=\"react-refresh-overlay\"] {\n display: none !important;\n}\n\n.mybricks_taro_systemPage {\n height: 100vh !important;\n}\n\nview {\n box-sizing: border-box;\n}\n"
|
|
5776
|
+
"content": "/* 隐藏 React Refresh 的全屏错误遮罩 */\n#react-refresh-overlay, \niframe[id=\"react-refresh-overlay\"] {\n display: none !important;\n}\n\n.mybricks_taro_systemPage {\n height: 100vh !important;\n}\n\n.mybricks_com{\n flex-shrink: 0;\n min-height: 0; /* 防止子元素撑开父元素 */\n}\n\nview {\n box-sizing: border-box;\n}\n"
|
|
5477
5777
|
},
|
|
5478
5778
|
{
|
|
5479
5779
|
"path": "src/app.ts",
|
|
@@ -5497,7 +5797,7 @@
|
|
|
5497
5797
|
},
|
|
5498
5798
|
{
|
|
5499
5799
|
"path": ".DS_Store",
|
|
5500
|
-
"content": "\u0000\u0000\u0000\u0001Bud1\u0000\u0000\u0010\u0000\u0000\u0000\b\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000%\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\b\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000 \u0000\u0000\u0000\u0001\u0000\u0000\u0000@\u0000\u0000\u0000\u0001\u0000\u0000\u0000�\u0000\u0000\u0000\u0001\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0000\u0000\u0001\u0000\u0000@\u0000\u0000\u0000\u0000\u0001\u0000\u0000�\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0001\u0000@\u0000\u0000\u0000\u0000\u0000\u0001\u0000�\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0001@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u000b\u0000\u0000\u0000E\u0000\u0000\u0000%\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004DSDB\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000`\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000�\u0000\u0000\u0000\u0001\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0002\u0000\u0000\b\u0000\u0000\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0000\u0000\u0001\u0000\u0000@\u0000\u0000\u0000\u0000\u0001\u0000\u0000�\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0001\u0000@\u0000\u0000\u0000\u0000\u0000\u0001\u0000�\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0001@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"
|
|
5800
|
+
"content": "\u0000\u0000\u0000\u0001Bud1\u0000\u0000\u0010\u0000\u0000\u0000\b\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000%\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0003\u0000s\u0000r\u0000cdsclbool\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0000clbool\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\b\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000 \u0000\u0000\u0000\u0001\u0000\u0000\u0000@\u0000\u0000\u0000\u0001\u0000\u0000\u0000�\u0000\u0000\u0000\u0001\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0000\u0000\u0001\u0000\u0000@\u0000\u0000\u0000\u0000\u0001\u0000\u0000�\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0001\u0000@\u0000\u0000\u0000\u0000\u0000\u0001\u0000�\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0001@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u000b\u0000\u0000\u0000E\u0000\u0000\u0000%\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004DSDB\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000`\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000�\u0000\u0000\u0000\u0001\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0002\u0000\u0000\b\u0000\u0000\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0000\u0000\u0001\u0000\u0000@\u0000\u0000\u0000\u0000\u0001\u0000\u0000�\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0001\u0000@\u0000\u0000\u0000\u0000\u0000\u0001\u0000�\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0001@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"
|
|
5501
5801
|
},
|
|
5502
5802
|
{
|
|
5503
5803
|
"path": ".editorconfig",
|
|
@@ -5533,7 +5833,7 @@
|
|
|
5533
5833
|
},
|
|
5534
5834
|
{
|
|
5535
5835
|
"path": "package.json",
|
|
5536
|
-
"content": "{\n \"name\": \"checkCom\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"description\": \"\",\n \"templateInfo\": {\n \"name\": \"default\",\n \"typescript\": true,\n \"css\": \"Less\",\n \"framework\": \"React\"\n },\n \"scripts\": {\n \"prepare\": \"husky\",\n \"new\": \"taro new\",\n \"build:weapp\": \"taro build --type weapp\",\n \"build:swan\": \"taro build --type swan\",\n \"build:alipay\": \"taro build --type alipay\",\n \"build:tt\": \"taro build --type tt\",\n \"build:h5\": \"taro build --type h5\",\n \"build:rn\": \"taro build --type rn\",\n \"build:qq\": \"taro build --type qq\",\n \"build:jd\": \"taro build --type jd\",\n \"build:harmony-hybrid\": \"taro build --type harmony-hybrid\",\n \"dev:weapp\": \"npm run build:weapp -- --watch\",\n \"dev:swan\": \"npm run build:swan -- --watch\",\n \"dev:alipay\": \"npm run build:alipay -- --watch\",\n \"dev:tt\": \"npm run build:tt -- --watch\",\n \"dev:h5\": \"npm run build:h5 -- --watch\",\n \"dev:rn\": \"npm run build:rn -- --watch\",\n \"dev:qq\": \"npm run build:qq -- --watch\",\n \"dev:jd\": \"npm run build:jd -- --watch\",\n \"dev:harmony-hybrid\": \"npm run build:harmony-hybrid -- --watch\"\n },\n \"browserslist\": {\n \"development\": [\n \"defaults and fully supports es6-module\",\n \"maintained node versions\"\n ],\n \"production\": [\n \"last 3 versions\",\n \"Android >= 4.1\",\n \"ios >= 8\"\n ]\n },\n \"author\": \"\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.24.4\",\n \"@tarojs/components\": \"4.1.9\",\n \"@tarojs/helper\": \"4.1.9\",\n \"@tarojs/plugin-platform-weapp\": \"4.1.9\",\n \"@tarojs/plugin-platform-alipay\": \"4.1.9\",\n \"@tarojs/plugin-platform-tt\": \"4.1.9\",\n \"@tarojs/plugin-platform-swan\": \"4.1.9\",\n \"@tarojs/plugin-platform-jd\": \"4.1.9\",\n \"@tarojs/plugin-platform-qq\": \"4.1.9\",\n \"@tarojs/plugin-platform-h5\": \"4.1.9\",\n \"@tarojs/plugin-platform-harmony-hybrid\": \"4.1.9\",\n \"@tarojs/runtime\": \"4.1.9\",\n \"@tarojs/shared\": \"4.1.9\",\n \"@tarojs/taro\": \"4.1.9\",\n \"@tarojs/plugin-framework-react\": \"4.1.9\",\n \"@tarojs/react\": \"4.1.9\",\n \"react-dom\": \"^18.0.0\",\n \"react\": \"^18.0.0\",\n \"brickd-mobile\": \"^0.0.53\",\n \"@taroify/icons\": \"^0.9.0\",\n \"@types/crypto-js\": \"^4.2.2\",\n \"crypto-js\": \"^4.2.0\"\n },\n \"devDependencies\": {\n \"@tarojs/plugin-generator\": \"4.1.9\",\n \"@commitlint/cli\": \"^19.8.1\",\n \"@commitlint/config-conventional\": \"^19.8.1\",\n \"lint-staged\": \"^16.1.2\",\n \"husky\": \"^9.1.7\",\n \"stylelint-config-standard\": \"^38.0.0\",\n \"@babel/core\": \"^7.24.4\",\n \"@tarojs/cli\": \"4.1.9\",\n \"@babel/plugin-transform-class-properties\": \"7.25.9\",\n \"@types/webpack-env\": \"^1.13.6\",\n \"@types/react\": \"^18.0.0\",\n \"webpack\": \"5.91.0\",\n \"@tarojs/taro-loader\": \"4.1.9\",\n \"@tarojs/webpack5-runner\": \"4.1.9\",\n \"less\": \"^4.2.0\",\n \"babel-preset-taro\": \"4.1.9\",\n \"eslint-config-taro\": \"4.1.9\",\n \"eslint\": \"^8.57.0\",\n \"@pmmmwh/react-refresh-webpack-plugin\": \"^0.5.5\",\n \"react-refresh\": \"^0.14.0\",\n \"@babel/preset-react\": \"^7.24.1\",\n \"eslint-plugin-react\": \"^7.34.1\",\n \"eslint-plugin-react-hooks\": \"^4.4.0\",\n \"stylelint\": \"^16.4.0\",\n \"typescript\": \"^5.4.5\",\n \"tsconfig-paths-webpack-plugin\": \"^4.1.0\",\n \"postcss\": \"^8.5.6\",\n \"@types/node\": \"^18\",\n \"@types/minimatch\": \"^5\"\n }\n}\n"
|
|
5836
|
+
"content": "{\n \"name\": \"checkCom\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"description\": \"\",\n \"templateInfo\": {\n \"name\": \"default\",\n \"typescript\": true,\n \"css\": \"Less\",\n \"framework\": \"React\"\n },\n \"scripts\": {\n \"prepare\": \"husky\",\n \"new\": \"taro new\",\n \"build:weapp\": \"taro build --type weapp\",\n \"build:swan\": \"taro build --type swan\",\n \"build:alipay\": \"taro build --type alipay\",\n \"build:tt\": \"taro build --type tt\",\n \"build:h5\": \"taro build --type h5\",\n \"build:rn\": \"taro build --type rn\",\n \"build:qq\": \"taro build --type qq\",\n \"build:jd\": \"taro build --type jd\",\n \"build:harmony-hybrid\": \"taro build --type harmony-hybrid\",\n \"dev:weapp\": \"npm run build:weapp -- --watch\",\n \"dev:swan\": \"npm run build:swan -- --watch\",\n \"dev:alipay\": \"npm run build:alipay -- --watch\",\n \"dev:tt\": \"npm run build:tt -- --watch\",\n \"dev:h5\": \"npm run build:h5 -- --watch\",\n \"dev:rn\": \"npm run build:rn -- --watch\",\n \"dev:qq\": \"npm run build:qq -- --watch\",\n \"dev:jd\": \"npm run build:jd -- --watch\",\n \"dev:harmony-hybrid\": \"npm run build:harmony-hybrid -- --watch\"\n },\n \"browserslist\": {\n \"development\": [\n \"defaults and fully supports es6-module\",\n \"maintained node versions\"\n ],\n \"production\": [\n \"last 3 versions\",\n \"Android >= 4.1\",\n \"ios >= 8\"\n ]\n },\n \"author\": \"\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.24.4\",\n \"@tarojs/components\": \"4.1.9\",\n \"@tarojs/helper\": \"4.1.9\",\n \"@tarojs/plugin-platform-weapp\": \"4.1.9\",\n \"@tarojs/plugin-platform-alipay\": \"4.1.9\",\n \"@tarojs/plugin-platform-tt\": \"4.1.9\",\n \"@tarojs/plugin-platform-swan\": \"4.1.9\",\n \"@tarojs/plugin-platform-jd\": \"4.1.9\",\n \"@tarojs/plugin-platform-qq\": \"4.1.9\",\n \"@tarojs/plugin-platform-h5\": \"4.1.9\",\n \"@tarojs/plugin-platform-harmony-hybrid\": \"4.1.9\",\n \"@tarojs/runtime\": \"4.1.9\",\n \"@tarojs/shared\": \"4.1.9\",\n \"@tarojs/taro\": \"4.1.9\",\n \"@tarojs/plugin-framework-react\": \"4.1.9\",\n \"@tarojs/react\": \"4.1.9\",\n \"react-dom\": \"^18.0.0\",\n \"react\": \"^18.0.0\",\n \"brickd-mobile\": \"^0.0.53\",\n \"@taroify/icons\": \"^0.9.0\",\n \"@types/crypto-js\": \"^4.2.2\",\n \"crypto-js\": \"^4.2.0\",\n \"@antv/f2\": \"3.8.12\",\n \"qrcode-generator\": \"^2.0.4\"\n },\n \"devDependencies\": {\n \"@tarojs/plugin-generator\": \"4.1.9\",\n \"@commitlint/cli\": \"^19.8.1\",\n \"@commitlint/config-conventional\": \"^19.8.1\",\n \"lint-staged\": \"^16.1.2\",\n \"husky\": \"^9.1.7\",\n \"stylelint-config-standard\": \"^38.0.0\",\n \"@babel/core\": \"^7.24.4\",\n \"@tarojs/cli\": \"4.1.9\",\n \"@babel/plugin-transform-class-properties\": \"7.25.9\",\n \"@types/webpack-env\": \"^1.13.6\",\n \"@types/react\": \"^18.0.0\",\n \"webpack\": \"5.91.0\",\n \"@tarojs/taro-loader\": \"4.1.9\",\n \"@tarojs/webpack5-runner\": \"4.1.9\",\n \"less\": \"^4.2.0\",\n \"babel-preset-taro\": \"4.1.9\",\n \"eslint-config-taro\": \"4.1.9\",\n \"eslint\": \"^8.57.0\",\n \"@pmmmwh/react-refresh-webpack-plugin\": \"^0.5.5\",\n \"react-refresh\": \"^0.14.0\",\n \"@babel/preset-react\": \"^7.24.1\",\n \"eslint-plugin-react\": \"^7.34.1\",\n \"eslint-plugin-react-hooks\": \"^4.4.0\",\n \"stylelint\": \"^16.4.0\",\n \"typescript\": \"^5.4.5\",\n \"tsconfig-paths-webpack-plugin\": \"^4.1.0\",\n \"postcss\": \"^8.5.6\",\n \"@types/node\": \"^18\",\n \"@types/minimatch\": \"^5\"\n }\n}\n"
|
|
5537
5837
|
},
|
|
5538
5838
|
{
|
|
5539
5839
|
"path": "project.config.json",
|