diff --git a/demo/.gitignore b/demo/.gitignore
new file mode 100644
index 0000000..4cf037e
--- /dev/null
+++ b/demo/.gitignore
@@ -0,0 +1,30 @@
+
+#///////////////////////////
+# Cocos Creator 3D Project
+#///////////////////////////
+library/
+temp/
+local/
+build/
+profiles/
+extensions/
+publish/
+#//////////////////////////
+# NPM
+#//////////////////////////
+node_modules/
+
+#//////////////////////////
+# VSCode
+#//////////////////////////
+.vscode/
+.creator/
+
+#//////////////////////////
+# WebStorm
+#//////////////////////////
+.idea/
+
+package-lock.json
+
+**/.DS_Store
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/.gitignore b/demo/FguiCreator3.8/.gitignore
new file mode 100644
index 0000000..ec9c400
--- /dev/null
+++ b/demo/FguiCreator3.8/.gitignore
@@ -0,0 +1,2 @@
+.DS_Store
+.objs/
diff --git a/demo/FguiCreator3.8/FguiCreator3.8.fairy b/demo/FguiCreator3.8/FguiCreator3.8.fairy
new file mode 100644
index 0000000..2e3d504
--- /dev/null
+++ b/demo/FguiCreator3.8/FguiCreator3.8.fairy
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Basics/btns/ComboBox1.xml b/demo/FguiCreator3.8/assets/Basics/btns/ComboBox1.xml
new file mode 100644
index 0000000..b8fc535
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Basics/btns/ComboBox1.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Basics/btns/ComboBox1_item.xml b/demo/FguiCreator3.8/assets/Basics/btns/ComboBox1_item.xml
new file mode 100644
index 0000000..95ce77c
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Basics/btns/ComboBox1_item.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Basics/btns/ComboBox1_popup.xml b/demo/FguiCreator3.8/assets/Basics/btns/ComboBox1_popup.xml
new file mode 100644
index 0000000..fbc15b7
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Basics/btns/ComboBox1_popup.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Basics/btns/Font1.fnt b/demo/FguiCreator3.8/assets/Basics/btns/Font1.fnt
new file mode 100644
index 0000000..e69de29
diff --git a/demo/FguiCreator3.8/assets/Basics/btns/Label1.xml b/demo/FguiCreator3.8/assets/Basics/btns/Label1.xml
new file mode 100644
index 0000000..1b4a6e6
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Basics/btns/Label1.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Basics/btns/MovieClip1.jta b/demo/FguiCreator3.8/assets/Basics/btns/MovieClip1.jta
new file mode 100644
index 0000000..5f1f31f
Binary files /dev/null and b/demo/FguiCreator3.8/assets/Basics/btns/MovieClip1.jta differ
diff --git a/demo/FguiCreator3.8/assets/Basics/btns/ProgressBar1.xml b/demo/FguiCreator3.8/assets/Basics/btns/ProgressBar1.xml
new file mode 100644
index 0000000..a6f713a
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Basics/btns/ProgressBar1.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Basics/btns/Slider1.xml b/demo/FguiCreator3.8/assets/Basics/btns/Slider1.xml
new file mode 100644
index 0000000..5d24c5a
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Basics/btns/Slider1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Basics/btns/Slider1_grip.xml b/demo/FguiCreator3.8/assets/Basics/btns/Slider1_grip.xml
new file mode 100644
index 0000000..f8f0fcc
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Basics/btns/Slider1_grip.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Basics/btns/btn_close.xml b/demo/FguiCreator3.8/assets/Basics/btns/btn_close.xml
new file mode 100644
index 0000000..830e073
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Basics/btns/btn_close.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Basics/btns/button1.xml b/demo/FguiCreator3.8/assets/Basics/btns/button1.xml
new file mode 100644
index 0000000..35e69c6
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Basics/btns/button1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Basics/btns/image_button1.png b/demo/FguiCreator3.8/assets/Basics/btns/image_button1.png
new file mode 100644
index 0000000..6a2d342
Binary files /dev/null and b/demo/FguiCreator3.8/assets/Basics/btns/image_button1.png differ
diff --git a/demo/FguiCreator3.8/assets/Basics/btns/image_button_close.png b/demo/FguiCreator3.8/assets/Basics/btns/image_button_close.png
new file mode 100644
index 0000000..9f8e0b1
Binary files /dev/null and b/demo/FguiCreator3.8/assets/Basics/btns/image_button_close.png differ
diff --git a/demo/FguiCreator3.8/assets/Basics/empty.xml b/demo/FguiCreator3.8/assets/Basics/empty.xml
new file mode 100644
index 0000000..2d3cc98
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Basics/empty.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Basics/header/WindowHeader.xml b/demo/FguiCreator3.8/assets/Basics/header/WindowHeader.xml
new file mode 100644
index 0000000..7849bd0
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Basics/header/WindowHeader.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Basics/header/WindowHeader2.xml b/demo/FguiCreator3.8/assets/Basics/header/WindowHeader2.xml
new file mode 100644
index 0000000..12d6860
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Basics/header/WindowHeader2.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Basics/image/image_black.png b/demo/FguiCreator3.8/assets/Basics/image/image_black.png
new file mode 100644
index 0000000..357870f
Binary files /dev/null and b/demo/FguiCreator3.8/assets/Basics/image/image_black.png differ
diff --git a/demo/FguiCreator3.8/assets/Basics/load/LoadUIWindow.xml b/demo/FguiCreator3.8/assets/Basics/load/LoadUIWindow.xml
new file mode 100644
index 0000000..979c49f
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Basics/load/LoadUIWindow.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Basics/load/image_net_wait.png b/demo/FguiCreator3.8/assets/Basics/load/image_net_wait.png
new file mode 100644
index 0000000..3bc6816
Binary files /dev/null and b/demo/FguiCreator3.8/assets/Basics/load/image_net_wait.png differ
diff --git a/demo/FguiCreator3.8/assets/Basics/package.xml b/demo/FguiCreator3.8/assets/Basics/package.xml
new file mode 100644
index 0000000..8af6198
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Basics/package.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Basics/window/AlertWindow.xml b/demo/FguiCreator3.8/assets/Basics/window/AlertWindow.xml
new file mode 100644
index 0000000..9d908c6
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Basics/window/AlertWindow.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Basics/window/ToastWindow.xml b/demo/FguiCreator3.8/assets/Basics/window/ToastWindow.xml
new file mode 100644
index 0000000..45d2c88
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Basics/window/ToastWindow.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Basics/window/toast/image_toastbg.png b/demo/FguiCreator3.8/assets/Basics/window/toast/image_toastbg.png
new file mode 100644
index 0000000..5ca5fb2
Binary files /dev/null and b/demo/FguiCreator3.8/assets/Basics/window/toast/image_toastbg.png differ
diff --git a/demo/FguiCreator3.8/assets/Basics/window/toast/toast.xml b/demo/FguiCreator3.8/assets/Basics/window/toast/toast.xml
new file mode 100644
index 0000000..f727fe4
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Basics/window/toast/toast.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Condition/ConditionWindow.xml b/demo/FguiCreator3.8/assets/Condition/ConditionWindow.xml
new file mode 100644
index 0000000..a268e82
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Condition/ConditionWindow.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Condition/image/image_reddot_bg.png b/demo/FguiCreator3.8/assets/Condition/image/image_reddot_bg.png
new file mode 100644
index 0000000..1318316
Binary files /dev/null and b/demo/FguiCreator3.8/assets/Condition/image/image_reddot_bg.png differ
diff --git a/demo/FguiCreator3.8/assets/Condition/image/item_reddot.xml b/demo/FguiCreator3.8/assets/Condition/image/item_reddot.xml
new file mode 100644
index 0000000..af78065
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Condition/image/item_reddot.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Condition/package.xml b/demo/FguiCreator3.8/assets/Condition/package.xml
new file mode 100644
index 0000000..b3847a8
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Condition/package.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Home/HomeWindow.xml b/demo/FguiCreator3.8/assets/Home/HomeWindow.xml
new file mode 100644
index 0000000..bb5e661
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Home/HomeWindow.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Home/package.xml b/demo/FguiCreator3.8/assets/Home/package.xml
new file mode 100644
index 0000000..7f687b4
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Home/package.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/HotUpdate/HotUpdateWindow.xml b/demo/FguiCreator3.8/assets/HotUpdate/HotUpdateWindow.xml
new file mode 100644
index 0000000..5088954
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/HotUpdate/HotUpdateWindow.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/HotUpdate/package.xml b/demo/FguiCreator3.8/assets/HotUpdate/package.xml
new file mode 100644
index 0000000..f156f8e
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/HotUpdate/package.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/MiniGame/MiniGameWindow.xml b/demo/FguiCreator3.8/assets/MiniGame/MiniGameWindow.xml
new file mode 100644
index 0000000..2e052d0
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/MiniGame/MiniGameWindow.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/MiniGame/package.xml b/demo/FguiCreator3.8/assets/MiniGame/package.xml
new file mode 100644
index 0000000..d6aa9d5
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/MiniGame/package.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Socket/SocketTestWindow.xml b/demo/FguiCreator3.8/assets/Socket/SocketTestWindow.xml
new file mode 100644
index 0000000..953c9bb
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Socket/SocketTestWindow.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Socket/package.xml b/demo/FguiCreator3.8/assets/Socket/package.xml
new file mode 100644
index 0000000..f6003b2
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Socket/package.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Window/CloseAllWindow.xml b/demo/FguiCreator3.8/assets/Window/CloseAllWindow.xml
new file mode 100644
index 0000000..05af238
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Window/CloseAllWindow.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Window/CloseOneWindow.xml b/demo/FguiCreator3.8/assets/Window/CloseOneWindow.xml
new file mode 100644
index 0000000..694eacc
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Window/CloseOneWindow.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Window/CustomComponents.xml b/demo/FguiCreator3.8/assets/Window/CustomComponents.xml
new file mode 100644
index 0000000..f02b9d7
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Window/CustomComponents.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Window/HideAllWindow.xml b/demo/FguiCreator3.8/assets/Window/HideAllWindow.xml
new file mode 100644
index 0000000..5b04bfb
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Window/HideAllWindow.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Window/HideOneWindow.xml b/demo/FguiCreator3.8/assets/Window/HideOneWindow.xml
new file mode 100644
index 0000000..5e1b39d
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Window/HideOneWindow.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Window/PopWindow.xml b/demo/FguiCreator3.8/assets/Window/PopWindow.xml
new file mode 100644
index 0000000..e26d38c
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Window/PopWindow.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Window/PopWindowHeader1.xml b/demo/FguiCreator3.8/assets/Window/PopWindowHeader1.xml
new file mode 100644
index 0000000..e26d38c
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Window/PopWindowHeader1.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Window/PopWindowHeader2.xml b/demo/FguiCreator3.8/assets/Window/PopWindowHeader2.xml
new file mode 100644
index 0000000..115a0eb
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Window/PopWindowHeader2.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Window/UIBaseWindow.xml b/demo/FguiCreator3.8/assets/Window/UIBaseWindow.xml
new file mode 100644
index 0000000..236a8ae
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Window/UIBaseWindow.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/assets/Window/image/Icon-60@2x.png b/demo/FguiCreator3.8/assets/Window/image/Icon-60@2x.png
new file mode 100755
index 0000000..6847890
Binary files /dev/null and b/demo/FguiCreator3.8/assets/Window/image/Icon-60@2x.png differ
diff --git a/demo/FguiCreator3.8/assets/Window/package.xml b/demo/FguiCreator3.8/assets/Window/package.xml
new file mode 100644
index 0000000..e923401
--- /dev/null
+++ b/demo/FguiCreator3.8/assets/Window/package.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/settings/Adaptation.json b/demo/FguiCreator3.8/settings/Adaptation.json
new file mode 100644
index 0000000..2c0ad0e
--- /dev/null
+++ b/demo/FguiCreator3.8/settings/Adaptation.json
@@ -0,0 +1,8 @@
+{
+ "scaleMode": "ScaleWithScreenSize",
+ "screenMathMode": "MatchWidthOrHeight",
+ "designResolutionX": 750,
+ "designResolutionY": 1334,
+ "devices": [],
+ "fileName": "Adaptation"
+}
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/settings/Common.json b/demo/FguiCreator3.8/settings/Common.json
new file mode 100644
index 0000000..6537e23
--- /dev/null
+++ b/demo/FguiCreator3.8/settings/Common.json
@@ -0,0 +1,25 @@
+{
+ "font": "Hiragino Sans GB",
+ "fontSize": 36,
+ "textColor": "#ffffff",
+ "fontAdjustment": false,
+ "colorScheme": [
+ "自定义颜色 #FF0000"
+ ],
+ "fontSizeScheme": [
+ "自定义字体大小 30"
+ ],
+ "fontScheme": [
+ "默认字体"
+ ],
+ "scrollBars": {
+ "horizontal": "",
+ "vertical": "",
+ "defaultDisplay": "visible"
+ },
+ "tipsRes": "",
+ "buttonClickSound": "",
+ "pivot": "default",
+ "listClearOnPublish": false,
+ "fileName": "Common"
+}
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/settings/CustomProperties.json b/demo/FguiCreator3.8/settings/CustomProperties.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/demo/FguiCreator3.8/settings/CustomProperties.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/settings/Publish.json b/demo/FguiCreator3.8/settings/Publish.json
new file mode 100644
index 0000000..a5a30a9
--- /dev/null
+++ b/demo/FguiCreator3.8/settings/Publish.json
@@ -0,0 +1,35 @@
+{
+ "path": "../assets/resources/ui",
+ "branchPath": "",
+ "fileExtension": "bin",
+ "packageCount": 2,
+ "compressDesc": true,
+ "binaryFormat": true,
+ "jpegQuality": 80,
+ "compressPNG": false,
+ "codeGeneration": {
+ "allowGenCode": true,
+ "codePath": "",
+ "classNamePrefix": "ui_",
+ "memberNamePrefix": "m_",
+ "packageName": null,
+ "ignoreNoname": true,
+ "getMemberByName": false,
+ "codeType": ""
+ },
+ "includeHighResolution": 0,
+ "branchProcessing": 0,
+ "seperatedAtlasForBranch": false,
+ "atlasSetting": {
+ "maxSize": 2048,
+ "paging": true,
+ "sizeOption": "npot",
+ "forceSquare": false,
+ "allowRotation": false,
+ "trimImage": true
+ },
+ "include2x": false,
+ "include3x": false,
+ "include4x": false,
+ "fileName": "Publish"
+}
\ No newline at end of file
diff --git a/demo/FguiCreator3.8/settings/i18n.json b/demo/FguiCreator3.8/settings/i18n.json
new file mode 100644
index 0000000..53e034f
--- /dev/null
+++ b/demo/FguiCreator3.8/settings/i18n.json
@@ -0,0 +1,3 @@
+{
+ "langFiles": []
+}
\ No newline at end of file
diff --git a/demo/README.md b/demo/README.md
new file mode 100644
index 0000000..48b9492
--- /dev/null
+++ b/demo/README.md
@@ -0,0 +1,10 @@
+# 项目说明
+
+clone项目后,到项目根目录,执行以下命令,安装项目依赖库
+```bash
+npm i
+```
+
+重新用creator打开项目
+
+本项目使用的creator版本为3.8.6
\ No newline at end of file
diff --git a/demo/assets/FirstScene.meta b/demo/assets/FirstScene.meta
new file mode 100644
index 0000000..ec92a82
--- /dev/null
+++ b/demo/assets/FirstScene.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "2768ad39-fa5d-43f6-a2f8-723dde4d0a32",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/FirstScene/loading_bg.jpg b/demo/assets/FirstScene/loading_bg.jpg
new file mode 100644
index 0000000..bd642b4
Binary files /dev/null and b/demo/assets/FirstScene/loading_bg.jpg differ
diff --git a/demo/assets/FirstScene/loading_bg.jpg.meta b/demo/assets/FirstScene/loading_bg.jpg.meta
new file mode 100644
index 0000000..ea8dc00
--- /dev/null
+++ b/demo/assets/FirstScene/loading_bg.jpg.meta
@@ -0,0 +1,137 @@
+{
+ "ver": "1.0.27",
+ "importer": "image",
+ "imported": true,
+ "uuid": "efb639df-cc0d-4a17-8b33-2d555c8147b4",
+ "files": [
+ ".jpg",
+ ".json"
+ ],
+ "subMetas": {
+ "6c48a": {
+ "importer": "texture",
+ "uuid": "efb639df-cc0d-4a17-8b33-2d555c8147b4@6c48a",
+ "displayName": "loading_bg",
+ "id": "6c48a",
+ "name": "texture",
+ "userData": {
+ "wrapModeS": "clamp-to-edge",
+ "wrapModeT": "clamp-to-edge",
+ "minfilter": "linear",
+ "magfilter": "linear",
+ "mipfilter": "none",
+ "anisotropy": 0,
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "efb639df-cc0d-4a17-8b33-2d555c8147b4",
+ "visible": false
+ },
+ "ver": "1.0.22",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ },
+ "f9941": {
+ "importer": "sprite-frame",
+ "uuid": "efb639df-cc0d-4a17-8b33-2d555c8147b4@f9941",
+ "displayName": "loading_bg",
+ "id": "f9941",
+ "name": "spriteFrame",
+ "userData": {
+ "trimType": "auto",
+ "trimThreshold": 1,
+ "rotated": false,
+ "offsetX": 0,
+ "offsetY": 0,
+ "trimX": 0,
+ "trimY": 0,
+ "width": 488,
+ "height": 1056,
+ "rawWidth": 488,
+ "rawHeight": 1056,
+ "borderTop": 0,
+ "borderBottom": 0,
+ "borderLeft": 0,
+ "borderRight": 0,
+ "packable": true,
+ "pixelsToUnit": 100,
+ "pivotX": 0.5,
+ "pivotY": 0.5,
+ "meshType": 0,
+ "vertices": {
+ "rawPosition": [
+ -244,
+ -528,
+ 0,
+ 244,
+ -528,
+ 0,
+ -244,
+ 528,
+ 0,
+ 244,
+ 528,
+ 0
+ ],
+ "indexes": [
+ 0,
+ 1,
+ 2,
+ 2,
+ 1,
+ 3
+ ],
+ "uv": [
+ 0,
+ 1056,
+ 488,
+ 1056,
+ 0,
+ 0,
+ 488,
+ 0
+ ],
+ "nuv": [
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1
+ ],
+ "minPos": [
+ -244,
+ -528,
+ 0
+ ],
+ "maxPos": [
+ 244,
+ 528,
+ 0
+ ]
+ },
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "efb639df-cc0d-4a17-8b33-2d555c8147b4@6c48a",
+ "atlasUuid": ""
+ },
+ "ver": "1.0.12",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ }
+ },
+ "userData": {
+ "hasAlpha": false,
+ "type": "sprite-frame",
+ "fixAlphaTransparencyArtifacts": false,
+ "redirect": "efb639df-cc0d-4a17-8b33-2d555c8147b4@6c48a",
+ "compressSettings": {
+ "useCompressTexture": false
+ }
+ }
+}
diff --git a/demo/assets/FirstScene/res.meta b/demo/assets/FirstScene/res.meta
new file mode 100644
index 0000000..14b6146
--- /dev/null
+++ b/demo/assets/FirstScene/res.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "7dea02d9-d93b-4d10-aa8a-311383a60a66",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/FirstScene/res/auto-atlas.pac b/demo/assets/FirstScene/res/auto-atlas.pac
new file mode 100644
index 0000000..39b3c02
--- /dev/null
+++ b/demo/assets/FirstScene/res/auto-atlas.pac
@@ -0,0 +1,3 @@
+{
+ "__type__": "cc.SpriteAtlas"
+}
diff --git a/demo/assets/FirstScene/res/auto-atlas.pac.meta b/demo/assets/FirstScene/res/auto-atlas.pac.meta
new file mode 100644
index 0000000..b8b0ae3
--- /dev/null
+++ b/demo/assets/FirstScene/res/auto-atlas.pac.meta
@@ -0,0 +1,36 @@
+{
+ "ver": "1.0.8",
+ "importer": "auto-atlas",
+ "imported": true,
+ "uuid": "0ee96ff7-032b-4826-b543-e6d2dccea89a",
+ "files": [
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {
+ "maxWidth": 1024,
+ "maxHeight": 1024,
+ "padding": 1,
+ "allowRotation": true,
+ "forceSquared": false,
+ "powerOfTwo": false,
+ "algorithm": "MaxRects",
+ "format": "png",
+ "quality": 80,
+ "contourBleed": true,
+ "paddingBleed": true,
+ "filterUnused": true,
+ "removeTextureInBundle": true,
+ "removeImageInBundle": true,
+ "removeSpriteAtlasInBundle": true,
+ "compressSettings": {},
+ "textureSetting": {
+ "wrapModeS": "repeat",
+ "wrapModeT": "repeat",
+ "minfilter": "linear",
+ "magfilter": "linear",
+ "mipfilter": "none",
+ "anisotropy": 0
+ }
+ }
+}
diff --git a/demo/assets/FirstScene/res/image_age_tip.png b/demo/assets/FirstScene/res/image_age_tip.png
new file mode 100644
index 0000000..d5728bb
Binary files /dev/null and b/demo/assets/FirstScene/res/image_age_tip.png differ
diff --git a/demo/assets/FirstScene/res/image_age_tip.png.meta b/demo/assets/FirstScene/res/image_age_tip.png.meta
new file mode 100644
index 0000000..377680d
--- /dev/null
+++ b/demo/assets/FirstScene/res/image_age_tip.png.meta
@@ -0,0 +1,134 @@
+{
+ "ver": "1.0.27",
+ "importer": "image",
+ "imported": true,
+ "uuid": "21e24b19-38a1-4116-a09a-a7765ef9207d",
+ "files": [
+ ".json",
+ ".png"
+ ],
+ "subMetas": {
+ "6c48a": {
+ "importer": "texture",
+ "uuid": "21e24b19-38a1-4116-a09a-a7765ef9207d@6c48a",
+ "displayName": "image_age_tip",
+ "id": "6c48a",
+ "name": "texture",
+ "userData": {
+ "wrapModeS": "clamp-to-edge",
+ "wrapModeT": "clamp-to-edge",
+ "minfilter": "linear",
+ "magfilter": "linear",
+ "mipfilter": "none",
+ "anisotropy": 0,
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "21e24b19-38a1-4116-a09a-a7765ef9207d",
+ "visible": false
+ },
+ "ver": "1.0.22",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ },
+ "f9941": {
+ "importer": "sprite-frame",
+ "uuid": "21e24b19-38a1-4116-a09a-a7765ef9207d@f9941",
+ "displayName": "image_age_tip",
+ "id": "f9941",
+ "name": "spriteFrame",
+ "userData": {
+ "trimType": "auto",
+ "trimThreshold": 1,
+ "rotated": false,
+ "offsetX": 0,
+ "offsetY": 0,
+ "trimX": 0,
+ "trimY": 0,
+ "width": 121,
+ "height": 156,
+ "rawWidth": 121,
+ "rawHeight": 156,
+ "borderTop": 0,
+ "borderBottom": 0,
+ "borderLeft": 0,
+ "borderRight": 0,
+ "packable": true,
+ "pixelsToUnit": 100,
+ "pivotX": 0.5,
+ "pivotY": 0.5,
+ "meshType": 0,
+ "vertices": {
+ "rawPosition": [
+ -60.5,
+ -78,
+ 0,
+ 60.5,
+ -78,
+ 0,
+ -60.5,
+ 78,
+ 0,
+ 60.5,
+ 78,
+ 0
+ ],
+ "indexes": [
+ 0,
+ 1,
+ 2,
+ 2,
+ 1,
+ 3
+ ],
+ "uv": [
+ 0,
+ 156,
+ 121,
+ 156,
+ 0,
+ 0,
+ 121,
+ 0
+ ],
+ "nuv": [
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1
+ ],
+ "minPos": [
+ -60.5,
+ -78,
+ 0
+ ],
+ "maxPos": [
+ 60.5,
+ 78,
+ 0
+ ]
+ },
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "21e24b19-38a1-4116-a09a-a7765ef9207d@6c48a",
+ "atlasUuid": ""
+ },
+ "ver": "1.0.12",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ }
+ },
+ "userData": {
+ "hasAlpha": true,
+ "type": "sprite-frame",
+ "fixAlphaTransparencyArtifacts": false,
+ "redirect": "21e24b19-38a1-4116-a09a-a7765ef9207d@6c48a"
+ }
+}
diff --git a/demo/assets/FirstScene/res/image_bar.png b/demo/assets/FirstScene/res/image_bar.png
new file mode 100644
index 0000000..1af80f4
Binary files /dev/null and b/demo/assets/FirstScene/res/image_bar.png differ
diff --git a/demo/assets/FirstScene/res/image_bar.png.meta b/demo/assets/FirstScene/res/image_bar.png.meta
new file mode 100644
index 0000000..1cc2cf6
--- /dev/null
+++ b/demo/assets/FirstScene/res/image_bar.png.meta
@@ -0,0 +1,134 @@
+{
+ "ver": "1.0.27",
+ "importer": "image",
+ "imported": true,
+ "uuid": "5e393489-5334-4bff-aade-dca65a6ab31f",
+ "files": [
+ ".json",
+ ".png"
+ ],
+ "subMetas": {
+ "6c48a": {
+ "importer": "texture",
+ "uuid": "5e393489-5334-4bff-aade-dca65a6ab31f@6c48a",
+ "displayName": "image_bar",
+ "id": "6c48a",
+ "name": "texture",
+ "userData": {
+ "wrapModeS": "clamp-to-edge",
+ "wrapModeT": "clamp-to-edge",
+ "minfilter": "linear",
+ "magfilter": "linear",
+ "mipfilter": "none",
+ "anisotropy": 0,
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "5e393489-5334-4bff-aade-dca65a6ab31f",
+ "visible": false
+ },
+ "ver": "1.0.22",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ },
+ "f9941": {
+ "importer": "sprite-frame",
+ "uuid": "5e393489-5334-4bff-aade-dca65a6ab31f@f9941",
+ "displayName": "image_bar",
+ "id": "f9941",
+ "name": "spriteFrame",
+ "userData": {
+ "trimType": "auto",
+ "trimThreshold": 1,
+ "rotated": false,
+ "offsetX": 0,
+ "offsetY": 0,
+ "trimX": 0,
+ "trimY": 0,
+ "width": 45,
+ "height": 42,
+ "rawWidth": 45,
+ "rawHeight": 42,
+ "borderTop": 0,
+ "borderBottom": 0,
+ "borderLeft": 0,
+ "borderRight": 0,
+ "packable": true,
+ "pixelsToUnit": 100,
+ "pivotX": 0.5,
+ "pivotY": 0.5,
+ "meshType": 0,
+ "vertices": {
+ "rawPosition": [
+ -22.5,
+ -21,
+ 0,
+ 22.5,
+ -21,
+ 0,
+ -22.5,
+ 21,
+ 0,
+ 22.5,
+ 21,
+ 0
+ ],
+ "indexes": [
+ 0,
+ 1,
+ 2,
+ 2,
+ 1,
+ 3
+ ],
+ "uv": [
+ 0,
+ 42,
+ 45,
+ 42,
+ 0,
+ 0,
+ 45,
+ 0
+ ],
+ "nuv": [
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1
+ ],
+ "minPos": [
+ -22.5,
+ -21,
+ 0
+ ],
+ "maxPos": [
+ 22.5,
+ 21,
+ 0
+ ]
+ },
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "5e393489-5334-4bff-aade-dca65a6ab31f@6c48a",
+ "atlasUuid": ""
+ },
+ "ver": "1.0.12",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ }
+ },
+ "userData": {
+ "hasAlpha": true,
+ "type": "sprite-frame",
+ "fixAlphaTransparencyArtifacts": false,
+ "redirect": "5e393489-5334-4bff-aade-dca65a6ab31f@6c48a"
+ }
+}
diff --git a/demo/assets/FirstScene/res/image_bar_bg.png b/demo/assets/FirstScene/res/image_bar_bg.png
new file mode 100644
index 0000000..17b5612
Binary files /dev/null and b/demo/assets/FirstScene/res/image_bar_bg.png differ
diff --git a/demo/assets/FirstScene/res/image_bar_bg.png.meta b/demo/assets/FirstScene/res/image_bar_bg.png.meta
new file mode 100644
index 0000000..0b470ce
--- /dev/null
+++ b/demo/assets/FirstScene/res/image_bar_bg.png.meta
@@ -0,0 +1,134 @@
+{
+ "ver": "1.0.27",
+ "importer": "image",
+ "imported": true,
+ "uuid": "2bf76acc-7d8b-4cb1-8717-92c1963f5231",
+ "files": [
+ ".json",
+ ".png"
+ ],
+ "subMetas": {
+ "6c48a": {
+ "importer": "texture",
+ "uuid": "2bf76acc-7d8b-4cb1-8717-92c1963f5231@6c48a",
+ "displayName": "image_bar_bg",
+ "id": "6c48a",
+ "name": "texture",
+ "userData": {
+ "wrapModeS": "clamp-to-edge",
+ "wrapModeT": "clamp-to-edge",
+ "minfilter": "linear",
+ "magfilter": "linear",
+ "mipfilter": "none",
+ "anisotropy": 0,
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "2bf76acc-7d8b-4cb1-8717-92c1963f5231",
+ "visible": false
+ },
+ "ver": "1.0.22",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ },
+ "f9941": {
+ "importer": "sprite-frame",
+ "uuid": "2bf76acc-7d8b-4cb1-8717-92c1963f5231@f9941",
+ "displayName": "image_bar_bg",
+ "id": "f9941",
+ "name": "spriteFrame",
+ "userData": {
+ "trimType": "auto",
+ "trimThreshold": 1,
+ "rotated": false,
+ "offsetX": 0,
+ "offsetY": 0,
+ "trimX": 0,
+ "trimY": 0,
+ "width": 40,
+ "height": 50,
+ "rawWidth": 40,
+ "rawHeight": 50,
+ "borderTop": 0,
+ "borderBottom": 0,
+ "borderLeft": 0,
+ "borderRight": 0,
+ "packable": true,
+ "pixelsToUnit": 100,
+ "pivotX": 0.5,
+ "pivotY": 0.5,
+ "meshType": 0,
+ "vertices": {
+ "rawPosition": [
+ -20,
+ -25,
+ 0,
+ 20,
+ -25,
+ 0,
+ -20,
+ 25,
+ 0,
+ 20,
+ 25,
+ 0
+ ],
+ "indexes": [
+ 0,
+ 1,
+ 2,
+ 2,
+ 1,
+ 3
+ ],
+ "uv": [
+ 0,
+ 50,
+ 40,
+ 50,
+ 0,
+ 0,
+ 40,
+ 0
+ ],
+ "nuv": [
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1
+ ],
+ "minPos": [
+ -20,
+ -25,
+ 0
+ ],
+ "maxPos": [
+ 20,
+ 25,
+ 0
+ ]
+ },
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "2bf76acc-7d8b-4cb1-8717-92c1963f5231@6c48a",
+ "atlasUuid": ""
+ },
+ "ver": "1.0.12",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ }
+ },
+ "userData": {
+ "hasAlpha": true,
+ "type": "sprite-frame",
+ "fixAlphaTransparencyArtifacts": false,
+ "redirect": "2bf76acc-7d8b-4cb1-8717-92c1963f5231@6c48a"
+ }
+}
diff --git a/demo/assets/FirstScene/res/image_health.png b/demo/assets/FirstScene/res/image_health.png
new file mode 100644
index 0000000..6adee48
Binary files /dev/null and b/demo/assets/FirstScene/res/image_health.png differ
diff --git a/demo/assets/FirstScene/res/image_health.png.meta b/demo/assets/FirstScene/res/image_health.png.meta
new file mode 100644
index 0000000..d39cb3f
--- /dev/null
+++ b/demo/assets/FirstScene/res/image_health.png.meta
@@ -0,0 +1,134 @@
+{
+ "ver": "1.0.27",
+ "importer": "image",
+ "imported": true,
+ "uuid": "2e6c7534-7589-4521-9ef9-176162d783d5",
+ "files": [
+ ".json",
+ ".png"
+ ],
+ "subMetas": {
+ "6c48a": {
+ "importer": "texture",
+ "uuid": "2e6c7534-7589-4521-9ef9-176162d783d5@6c48a",
+ "displayName": "image_health",
+ "id": "6c48a",
+ "name": "texture",
+ "userData": {
+ "wrapModeS": "clamp-to-edge",
+ "wrapModeT": "clamp-to-edge",
+ "minfilter": "linear",
+ "magfilter": "linear",
+ "mipfilter": "none",
+ "anisotropy": 0,
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "2e6c7534-7589-4521-9ef9-176162d783d5",
+ "visible": false
+ },
+ "ver": "1.0.22",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ },
+ "f9941": {
+ "importer": "sprite-frame",
+ "uuid": "2e6c7534-7589-4521-9ef9-176162d783d5@f9941",
+ "displayName": "image_health",
+ "id": "f9941",
+ "name": "spriteFrame",
+ "userData": {
+ "trimType": "auto",
+ "trimThreshold": 1,
+ "rotated": false,
+ "offsetX": 0,
+ "offsetY": 0,
+ "trimX": 2,
+ "trimY": 2,
+ "width": 634,
+ "height": 60,
+ "rawWidth": 638,
+ "rawHeight": 64,
+ "borderTop": 0,
+ "borderBottom": 0,
+ "borderLeft": 0,
+ "borderRight": 0,
+ "packable": true,
+ "pixelsToUnit": 100,
+ "pivotX": 0.5,
+ "pivotY": 0.5,
+ "meshType": 0,
+ "vertices": {
+ "rawPosition": [
+ -317,
+ -30,
+ 0,
+ 317,
+ -30,
+ 0,
+ -317,
+ 30,
+ 0,
+ 317,
+ 30,
+ 0
+ ],
+ "indexes": [
+ 0,
+ 1,
+ 2,
+ 2,
+ 1,
+ 3
+ ],
+ "uv": [
+ 2,
+ 62,
+ 636,
+ 62,
+ 2,
+ 2,
+ 636,
+ 2
+ ],
+ "nuv": [
+ 0.003134796238244514,
+ 0.03125,
+ 0.9968652037617555,
+ 0.03125,
+ 0.003134796238244514,
+ 0.96875,
+ 0.9968652037617555,
+ 0.96875
+ ],
+ "minPos": [
+ -317,
+ -30,
+ 0
+ ],
+ "maxPos": [
+ 317,
+ 30,
+ 0
+ ]
+ },
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "2e6c7534-7589-4521-9ef9-176162d783d5@6c48a",
+ "atlasUuid": ""
+ },
+ "ver": "1.0.12",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ }
+ },
+ "userData": {
+ "hasAlpha": true,
+ "type": "sprite-frame",
+ "fixAlphaTransparencyArtifacts": false,
+ "redirect": "2e6c7534-7589-4521-9ef9-176162d783d5@6c48a"
+ }
+}
diff --git a/demo/assets/FirstScene/res/image_health_title.png b/demo/assets/FirstScene/res/image_health_title.png
new file mode 100644
index 0000000..deb3f10
Binary files /dev/null and b/demo/assets/FirstScene/res/image_health_title.png differ
diff --git a/demo/assets/FirstScene/res/image_health_title.png.meta b/demo/assets/FirstScene/res/image_health_title.png.meta
new file mode 100644
index 0000000..f113d94
--- /dev/null
+++ b/demo/assets/FirstScene/res/image_health_title.png.meta
@@ -0,0 +1,134 @@
+{
+ "ver": "1.0.27",
+ "importer": "image",
+ "imported": true,
+ "uuid": "0aa6f7d9-09d0-42bf-ae09-a445e6fd22c9",
+ "files": [
+ ".json",
+ ".png"
+ ],
+ "subMetas": {
+ "6c48a": {
+ "importer": "texture",
+ "uuid": "0aa6f7d9-09d0-42bf-ae09-a445e6fd22c9@6c48a",
+ "displayName": "image_health_title",
+ "id": "6c48a",
+ "name": "texture",
+ "userData": {
+ "wrapModeS": "clamp-to-edge",
+ "wrapModeT": "clamp-to-edge",
+ "minfilter": "linear",
+ "magfilter": "linear",
+ "mipfilter": "none",
+ "anisotropy": 0,
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "0aa6f7d9-09d0-42bf-ae09-a445e6fd22c9",
+ "visible": false
+ },
+ "ver": "1.0.22",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ },
+ "f9941": {
+ "importer": "sprite-frame",
+ "uuid": "0aa6f7d9-09d0-42bf-ae09-a445e6fd22c9@f9941",
+ "displayName": "image_health_title",
+ "id": "f9941",
+ "name": "spriteFrame",
+ "userData": {
+ "trimType": "auto",
+ "trimThreshold": 1,
+ "rotated": false,
+ "offsetX": 0,
+ "offsetY": 0,
+ "trimX": 2,
+ "trimY": 2,
+ "width": 137,
+ "height": 29,
+ "rawWidth": 141,
+ "rawHeight": 33,
+ "borderTop": 0,
+ "borderBottom": 0,
+ "borderLeft": 0,
+ "borderRight": 0,
+ "packable": true,
+ "pixelsToUnit": 100,
+ "pivotX": 0.5,
+ "pivotY": 0.5,
+ "meshType": 0,
+ "vertices": {
+ "rawPosition": [
+ -68.5,
+ -14.5,
+ 0,
+ 68.5,
+ -14.5,
+ 0,
+ -68.5,
+ 14.5,
+ 0,
+ 68.5,
+ 14.5,
+ 0
+ ],
+ "indexes": [
+ 0,
+ 1,
+ 2,
+ 2,
+ 1,
+ 3
+ ],
+ "uv": [
+ 2,
+ 31,
+ 139,
+ 31,
+ 2,
+ 2,
+ 139,
+ 2
+ ],
+ "nuv": [
+ 0.014184397163120567,
+ 0.06060606060606061,
+ 0.9858156028368794,
+ 0.06060606060606061,
+ 0.014184397163120567,
+ 0.9393939393939394,
+ 0.9858156028368794,
+ 0.9393939393939394
+ ],
+ "minPos": [
+ -68.5,
+ -14.5,
+ 0
+ ],
+ "maxPos": [
+ 68.5,
+ 14.5,
+ 0
+ ]
+ },
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "0aa6f7d9-09d0-42bf-ae09-a445e6fd22c9@6c48a",
+ "atlasUuid": ""
+ },
+ "ver": "1.0.12",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ }
+ },
+ "userData": {
+ "hasAlpha": true,
+ "type": "sprite-frame",
+ "fixAlphaTransparencyArtifacts": false,
+ "redirect": "0aa6f7d9-09d0-42bf-ae09-a445e6fd22c9@6c48a"
+ }
+}
diff --git a/demo/assets/bundle_res.meta b/demo/assets/bundle_res.meta
new file mode 100644
index 0000000..76ab428
--- /dev/null
+++ b/demo/assets/bundle_res.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "6af74e7e-0a88-45ee-9f54-eb9fe4dbf93b",
+ "files": [],
+ "subMetas": {},
+ "userData": {
+ "isBundle": true,
+ "bundleFilterConfig": []
+ }
+}
diff --git a/demo/assets/bundle_res/pet.meta b/demo/assets/bundle_res/pet.meta
new file mode 100644
index 0000000..94e6835
--- /dev/null
+++ b/demo/assets/bundle_res/pet.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "8603cf96-ad37-4569-8219-e8a3bf3df0fe",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/bundle_res/pet/pet1.png b/demo/assets/bundle_res/pet/pet1.png
new file mode 100644
index 0000000..0d73de5
Binary files /dev/null and b/demo/assets/bundle_res/pet/pet1.png differ
diff --git a/demo/assets/bundle_res/pet/pet1.png.meta b/demo/assets/bundle_res/pet/pet1.png.meta
new file mode 100644
index 0000000..43d5522
--- /dev/null
+++ b/demo/assets/bundle_res/pet/pet1.png.meta
@@ -0,0 +1,42 @@
+{
+ "ver": "1.0.27",
+ "importer": "image",
+ "imported": true,
+ "uuid": "7bb3b566-6a3e-48f9-b414-3c5ab8527c0a",
+ "files": [
+ ".json",
+ ".png"
+ ],
+ "subMetas": {
+ "6c48a": {
+ "importer": "texture",
+ "uuid": "7bb3b566-6a3e-48f9-b414-3c5ab8527c0a@6c48a",
+ "displayName": "pet1",
+ "id": "6c48a",
+ "name": "texture",
+ "userData": {
+ "wrapModeS": "clamp-to-edge",
+ "wrapModeT": "clamp-to-edge",
+ "minfilter": "linear",
+ "magfilter": "linear",
+ "mipfilter": "nearest",
+ "anisotropy": 0,
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "7bb3b566-6a3e-48f9-b414-3c5ab8527c0a",
+ "visible": false
+ },
+ "ver": "1.0.22",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ }
+ },
+ "userData": {
+ "hasAlpha": true,
+ "type": "texture",
+ "fixAlphaTransparencyArtifacts": false,
+ "redirect": "7bb3b566-6a3e-48f9-b414-3c5ab8527c0a@6c48a"
+ }
+}
diff --git a/demo/assets/bundle_res/pet/pet2.png b/demo/assets/bundle_res/pet/pet2.png
new file mode 100644
index 0000000..26de7d8
Binary files /dev/null and b/demo/assets/bundle_res/pet/pet2.png differ
diff --git a/demo/assets/bundle_res/pet/pet2.png.meta b/demo/assets/bundle_res/pet/pet2.png.meta
new file mode 100644
index 0000000..0564052
--- /dev/null
+++ b/demo/assets/bundle_res/pet/pet2.png.meta
@@ -0,0 +1,134 @@
+{
+ "ver": "1.0.27",
+ "importer": "image",
+ "imported": true,
+ "uuid": "43b6905d-cad1-4724-a9b6-e5ba1c58846f",
+ "files": [
+ ".json",
+ ".png"
+ ],
+ "subMetas": {
+ "6c48a": {
+ "importer": "texture",
+ "uuid": "43b6905d-cad1-4724-a9b6-e5ba1c58846f@6c48a",
+ "displayName": "pet2",
+ "id": "6c48a",
+ "name": "texture",
+ "userData": {
+ "wrapModeS": "clamp-to-edge",
+ "wrapModeT": "clamp-to-edge",
+ "minfilter": "linear",
+ "magfilter": "linear",
+ "mipfilter": "none",
+ "anisotropy": 0,
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "43b6905d-cad1-4724-a9b6-e5ba1c58846f",
+ "visible": false
+ },
+ "ver": "1.0.22",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ },
+ "f9941": {
+ "importer": "sprite-frame",
+ "uuid": "43b6905d-cad1-4724-a9b6-e5ba1c58846f@f9941",
+ "displayName": "pet2",
+ "id": "f9941",
+ "name": "spriteFrame",
+ "userData": {
+ "trimType": "auto",
+ "trimThreshold": 1,
+ "rotated": false,
+ "offsetX": 0,
+ "offsetY": 0,
+ "trimX": 0,
+ "trimY": 0,
+ "width": 140,
+ "height": 140,
+ "rawWidth": 140,
+ "rawHeight": 140,
+ "borderTop": 0,
+ "borderBottom": 0,
+ "borderLeft": 0,
+ "borderRight": 0,
+ "packable": true,
+ "pixelsToUnit": 100,
+ "pivotX": 0.5,
+ "pivotY": 0.5,
+ "meshType": 0,
+ "vertices": {
+ "rawPosition": [
+ -70,
+ -70,
+ 0,
+ 70,
+ -70,
+ 0,
+ -70,
+ 70,
+ 0,
+ 70,
+ 70,
+ 0
+ ],
+ "indexes": [
+ 0,
+ 1,
+ 2,
+ 2,
+ 1,
+ 3
+ ],
+ "uv": [
+ 0,
+ 140,
+ 140,
+ 140,
+ 0,
+ 0,
+ 140,
+ 0
+ ],
+ "nuv": [
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1
+ ],
+ "minPos": [
+ -70,
+ -70,
+ 0
+ ],
+ "maxPos": [
+ 70,
+ 70,
+ 0
+ ]
+ },
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "43b6905d-cad1-4724-a9b6-e5ba1c58846f@6c48a",
+ "atlasUuid": ""
+ },
+ "ver": "1.0.12",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ }
+ },
+ "userData": {
+ "hasAlpha": true,
+ "type": "sprite-frame",
+ "fixAlphaTransparencyArtifacts": false,
+ "redirect": "43b6905d-cad1-4724-a9b6-e5ba1c58846f@6c48a"
+ }
+}
diff --git a/demo/assets/bundle_res/pet/pet3.png b/demo/assets/bundle_res/pet/pet3.png
new file mode 100644
index 0000000..bb4430b
Binary files /dev/null and b/demo/assets/bundle_res/pet/pet3.png differ
diff --git a/demo/assets/bundle_res/pet/pet3.png.meta b/demo/assets/bundle_res/pet/pet3.png.meta
new file mode 100644
index 0000000..a69df7a
--- /dev/null
+++ b/demo/assets/bundle_res/pet/pet3.png.meta
@@ -0,0 +1,134 @@
+{
+ "ver": "1.0.27",
+ "importer": "image",
+ "imported": true,
+ "uuid": "5836c379-d558-423f-a309-f822efcb834d",
+ "files": [
+ ".json",
+ ".png"
+ ],
+ "subMetas": {
+ "6c48a": {
+ "importer": "texture",
+ "uuid": "5836c379-d558-423f-a309-f822efcb834d@6c48a",
+ "displayName": "pet3",
+ "id": "6c48a",
+ "name": "texture",
+ "userData": {
+ "wrapModeS": "clamp-to-edge",
+ "wrapModeT": "clamp-to-edge",
+ "minfilter": "linear",
+ "magfilter": "linear",
+ "mipfilter": "none",
+ "anisotropy": 0,
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "5836c379-d558-423f-a309-f822efcb834d",
+ "visible": false
+ },
+ "ver": "1.0.22",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ },
+ "f9941": {
+ "importer": "sprite-frame",
+ "uuid": "5836c379-d558-423f-a309-f822efcb834d@f9941",
+ "displayName": "pet3",
+ "id": "f9941",
+ "name": "spriteFrame",
+ "userData": {
+ "trimType": "auto",
+ "trimThreshold": 1,
+ "rotated": false,
+ "offsetX": 0,
+ "offsetY": 0,
+ "trimX": 0,
+ "trimY": 0,
+ "width": 140,
+ "height": 140,
+ "rawWidth": 140,
+ "rawHeight": 140,
+ "borderTop": 0,
+ "borderBottom": 0,
+ "borderLeft": 0,
+ "borderRight": 0,
+ "packable": true,
+ "pixelsToUnit": 100,
+ "pivotX": 0.5,
+ "pivotY": 0.5,
+ "meshType": 0,
+ "vertices": {
+ "rawPosition": [
+ -70,
+ -70,
+ 0,
+ 70,
+ -70,
+ 0,
+ -70,
+ 70,
+ 0,
+ 70,
+ 70,
+ 0
+ ],
+ "indexes": [
+ 0,
+ 1,
+ 2,
+ 2,
+ 1,
+ 3
+ ],
+ "uv": [
+ 0,
+ 140,
+ 140,
+ 140,
+ 0,
+ 0,
+ 140,
+ 0
+ ],
+ "nuv": [
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1
+ ],
+ "minPos": [
+ -70,
+ -70,
+ 0
+ ],
+ "maxPos": [
+ 70,
+ 70,
+ 0
+ ]
+ },
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "5836c379-d558-423f-a309-f822efcb834d@6c48a",
+ "atlasUuid": ""
+ },
+ "ver": "1.0.12",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ }
+ },
+ "userData": {
+ "hasAlpha": true,
+ "type": "sprite-frame",
+ "fixAlphaTransparencyArtifacts": false,
+ "redirect": "5836c379-d558-423f-a309-f822efcb834d@6c48a"
+ }
+}
diff --git a/demo/assets/libs.meta b/demo/assets/libs.meta
new file mode 100644
index 0000000..8b326a6
--- /dev/null
+++ b/demo/assets/libs.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "029c5707-dcdd-4e4a-aece-264a51587b84",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/libs/.gitignore b/demo/assets/libs/.gitignore
new file mode 100644
index 0000000..71a4c83
--- /dev/null
+++ b/demo/assets/libs/.gitignore
@@ -0,0 +1,5 @@
+kunpo-inspector.min.mjs
+kunpo-inspector.min.mjs.meta
+
+kunpo-inspector.mjs
+kunpo-inspector.mjs.meta
\ No newline at end of file
diff --git a/demo/assets/libs/protobuf.min.js b/demo/assets/libs/protobuf.min.js
new file mode 100644
index 0000000..b91c234
--- /dev/null
+++ b/demo/assets/libs/protobuf.min.js
@@ -0,0 +1,8 @@
+/*!
+ * protobuf.js v7.4.0 (c) 2016, daniel wirtz
+ * compiled thu, 22 aug 2024 20:30:39 utc
+ * licensed under the bsd-3-clause license
+ * see: https://github.com/dcodeio/protobuf.js for details
+ */
+!function(d){"use strict";!function(r,u,t){var n=function t(n){var i=u[n];return i||r[n][0].call(i=u[n]={exports:{}},t,i,i.exports),i.exports}(t[0]);n.util.global.protobuf=n,"function"==typeof define&&define.amd&&define(["long"],function(t){return t&&t.isLong&&(n.util.Long=t,n.configure()),n}),"object"==typeof module&&module&&module.exports&&(module.exports=n)}({1:[function(t,n,i){n.exports=function(t,n){var i=Array(arguments.length-1),e=0,r=2,s=!0;for(;r>2],r=(3&o)<<4,h=1;break;case 1:e[s++]=f[r|o>>4],r=(15&o)<<2,h=2;break;case 2:e[s++]=f[r|o>>6],e[s++]=f[63&o],h=0}8191>4,r=h,e=2;break;case 2:n[i++]=(15&r)<<4|(60&h)>>2,r=h,e=3;break;case 3:n[i++]=(3&r)<<6|h,e=0}}if(1===e)throw Error(c);return i-u},i.test=function(t){return/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(t)}},{}],3:[function(t,n,i){function r(){this.t={}}(n.exports=r).prototype.on=function(t,n,i){return(this.t[t]||(this.t[t]=[])).push({fn:n,ctx:i||this}),this},r.prototype.off=function(t,n){if(t===d)this.t={};else if(n===d)this.t[t]=[];else for(var i=this.t[t],r=0;r>>0:n<11754943508222875e-54?(u<<31|Math.round(n/1401298464324817e-60))>>>0:(u<<31|127+(t=Math.floor(Math.log(n)/Math.LN2))<<23|8388607&Math.round(n*Math.pow(2,-t)*8388608))>>>0,i,r)}function i(t,n,i){t=t(n,i),n=2*(t>>31)+1,i=t>>>23&255,t&=8388607;return 255==i?t?NaN:1/0*n:0==i?1401298464324817e-60*n*t:n*Math.pow(2,i-150)*(8388608+t)}function r(t,n,i){h[0]=t,n[i]=o[0],n[i+1]=o[1],n[i+2]=o[2],n[i+3]=o[3]}function u(t,n,i){h[0]=t,n[i]=o[3],n[i+1]=o[2],n[i+2]=o[1],n[i+3]=o[0]}function e(t,n){return o[0]=t[n],o[1]=t[n+1],o[2]=t[n+2],o[3]=t[n+3],h[0]}function s(t,n){return o[3]=t[n],o[2]=t[n+1],o[1]=t[n+2],o[0]=t[n+3],h[0]}var h,o,f,c,a;function l(t,n,i,r,u,e){var s,h=r<0?1:0;0===(r=h?-r:r)?(t(0,u,e+n),t(0<1/r?0:2147483648,u,e+i)):isNaN(r)?(t(0,u,e+n),t(2146959360,u,e+i)):17976931348623157e292>>0,u,e+i)):r<22250738585072014e-324?(t((s=r/5e-324)>>>0,u,e+n),t((h<<31|s/4294967296)>>>0,u,e+i)):(t(4503599627370496*(s=r*Math.pow(2,-(r=1024===(r=Math.floor(Math.log(r)/Math.LN2))?1023:r)))>>>0,u,e+n),t((h<<31|r+1023<<20|1048576*s&1048575)>>>0,u,e+i))}function v(t,n,i,r,u){n=t(r,u+n),t=t(r,u+i),r=2*(t>>31)+1,u=t>>>20&2047,i=4294967296*(1048575&t)+n;return 2047==u?i?NaN:1/0*r:0==u?5e-324*r*i:r*Math.pow(2,u-1075)*(i+4503599627370496)}function w(t,n,i){f[0]=t,n[i]=c[0],n[i+1]=c[1],n[i+2]=c[2],n[i+3]=c[3],n[i+4]=c[4],n[i+5]=c[5],n[i+6]=c[6],n[i+7]=c[7]}function b(t,n,i){f[0]=t,n[i]=c[7],n[i+1]=c[6],n[i+2]=c[5],n[i+3]=c[4],n[i+4]=c[3],n[i+5]=c[2],n[i+6]=c[1],n[i+7]=c[0]}function y(t,n){return c[0]=t[n],c[1]=t[n+1],c[2]=t[n+2],c[3]=t[n+3],c[4]=t[n+4],c[5]=t[n+5],c[6]=t[n+6],c[7]=t[n+7],f[0]}function g(t,n){return c[7]=t[n],c[6]=t[n+1],c[5]=t[n+2],c[4]=t[n+3],c[3]=t[n+4],c[2]=t[n+5],c[1]=t[n+6],c[0]=t[n+7],f[0]}return"undefined"!=typeof Float32Array?(h=new Float32Array([-0]),o=new Uint8Array(h.buffer),a=128===o[3],t.writeFloatLE=a?r:u,t.writeFloatBE=a?u:r,t.readFloatLE=a?e:s,t.readFloatBE=a?s:e):(t.writeFloatLE=n.bind(null,d),t.writeFloatBE=n.bind(null,A),t.readFloatLE=i.bind(null,p),t.readFloatBE=i.bind(null,m)),"undefined"!=typeof Float64Array?(f=new Float64Array([-0]),c=new Uint8Array(f.buffer),a=128===c[7],t.writeDoubleLE=a?w:b,t.writeDoubleBE=a?b:w,t.readDoubleLE=a?y:g,t.readDoubleBE=a?g:y):(t.writeDoubleLE=l.bind(null,d,0,4),t.writeDoubleBE=l.bind(null,A,4,0),t.readDoubleLE=v.bind(null,p,0,4),t.readDoubleBE=v.bind(null,m,4,0)),t}function d(t,n,i){n[i]=255&t,n[i+1]=t>>>8&255,n[i+2]=t>>>16&255,n[i+3]=t>>>24}function A(t,n,i){n[i]=t>>>24,n[i+1]=t>>>16&255,n[i+2]=t>>>8&255,n[i+3]=255&t}function p(t,n){return(t[n]|t[n+1]<<8|t[n+2]<<16|t[n+3]<<24)>>>0}function m(t,n){return(t[n]<<24|t[n+1]<<16|t[n+2]<<8|t[n+3])>>>0}n.exports=r(r)},{}],5:[function(t,n,i){function r(t){try{var n=eval("require")(t);if(n&&(n.length||Object.keys(n).length))return n}catch(t){}return null}n.exports=r},{}],6:[function(t,n,i){n.exports=function(n,i,t){var r=t||8192,u=r>>>1,e=null,s=r;return function(t){if(t<1||u>10),e[s++]=56320+(1023&r)):e[s++]=(15&r)<<12|(63&t[n++])<<6|63&t[n++],8191>6|192:(55296==(64512&r)&&56320==(64512&(u=t.charCodeAt(s+1)))?(++s,n[i++]=(r=65536+((1023&r)<<10)+(1023&u))>>18|240,n[i++]=r>>12&63|128):n[i++]=r>>12|224,n[i++]=r>>6&63|128),n[i++]=63&r|128);return i-e}},{}],8:[function(t,n,i){var r=i;function u(){r.util.n(),r.Writer.n(r.BufferWriter),r.Reader.n(r.BufferReader)}r.build="minimal",r.Writer=t(16),r.BufferWriter=t(17),r.Reader=t(9),r.BufferReader=t(10),r.util=t(15),r.rpc=t(12),r.roots=t(11),r.configure=u,u()},{10:10,11:11,12:12,15:15,16:16,17:17,9:9}],9:[function(t,n,i){n.exports=o;var r,u=t(15),e=u.LongBits,s=u.utf8;function h(t,n){return RangeError("index out of range: "+t.pos+" + "+(n||1)+" > "+t.len)}function o(t){this.buf=t,this.pos=0,this.len=t.length}function f(){return u.Buffer?function(t){return(o.create=function(t){return u.Buffer.isBuffer(t)?new r(t):a(t)})(t)}:a}var c,a="undefined"!=typeof Uint8Array?function(t){if(t instanceof Uint8Array||Array.isArray(t))return new o(t);throw Error("illegal buffer")}:function(t){if(Array.isArray(t))return new o(t);throw Error("illegal buffer")};function l(){var t=new e(0,0),n=0;if(!(4=this.len)throw h(this);if(t.lo=(t.lo|(127&this.buf[this.pos])<<7*n)>>>0,this.buf[this.pos++]<128)return t}return t.lo=(t.lo|(127&this.buf[this.pos++])<<7*n)>>>0,t}for(;n<4;++n)if(t.lo=(t.lo|(127&this.buf[this.pos])<<7*n)>>>0,this.buf[this.pos++]<128)return t;if(t.lo=(t.lo|(127&this.buf[this.pos])<<28)>>>0,t.hi=(t.hi|(127&this.buf[this.pos])>>4)>>>0,this.buf[this.pos++]<128)return t;if(n=0,4>>0,this.buf[this.pos++]<128)return t}else for(;n<5;++n){if(this.pos>=this.len)throw h(this);if(t.hi=(t.hi|(127&this.buf[this.pos])<<7*n+3)>>>0,this.buf[this.pos++]<128)return t}throw Error("invalid varint encoding")}function v(t,n){return(t[n-4]|t[n-3]<<8|t[n-2]<<16|t[n-1]<<24)>>>0}function w(){if(this.pos+8>this.len)throw h(this,8);return new e(v(this.buf,this.pos+=4),v(this.buf,this.pos+=4))}o.create=f(),o.prototype.i=u.Array.prototype.subarray||u.Array.prototype.slice,o.prototype.uint32=(c=4294967295,function(){if(c=(127&this.buf[this.pos])>>>0,this.buf[this.pos++]<128||(c=(c|(127&this.buf[this.pos])<<7)>>>0,this.buf[this.pos++]<128||(c=(c|(127&this.buf[this.pos])<<14)>>>0,this.buf[this.pos++]<128||(c=(c|(127&this.buf[this.pos])<<21)>>>0,this.buf[this.pos++]<128||(c=(c|(15&this.buf[this.pos])<<28)>>>0,this.buf[this.pos++]<128||!((this.pos+=5)>this.len))))))return c;throw this.pos=this.len,h(this,10)}),o.prototype.int32=function(){return 0|this.uint32()},o.prototype.sint32=function(){var t=this.uint32();return t>>>1^-(1&t)|0},o.prototype.bool=function(){return 0!==this.uint32()},o.prototype.fixed32=function(){if(this.pos+4>this.len)throw h(this,4);return v(this.buf,this.pos+=4)},o.prototype.sfixed32=function(){if(this.pos+4>this.len)throw h(this,4);return 0|v(this.buf,this.pos+=4)},o.prototype.float=function(){if(this.pos+4>this.len)throw h(this,4);var t=u.float.readFloatLE(this.buf,this.pos);return this.pos+=4,t},o.prototype.double=function(){if(this.pos+8>this.len)throw h(this,4);var t=u.float.readDoubleLE(this.buf,this.pos);return this.pos+=8,t},o.prototype.bytes=function(){var t=this.uint32(),n=this.pos,i=this.pos+t;if(i>this.len)throw h(this,t);return this.pos+=t,Array.isArray(this.buf)?this.buf.slice(n,i):n===i?(t=u.Buffer)?t.alloc(0):new this.buf.constructor(0):this.i.call(this.buf,n,i)},o.prototype.string=function(){var t=this.bytes();return s.read(t,0,t.length)},o.prototype.skip=function(t){if("number"==typeof t){if(this.pos+t>this.len)throw h(this,t);this.pos+=t}else do{if(this.pos>=this.len)throw h(this)}while(128&this.buf[this.pos++]);return this},o.prototype.skipType=function(t){switch(t){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;4!=(t=7&this.uint32());)this.skipType(t);break;case 5:this.skip(4);break;default:throw Error("invalid wire type "+t+" at offset "+this.pos)}return this},o.n=function(t){r=t,o.create=f(),r.n();var n=u.Long?"toLong":"toNumber";u.merge(o.prototype,{int64:function(){return l.call(this)[n](!1)},uint64:function(){return l.call(this)[n](!0)},sint64:function(){return l.call(this).zzDecode()[n](!1)},fixed64:function(){return w.call(this)[n](!0)},sfixed64:function(){return w.call(this)[n](!1)}})}},{15:15}],10:[function(t,n,i){n.exports=e;var r=t(9),u=((e.prototype=Object.create(r.prototype)).constructor=e,t(15));function e(t){r.call(this,t)}e.n=function(){u.Buffer&&(e.prototype.i=u.Buffer.prototype.slice)},e.prototype.string=function(){var t=this.uint32();return this.buf.utf8Slice?this.buf.utf8Slice(this.pos,this.pos=Math.min(this.pos+t,this.len)):this.buf.toString("utf-8",this.pos,this.pos=Math.min(this.pos+t,this.len))},e.n()},{15:15,9:9}],11:[function(t,n,i){n.exports={}},{}],12:[function(t,n,i){i.Service=t(13)},{13:13}],13:[function(t,n,i){n.exports=r;var h=t(15);function r(t,n,i){if("function"!=typeof t)throw TypeError("rpcImpl must be a function");h.EventEmitter.call(this),this.rpcImpl=t,this.requestDelimited=!!n,this.responseDelimited=!!i}((r.prototype=Object.create(h.EventEmitter.prototype)).constructor=r).prototype.rpcCall=function t(i,n,r,u,e){if(!u)throw TypeError("request must be specified");var s=this;if(!e)return h.asPromise(t,s,i,n,r,u);if(!s.rpcImpl)return setTimeout(function(){e(Error("already ended"))},0),d;try{return s.rpcImpl(i,n[s.requestDelimited?"encodeDelimited":"encode"](u).finish(),function(t,n){if(t)return s.emit("error",t,i),e(t);if(null===n)return s.end(!0),d;if(!(n instanceof r))try{n=r[s.responseDelimited?"decodeDelimited":"decode"](n)}catch(t){return s.emit("error",t,i),e(t)}return s.emit("data",n,i),e(null,n)})}catch(t){return s.emit("error",t,i),setTimeout(function(){e(t)},0),d}},r.prototype.end=function(t){return this.rpcImpl&&(t||this.rpcImpl(null,null,null),this.rpcImpl=null,this.emit("end").off()),this}},{15:15}],14:[function(t,n,i){n.exports=u;var r=t(15);function u(t,n){this.lo=t>>>0,this.hi=n>>>0}var e=u.zero=new u(0,0),s=(e.toNumber=function(){return 0},e.zzEncode=e.zzDecode=function(){return this},e.length=function(){return 1},u.zeroHash="\0\0\0\0\0\0\0\0",u.fromNumber=function(t){var n,i;return 0===t?e:(i=(t=(n=t<0)?-t:t)>>>0,t=(t-i)/4294967296>>>0,n&&(t=~t>>>0,i=~i>>>0,4294967295<++i&&(i=0,4294967295<++t&&(t=0))),new u(i,t))},u.from=function(t){if("number"==typeof t)return u.fromNumber(t);if(r.isString(t)){if(!r.Long)return u.fromNumber(parseInt(t,10));t=r.Long.fromString(t)}return t.low||t.high?new u(t.low>>>0,t.high>>>0):e},u.prototype.toNumber=function(t){var n;return!t&&this.hi>>>31?(t=1+~this.lo>>>0,n=~this.hi>>>0,-(t+4294967296*(n=t?n:n+1>>>0))):this.lo+4294967296*this.hi},u.prototype.toLong=function(t){return r.Long?new r.Long(0|this.lo,0|this.hi,!!t):{low:0|this.lo,high:0|this.hi,unsigned:!!t}},String.prototype.charCodeAt);u.fromHash=function(t){return"\0\0\0\0\0\0\0\0"===t?e:new u((s.call(t,0)|s.call(t,1)<<8|s.call(t,2)<<16|s.call(t,3)<<24)>>>0,(s.call(t,4)|s.call(t,5)<<8|s.call(t,6)<<16|s.call(t,7)<<24)>>>0)},u.prototype.toHash=function(){return String.fromCharCode(255&this.lo,this.lo>>>8&255,this.lo>>>16&255,this.lo>>>24,255&this.hi,this.hi>>>8&255,this.hi>>>16&255,this.hi>>>24)},u.prototype.zzEncode=function(){var t=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^t)>>>0,this.lo=(this.lo<<1^t)>>>0,this},u.prototype.zzDecode=function(){var t=-(1&this.lo);return this.lo=((this.lo>>>1|this.hi<<31)^t)>>>0,this.hi=(this.hi>>>1^t)>>>0,this},u.prototype.length=function(){var t=this.lo,n=(this.lo>>>28|this.hi<<4)>>>0,i=this.hi>>>24;return 0==i?0==n?t<16384?t<128?1:2:t<2097152?3:4:n<16384?n<128?5:6:n<2097152?7:8:i<128?9:10}},{15:15}],15:[function(t,n,i){var r=i;function u(t,n,i){for(var r=Object.keys(n),u=0;u>>7|t.hi<<25)>>>0,t.hi>>>=7;for(;127>>7;n[i++]=t.lo}function y(t,n,i){n[i]=255&t,n[i+1]=t>>>8&255,n[i+2]=t>>>16&255,n[i+3]=t>>>24}a.create=l(),a.alloc=function(t){return new u.Array(t)},u.Array!==Array&&(a.alloc=u.pool(a.alloc,u.Array.prototype.subarray)),a.prototype.e=function(t,n,i){return this.tail=this.tail.next=new o(t,n,i),this.len+=n,this},(w.prototype=Object.create(o.prototype)).fn=function(t,n,i){for(;127>>=7;n[i]=t},a.prototype.uint32=function(t){return this.len+=(this.tail=this.tail.next=new w((t>>>=0)<128?1:t<16384?2:t<2097152?3:t<268435456?4:5,t)).len,this},a.prototype.int32=function(t){return t<0?this.e(b,10,e.fromNumber(t)):this.uint32(t)},a.prototype.sint32=function(t){return this.uint32((t<<1^t>>31)>>>0)},a.prototype.int64=a.prototype.uint64=function(t){t=e.from(t);return this.e(b,t.length(),t)},a.prototype.sint64=function(t){t=e.from(t).zzEncode();return this.e(b,t.length(),t)},a.prototype.bool=function(t){return this.e(v,1,t?1:0)},a.prototype.sfixed32=a.prototype.fixed32=function(t){return this.e(y,4,t>>>0)},a.prototype.sfixed64=a.prototype.fixed64=function(t){t=e.from(t);return this.e(y,4,t.lo).e(y,4,t.hi)},a.prototype.float=function(t){return this.e(u.float.writeFloatLE,4,t)},a.prototype.double=function(t){return this.e(u.float.writeDoubleLE,8,t)};var g=u.Array.prototype.set?function(t,n,i){n.set(t,i)}:function(t,n,i){for(var r=0;r>>0;return i?(u.isString(t)&&(n=a.alloc(i=s.length(t)),s.decode(t,n,0),t=n),this.uint32(i).e(g,i,t)):this.e(v,1,0)},a.prototype.string=function(t){var n=h.length(t);return n?this.uint32(n).e(h.write,n,t):this.e(v,1,0)},a.prototype.fork=function(){return this.states=new c(this),this.head=this.tail=new o(f,0,0),this.len=0,this},a.prototype.reset=function(){return this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new o(f,0,0),this.len=0),this},a.prototype.ldelim=function(){var t=this.head,n=this.tail,i=this.len;return this.reset().uint32(i),i&&(this.tail.next=t.next,this.tail=n,this.len+=i),this},a.prototype.finish=function(){for(var t=this.head.next,n=this.constructor.alloc(this.len),i=0;t;)t.fn(t.val,n,i),i+=t.len,t=t.next;return n},a.n=function(t){r=t,a.create=l(),r.n()}},{15:15}],17:[function(t,n,i){n.exports=e;var r=t(16),u=((e.prototype=Object.create(r.prototype)).constructor=e,t(15));function e(){r.call(this)}function s(t,n,i){t.length<40?u.utf8.write(t,n,i):n.utf8Write?n.utf8Write(t,i):n.write(t,i)}e.n=function(){e.alloc=u.u,e.writeBytesBuffer=u.Buffer&&u.Buffer.prototype instanceof Uint8Array&&"set"===u.Buffer.prototype.set.name?function(t,n,i){n.set(t,i)}:function(t,n,i){if(t.copy)t.copy(n,i,0,t.length);else for(var r=0;r>>0;return this.uint32(n),n&&this.e(e.writeBytesBuffer,n,t),this},e.prototype.string=function(t){var n=u.Buffer.byteLength(t);return this.uint32(n),n&&this.e(s,n,t),this},e.n()},{15:15,16:16}]},{},[8])}();
+//# sourceMappingURL=protobuf.min.js.map
diff --git a/demo/assets/libs/protobuf.min.js.map b/demo/assets/libs/protobuf.min.js.map
new file mode 100644
index 0000000..9647827
--- /dev/null
+++ b/demo/assets/libs/protobuf.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["lib/prelude.js","../node_modules/@protobufjs/aspromise/index.js","../node_modules/@protobufjs/base64/index.js","../node_modules/@protobufjs/eventemitter/index.js","../node_modules/@protobufjs/float/index.js","../node_modules/@protobufjs/inquire/index.js","../node_modules/@protobufjs/pool/index.js","../node_modules/@protobufjs/utf8/index.js","../src/index-minimal","../src/reader.js","../src/reader_buffer.js","../src/roots.js","../src/rpc.js","../src/rpc/service.js","../src/util/longbits.js","../src/util/minimal.js","../src/writer.js","../src/writer_buffer.js"],"names":["undefined","modules","cache","entries","protobuf","$require","name","$module","call","exports","util","global","define","amd","Long","isLong","configure","module","1","require","fn","ctx","params","Array","arguments","length","offset","index","pending","Promise","resolve","reject","err","apply","base64","string","p","n","Math","ceil","b64","s64","i","encode","buffer","start","end","t","parts","chunk","j","b","push","String","fromCharCode","slice","join","invalidEncoding","decode","c","charCodeAt","Error","test","EventEmitter","this","_listeners","prototype","on","evt","off","listeners","splice","emit","args","factory","writeFloat_ieee754","writeUint","val","buf","pos","sign","isNaN","round","exponent","floor","log","LN2","pow","readFloat_ieee754","readUint","uint","mantissa","NaN","Infinity","writeFloat_f32_cpy","f32","f8b","writeFloat_f32_rev","readFloat_f32_cpy","readFloat_f32_rev","f64","le","writeDouble_ieee754","off0","off1","readDouble_ieee754","lo","hi","writeDouble_f64_cpy","writeDouble_f64_rev","readDouble_f64_cpy","readDouble_f64_rev","Float32Array","Uint8Array","writeFloatLE","writeFloatBE","readFloatLE","readFloatBE","bind","writeUintLE","writeUintBE","readUintLE","readUintBE","Float64Array","writeDoubleLE","writeDoubleBE","readDoubleLE","readDoubleBE","inquire","moduleName","mod","eval","Object","keys","e","alloc","size","SIZE","MAX","slab","utf8","len","read","write","c1","c2","_configure","Writer","BufferWriter","Reader","BufferReader","build","rpc","roots","LongBits","indexOutOfRange","reader","writeLength","RangeError","create","Buffer","isBuffer","create_array","value","isArray","readLongVarint","bits","readFixed32_end","readFixed64","_slice","subarray","uint32","int32","sint32","bool","fixed32","sfixed32","float","double","bytes","nativeBuffer","constructor","skip","skipType","wireType","BufferReader_","merge","int64","uint64","sint64","zzDecode","fixed64","sfixed64","utf8Slice","min","toString","Service","rpcImpl","requestDelimited","responseDelimited","TypeError","Boolean","rpcCall","method","requestCtor","responseCtor","request","callback","self","asPromise","setTimeout","finish","response","endedByRPC","zero","toNumber","zzEncode","zeroHash","fromNumber","from","isString","parseInt","fromString","low","high","unsigned","toLong","fromHash","hash","toHash","mask","part0","part1","part2","dst","src","ifNotSet","newError","CustomError","message","properties","defineProperty","get","captureStackTrace","stack","writable","enumerable","configurable","set","pool","isNode","process","versions","node","window","emptyArray","freeze","emptyObject","isInteger","Number","isFinite","isObject","isset","isSet","obj","prop","hasOwnProperty","utf8Write","_Buffer_from","_Buffer_allocUnsafe","newBuffer","sizeOrArray","dcodeIO","key2Re","key32Re","key64Re","longToHash","longFromHash","fromBits","lcFirst","str","toLowerCase","substring","ProtocolError","oneOfGetter","fieldNames","fieldMap","oneOfSetter","toJSONOptions","longs","enums","json","encoding","allocUnsafe","Op","next","noop","State","writer","head","tail","states","writeByte","VarintOp","writeVarint64","writeFixed32","_push","writeBytes","fork","reset","ldelim","BufferWriter_","writeStringBuffer","writeBytesBuffer","copy","byteLength"],"mappings":"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","file":"protobuf.min.js","sourcesContent":["(function prelude(modules, cache, entries) {\n\n // This is the prelude used to bundle protobuf.js for the browser. Wraps up the CommonJS\n // sources through a conflict-free require shim and is again wrapped within an iife that\n // provides a minification-friendly `undefined` var plus a global \"use strict\" directive\n // so that minification can remove the directives of each module.\n\n function $require(name) {\n var $module = cache[name];\n if (!$module)\n modules[name][0].call($module = cache[name] = { exports: {} }, $require, $module, $module.exports);\n return $module.exports;\n }\n\n var protobuf = $require(entries[0]);\n\n // Expose globally\n protobuf.util.global.protobuf = protobuf;\n\n // Be nice to AMD\n if (typeof define === \"function\" && define.amd)\n define([\"long\"], function(Long) {\n if (Long && Long.isLong) {\n protobuf.util.Long = Long;\n protobuf.configure();\n }\n return protobuf;\n });\n\n // Be nice to CommonJS\n if (typeof module === \"object\" && module && module.exports)\n module.exports = protobuf;\n\n})/* end of prelude */","\"use strict\";\r\nmodule.exports = asPromise;\r\n\r\n/**\r\n * Callback as used by {@link util.asPromise}.\r\n * @typedef asPromiseCallback\r\n * @type {function}\r\n * @param {Error|null} error Error, if any\r\n * @param {...*} params Additional arguments\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Returns a promise from a node-style callback function.\r\n * @memberof util\r\n * @param {asPromiseCallback} fn Function to call\r\n * @param {*} ctx Function context\r\n * @param {...*} params Function arguments\r\n * @returns {Promise<*>} Promisified function\r\n */\r\nfunction asPromise(fn, ctx/*, varargs */) {\r\n var params = new Array(arguments.length - 1),\r\n offset = 0,\r\n index = 2,\r\n pending = true;\r\n while (index < arguments.length)\r\n params[offset++] = arguments[index++];\r\n return new Promise(function executor(resolve, reject) {\r\n params[offset] = function callback(err/*, varargs */) {\r\n if (pending) {\r\n pending = false;\r\n if (err)\r\n reject(err);\r\n else {\r\n var params = new Array(arguments.length - 1),\r\n offset = 0;\r\n while (offset < params.length)\r\n params[offset++] = arguments[offset];\r\n resolve.apply(null, params);\r\n }\r\n }\r\n };\r\n try {\r\n fn.apply(ctx || null, params);\r\n } catch (err) {\r\n if (pending) {\r\n pending = false;\r\n reject(err);\r\n }\r\n }\r\n });\r\n}\r\n","\"use strict\";\r\n\r\n/**\r\n * A minimal base64 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar base64 = exports;\r\n\r\n/**\r\n * Calculates the byte length of a base64 encoded string.\r\n * @param {string} string Base64 encoded string\r\n * @returns {number} Byte length\r\n */\r\nbase64.length = function length(string) {\r\n var p = string.length;\r\n if (!p)\r\n return 0;\r\n var n = 0;\r\n while (--p % 4 > 1 && string.charAt(p) === \"=\")\r\n ++n;\r\n return Math.ceil(string.length * 3) / 4 - n;\r\n};\r\n\r\n// Base64 encoding table\r\nvar b64 = new Array(64);\r\n\r\n// Base64 decoding table\r\nvar s64 = new Array(123);\r\n\r\n// 65..90, 97..122, 48..57, 43, 47\r\nfor (var i = 0; i < 64;)\r\n s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;\r\n\r\n/**\r\n * Encodes a buffer to a base64 encoded string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} Base64 encoded string\r\n */\r\nbase64.encode = function encode(buffer, start, end) {\r\n var parts = null,\r\n chunk = [];\r\n var i = 0, // output index\r\n j = 0, // goto index\r\n t; // temporary\r\n while (start < end) {\r\n var b = buffer[start++];\r\n switch (j) {\r\n case 0:\r\n chunk[i++] = b64[b >> 2];\r\n t = (b & 3) << 4;\r\n j = 1;\r\n break;\r\n case 1:\r\n chunk[i++] = b64[t | b >> 4];\r\n t = (b & 15) << 2;\r\n j = 2;\r\n break;\r\n case 2:\r\n chunk[i++] = b64[t | b >> 6];\r\n chunk[i++] = b64[b & 63];\r\n j = 0;\r\n break;\r\n }\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (j) {\r\n chunk[i++] = b64[t];\r\n chunk[i++] = 61;\r\n if (j === 1)\r\n chunk[i++] = 61;\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\nvar invalidEncoding = \"invalid encoding\";\r\n\r\n/**\r\n * Decodes a base64 encoded string to a buffer.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Number of bytes written\r\n * @throws {Error} If encoding is invalid\r\n */\r\nbase64.decode = function decode(string, buffer, offset) {\r\n var start = offset;\r\n var j = 0, // goto index\r\n t; // temporary\r\n for (var i = 0; i < string.length;) {\r\n var c = string.charCodeAt(i++);\r\n if (c === 61 && j > 1)\r\n break;\r\n if ((c = s64[c]) === undefined)\r\n throw Error(invalidEncoding);\r\n switch (j) {\r\n case 0:\r\n t = c;\r\n j = 1;\r\n break;\r\n case 1:\r\n buffer[offset++] = t << 2 | (c & 48) >> 4;\r\n t = c;\r\n j = 2;\r\n break;\r\n case 2:\r\n buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2;\r\n t = c;\r\n j = 3;\r\n break;\r\n case 3:\r\n buffer[offset++] = (t & 3) << 6 | c;\r\n j = 0;\r\n break;\r\n }\r\n }\r\n if (j === 1)\r\n throw Error(invalidEncoding);\r\n return offset - start;\r\n};\r\n\r\n/**\r\n * Tests if the specified string appears to be base64 encoded.\r\n * @param {string} string String to test\r\n * @returns {boolean} `true` if probably base64 encoded, otherwise false\r\n */\r\nbase64.test = function test(string) {\r\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(string);\r\n};\r\n","\"use strict\";\r\nmodule.exports = EventEmitter;\r\n\r\n/**\r\n * Constructs a new event emitter instance.\r\n * @classdesc A minimal event emitter.\r\n * @memberof util\r\n * @constructor\r\n */\r\nfunction EventEmitter() {\r\n\r\n /**\r\n * Registered listeners.\r\n * @type {Object.}\r\n * @private\r\n */\r\n this._listeners = {};\r\n}\r\n\r\n/**\r\n * Registers an event listener.\r\n * @param {string} evt Event name\r\n * @param {function} fn Listener\r\n * @param {*} [ctx] Listener context\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.on = function on(evt, fn, ctx) {\r\n (this._listeners[evt] || (this._listeners[evt] = [])).push({\r\n fn : fn,\r\n ctx : ctx || this\r\n });\r\n return this;\r\n};\r\n\r\n/**\r\n * Removes an event listener or any matching listeners if arguments are omitted.\r\n * @param {string} [evt] Event name. Removes all listeners if omitted.\r\n * @param {function} [fn] Listener to remove. Removes all listeners of `evt` if omitted.\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.off = function off(evt, fn) {\r\n if (evt === undefined)\r\n this._listeners = {};\r\n else {\r\n if (fn === undefined)\r\n this._listeners[evt] = [];\r\n else {\r\n var listeners = this._listeners[evt];\r\n for (var i = 0; i < listeners.length;)\r\n if (listeners[i].fn === fn)\r\n listeners.splice(i, 1);\r\n else\r\n ++i;\r\n }\r\n }\r\n return this;\r\n};\r\n\r\n/**\r\n * Emits an event by calling its listeners with the specified arguments.\r\n * @param {string} evt Event name\r\n * @param {...*} args Arguments\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.emit = function emit(evt) {\r\n var listeners = this._listeners[evt];\r\n if (listeners) {\r\n var args = [],\r\n i = 1;\r\n for (; i < arguments.length;)\r\n args.push(arguments[i++]);\r\n for (i = 0; i < listeners.length;)\r\n listeners[i].fn.apply(listeners[i++].ctx, args);\r\n }\r\n return this;\r\n};\r\n","\"use strict\";\r\n\r\nmodule.exports = factory(factory);\r\n\r\n/**\r\n * Reads / writes floats / doubles from / to buffers.\r\n * @name util.float\r\n * @namespace\r\n */\r\n\r\n/**\r\n * Writes a 32 bit float to a buffer using little endian byte order.\r\n * @name util.float.writeFloatLE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Writes a 32 bit float to a buffer using big endian byte order.\r\n * @name util.float.writeFloatBE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Reads a 32 bit float from a buffer using little endian byte order.\r\n * @name util.float.readFloatLE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Reads a 32 bit float from a buffer using big endian byte order.\r\n * @name util.float.readFloatBE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Writes a 64 bit double to a buffer using little endian byte order.\r\n * @name util.float.writeDoubleLE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Writes a 64 bit double to a buffer using big endian byte order.\r\n * @name util.float.writeDoubleBE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Reads a 64 bit double from a buffer using little endian byte order.\r\n * @name util.float.readDoubleLE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Reads a 64 bit double from a buffer using big endian byte order.\r\n * @name util.float.readDoubleBE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n// Factory function for the purpose of node-based testing in modified global environments\r\nfunction factory(exports) {\r\n\r\n // float: typed array\r\n if (typeof Float32Array !== \"undefined\") (function() {\r\n\r\n var f32 = new Float32Array([ -0 ]),\r\n f8b = new Uint8Array(f32.buffer),\r\n le = f8b[3] === 128;\r\n\r\n function writeFloat_f32_cpy(val, buf, pos) {\r\n f32[0] = val;\r\n buf[pos ] = f8b[0];\r\n buf[pos + 1] = f8b[1];\r\n buf[pos + 2] = f8b[2];\r\n buf[pos + 3] = f8b[3];\r\n }\r\n\r\n function writeFloat_f32_rev(val, buf, pos) {\r\n f32[0] = val;\r\n buf[pos ] = f8b[3];\r\n buf[pos + 1] = f8b[2];\r\n buf[pos + 2] = f8b[1];\r\n buf[pos + 3] = f8b[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.writeFloatLE = le ? writeFloat_f32_cpy : writeFloat_f32_rev;\r\n /* istanbul ignore next */\r\n exports.writeFloatBE = le ? writeFloat_f32_rev : writeFloat_f32_cpy;\r\n\r\n function readFloat_f32_cpy(buf, pos) {\r\n f8b[0] = buf[pos ];\r\n f8b[1] = buf[pos + 1];\r\n f8b[2] = buf[pos + 2];\r\n f8b[3] = buf[pos + 3];\r\n return f32[0];\r\n }\r\n\r\n function readFloat_f32_rev(buf, pos) {\r\n f8b[3] = buf[pos ];\r\n f8b[2] = buf[pos + 1];\r\n f8b[1] = buf[pos + 2];\r\n f8b[0] = buf[pos + 3];\r\n return f32[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.readFloatLE = le ? readFloat_f32_cpy : readFloat_f32_rev;\r\n /* istanbul ignore next */\r\n exports.readFloatBE = le ? readFloat_f32_rev : readFloat_f32_cpy;\r\n\r\n // float: ieee754\r\n })(); else (function() {\r\n\r\n function writeFloat_ieee754(writeUint, val, buf, pos) {\r\n var sign = val < 0 ? 1 : 0;\r\n if (sign)\r\n val = -val;\r\n if (val === 0)\r\n writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos);\r\n else if (isNaN(val))\r\n writeUint(2143289344, buf, pos);\r\n else if (val > 3.4028234663852886e+38) // +-Infinity\r\n writeUint((sign << 31 | 2139095040) >>> 0, buf, pos);\r\n else if (val < 1.1754943508222875e-38) // denormal\r\n writeUint((sign << 31 | Math.round(val / 1.401298464324817e-45)) >>> 0, buf, pos);\r\n else {\r\n var exponent = Math.floor(Math.log(val) / Math.LN2),\r\n mantissa = Math.round(val * Math.pow(2, -exponent) * 8388608) & 8388607;\r\n writeUint((sign << 31 | exponent + 127 << 23 | mantissa) >>> 0, buf, pos);\r\n }\r\n }\r\n\r\n exports.writeFloatLE = writeFloat_ieee754.bind(null, writeUintLE);\r\n exports.writeFloatBE = writeFloat_ieee754.bind(null, writeUintBE);\r\n\r\n function readFloat_ieee754(readUint, buf, pos) {\r\n var uint = readUint(buf, pos),\r\n sign = (uint >> 31) * 2 + 1,\r\n exponent = uint >>> 23 & 255,\r\n mantissa = uint & 8388607;\r\n return exponent === 255\r\n ? mantissa\r\n ? NaN\r\n : sign * Infinity\r\n : exponent === 0 // denormal\r\n ? sign * 1.401298464324817e-45 * mantissa\r\n : sign * Math.pow(2, exponent - 150) * (mantissa + 8388608);\r\n }\r\n\r\n exports.readFloatLE = readFloat_ieee754.bind(null, readUintLE);\r\n exports.readFloatBE = readFloat_ieee754.bind(null, readUintBE);\r\n\r\n })();\r\n\r\n // double: typed array\r\n if (typeof Float64Array !== \"undefined\") (function() {\r\n\r\n var f64 = new Float64Array([-0]),\r\n f8b = new Uint8Array(f64.buffer),\r\n le = f8b[7] === 128;\r\n\r\n function writeDouble_f64_cpy(val, buf, pos) {\r\n f64[0] = val;\r\n buf[pos ] = f8b[0];\r\n buf[pos + 1] = f8b[1];\r\n buf[pos + 2] = f8b[2];\r\n buf[pos + 3] = f8b[3];\r\n buf[pos + 4] = f8b[4];\r\n buf[pos + 5] = f8b[5];\r\n buf[pos + 6] = f8b[6];\r\n buf[pos + 7] = f8b[7];\r\n }\r\n\r\n function writeDouble_f64_rev(val, buf, pos) {\r\n f64[0] = val;\r\n buf[pos ] = f8b[7];\r\n buf[pos + 1] = f8b[6];\r\n buf[pos + 2] = f8b[5];\r\n buf[pos + 3] = f8b[4];\r\n buf[pos + 4] = f8b[3];\r\n buf[pos + 5] = f8b[2];\r\n buf[pos + 6] = f8b[1];\r\n buf[pos + 7] = f8b[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.writeDoubleLE = le ? writeDouble_f64_cpy : writeDouble_f64_rev;\r\n /* istanbul ignore next */\r\n exports.writeDoubleBE = le ? writeDouble_f64_rev : writeDouble_f64_cpy;\r\n\r\n function readDouble_f64_cpy(buf, pos) {\r\n f8b[0] = buf[pos ];\r\n f8b[1] = buf[pos + 1];\r\n f8b[2] = buf[pos + 2];\r\n f8b[3] = buf[pos + 3];\r\n f8b[4] = buf[pos + 4];\r\n f8b[5] = buf[pos + 5];\r\n f8b[6] = buf[pos + 6];\r\n f8b[7] = buf[pos + 7];\r\n return f64[0];\r\n }\r\n\r\n function readDouble_f64_rev(buf, pos) {\r\n f8b[7] = buf[pos ];\r\n f8b[6] = buf[pos + 1];\r\n f8b[5] = buf[pos + 2];\r\n f8b[4] = buf[pos + 3];\r\n f8b[3] = buf[pos + 4];\r\n f8b[2] = buf[pos + 5];\r\n f8b[1] = buf[pos + 6];\r\n f8b[0] = buf[pos + 7];\r\n return f64[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.readDoubleLE = le ? readDouble_f64_cpy : readDouble_f64_rev;\r\n /* istanbul ignore next */\r\n exports.readDoubleBE = le ? readDouble_f64_rev : readDouble_f64_cpy;\r\n\r\n // double: ieee754\r\n })(); else (function() {\r\n\r\n function writeDouble_ieee754(writeUint, off0, off1, val, buf, pos) {\r\n var sign = val < 0 ? 1 : 0;\r\n if (sign)\r\n val = -val;\r\n if (val === 0) {\r\n writeUint(0, buf, pos + off0);\r\n writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos + off1);\r\n } else if (isNaN(val)) {\r\n writeUint(0, buf, pos + off0);\r\n writeUint(2146959360, buf, pos + off1);\r\n } else if (val > 1.7976931348623157e+308) { // +-Infinity\r\n writeUint(0, buf, pos + off0);\r\n writeUint((sign << 31 | 2146435072) >>> 0, buf, pos + off1);\r\n } else {\r\n var mantissa;\r\n if (val < 2.2250738585072014e-308) { // denormal\r\n mantissa = val / 5e-324;\r\n writeUint(mantissa >>> 0, buf, pos + off0);\r\n writeUint((sign << 31 | mantissa / 4294967296) >>> 0, buf, pos + off1);\r\n } else {\r\n var exponent = Math.floor(Math.log(val) / Math.LN2);\r\n if (exponent === 1024)\r\n exponent = 1023;\r\n mantissa = val * Math.pow(2, -exponent);\r\n writeUint(mantissa * 4503599627370496 >>> 0, buf, pos + off0);\r\n writeUint((sign << 31 | exponent + 1023 << 20 | mantissa * 1048576 & 1048575) >>> 0, buf, pos + off1);\r\n }\r\n }\r\n }\r\n\r\n exports.writeDoubleLE = writeDouble_ieee754.bind(null, writeUintLE, 0, 4);\r\n exports.writeDoubleBE = writeDouble_ieee754.bind(null, writeUintBE, 4, 0);\r\n\r\n function readDouble_ieee754(readUint, off0, off1, buf, pos) {\r\n var lo = readUint(buf, pos + off0),\r\n hi = readUint(buf, pos + off1);\r\n var sign = (hi >> 31) * 2 + 1,\r\n exponent = hi >>> 20 & 2047,\r\n mantissa = 4294967296 * (hi & 1048575) + lo;\r\n return exponent === 2047\r\n ? mantissa\r\n ? NaN\r\n : sign * Infinity\r\n : exponent === 0 // denormal\r\n ? sign * 5e-324 * mantissa\r\n : sign * Math.pow(2, exponent - 1075) * (mantissa + 4503599627370496);\r\n }\r\n\r\n exports.readDoubleLE = readDouble_ieee754.bind(null, readUintLE, 0, 4);\r\n exports.readDoubleBE = readDouble_ieee754.bind(null, readUintBE, 4, 0);\r\n\r\n })();\r\n\r\n return exports;\r\n}\r\n\r\n// uint helpers\r\n\r\nfunction writeUintLE(val, buf, pos) {\r\n buf[pos ] = val & 255;\r\n buf[pos + 1] = val >>> 8 & 255;\r\n buf[pos + 2] = val >>> 16 & 255;\r\n buf[pos + 3] = val >>> 24;\r\n}\r\n\r\nfunction writeUintBE(val, buf, pos) {\r\n buf[pos ] = val >>> 24;\r\n buf[pos + 1] = val >>> 16 & 255;\r\n buf[pos + 2] = val >>> 8 & 255;\r\n buf[pos + 3] = val & 255;\r\n}\r\n\r\nfunction readUintLE(buf, pos) {\r\n return (buf[pos ]\r\n | buf[pos + 1] << 8\r\n | buf[pos + 2] << 16\r\n | buf[pos + 3] << 24) >>> 0;\r\n}\r\n\r\nfunction readUintBE(buf, pos) {\r\n return (buf[pos ] << 24\r\n | buf[pos + 1] << 16\r\n | buf[pos + 2] << 8\r\n | buf[pos + 3]) >>> 0;\r\n}\r\n","\"use strict\";\r\nmodule.exports = inquire;\r\n\r\n/**\r\n * Requires a module only if available.\r\n * @memberof util\r\n * @param {string} moduleName Module to require\r\n * @returns {?Object} Required module if available and not empty, otherwise `null`\r\n */\r\nfunction inquire(moduleName) {\r\n try {\r\n var mod = eval(\"quire\".replace(/^/,\"re\"))(moduleName); // eslint-disable-line no-eval\r\n if (mod && (mod.length || Object.keys(mod).length))\r\n return mod;\r\n } catch (e) {} // eslint-disable-line no-empty\r\n return null;\r\n}\r\n","\"use strict\";\r\nmodule.exports = pool;\r\n\r\n/**\r\n * An allocator as used by {@link util.pool}.\r\n * @typedef PoolAllocator\r\n * @type {function}\r\n * @param {number} size Buffer size\r\n * @returns {Uint8Array} Buffer\r\n */\r\n\r\n/**\r\n * A slicer as used by {@link util.pool}.\r\n * @typedef PoolSlicer\r\n * @type {function}\r\n * @param {number} start Start offset\r\n * @param {number} end End offset\r\n * @returns {Uint8Array} Buffer slice\r\n * @this {Uint8Array}\r\n */\r\n\r\n/**\r\n * A general purpose buffer pool.\r\n * @memberof util\r\n * @function\r\n * @param {PoolAllocator} alloc Allocator\r\n * @param {PoolSlicer} slice Slicer\r\n * @param {number} [size=8192] Slab size\r\n * @returns {PoolAllocator} Pooled allocator\r\n */\r\nfunction pool(alloc, slice, size) {\r\n var SIZE = size || 8192;\r\n var MAX = SIZE >>> 1;\r\n var slab = null;\r\n var offset = SIZE;\r\n return function pool_alloc(size) {\r\n if (size < 1 || size > MAX)\r\n return alloc(size);\r\n if (offset + size > SIZE) {\r\n slab = alloc(SIZE);\r\n offset = 0;\r\n }\r\n var buf = slice.call(slab, offset, offset += size);\r\n if (offset & 7) // align to 32 bit\r\n offset = (offset | 7) + 1;\r\n return buf;\r\n };\r\n}\r\n","\"use strict\";\r\n\r\n/**\r\n * A minimal UTF8 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar utf8 = exports;\r\n\r\n/**\r\n * Calculates the UTF8 byte length of a string.\r\n * @param {string} string String\r\n * @returns {number} Byte length\r\n */\r\nutf8.length = function utf8_length(string) {\r\n var len = 0,\r\n c = 0;\r\n for (var i = 0; i < string.length; ++i) {\r\n c = string.charCodeAt(i);\r\n if (c < 128)\r\n len += 1;\r\n else if (c < 2048)\r\n len += 2;\r\n else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {\r\n ++i;\r\n len += 4;\r\n } else\r\n len += 3;\r\n }\r\n return len;\r\n};\r\n\r\n/**\r\n * Reads UTF8 bytes as a string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} String read\r\n */\r\nutf8.read = function utf8_read(buffer, start, end) {\r\n var len = end - start;\r\n if (len < 1)\r\n return \"\";\r\n var parts = null,\r\n chunk = [],\r\n i = 0, // char offset\r\n t; // temporary\r\n while (start < end) {\r\n t = buffer[start++];\r\n if (t < 128)\r\n chunk[i++] = t;\r\n else if (t > 191 && t < 224)\r\n chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\r\n else if (t > 239 && t < 365) {\r\n t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\r\n chunk[i++] = 0xD800 + (t >> 10);\r\n chunk[i++] = 0xDC00 + (t & 1023);\r\n } else\r\n chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\n/**\r\n * Writes a string as UTF8 bytes.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Bytes written\r\n */\r\nutf8.write = function utf8_write(string, buffer, offset) {\r\n var start = offset,\r\n c1, // character 1\r\n c2; // character 2\r\n for (var i = 0; i < string.length; ++i) {\r\n c1 = string.charCodeAt(i);\r\n if (c1 < 128) {\r\n buffer[offset++] = c1;\r\n } else if (c1 < 2048) {\r\n buffer[offset++] = c1 >> 6 | 192;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {\r\n c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\r\n ++i;\r\n buffer[offset++] = c1 >> 18 | 240;\r\n buffer[offset++] = c1 >> 12 & 63 | 128;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else {\r\n buffer[offset++] = c1 >> 12 | 224;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n }\r\n }\r\n return offset - start;\r\n};\r\n","\"use strict\";\nvar protobuf = exports;\n\n/**\n * Build type, one of `\"full\"`, `\"light\"` or `\"minimal\"`.\n * @name build\n * @type {string}\n * @const\n */\nprotobuf.build = \"minimal\";\n\n// Serialization\nprotobuf.Writer = require(16);\nprotobuf.BufferWriter = require(17);\nprotobuf.Reader = require(9);\nprotobuf.BufferReader = require(10);\n\n// Utility\nprotobuf.util = require(15);\nprotobuf.rpc = require(12);\nprotobuf.roots = require(11);\nprotobuf.configure = configure;\n\n/* istanbul ignore next */\n/**\n * Reconfigures the library according to the environment.\n * @returns {undefined}\n */\nfunction configure() {\n protobuf.util._configure();\n protobuf.Writer._configure(protobuf.BufferWriter);\n protobuf.Reader._configure(protobuf.BufferReader);\n}\n\n// Set up buffer utility according to the environment\nconfigure();\n","\"use strict\";\nmodule.exports = Reader;\n\nvar util = require(15);\n\nvar BufferReader; // cyclic\n\nvar LongBits = util.LongBits,\n utf8 = util.utf8;\n\n/* istanbul ignore next */\nfunction indexOutOfRange(reader, writeLength) {\n return RangeError(\"index out of range: \" + reader.pos + \" + \" + (writeLength || 1) + \" > \" + reader.len);\n}\n\n/**\n * Constructs a new reader instance using the specified buffer.\n * @classdesc Wire format reader using `Uint8Array` if available, otherwise `Array`.\n * @constructor\n * @param {Uint8Array} buffer Buffer to read from\n */\nfunction Reader(buffer) {\n\n /**\n * Read buffer.\n * @type {Uint8Array}\n */\n this.buf = buffer;\n\n /**\n * Read buffer position.\n * @type {number}\n */\n this.pos = 0;\n\n /**\n * Read buffer length.\n * @type {number}\n */\n this.len = buffer.length;\n}\n\nvar create_array = typeof Uint8Array !== \"undefined\"\n ? function create_typed_array(buffer) {\n if (buffer instanceof Uint8Array || Array.isArray(buffer))\n return new Reader(buffer);\n throw Error(\"illegal buffer\");\n }\n /* istanbul ignore next */\n : function create_array(buffer) {\n if (Array.isArray(buffer))\n return new Reader(buffer);\n throw Error(\"illegal buffer\");\n };\n\nvar create = function create() {\n return util.Buffer\n ? function create_buffer_setup(buffer) {\n return (Reader.create = function create_buffer(buffer) {\n return util.Buffer.isBuffer(buffer)\n ? new BufferReader(buffer)\n /* istanbul ignore next */\n : create_array(buffer);\n })(buffer);\n }\n /* istanbul ignore next */\n : create_array;\n};\n\n/**\n * Creates a new reader using the specified buffer.\n * @function\n * @param {Uint8Array|Buffer} buffer Buffer to read from\n * @returns {Reader|BufferReader} A {@link BufferReader} if `buffer` is a Buffer, otherwise a {@link Reader}\n * @throws {Error} If `buffer` is not a valid buffer\n */\nReader.create = create();\n\nReader.prototype._slice = util.Array.prototype.subarray || /* istanbul ignore next */ util.Array.prototype.slice;\n\n/**\n * Reads a varint as an unsigned 32 bit value.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.uint32 = (function read_uint32_setup() {\n var value = 4294967295; // optimizer type-hint, tends to deopt otherwise (?!)\n return function read_uint32() {\n value = ( this.buf[this.pos] & 127 ) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 127) << 7) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 127) << 14) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 127) << 21) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 15) << 28) >>> 0; if (this.buf[this.pos++] < 128) return value;\n\n /* istanbul ignore if */\n if ((this.pos += 5) > this.len) {\n this.pos = this.len;\n throw indexOutOfRange(this, 10);\n }\n return value;\n };\n})();\n\n/**\n * Reads a varint as a signed 32 bit value.\n * @returns {number} Value read\n */\nReader.prototype.int32 = function read_int32() {\n return this.uint32() | 0;\n};\n\n/**\n * Reads a zig-zag encoded varint as a signed 32 bit value.\n * @returns {number} Value read\n */\nReader.prototype.sint32 = function read_sint32() {\n var value = this.uint32();\n return value >>> 1 ^ -(value & 1) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readLongVarint() {\n // tends to deopt with local vars for octet etc.\n var bits = new LongBits(0, 0);\n var i = 0;\n if (this.len - this.pos > 4) { // fast route (lo)\n for (; i < 4; ++i) {\n // 1st..4th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n // 5th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0;\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) >> 4) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n i = 0;\n } else {\n for (; i < 3; ++i) {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n // 1st..3th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n // 4th\n bits.lo = (bits.lo | (this.buf[this.pos++] & 127) << i * 7) >>> 0;\n return bits;\n }\n if (this.len - this.pos > 4) { // fast route (hi)\n for (; i < 5; ++i) {\n // 6th..10th\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n } else {\n for (; i < 5; ++i) {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n // 6th..10th\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n }\n /* istanbul ignore next */\n throw Error(\"invalid varint encoding\");\n}\n\n/* eslint-enable no-invalid-this */\n\n/**\n * Reads a varint as a signed 64 bit value.\n * @name Reader#int64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a varint as an unsigned 64 bit value.\n * @name Reader#uint64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a zig-zag encoded varint as a signed 64 bit value.\n * @name Reader#sint64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a varint as a boolean.\n * @returns {boolean} Value read\n */\nReader.prototype.bool = function read_bool() {\n return this.uint32() !== 0;\n};\n\nfunction readFixed32_end(buf, end) { // note that this uses `end`, not `pos`\n return (buf[end - 4]\n | buf[end - 3] << 8\n | buf[end - 2] << 16\n | buf[end - 1] << 24) >>> 0;\n}\n\n/**\n * Reads fixed 32 bits as an unsigned 32 bit integer.\n * @returns {number} Value read\n */\nReader.prototype.fixed32 = function read_fixed32() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n return readFixed32_end(this.buf, this.pos += 4);\n};\n\n/**\n * Reads fixed 32 bits as a signed 32 bit integer.\n * @returns {number} Value read\n */\nReader.prototype.sfixed32 = function read_sfixed32() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n return readFixed32_end(this.buf, this.pos += 4) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readFixed64(/* this: Reader */) {\n\n /* istanbul ignore if */\n if (this.pos + 8 > this.len)\n throw indexOutOfRange(this, 8);\n\n return new LongBits(readFixed32_end(this.buf, this.pos += 4), readFixed32_end(this.buf, this.pos += 4));\n}\n\n/* eslint-enable no-invalid-this */\n\n/**\n * Reads fixed 64 bits.\n * @name Reader#fixed64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads zig-zag encoded fixed 64 bits.\n * @name Reader#sfixed64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a float (32 bit) as a number.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.float = function read_float() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n var value = util.float.readFloatLE(this.buf, this.pos);\n this.pos += 4;\n return value;\n};\n\n/**\n * Reads a double (64 bit float) as a number.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.double = function read_double() {\n\n /* istanbul ignore if */\n if (this.pos + 8 > this.len)\n throw indexOutOfRange(this, 4);\n\n var value = util.float.readDoubleLE(this.buf, this.pos);\n this.pos += 8;\n return value;\n};\n\n/**\n * Reads a sequence of bytes preceeded by its length as a varint.\n * @returns {Uint8Array} Value read\n */\nReader.prototype.bytes = function read_bytes() {\n var length = this.uint32(),\n start = this.pos,\n end = this.pos + length;\n\n /* istanbul ignore if */\n if (end > this.len)\n throw indexOutOfRange(this, length);\n\n this.pos += length;\n if (Array.isArray(this.buf)) // plain array\n return this.buf.slice(start, end);\n\n if (start === end) { // fix for IE 10/Win8 and others' subarray returning array of size 1\n var nativeBuffer = util.Buffer;\n return nativeBuffer\n ? nativeBuffer.alloc(0)\n : new this.buf.constructor(0);\n }\n return this._slice.call(this.buf, start, end);\n};\n\n/**\n * Reads a string preceeded by its byte length as a varint.\n * @returns {string} Value read\n */\nReader.prototype.string = function read_string() {\n var bytes = this.bytes();\n return utf8.read(bytes, 0, bytes.length);\n};\n\n/**\n * Skips the specified number of bytes if specified, otherwise skips a varint.\n * @param {number} [length] Length if known, otherwise a varint is assumed\n * @returns {Reader} `this`\n */\nReader.prototype.skip = function skip(length) {\n if (typeof length === \"number\") {\n /* istanbul ignore if */\n if (this.pos + length > this.len)\n throw indexOutOfRange(this, length);\n this.pos += length;\n } else {\n do {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n } while (this.buf[this.pos++] & 128);\n }\n return this;\n};\n\n/**\n * Skips the next element of the specified wire type.\n * @param {number} wireType Wire type received\n * @returns {Reader} `this`\n */\nReader.prototype.skipType = function(wireType) {\n switch (wireType) {\n case 0:\n this.skip();\n break;\n case 1:\n this.skip(8);\n break;\n case 2:\n this.skip(this.uint32());\n break;\n case 3:\n while ((wireType = this.uint32() & 7) !== 4) {\n this.skipType(wireType);\n }\n break;\n case 5:\n this.skip(4);\n break;\n\n /* istanbul ignore next */\n default:\n throw Error(\"invalid wire type \" + wireType + \" at offset \" + this.pos);\n }\n return this;\n};\n\nReader._configure = function(BufferReader_) {\n BufferReader = BufferReader_;\n Reader.create = create();\n BufferReader._configure();\n\n var fn = util.Long ? \"toLong\" : /* istanbul ignore next */ \"toNumber\";\n util.merge(Reader.prototype, {\n\n int64: function read_int64() {\n return readLongVarint.call(this)[fn](false);\n },\n\n uint64: function read_uint64() {\n return readLongVarint.call(this)[fn](true);\n },\n\n sint64: function read_sint64() {\n return readLongVarint.call(this).zzDecode()[fn](false);\n },\n\n fixed64: function read_fixed64() {\n return readFixed64.call(this)[fn](true);\n },\n\n sfixed64: function read_sfixed64() {\n return readFixed64.call(this)[fn](false);\n }\n\n });\n};\n","\"use strict\";\nmodule.exports = BufferReader;\n\n// extends Reader\nvar Reader = require(9);\n(BufferReader.prototype = Object.create(Reader.prototype)).constructor = BufferReader;\n\nvar util = require(15);\n\n/**\n * Constructs a new buffer reader instance.\n * @classdesc Wire format reader using node buffers.\n * @extends Reader\n * @constructor\n * @param {Buffer} buffer Buffer to read from\n */\nfunction BufferReader(buffer) {\n Reader.call(this, buffer);\n\n /**\n * Read buffer.\n * @name BufferReader#buf\n * @type {Buffer}\n */\n}\n\nBufferReader._configure = function () {\n /* istanbul ignore else */\n if (util.Buffer)\n BufferReader.prototype._slice = util.Buffer.prototype.slice;\n};\n\n\n/**\n * @override\n */\nBufferReader.prototype.string = function read_string_buffer() {\n var len = this.uint32(); // modifies pos\n return this.buf.utf8Slice\n ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + len, this.len))\n : this.buf.toString(\"utf-8\", this.pos, this.pos = Math.min(this.pos + len, this.len));\n};\n\n/**\n * Reads a sequence of bytes preceeded by its length as a varint.\n * @name BufferReader#bytes\n * @function\n * @returns {Buffer} Value read\n */\n\nBufferReader._configure();\n","\"use strict\";\nmodule.exports = {};\n\n/**\n * Named roots.\n * This is where pbjs stores generated structures (the option `-r, --root` specifies a name).\n * Can also be used manually to make roots available across modules.\n * @name roots\n * @type {Object.}\n * @example\n * // pbjs -r myroot -o compiled.js ...\n *\n * // in another module:\n * require(\"./compiled.js\");\n *\n * // in any subsequent module:\n * var root = protobuf.roots[\"myroot\"];\n */\n","\"use strict\";\n\n/**\n * Streaming RPC helpers.\n * @namespace\n */\nvar rpc = exports;\n\n/**\n * RPC implementation passed to {@link Service#create} performing a service request on network level, i.e. by utilizing http requests or websockets.\n * @typedef RPCImpl\n * @type {function}\n * @param {Method|rpc.ServiceMethod,Message<{}>>} method Reflected or static method being called\n * @param {Uint8Array} requestData Request data\n * @param {RPCImplCallback} callback Callback function\n * @returns {undefined}\n * @example\n * function rpcImpl(method, requestData, callback) {\n * if (protobuf.util.lcFirst(method.name) !== \"myMethod\") // compatible with static code\n * throw Error(\"no such method\");\n * asynchronouslyObtainAResponse(requestData, function(err, responseData) {\n * callback(err, responseData);\n * });\n * }\n */\n\n/**\n * Node-style callback as used by {@link RPCImpl}.\n * @typedef RPCImplCallback\n * @type {function}\n * @param {Error|null} error Error, if any, otherwise `null`\n * @param {Uint8Array|null} [response] Response data or `null` to signal end of stream, if there hasn't been an error\n * @returns {undefined}\n */\n\nrpc.Service = require(13);\n","\"use strict\";\nmodule.exports = Service;\n\nvar util = require(15);\n\n// Extends EventEmitter\n(Service.prototype = Object.create(util.EventEmitter.prototype)).constructor = Service;\n\n/**\n * A service method callback as used by {@link rpc.ServiceMethod|ServiceMethod}.\n *\n * Differs from {@link RPCImplCallback} in that it is an actual callback of a service method which may not return `response = null`.\n * @typedef rpc.ServiceMethodCallback\n * @template TRes extends Message\n * @type {function}\n * @param {Error|null} error Error, if any\n * @param {TRes} [response] Response message\n * @returns {undefined}\n */\n\n/**\n * A service method part of a {@link rpc.Service} as created by {@link Service.create}.\n * @typedef rpc.ServiceMethod\n * @template TReq extends Message\n * @template TRes extends Message\n * @type {function}\n * @param {TReq|Properties} request Request message or plain object\n * @param {rpc.ServiceMethodCallback} [callback] Node-style callback called with the error, if any, and the response message\n * @returns {Promise>} Promise if `callback` has been omitted, otherwise `undefined`\n */\n\n/**\n * Constructs a new RPC service instance.\n * @classdesc An RPC service as returned by {@link Service#create}.\n * @exports rpc.Service\n * @extends util.EventEmitter\n * @constructor\n * @param {RPCImpl} rpcImpl RPC implementation\n * @param {boolean} [requestDelimited=false] Whether requests are length-delimited\n * @param {boolean} [responseDelimited=false] Whether responses are length-delimited\n */\nfunction Service(rpcImpl, requestDelimited, responseDelimited) {\n\n if (typeof rpcImpl !== \"function\")\n throw TypeError(\"rpcImpl must be a function\");\n\n util.EventEmitter.call(this);\n\n /**\n * RPC implementation. Becomes `null` once the service is ended.\n * @type {RPCImpl|null}\n */\n this.rpcImpl = rpcImpl;\n\n /**\n * Whether requests are length-delimited.\n * @type {boolean}\n */\n this.requestDelimited = Boolean(requestDelimited);\n\n /**\n * Whether responses are length-delimited.\n * @type {boolean}\n */\n this.responseDelimited = Boolean(responseDelimited);\n}\n\n/**\n * Calls a service method through {@link rpc.Service#rpcImpl|rpcImpl}.\n * @param {Method|rpc.ServiceMethod} method Reflected or static method\n * @param {Constructor} requestCtor Request constructor\n * @param {Constructor} responseCtor Response constructor\n * @param {TReq|Properties} request Request message or plain object\n * @param {rpc.ServiceMethodCallback} callback Service callback\n * @returns {undefined}\n * @template TReq extends Message\n * @template TRes extends Message\n */\nService.prototype.rpcCall = function rpcCall(method, requestCtor, responseCtor, request, callback) {\n\n if (!request)\n throw TypeError(\"request must be specified\");\n\n var self = this;\n if (!callback)\n return util.asPromise(rpcCall, self, method, requestCtor, responseCtor, request);\n\n if (!self.rpcImpl) {\n setTimeout(function() { callback(Error(\"already ended\")); }, 0);\n return undefined;\n }\n\n try {\n return self.rpcImpl(\n method,\n requestCtor[self.requestDelimited ? \"encodeDelimited\" : \"encode\"](request).finish(),\n function rpcCallback(err, response) {\n\n if (err) {\n self.emit(\"error\", err, method);\n return callback(err);\n }\n\n if (response === null) {\n self.end(/* endedByRPC */ true);\n return undefined;\n }\n\n if (!(response instanceof responseCtor)) {\n try {\n response = responseCtor[self.responseDelimited ? \"decodeDelimited\" : \"decode\"](response);\n } catch (err) {\n self.emit(\"error\", err, method);\n return callback(err);\n }\n }\n\n self.emit(\"data\", response, method);\n return callback(null, response);\n }\n );\n } catch (err) {\n self.emit(\"error\", err, method);\n setTimeout(function() { callback(err); }, 0);\n return undefined;\n }\n};\n\n/**\n * Ends this service and emits the `end` event.\n * @param {boolean} [endedByRPC=false] Whether the service has been ended by the RPC implementation.\n * @returns {rpc.Service} `this`\n */\nService.prototype.end = function end(endedByRPC) {\n if (this.rpcImpl) {\n if (!endedByRPC) // signal end to rpcImpl\n this.rpcImpl(null, null, null);\n this.rpcImpl = null;\n this.emit(\"end\").off();\n }\n return this;\n};\n","\"use strict\";\nmodule.exports = LongBits;\n\nvar util = require(15);\n\n/**\n * Constructs new long bits.\n * @classdesc Helper class for working with the low and high bits of a 64 bit value.\n * @memberof util\n * @constructor\n * @param {number} lo Low 32 bits, unsigned\n * @param {number} hi High 32 bits, unsigned\n */\nfunction LongBits(lo, hi) {\n\n // note that the casts below are theoretically unnecessary as of today, but older statically\n // generated converter code might still call the ctor with signed 32bits. kept for compat.\n\n /**\n * Low bits.\n * @type {number}\n */\n this.lo = lo >>> 0;\n\n /**\n * High bits.\n * @type {number}\n */\n this.hi = hi >>> 0;\n}\n\n/**\n * Zero bits.\n * @memberof util.LongBits\n * @type {util.LongBits}\n */\nvar zero = LongBits.zero = new LongBits(0, 0);\n\nzero.toNumber = function() { return 0; };\nzero.zzEncode = zero.zzDecode = function() { return this; };\nzero.length = function() { return 1; };\n\n/**\n * Zero hash.\n * @memberof util.LongBits\n * @type {string}\n */\nvar zeroHash = LongBits.zeroHash = \"\\0\\0\\0\\0\\0\\0\\0\\0\";\n\n/**\n * Constructs new long bits from the specified number.\n * @param {number} value Value\n * @returns {util.LongBits} Instance\n */\nLongBits.fromNumber = function fromNumber(value) {\n if (value === 0)\n return zero;\n var sign = value < 0;\n if (sign)\n value = -value;\n var lo = value >>> 0,\n hi = (value - lo) / 4294967296 >>> 0;\n if (sign) {\n hi = ~hi >>> 0;\n lo = ~lo >>> 0;\n if (++lo > 4294967295) {\n lo = 0;\n if (++hi > 4294967295)\n hi = 0;\n }\n }\n return new LongBits(lo, hi);\n};\n\n/**\n * Constructs new long bits from a number, long or string.\n * @param {Long|number|string} value Value\n * @returns {util.LongBits} Instance\n */\nLongBits.from = function from(value) {\n if (typeof value === \"number\")\n return LongBits.fromNumber(value);\n if (util.isString(value)) {\n /* istanbul ignore else */\n if (util.Long)\n value = util.Long.fromString(value);\n else\n return LongBits.fromNumber(parseInt(value, 10));\n }\n return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero;\n};\n\n/**\n * Converts this long bits to a possibly unsafe JavaScript number.\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {number} Possibly unsafe number\n */\nLongBits.prototype.toNumber = function toNumber(unsigned) {\n if (!unsigned && this.hi >>> 31) {\n var lo = ~this.lo + 1 >>> 0,\n hi = ~this.hi >>> 0;\n if (!lo)\n hi = hi + 1 >>> 0;\n return -(lo + hi * 4294967296);\n }\n return this.lo + this.hi * 4294967296;\n};\n\n/**\n * Converts this long bits to a long.\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long} Long\n */\nLongBits.prototype.toLong = function toLong(unsigned) {\n return util.Long\n ? new util.Long(this.lo | 0, this.hi | 0, Boolean(unsigned))\n /* istanbul ignore next */\n : { low: this.lo | 0, high: this.hi | 0, unsigned: Boolean(unsigned) };\n};\n\nvar charCodeAt = String.prototype.charCodeAt;\n\n/**\n * Constructs new long bits from the specified 8 characters long hash.\n * @param {string} hash Hash\n * @returns {util.LongBits} Bits\n */\nLongBits.fromHash = function fromHash(hash) {\n if (hash === zeroHash)\n return zero;\n return new LongBits(\n ( charCodeAt.call(hash, 0)\n | charCodeAt.call(hash, 1) << 8\n | charCodeAt.call(hash, 2) << 16\n | charCodeAt.call(hash, 3) << 24) >>> 0\n ,\n ( charCodeAt.call(hash, 4)\n | charCodeAt.call(hash, 5) << 8\n | charCodeAt.call(hash, 6) << 16\n | charCodeAt.call(hash, 7) << 24) >>> 0\n );\n};\n\n/**\n * Converts this long bits to a 8 characters long hash.\n * @returns {string} Hash\n */\nLongBits.prototype.toHash = function toHash() {\n return String.fromCharCode(\n this.lo & 255,\n this.lo >>> 8 & 255,\n this.lo >>> 16 & 255,\n this.lo >>> 24 ,\n this.hi & 255,\n this.hi >>> 8 & 255,\n this.hi >>> 16 & 255,\n this.hi >>> 24\n );\n};\n\n/**\n * Zig-zag encodes this long bits.\n * @returns {util.LongBits} `this`\n */\nLongBits.prototype.zzEncode = function zzEncode() {\n var mask = this.hi >> 31;\n this.hi = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0;\n this.lo = ( this.lo << 1 ^ mask) >>> 0;\n return this;\n};\n\n/**\n * Zig-zag decodes this long bits.\n * @returns {util.LongBits} `this`\n */\nLongBits.prototype.zzDecode = function zzDecode() {\n var mask = -(this.lo & 1);\n this.lo = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0;\n this.hi = ( this.hi >>> 1 ^ mask) >>> 0;\n return this;\n};\n\n/**\n * Calculates the length of this longbits when encoded as a varint.\n * @returns {number} Length\n */\nLongBits.prototype.length = function length() {\n var part0 = this.lo,\n part1 = (this.lo >>> 28 | this.hi << 4) >>> 0,\n part2 = this.hi >>> 24;\n return part2 === 0\n ? part1 === 0\n ? part0 < 16384\n ? part0 < 128 ? 1 : 2\n : part0 < 2097152 ? 3 : 4\n : part1 < 16384\n ? part1 < 128 ? 5 : 6\n : part1 < 2097152 ? 7 : 8\n : part2 < 128 ? 9 : 10;\n};\n","\"use strict\";\nvar util = exports;\n\n// used to return a Promise where callback is omitted\nutil.asPromise = require(1);\n\n// converts to / from base64 encoded strings\nutil.base64 = require(2);\n\n// base class of rpc.Service\nutil.EventEmitter = require(3);\n\n// float handling accross browsers\nutil.float = require(4);\n\n// requires modules optionally and hides the call from bundlers\nutil.inquire = require(5);\n\n// converts to / from utf8 encoded strings\nutil.utf8 = require(7);\n\n// provides a node-like buffer pool in the browser\nutil.pool = require(6);\n\n// utility to work with the low and high bits of a 64 bit value\nutil.LongBits = require(14);\n\n/**\n * Whether running within node or not.\n * @memberof util\n * @type {boolean}\n */\nutil.isNode = Boolean(typeof global !== \"undefined\"\n && global\n && global.process\n && global.process.versions\n && global.process.versions.node);\n\n/**\n * Global object reference.\n * @memberof util\n * @type {Object}\n */\nutil.global = util.isNode && global\n || typeof window !== \"undefined\" && window\n || typeof self !== \"undefined\" && self\n || this; // eslint-disable-line no-invalid-this\n\n/**\n * An immuable empty array.\n * @memberof util\n * @type {Array.<*>}\n * @const\n */\nutil.emptyArray = Object.freeze ? Object.freeze([]) : /* istanbul ignore next */ []; // used on prototypes\n\n/**\n * An immutable empty object.\n * @type {Object}\n * @const\n */\nutil.emptyObject = Object.freeze ? Object.freeze({}) : /* istanbul ignore next */ {}; // used on prototypes\n\n/**\n * Tests if the specified value is an integer.\n * @function\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is an integer\n */\nutil.isInteger = Number.isInteger || /* istanbul ignore next */ function isInteger(value) {\n return typeof value === \"number\" && isFinite(value) && Math.floor(value) === value;\n};\n\n/**\n * Tests if the specified value is a string.\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is a string\n */\nutil.isString = function isString(value) {\n return typeof value === \"string\" || value instanceof String;\n};\n\n/**\n * Tests if the specified value is a non-null object.\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is a non-null object\n */\nutil.isObject = function isObject(value) {\n return value && typeof value === \"object\";\n};\n\n/**\n * Checks if a property on a message is considered to be present.\n * This is an alias of {@link util.isSet}.\n * @function\n * @param {Object} obj Plain object or message instance\n * @param {string} prop Property name\n * @returns {boolean} `true` if considered to be present, otherwise `false`\n */\nutil.isset =\n\n/**\n * Checks if a property on a message is considered to be present.\n * @param {Object} obj Plain object or message instance\n * @param {string} prop Property name\n * @returns {boolean} `true` if considered to be present, otherwise `false`\n */\nutil.isSet = function isSet(obj, prop) {\n var value = obj[prop];\n if (value != null && obj.hasOwnProperty(prop)) // eslint-disable-line eqeqeq, no-prototype-builtins\n return typeof value !== \"object\" || (Array.isArray(value) ? value.length : Object.keys(value).length) > 0;\n return false;\n};\n\n/**\n * Any compatible Buffer instance.\n * This is a minimal stand-alone definition of a Buffer instance. The actual type is that exported by node's typings.\n * @interface Buffer\n * @extends Uint8Array\n */\n\n/**\n * Node's Buffer class if available.\n * @type {Constructor}\n */\nutil.Buffer = (function() {\n try {\n var Buffer = util.inquire(\"buffer\").Buffer;\n // refuse to use non-node buffers if not explicitly assigned (perf reasons):\n return Buffer.prototype.utf8Write ? Buffer : /* istanbul ignore next */ null;\n } catch (e) {\n /* istanbul ignore next */\n return null;\n }\n})();\n\n// Internal alias of or polyfull for Buffer.from.\nutil._Buffer_from = null;\n\n// Internal alias of or polyfill for Buffer.allocUnsafe.\nutil._Buffer_allocUnsafe = null;\n\n/**\n * Creates a new buffer of whatever type supported by the environment.\n * @param {number|number[]} [sizeOrArray=0] Buffer size or number array\n * @returns {Uint8Array|Buffer} Buffer\n */\nutil.newBuffer = function newBuffer(sizeOrArray) {\n /* istanbul ignore next */\n return typeof sizeOrArray === \"number\"\n ? util.Buffer\n ? util._Buffer_allocUnsafe(sizeOrArray)\n : new util.Array(sizeOrArray)\n : util.Buffer\n ? util._Buffer_from(sizeOrArray)\n : typeof Uint8Array === \"undefined\"\n ? sizeOrArray\n : new Uint8Array(sizeOrArray);\n};\n\n/**\n * Array implementation used in the browser. `Uint8Array` if supported, otherwise `Array`.\n * @type {Constructor}\n */\nutil.Array = typeof Uint8Array !== \"undefined\" ? Uint8Array /* istanbul ignore next */ : Array;\n\n/**\n * Any compatible Long instance.\n * This is a minimal stand-alone definition of a Long instance. The actual type is that exported by long.js.\n * @interface Long\n * @property {number} low Low bits\n * @property {number} high High bits\n * @property {boolean} unsigned Whether unsigned or not\n */\n\n/**\n * Long.js's Long class if available.\n * @type {Constructor}\n */\nutil.Long = /* istanbul ignore next */ util.global.dcodeIO && /* istanbul ignore next */ util.global.dcodeIO.Long\n || /* istanbul ignore next */ util.global.Long\n || util.inquire(\"long\");\n\n/**\n * Regular expression used to verify 2 bit (`bool`) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key2Re = /^true|false|0|1$/;\n\n/**\n * Regular expression used to verify 32 bit (`int32` etc.) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key32Re = /^-?(?:0|[1-9][0-9]*)$/;\n\n/**\n * Regular expression used to verify 64 bit (`int64` etc.) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key64Re = /^(?:[\\\\x00-\\\\xff]{8}|-?(?:0|[1-9][0-9]*))$/;\n\n/**\n * Converts a number or long to an 8 characters long hash string.\n * @param {Long|number} value Value to convert\n * @returns {string} Hash\n */\nutil.longToHash = function longToHash(value) {\n return value\n ? util.LongBits.from(value).toHash()\n : util.LongBits.zeroHash;\n};\n\n/**\n * Converts an 8 characters long hash string to a long or number.\n * @param {string} hash Hash\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long|number} Original value\n */\nutil.longFromHash = function longFromHash(hash, unsigned) {\n var bits = util.LongBits.fromHash(hash);\n if (util.Long)\n return util.Long.fromBits(bits.lo, bits.hi, unsigned);\n return bits.toNumber(Boolean(unsigned));\n};\n\n/**\n * Merges the properties of the source object into the destination object.\n * @memberof util\n * @param {Object.} dst Destination object\n * @param {Object.} src Source object\n * @param {boolean} [ifNotSet=false] Merges only if the key is not already set\n * @returns {Object.} Destination object\n */\nfunction merge(dst, src, ifNotSet) { // used by converters\n for (var keys = Object.keys(src), i = 0; i < keys.length; ++i)\n if (dst[keys[i]] === undefined || !ifNotSet)\n dst[keys[i]] = src[keys[i]];\n return dst;\n}\n\nutil.merge = merge;\n\n/**\n * Converts the first character of a string to lower case.\n * @param {string} str String to convert\n * @returns {string} Converted string\n */\nutil.lcFirst = function lcFirst(str) {\n return str.charAt(0).toLowerCase() + str.substring(1);\n};\n\n/**\n * Creates a custom error constructor.\n * @memberof util\n * @param {string} name Error name\n * @returns {Constructor} Custom error constructor\n */\nfunction newError(name) {\n\n function CustomError(message, properties) {\n\n if (!(this instanceof CustomError))\n return new CustomError(message, properties);\n\n // Error.call(this, message);\n // ^ just returns a new error instance because the ctor can be called as a function\n\n Object.defineProperty(this, \"message\", { get: function() { return message; } });\n\n /* istanbul ignore next */\n if (Error.captureStackTrace) // node\n Error.captureStackTrace(this, CustomError);\n else\n Object.defineProperty(this, \"stack\", { value: new Error().stack || \"\" });\n\n if (properties)\n merge(this, properties);\n }\n\n CustomError.prototype = Object.create(Error.prototype, {\n constructor: {\n value: CustomError,\n writable: true,\n enumerable: false,\n configurable: true,\n },\n name: {\n get: function get() { return name; },\n set: undefined,\n enumerable: false,\n // configurable: false would accurately preserve the behavior of\n // the original, but I'm guessing that was not intentional.\n // For an actual error subclass, this property would\n // be configurable.\n configurable: true,\n },\n toString: {\n value: function value() { return this.name + \": \" + this.message; },\n writable: true,\n enumerable: false,\n configurable: true,\n },\n });\n\n return CustomError;\n}\n\nutil.newError = newError;\n\n/**\n * Constructs a new protocol error.\n * @classdesc Error subclass indicating a protocol specifc error.\n * @memberof util\n * @extends Error\n * @template T extends Message\n * @constructor\n * @param {string} message Error message\n * @param {Object.} [properties] Additional properties\n * @example\n * try {\n * MyMessage.decode(someBuffer); // throws if required fields are missing\n * } catch (e) {\n * if (e instanceof ProtocolError && e.instance)\n * console.log(\"decoded so far: \" + JSON.stringify(e.instance));\n * }\n */\nutil.ProtocolError = newError(\"ProtocolError\");\n\n/**\n * So far decoded message instance.\n * @name util.ProtocolError#instance\n * @type {Message}\n */\n\n/**\n * A OneOf getter as returned by {@link util.oneOfGetter}.\n * @typedef OneOfGetter\n * @type {function}\n * @returns {string|undefined} Set field name, if any\n */\n\n/**\n * Builds a getter for a oneof's present field name.\n * @param {string[]} fieldNames Field names\n * @returns {OneOfGetter} Unbound getter\n */\nutil.oneOfGetter = function getOneOf(fieldNames) {\n var fieldMap = {};\n for (var i = 0; i < fieldNames.length; ++i)\n fieldMap[fieldNames[i]] = 1;\n\n /**\n * @returns {string|undefined} Set field name, if any\n * @this Object\n * @ignore\n */\n return function() { // eslint-disable-line consistent-return\n for (var keys = Object.keys(this), i = keys.length - 1; i > -1; --i)\n if (fieldMap[keys[i]] === 1 && this[keys[i]] !== undefined && this[keys[i]] !== null)\n return keys[i];\n };\n};\n\n/**\n * A OneOf setter as returned by {@link util.oneOfSetter}.\n * @typedef OneOfSetter\n * @type {function}\n * @param {string|undefined} value Field name\n * @returns {undefined}\n */\n\n/**\n * Builds a setter for a oneof's present field name.\n * @param {string[]} fieldNames Field names\n * @returns {OneOfSetter} Unbound setter\n */\nutil.oneOfSetter = function setOneOf(fieldNames) {\n\n /**\n * @param {string} name Field name\n * @returns {undefined}\n * @this Object\n * @ignore\n */\n return function(name) {\n for (var i = 0; i < fieldNames.length; ++i)\n if (fieldNames[i] !== name)\n delete this[fieldNames[i]];\n };\n};\n\n/**\n * Default conversion options used for {@link Message#toJSON} implementations.\n *\n * These options are close to proto3's JSON mapping with the exception that internal types like Any are handled just like messages. More precisely:\n *\n * - Longs become strings\n * - Enums become string keys\n * - Bytes become base64 encoded strings\n * - (Sub-)Messages become plain objects\n * - Maps become plain objects with all string keys\n * - Repeated fields become arrays\n * - NaN and Infinity for float and double fields become strings\n *\n * @type {IConversionOptions}\n * @see https://developers.google.com/protocol-buffers/docs/proto3?hl=en#json\n */\nutil.toJSONOptions = {\n longs: String,\n enums: String,\n bytes: String,\n json: true\n};\n\n// Sets up buffer utility according to the environment (called in index-minimal)\nutil._configure = function() {\n var Buffer = util.Buffer;\n /* istanbul ignore if */\n if (!Buffer) {\n util._Buffer_from = util._Buffer_allocUnsafe = null;\n return;\n }\n // because node 4.x buffers are incompatible & immutable\n // see: https://github.com/dcodeIO/protobuf.js/pull/665\n util._Buffer_from = Buffer.from !== Uint8Array.from && Buffer.from ||\n /* istanbul ignore next */\n function Buffer_from(value, encoding) {\n return new Buffer(value, encoding);\n };\n util._Buffer_allocUnsafe = Buffer.allocUnsafe ||\n /* istanbul ignore next */\n function Buffer_allocUnsafe(size) {\n return new Buffer(size);\n };\n};\n","\"use strict\";\nmodule.exports = Writer;\n\nvar util = require(15);\n\nvar BufferWriter; // cyclic\n\nvar LongBits = util.LongBits,\n base64 = util.base64,\n utf8 = util.utf8;\n\n/**\n * Constructs a new writer operation instance.\n * @classdesc Scheduled writer operation.\n * @constructor\n * @param {function(*, Uint8Array, number)} fn Function to call\n * @param {number} len Value byte length\n * @param {*} val Value to write\n * @ignore\n */\nfunction Op(fn, len, val) {\n\n /**\n * Function to call.\n * @type {function(Uint8Array, number, *)}\n */\n this.fn = fn;\n\n /**\n * Value byte length.\n * @type {number}\n */\n this.len = len;\n\n /**\n * Next operation.\n * @type {Writer.Op|undefined}\n */\n this.next = undefined;\n\n /**\n * Value to write.\n * @type {*}\n */\n this.val = val; // type varies\n}\n\n/* istanbul ignore next */\nfunction noop() {} // eslint-disable-line no-empty-function\n\n/**\n * Constructs a new writer state instance.\n * @classdesc Copied writer state.\n * @memberof Writer\n * @constructor\n * @param {Writer} writer Writer to copy state from\n * @ignore\n */\nfunction State(writer) {\n\n /**\n * Current head.\n * @type {Writer.Op}\n */\n this.head = writer.head;\n\n /**\n * Current tail.\n * @type {Writer.Op}\n */\n this.tail = writer.tail;\n\n /**\n * Current buffer length.\n * @type {number}\n */\n this.len = writer.len;\n\n /**\n * Next state.\n * @type {State|null}\n */\n this.next = writer.states;\n}\n\n/**\n * Constructs a new writer instance.\n * @classdesc Wire format writer using `Uint8Array` if available, otherwise `Array`.\n * @constructor\n */\nfunction Writer() {\n\n /**\n * Current length.\n * @type {number}\n */\n this.len = 0;\n\n /**\n * Operations head.\n * @type {Object}\n */\n this.head = new Op(noop, 0, 0);\n\n /**\n * Operations tail\n * @type {Object}\n */\n this.tail = this.head;\n\n /**\n * Linked forked states.\n * @type {Object|null}\n */\n this.states = null;\n\n // When a value is written, the writer calculates its byte length and puts it into a linked\n // list of operations to perform when finish() is called. This both allows us to allocate\n // buffers of the exact required size and reduces the amount of work we have to do compared\n // to first calculating over objects and then encoding over objects. In our case, the encoding\n // part is just a linked list walk calling operations with already prepared values.\n}\n\nvar create = function create() {\n return util.Buffer\n ? function create_buffer_setup() {\n return (Writer.create = function create_buffer() {\n return new BufferWriter();\n })();\n }\n /* istanbul ignore next */\n : function create_array() {\n return new Writer();\n };\n};\n\n/**\n * Creates a new writer.\n * @function\n * @returns {BufferWriter|Writer} A {@link BufferWriter} when Buffers are supported, otherwise a {@link Writer}\n */\nWriter.create = create();\n\n/**\n * Allocates a buffer of the specified size.\n * @param {number} size Buffer size\n * @returns {Uint8Array} Buffer\n */\nWriter.alloc = function alloc(size) {\n return new util.Array(size);\n};\n\n// Use Uint8Array buffer pool in the browser, just like node does with buffers\n/* istanbul ignore else */\nif (util.Array !== Array)\n Writer.alloc = util.pool(Writer.alloc, util.Array.prototype.subarray);\n\n/**\n * Pushes a new operation to the queue.\n * @param {function(Uint8Array, number, *)} fn Function to call\n * @param {number} len Value byte length\n * @param {number} val Value to write\n * @returns {Writer} `this`\n * @private\n */\nWriter.prototype._push = function push(fn, len, val) {\n this.tail = this.tail.next = new Op(fn, len, val);\n this.len += len;\n return this;\n};\n\nfunction writeByte(val, buf, pos) {\n buf[pos] = val & 255;\n}\n\nfunction writeVarint32(val, buf, pos) {\n while (val > 127) {\n buf[pos++] = val & 127 | 128;\n val >>>= 7;\n }\n buf[pos] = val;\n}\n\n/**\n * Constructs a new varint writer operation instance.\n * @classdesc Scheduled varint writer operation.\n * @extends Op\n * @constructor\n * @param {number} len Value byte length\n * @param {number} val Value to write\n * @ignore\n */\nfunction VarintOp(len, val) {\n this.len = len;\n this.next = undefined;\n this.val = val;\n}\n\nVarintOp.prototype = Object.create(Op.prototype);\nVarintOp.prototype.fn = writeVarint32;\n\n/**\n * Writes an unsigned 32 bit value as a varint.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.uint32 = function write_uint32(value) {\n // here, the call to this.push has been inlined and a varint specific Op subclass is used.\n // uint32 is by far the most frequently used operation and benefits significantly from this.\n this.len += (this.tail = this.tail.next = new VarintOp(\n (value = value >>> 0)\n < 128 ? 1\n : value < 16384 ? 2\n : value < 2097152 ? 3\n : value < 268435456 ? 4\n : 5,\n value)).len;\n return this;\n};\n\n/**\n * Writes a signed 32 bit value as a varint.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.int32 = function write_int32(value) {\n return value < 0\n ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) // 10 bytes per spec\n : this.uint32(value);\n};\n\n/**\n * Writes a 32 bit value as a varint, zig-zag encoded.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sint32 = function write_sint32(value) {\n return this.uint32((value << 1 ^ value >> 31) >>> 0);\n};\n\nfunction writeVarint64(val, buf, pos) {\n while (val.hi) {\n buf[pos++] = val.lo & 127 | 128;\n val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0;\n val.hi >>>= 7;\n }\n while (val.lo > 127) {\n buf[pos++] = val.lo & 127 | 128;\n val.lo = val.lo >>> 7;\n }\n buf[pos++] = val.lo;\n}\n\n/**\n * Writes an unsigned 64 bit value as a varint.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.uint64 = function write_uint64(value) {\n var bits = LongBits.from(value);\n return this._push(writeVarint64, bits.length(), bits);\n};\n\n/**\n * Writes a signed 64 bit value as a varint.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.int64 = Writer.prototype.uint64;\n\n/**\n * Writes a signed 64 bit value as a varint, zig-zag encoded.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sint64 = function write_sint64(value) {\n var bits = LongBits.from(value).zzEncode();\n return this._push(writeVarint64, bits.length(), bits);\n};\n\n/**\n * Writes a boolish value as a varint.\n * @param {boolean} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bool = function write_bool(value) {\n return this._push(writeByte, 1, value ? 1 : 0);\n};\n\nfunction writeFixed32(val, buf, pos) {\n buf[pos ] = val & 255;\n buf[pos + 1] = val >>> 8 & 255;\n buf[pos + 2] = val >>> 16 & 255;\n buf[pos + 3] = val >>> 24;\n}\n\n/**\n * Writes an unsigned 32 bit value as fixed 32 bits.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.fixed32 = function write_fixed32(value) {\n return this._push(writeFixed32, 4, value >>> 0);\n};\n\n/**\n * Writes a signed 32 bit value as fixed 32 bits.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sfixed32 = Writer.prototype.fixed32;\n\n/**\n * Writes an unsigned 64 bit value as fixed 64 bits.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.fixed64 = function write_fixed64(value) {\n var bits = LongBits.from(value);\n return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi);\n};\n\n/**\n * Writes a signed 64 bit value as fixed 64 bits.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sfixed64 = Writer.prototype.fixed64;\n\n/**\n * Writes a float (32 bit).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.float = function write_float(value) {\n return this._push(util.float.writeFloatLE, 4, value);\n};\n\n/**\n * Writes a double (64 bit float).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.double = function write_double(value) {\n return this._push(util.float.writeDoubleLE, 8, value);\n};\n\nvar writeBytes = util.Array.prototype.set\n ? function writeBytes_set(val, buf, pos) {\n buf.set(val, pos); // also works for plain array values\n }\n /* istanbul ignore next */\n : function writeBytes_for(val, buf, pos) {\n for (var i = 0; i < val.length; ++i)\n buf[pos + i] = val[i];\n };\n\n/**\n * Writes a sequence of bytes.\n * @param {Uint8Array|string} value Buffer or base64 encoded string to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bytes = function write_bytes(value) {\n var len = value.length >>> 0;\n if (!len)\n return this._push(writeByte, 1, 0);\n if (util.isString(value)) {\n var buf = Writer.alloc(len = base64.length(value));\n base64.decode(value, buf, 0);\n value = buf;\n }\n return this.uint32(len)._push(writeBytes, len, value);\n};\n\n/**\n * Writes a string.\n * @param {string} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.string = function write_string(value) {\n var len = utf8.length(value);\n return len\n ? this.uint32(len)._push(utf8.write, len, value)\n : this._push(writeByte, 1, 0);\n};\n\n/**\n * Forks this writer's state by pushing it to a stack.\n * Calling {@link Writer#reset|reset} or {@link Writer#ldelim|ldelim} resets the writer to the previous state.\n * @returns {Writer} `this`\n */\nWriter.prototype.fork = function fork() {\n this.states = new State(this);\n this.head = this.tail = new Op(noop, 0, 0);\n this.len = 0;\n return this;\n};\n\n/**\n * Resets this instance to the last state.\n * @returns {Writer} `this`\n */\nWriter.prototype.reset = function reset() {\n if (this.states) {\n this.head = this.states.head;\n this.tail = this.states.tail;\n this.len = this.states.len;\n this.states = this.states.next;\n } else {\n this.head = this.tail = new Op(noop, 0, 0);\n this.len = 0;\n }\n return this;\n};\n\n/**\n * Resets to the last state and appends the fork state's current write length as a varint followed by its operations.\n * @returns {Writer} `this`\n */\nWriter.prototype.ldelim = function ldelim() {\n var head = this.head,\n tail = this.tail,\n len = this.len;\n this.reset().uint32(len);\n if (len) {\n this.tail.next = head.next; // skip noop\n this.tail = tail;\n this.len += len;\n }\n return this;\n};\n\n/**\n * Finishes the write operation.\n * @returns {Uint8Array} Finished buffer\n */\nWriter.prototype.finish = function finish() {\n var head = this.head.next, // skip noop\n buf = this.constructor.alloc(this.len),\n pos = 0;\n while (head) {\n head.fn(head.val, buf, pos);\n pos += head.len;\n head = head.next;\n }\n // this.head = this.tail = null;\n return buf;\n};\n\nWriter._configure = function(BufferWriter_) {\n BufferWriter = BufferWriter_;\n Writer.create = create();\n BufferWriter._configure();\n};\n","\"use strict\";\nmodule.exports = BufferWriter;\n\n// extends Writer\nvar Writer = require(16);\n(BufferWriter.prototype = Object.create(Writer.prototype)).constructor = BufferWriter;\n\nvar util = require(15);\n\n/**\n * Constructs a new buffer writer instance.\n * @classdesc Wire format writer using node buffers.\n * @extends Writer\n * @constructor\n */\nfunction BufferWriter() {\n Writer.call(this);\n}\n\nBufferWriter._configure = function () {\n /**\n * Allocates a buffer of the specified size.\n * @function\n * @param {number} size Buffer size\n * @returns {Buffer} Buffer\n */\n BufferWriter.alloc = util._Buffer_allocUnsafe;\n\n BufferWriter.writeBytesBuffer = util.Buffer && util.Buffer.prototype instanceof Uint8Array && util.Buffer.prototype.set.name === \"set\"\n ? function writeBytesBuffer_set(val, buf, pos) {\n buf.set(val, pos); // faster than copy (requires node >= 4 where Buffers extend Uint8Array and set is properly inherited)\n // also works for plain array values\n }\n /* istanbul ignore next */\n : function writeBytesBuffer_copy(val, buf, pos) {\n if (val.copy) // Buffer values\n val.copy(buf, pos, 0, val.length);\n else for (var i = 0; i < val.length;) // plain array values\n buf[pos++] = val[i++];\n };\n};\n\n\n/**\n * @override\n */\nBufferWriter.prototype.bytes = function write_bytes_buffer(value) {\n if (util.isString(value))\n value = util._Buffer_from(value, \"base64\");\n var len = value.length >>> 0;\n this.uint32(len);\n if (len)\n this._push(BufferWriter.writeBytesBuffer, len, value);\n return this;\n};\n\nfunction writeStringBuffer(val, buf, pos) {\n if (val.length < 40) // plain js is faster for short strings (probably due to redundant assertions)\n util.utf8.write(val, buf, pos);\n else if (buf.utf8Write)\n buf.utf8Write(val, pos);\n else\n buf.write(val, pos);\n}\n\n/**\n * @override\n */\nBufferWriter.prototype.string = function write_string_buffer(value) {\n var len = util.Buffer.byteLength(value);\n this.uint32(len);\n if (len)\n this._push(writeStringBuffer, len, value);\n return this;\n};\n\n\n/**\n * Finishes the write operation.\n * @name BufferWriter#finish\n * @function\n * @returns {Buffer} Finished buffer\n */\n\nBufferWriter._configure();\n"],"sourceRoot":"."}
\ No newline at end of file
diff --git a/demo/assets/libs/protobuf.min.js.map.meta b/demo/assets/libs/protobuf.min.js.map.meta
new file mode 100644
index 0000000..9c3e03b
--- /dev/null
+++ b/demo/assets/libs/protobuf.min.js.map.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.0.0",
+ "importer": "*",
+ "imported": true,
+ "uuid": "49c2d61d-b9d9-42a0-b8fb-0e49a16b3aa9",
+ "files": [
+ ".json",
+ ".map"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/libs/protobuf.min.js.meta b/demo/assets/libs/protobuf.min.js.meta
new file mode 100644
index 0000000..77f0667
--- /dev/null
+++ b/demo/assets/libs/protobuf.min.js.meta
@@ -0,0 +1,17 @@
+{
+ "ver": "4.0.24",
+ "importer": "javascript",
+ "imported": true,
+ "uuid": "86dc80e7-444d-49d1-b316-97a0de9ef9d3",
+ "files": [
+ ".js"
+ ],
+ "subMetas": {},
+ "userData": {
+ "loadPluginInEditor": true,
+ "loadPluginInWeb": true,
+ "loadPluginInNative": true,
+ "loadPluginInMiniGame": true,
+ "isPlugin": true
+ }
+}
diff --git a/demo/assets/project.manifest b/demo/assets/project.manifest
new file mode 100644
index 0000000..53a501c
--- /dev/null
+++ b/demo/assets/project.manifest
@@ -0,0 +1 @@
+{"remoteManifestUrl":"https://cdn-laonainai.lanfeitech.com/test/hot-update-debug/v0.0.1/android/0/project.manifest","remoteVersionUrl":"https://cdn-laonainai.lanfeitech.com/test/hot-update-debug/v0.0.1/android/version.manifest","version":"0","assets":{"src/chunks/bundle.js":{"size":1297049,"md5":"26720364f234968034da77989680980e"},"src/cocos-js/cc.js":{"size":2889299,"md5":"be5ed2b2ce55ebc15165479737da9c8a"},"src/import-map.json":{"size":51,"md5":"0a4b903dc20b74fe4a5a977a98b9d094"},"src/settings.json":{"size":22484,"md5":"3d5e415510cbdcd8309593f618f913a7"},"src/system.bundle.js":{"size":27303,"md5":"dd57820726a647db035e8ba9a520ab27"},"assets/bundle_res/cc.config.json":{"size":2392,"md5":"b148abb2a60e0f65b337e8388a08494b"},"assets/bundle_res/import/09/09b58ffd0.json":{"size":1524,"md5":"9f6412defff990e0e36968620e821a9c"},"assets/bundle_res/index.js":{"size":627,"md5":"06354685e715ed75774c9b3a26d6e4a8"},"assets/bundle_res/native/43/43b6905d-cad1-4724-a9b6-e5ba1c58846f.png":{"size":5180,"md5":"f09616b3dffa67faa1852115527e0e3c"},"assets/bundle_res/native/58/5836c379-d558-423f-a309-f822efcb834d.png":{"size":5172,"md5":"d39ef7b66a00ef64721d0940a7554557"},"assets/bundle_res/native/7b/7bb3b566-6a3e-48f9-b414-3c5ab8527c0a.png":{"size":2430,"md5":"5399e7ecd837bce2e02afcb11409f427"},"assets/internal/cc.config.json":{"size":5242,"md5":"b0ceb17b165170c13dea27ff6b71901f"},"assets/internal/import/0c/0ca60d3e4.json":{"size":158736,"md5":"626bf7a9326ddb6ccda2ca9693fd7bb3"},"assets/internal/index.js":{"size":14414,"md5":"bb6ea044e2ea0b36553a013c4ef69a2c"},"assets/main/cc.config.json":{"size":2419,"md5":"43793267461f47ebf8e526f0f8cb314a"},"assets/main/import/01/012e4ed4c.json":{"size":8562,"md5":"80640c527e7ef0a7c6123879afe96c55"},"assets/main/index.js":{"size":143182,"md5":"c46521600c8f71b5e544200702dabdca"},"assets/main/native/1b/1bcdc16b8.png":{"size":21799,"md5":"5193df1c13b002c8e4d3f53d42d62d73"},"assets/main/native/61/61f59735-b08e-4496-9ad8-0731b9d684ca.manifest":{"size":5836,"md5":"ad74e5deb82d2ac8680ebf95382f9565"},"assets/main/native/ef/efb639df-cc0d-4a17-8b33-2d555c8147b4.jpg":{"size":194098,"md5":"3c5718f4b9cb7812bcf47b74aa6d361b"},"assets/resources/cc.config.json":{"size":9438,"md5":"0d33a960a94156198dbec1171f6a1e36"},"assets/resources/import/03/0359a2be4.json":{"size":4601,"md5":"a15009bc3858c08949fae8bf762ecd54"},"assets/resources/import/94/94e351a1-10f0-41f7-ab21-f29c24e9a2ce.bin":{"size":144,"md5":"cf4920786a8a75a34d46a4896dbcc3fb"},"assets/resources/import/94/94e351a1-10f0-41f7-ab21-f29c24e9a2ce.json":{"size":1623,"md5":"d2fac1f240fa6145211c2909674a4653"},"assets/resources/index.js":{"size":624,"md5":"d7916efc3fa8f57fb7b79ac9af0b1c68"},"assets/resources/native/0c/0c4eb7a1-ff02-4654-b1e8-cebd83073e64.bin":{"size":2072,"md5":"4419390aade4496a76c4ac07daff159b"},"assets/resources/native/0d/0ddbad49-93fa-4a05-b864-4b0855833c48.bin":{"size":1396,"md5":"5acb29f2b8988daaf48bec26b6d3ef47"},"assets/resources/native/1a/1aafc8a5-bc8e-4c4b-8116-90a779354554.bin":{"size":1699,"md5":"a22e6867ce52797c1827552ebbace2f2"},"assets/resources/native/27/274235a8-2bda-4684-b0c6-d9c089bd9dd6.png":{"size":9048,"md5":"e30a02c458c164f9669e5185886a1ba1"},"assets/resources/native/3d/3dc75f69-a4e2-409a-b107-491b4a3105fc.bin":{"size":105,"md5":"ec3a54fc1d3feea6f705ba5d0c3d99dd"},"assets/resources/native/49/49fb1ab9-a06e-4157-b733-dd3a64202b7c.bin":{"size":161,"md5":"104fb82ef967b8fbce90007c39c4d72a"},"assets/resources/native/55/55fb25ca-02c5-4571-8e60-8bd6ac23918e.png":{"size":3526,"md5":"fdedf098245c2bb5a8fb819ab0bd3bf3"},"assets/resources/native/5a/5aa1ffee-27a7-4a3b-85cf-e5714ab05803.bin":{"size":4573,"md5":"452e8db8aa35488a74ca24e99627b00f"},"assets/resources/native/5e/5e20beb7-4e36-4009-b2fc-12363dd586c1.png":{"size":1206,"md5":"73d7f4751ea83656cd42b6bc2ef1a68b"},"assets/resources/native/5f/5f5f19ff-554c-47e3-babc-05ac4e5b0738.bin":{"size":139,"md5":"59d27e975d3287c4158965eac6a08a84"},"assets/resources/native/7c/7ccddeab-1e82-4f7d-884c-136b0c761fec.bin":{"size":210,"md5":"edc5f6666b1d607ffd552bf126907ea9"},"assets/resources/native/8d/8d6a01b1-dad8-46b4-9fdc-5bbfcc52444a.bin":{"size":7581,"md5":"bfca32d9bfe3891d37576e349d9a1e3e"},"assets/resources/native/ac/acd5e6e2-5bcf-4670-9401-cd449b76d3e3.bin":{"size":601,"md5":"bd5ebd8b5c0c7c576663db5176714342"},"assets/resources/native/b5/b57ac369-668d-4a88-a919-d38170c49e26.png":{"size":32437,"md5":"127cc6abe03002f7e0ca00f742d92825"},"assets/resources/native/bc/bcc566a0-e9a7-4aa6-874b-1cb226f10f57.bin":{"size":1064,"md5":"6baa039f118ba2c3cb019ac3a30ce917"},"assets/resources/native/bd/bdf4c0a3-6740-4bd7-89e1-7635cdd647e1.png":{"size":3845,"md5":"df3f997518815e7ee393a9b8eb3a5468"},"assets/resources/native/bf/bf33d428-e248-4887-a41f-b159bcc30016.bin":{"size":397,"md5":"7f6e642332794c712434746f304ca347"},"assets/resources/native/c3/c34c30bc-709b-4ad8-9191-8c15875d0d85.bin":{"size":110,"md5":"fdf1f4f61edef52b33e17d8f9fd541db"},"assets/resources/native/d8/d8c9bfc6-3bc4-459f-8222-eb11c69c16f1.png":{"size":15925,"md5":"983e0c4f65013c9635558a6ca9a00438"},"assets/resources/native/e7/e79e7e68-6506-4516-8ef2-f6b50b340044.png":{"size":17062,"md5":"04cdecbc6fd3f47268cfd23d5c18ccef"},"assets/resources/native/f0/f0f09729-0846-4cb5-8014-12615f57c9f9.bin":{"size":93,"md5":"9579907539a4122ff0324bb8eb32b13b"},"assets/resources/native/f6/f60172a3-de6e-4eb5-9567-918cc82f4c3e.png":{"size":3885,"md5":"c87cf09a5d4d1e09a59f9d8057b2008c"},"assets/resources/native/f8/f89db7d4-cac2-4d81-9b9f-042a0abbe9c7.bin":{"size":1915,"md5":"ce7536d1152b2c104b6f5a5ce256bb84"},"jsb-adapter/engine-adapter.js":{"size":168322,"md5":"737d63198980af5bf1419b864c3144b7"},"jsb-adapter/web-adapter.js":{"size":173123,"md5":"80089d401dd3c23084b27612aa258f59"}},"searchPaths":[],"packageUrl":"https://cdn-laonainai.lanfeitech.com/test/hot-update-debug/v0.0.1/android/0"}
\ No newline at end of file
diff --git a/demo/assets/project.manifest.meta b/demo/assets/project.manifest.meta
new file mode 100644
index 0000000..93a2728
--- /dev/null
+++ b/demo/assets/project.manifest.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.0.0",
+ "importer": "*",
+ "imported": true,
+ "uuid": "61f59735-b08e-4496-9ad8-0731b9d684ca",
+ "files": [
+ ".json",
+ ".manifest"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources.meta b/demo/assets/resources.meta
new file mode 100644
index 0000000..84b262a
--- /dev/null
+++ b/demo/assets/resources.meta
@@ -0,0 +1,14 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "9d91ce52-ffe8-43c0-a118-9ace6bd9cf45",
+ "files": [],
+ "subMetas": {},
+ "userData": {
+ "isBundle": true,
+ "bundleConfigID": "default",
+ "bundleName": "resources",
+ "priority": 8
+ }
+}
diff --git a/demo/assets/resources/anim.meta b/demo/assets/resources/anim.meta
new file mode 100644
index 0000000..67c7110
--- /dev/null
+++ b/demo/assets/resources/anim.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "b1a64f1f-5f8a-44b6-b8ef-b1383f52b075",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/anim/rotate.anim b/demo/assets/resources/anim/rotate.anim
new file mode 100644
index 0000000..f754e45
--- /dev/null
+++ b/demo/assets/resources/anim/rotate.anim
@@ -0,0 +1,213 @@
+[
+ {
+ "__type__": "cc.AnimationClip",
+ "_name": "rotate",
+ "_objFlags": 0,
+ "__editorExtras__": {
+ "embeddedPlayerGroups": []
+ },
+ "_native": "",
+ "sample": 60,
+ "speed": 1,
+ "wrapMode": 2,
+ "enableTrsBlending": false,
+ "_duration": 1,
+ "_hash": 500763545,
+ "_tracks": [
+ {
+ "__id__": 1
+ }
+ ],
+ "_exoticAnimation": null,
+ "_events": [],
+ "_embeddedPlayers": [],
+ "_additiveSettings": {
+ "__id__": 11
+ },
+ "_auxiliaryCurveEntries": []
+ },
+ {
+ "__type__": "cc.animation.VectorTrack",
+ "_binding": {
+ "__type__": "cc.animation.TrackBinding",
+ "path": {
+ "__id__": 2
+ },
+ "proxy": null
+ },
+ "_channels": [
+ {
+ "__id__": 3
+ },
+ {
+ "__id__": 5
+ },
+ {
+ "__id__": 7
+ },
+ {
+ "__id__": 9
+ }
+ ],
+ "_nComponents": 3
+ },
+ {
+ "__type__": "cc.animation.TrackPath",
+ "_paths": [
+ "eulerAngles"
+ ]
+ },
+ {
+ "__type__": "cc.animation.Channel",
+ "_curve": {
+ "__id__": 4
+ }
+ },
+ {
+ "__type__": "cc.RealCurve",
+ "_times": [
+ 0,
+ 1
+ ],
+ "_values": [
+ {
+ "__type__": "cc.RealKeyframeValue",
+ "interpolationMode": 0,
+ "tangentWeightMode": 0,
+ "value": 0,
+ "rightTangent": 0,
+ "rightTangentWeight": 1,
+ "leftTangent": 0,
+ "leftTangentWeight": 1,
+ "easingMethod": 0,
+ "__editorExtras__": {
+ "tangentMode": 0
+ }
+ },
+ {
+ "__type__": "cc.RealKeyframeValue",
+ "interpolationMode": 0,
+ "tangentWeightMode": 0,
+ "value": 0,
+ "rightTangent": 0,
+ "rightTangentWeight": 1,
+ "leftTangent": 0,
+ "leftTangentWeight": 1,
+ "easingMethod": 0,
+ "__editorExtras__": {
+ "tangentMode": 0
+ }
+ }
+ ],
+ "preExtrapolation": 1,
+ "postExtrapolation": 1
+ },
+ {
+ "__type__": "cc.animation.Channel",
+ "_curve": {
+ "__id__": 6
+ }
+ },
+ {
+ "__type__": "cc.RealCurve",
+ "_times": [
+ 0,
+ 1
+ ],
+ "_values": [
+ {
+ "__type__": "cc.RealKeyframeValue",
+ "interpolationMode": 0,
+ "tangentWeightMode": 0,
+ "value": 0,
+ "rightTangent": 0,
+ "rightTangentWeight": 1,
+ "leftTangent": 0,
+ "leftTangentWeight": 1,
+ "easingMethod": 0,
+ "__editorExtras__": {
+ "tangentMode": 0
+ }
+ },
+ {
+ "__type__": "cc.RealKeyframeValue",
+ "interpolationMode": 0,
+ "tangentWeightMode": 0,
+ "value": 0,
+ "rightTangent": 0,
+ "rightTangentWeight": 1,
+ "leftTangent": 0,
+ "leftTangentWeight": 1,
+ "easingMethod": 0,
+ "__editorExtras__": {
+ "tangentMode": 0
+ }
+ }
+ ],
+ "preExtrapolation": 1,
+ "postExtrapolation": 1
+ },
+ {
+ "__type__": "cc.animation.Channel",
+ "_curve": {
+ "__id__": 8
+ }
+ },
+ {
+ "__type__": "cc.RealCurve",
+ "_times": [
+ 0,
+ 1
+ ],
+ "_values": [
+ {
+ "__type__": "cc.RealKeyframeValue",
+ "interpolationMode": 0,
+ "tangentWeightMode": 0,
+ "value": 0,
+ "rightTangent": 0,
+ "rightTangentWeight": 1,
+ "leftTangent": 0,
+ "leftTangentWeight": 1,
+ "easingMethod": 0,
+ "__editorExtras__": {
+ "tangentMode": 0
+ }
+ },
+ {
+ "__type__": "cc.RealKeyframeValue",
+ "interpolationMode": 0,
+ "tangentWeightMode": 0,
+ "value": 360,
+ "rightTangent": 0,
+ "rightTangentWeight": 1,
+ "leftTangent": 0,
+ "leftTangentWeight": 1,
+ "easingMethod": 0,
+ "__editorExtras__": {
+ "tangentMode": 0
+ }
+ }
+ ],
+ "preExtrapolation": 1,
+ "postExtrapolation": 1
+ },
+ {
+ "__type__": "cc.animation.Channel",
+ "_curve": {
+ "__id__": 10
+ }
+ },
+ {
+ "__type__": "cc.RealCurve",
+ "_times": [],
+ "_values": [],
+ "preExtrapolation": 1,
+ "postExtrapolation": 1
+ },
+ {
+ "__type__": "cc.AnimationClipAdditiveSettings",
+ "enabled": false,
+ "refClip": null
+ }
+]
\ No newline at end of file
diff --git a/demo/assets/resources/anim/rotate.anim.meta b/demo/assets/resources/anim/rotate.anim.meta
new file mode 100644
index 0000000..40dfd8b
--- /dev/null
+++ b/demo/assets/resources/anim/rotate.anim.meta
@@ -0,0 +1,13 @@
+{
+ "ver": "2.0.3",
+ "importer": "animation-clip",
+ "imported": true,
+ "uuid": "94e351a1-10f0-41f7-ab21-f29c24e9a2ce",
+ "files": [
+ ".cconb"
+ ],
+ "subMetas": {},
+ "userData": {
+ "name": "rotate"
+ }
+}
diff --git a/demo/assets/resources/config.meta b/demo/assets/resources/config.meta
new file mode 100644
index 0000000..4107367
--- /dev/null
+++ b/demo/assets/resources/config.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "1ea023b5-0ab6-4613-b157-3098b11c379b",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/config/buffer.meta b/demo/assets/resources/config/buffer.meta
new file mode 100644
index 0000000..62e137a
--- /dev/null
+++ b/demo/assets/resources/config/buffer.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "e4f67d71-d470-42d1-9b9a-1f83d235e025",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/config/buffer/DictSheet.bin b/demo/assets/resources/config/buffer/DictSheet.bin
new file mode 100644
index 0000000..161b68b
Binary files /dev/null and b/demo/assets/resources/config/buffer/DictSheet.bin differ
diff --git a/demo/assets/resources/config/buffer/DictSheet.bin.meta b/demo/assets/resources/config/buffer/DictSheet.bin.meta
new file mode 100644
index 0000000..0fe0170
--- /dev/null
+++ b/demo/assets/resources/config/buffer/DictSheet.bin.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.0.3",
+ "importer": "buffer",
+ "imported": true,
+ "uuid": "c34c30bc-709b-4ad8-9191-8c15875d0d85",
+ "files": [
+ ".bin",
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/config/buffer/basic.bin b/demo/assets/resources/config/buffer/basic.bin
new file mode 100644
index 0000000..74474af
Binary files /dev/null and b/demo/assets/resources/config/buffer/basic.bin differ
diff --git a/demo/assets/resources/config/buffer/basic.bin.meta b/demo/assets/resources/config/buffer/basic.bin.meta
new file mode 100644
index 0000000..783d9f4
--- /dev/null
+++ b/demo/assets/resources/config/buffer/basic.bin.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.0.3",
+ "importer": "buffer",
+ "imported": true,
+ "uuid": "49fb1ab9-a06e-4157-b733-dd3a64202b7c",
+ "files": [
+ ".bin",
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/config/buffer/dict.bin b/demo/assets/resources/config/buffer/dict.bin
new file mode 100644
index 0000000..60da08c
Binary files /dev/null and b/demo/assets/resources/config/buffer/dict.bin differ
diff --git a/demo/assets/resources/config/buffer/dict.bin.meta b/demo/assets/resources/config/buffer/dict.bin.meta
new file mode 100644
index 0000000..1f1f21e
--- /dev/null
+++ b/demo/assets/resources/config/buffer/dict.bin.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.0.3",
+ "importer": "buffer",
+ "imported": true,
+ "uuid": "5f5f19ff-554c-47e3-babc-05ac4e5b0738",
+ "files": [
+ ".bin",
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/config/buffer/dict_list.bin b/demo/assets/resources/config/buffer/dict_list.bin
new file mode 100644
index 0000000..000242e
Binary files /dev/null and b/demo/assets/resources/config/buffer/dict_list.bin differ
diff --git a/demo/assets/resources/config/buffer/dict_list.bin.meta b/demo/assets/resources/config/buffer/dict_list.bin.meta
new file mode 100644
index 0000000..04f4a2a
--- /dev/null
+++ b/demo/assets/resources/config/buffer/dict_list.bin.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.0.3",
+ "importer": "buffer",
+ "imported": true,
+ "uuid": "3dc75f69-a4e2-409a-b107-491b4a3105fc",
+ "files": [
+ ".bin",
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/config/buffer/dict_list_dict.bin b/demo/assets/resources/config/buffer/dict_list_dict.bin
new file mode 100644
index 0000000..a9aeb39
Binary files /dev/null and b/demo/assets/resources/config/buffer/dict_list_dict.bin differ
diff --git a/demo/assets/resources/config/buffer/dict_list_dict.bin.meta b/demo/assets/resources/config/buffer/dict_list_dict.bin.meta
new file mode 100644
index 0000000..8bd00ef
--- /dev/null
+++ b/demo/assets/resources/config/buffer/dict_list_dict.bin.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.0.3",
+ "importer": "buffer",
+ "imported": true,
+ "uuid": "bf33d428-e248-4887-a41f-b159bcc30016",
+ "files": [
+ ".bin",
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/config/buffer/list.bin b/demo/assets/resources/config/buffer/list.bin
new file mode 100644
index 0000000..1f1f912
Binary files /dev/null and b/demo/assets/resources/config/buffer/list.bin differ
diff --git a/demo/assets/resources/config/buffer/list.bin.meta b/demo/assets/resources/config/buffer/list.bin.meta
new file mode 100644
index 0000000..e2968cd
--- /dev/null
+++ b/demo/assets/resources/config/buffer/list.bin.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.0.3",
+ "importer": "buffer",
+ "imported": true,
+ "uuid": "f0f09729-0846-4cb5-8014-12615f57c9f9",
+ "files": [
+ ".bin",
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/config/buffer/list_dict.bin b/demo/assets/resources/config/buffer/list_dict.bin
new file mode 100644
index 0000000..1caf623
Binary files /dev/null and b/demo/assets/resources/config/buffer/list_dict.bin differ
diff --git a/demo/assets/resources/config/buffer/list_dict.bin.meta b/demo/assets/resources/config/buffer/list_dict.bin.meta
new file mode 100644
index 0000000..f41f296
--- /dev/null
+++ b/demo/assets/resources/config/buffer/list_dict.bin.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.0.3",
+ "importer": "buffer",
+ "imported": true,
+ "uuid": "7ccddeab-1e82-4f7d-884c-136b0c761fec",
+ "files": [
+ ".bin",
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/icon.meta b/demo/assets/resources/icon.meta
new file mode 100644
index 0000000..568bcf2
--- /dev/null
+++ b/demo/assets/resources/icon.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "a5a2dda9-38ca-49d8-b992-aca84bd1cd4a",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/icon/6102.png b/demo/assets/resources/icon/6102.png
new file mode 100644
index 0000000..5897e1f
Binary files /dev/null and b/demo/assets/resources/icon/6102.png differ
diff --git a/demo/assets/resources/icon/6102.png.meta b/demo/assets/resources/icon/6102.png.meta
new file mode 100644
index 0000000..4177f83
--- /dev/null
+++ b/demo/assets/resources/icon/6102.png.meta
@@ -0,0 +1,42 @@
+{
+ "ver": "1.0.27",
+ "importer": "image",
+ "imported": true,
+ "uuid": "55fb25ca-02c5-4571-8e60-8bd6ac23918e",
+ "files": [
+ ".json",
+ ".png"
+ ],
+ "subMetas": {
+ "6c48a": {
+ "importer": "texture",
+ "uuid": "55fb25ca-02c5-4571-8e60-8bd6ac23918e@6c48a",
+ "displayName": "6102",
+ "id": "6c48a",
+ "name": "texture",
+ "userData": {
+ "wrapModeS": "clamp-to-edge",
+ "wrapModeT": "clamp-to-edge",
+ "minfilter": "linear",
+ "magfilter": "linear",
+ "mipfilter": "none",
+ "anisotropy": 0,
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "55fb25ca-02c5-4571-8e60-8bd6ac23918e",
+ "visible": false
+ },
+ "ver": "1.0.22",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ }
+ },
+ "userData": {
+ "hasAlpha": true,
+ "type": "texture",
+ "fixAlphaTransparencyArtifacts": false,
+ "redirect": "55fb25ca-02c5-4571-8e60-8bd6ac23918e@6c48a"
+ }
+}
diff --git a/demo/assets/resources/icon/6103.png b/demo/assets/resources/icon/6103.png
new file mode 100644
index 0000000..d4fe74f
Binary files /dev/null and b/demo/assets/resources/icon/6103.png differ
diff --git a/demo/assets/resources/icon/6103.png.meta b/demo/assets/resources/icon/6103.png.meta
new file mode 100644
index 0000000..8e6066f
--- /dev/null
+++ b/demo/assets/resources/icon/6103.png.meta
@@ -0,0 +1,42 @@
+{
+ "ver": "1.0.27",
+ "importer": "image",
+ "imported": true,
+ "uuid": "bdf4c0a3-6740-4bd7-89e1-7635cdd647e1",
+ "files": [
+ ".json",
+ ".png"
+ ],
+ "subMetas": {
+ "6c48a": {
+ "importer": "texture",
+ "uuid": "bdf4c0a3-6740-4bd7-89e1-7635cdd647e1@6c48a",
+ "displayName": "6103",
+ "id": "6c48a",
+ "name": "texture",
+ "userData": {
+ "wrapModeS": "clamp-to-edge",
+ "wrapModeT": "clamp-to-edge",
+ "minfilter": "linear",
+ "magfilter": "linear",
+ "mipfilter": "none",
+ "anisotropy": 0,
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "bdf4c0a3-6740-4bd7-89e1-7635cdd647e1",
+ "visible": false
+ },
+ "ver": "1.0.22",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ }
+ },
+ "userData": {
+ "hasAlpha": true,
+ "type": "texture",
+ "fixAlphaTransparencyArtifacts": false,
+ "redirect": "bdf4c0a3-6740-4bd7-89e1-7635cdd647e1@6c48a"
+ }
+}
diff --git a/demo/assets/resources/icon/6104.png b/demo/assets/resources/icon/6104.png
new file mode 100644
index 0000000..389df20
Binary files /dev/null and b/demo/assets/resources/icon/6104.png differ
diff --git a/demo/assets/resources/icon/6104.png.meta b/demo/assets/resources/icon/6104.png.meta
new file mode 100644
index 0000000..011aba6
--- /dev/null
+++ b/demo/assets/resources/icon/6104.png.meta
@@ -0,0 +1,134 @@
+{
+ "ver": "1.0.27",
+ "importer": "image",
+ "imported": true,
+ "uuid": "d8c9bfc6-3bc4-459f-8222-eb11c69c16f1",
+ "files": [
+ ".json",
+ ".png"
+ ],
+ "subMetas": {
+ "6c48a": {
+ "importer": "texture",
+ "uuid": "d8c9bfc6-3bc4-459f-8222-eb11c69c16f1@6c48a",
+ "displayName": "6104",
+ "id": "6c48a",
+ "name": "texture",
+ "userData": {
+ "wrapModeS": "clamp-to-edge",
+ "wrapModeT": "clamp-to-edge",
+ "minfilter": "linear",
+ "magfilter": "linear",
+ "mipfilter": "none",
+ "anisotropy": 0,
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "d8c9bfc6-3bc4-459f-8222-eb11c69c16f1",
+ "visible": false
+ },
+ "ver": "1.0.22",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ },
+ "f9941": {
+ "importer": "sprite-frame",
+ "uuid": "d8c9bfc6-3bc4-459f-8222-eb11c69c16f1@f9941",
+ "displayName": "6104",
+ "id": "f9941",
+ "name": "spriteFrame",
+ "userData": {
+ "trimType": "auto",
+ "trimThreshold": 1,
+ "rotated": false,
+ "offsetX": 0,
+ "offsetY": 0,
+ "trimX": 0,
+ "trimY": 0,
+ "width": 79,
+ "height": 90,
+ "rawWidth": 79,
+ "rawHeight": 90,
+ "borderTop": 0,
+ "borderBottom": 0,
+ "borderLeft": 0,
+ "borderRight": 0,
+ "packable": true,
+ "pixelsToUnit": 100,
+ "pivotX": 0.5,
+ "pivotY": 0.5,
+ "meshType": 0,
+ "vertices": {
+ "rawPosition": [
+ -39.5,
+ -45,
+ 0,
+ 39.5,
+ -45,
+ 0,
+ -39.5,
+ 45,
+ 0,
+ 39.5,
+ 45,
+ 0
+ ],
+ "indexes": [
+ 0,
+ 1,
+ 2,
+ 2,
+ 1,
+ 3
+ ],
+ "uv": [
+ 0,
+ 90,
+ 79,
+ 90,
+ 0,
+ 0,
+ 79,
+ 0
+ ],
+ "nuv": [
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1
+ ],
+ "minPos": [
+ -39.5,
+ -45,
+ 0
+ ],
+ "maxPos": [
+ 39.5,
+ 45,
+ 0
+ ]
+ },
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "d8c9bfc6-3bc4-459f-8222-eb11c69c16f1@6c48a",
+ "atlasUuid": ""
+ },
+ "ver": "1.0.12",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ }
+ },
+ "userData": {
+ "hasAlpha": true,
+ "type": "sprite-frame",
+ "fixAlphaTransparencyArtifacts": false,
+ "redirect": "d8c9bfc6-3bc4-459f-8222-eb11c69c16f1@6c48a"
+ }
+}
diff --git a/demo/assets/resources/icon/icon.png b/demo/assets/resources/icon/icon.png
new file mode 100644
index 0000000..c55aa3e
Binary files /dev/null and b/demo/assets/resources/icon/icon.png differ
diff --git a/demo/assets/resources/icon/icon.png.meta b/demo/assets/resources/icon/icon.png.meta
new file mode 100644
index 0000000..14947f5
--- /dev/null
+++ b/demo/assets/resources/icon/icon.png.meta
@@ -0,0 +1,134 @@
+{
+ "ver": "1.0.27",
+ "importer": "image",
+ "imported": true,
+ "uuid": "274235a8-2bda-4684-b0c6-d9c089bd9dd6",
+ "files": [
+ ".json",
+ ".png"
+ ],
+ "subMetas": {
+ "6c48a": {
+ "importer": "texture",
+ "uuid": "274235a8-2bda-4684-b0c6-d9c089bd9dd6@6c48a",
+ "displayName": "icon",
+ "id": "6c48a",
+ "name": "texture",
+ "userData": {
+ "wrapModeS": "clamp-to-edge",
+ "wrapModeT": "clamp-to-edge",
+ "minfilter": "linear",
+ "magfilter": "linear",
+ "mipfilter": "none",
+ "anisotropy": 0,
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "274235a8-2bda-4684-b0c6-d9c089bd9dd6",
+ "visible": false
+ },
+ "ver": "1.0.22",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ },
+ "f9941": {
+ "importer": "sprite-frame",
+ "uuid": "274235a8-2bda-4684-b0c6-d9c089bd9dd6@f9941",
+ "displayName": "icon",
+ "id": "f9941",
+ "name": "spriteFrame",
+ "userData": {
+ "trimType": "auto",
+ "trimThreshold": 1,
+ "rotated": false,
+ "offsetX": 0,
+ "offsetY": 0,
+ "trimX": 0,
+ "trimY": 0,
+ "width": 62,
+ "height": 62,
+ "rawWidth": 62,
+ "rawHeight": 62,
+ "borderTop": 0,
+ "borderBottom": 0,
+ "borderLeft": 0,
+ "borderRight": 0,
+ "packable": true,
+ "pixelsToUnit": 100,
+ "pivotX": 0.5,
+ "pivotY": 0.5,
+ "meshType": 0,
+ "vertices": {
+ "rawPosition": [
+ -31,
+ -31,
+ 0,
+ 31,
+ -31,
+ 0,
+ -31,
+ 31,
+ 0,
+ 31,
+ 31,
+ 0
+ ],
+ "indexes": [
+ 0,
+ 1,
+ 2,
+ 2,
+ 1,
+ 3
+ ],
+ "uv": [
+ 0,
+ 62,
+ 62,
+ 62,
+ 0,
+ 0,
+ 62,
+ 0
+ ],
+ "nuv": [
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1
+ ],
+ "minPos": [
+ -31,
+ -31,
+ 0
+ ],
+ "maxPos": [
+ 31,
+ 31,
+ 0
+ ]
+ },
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "274235a8-2bda-4684-b0c6-d9c089bd9dd6@6c48a",
+ "atlasUuid": ""
+ },
+ "ver": "1.0.12",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ }
+ },
+ "userData": {
+ "hasAlpha": true,
+ "type": "sprite-frame",
+ "fixAlphaTransparencyArtifacts": false,
+ "redirect": "274235a8-2bda-4684-b0c6-d9c089bd9dd6@6c48a"
+ }
+}
diff --git a/demo/assets/resources/prefab.meta b/demo/assets/resources/prefab.meta
new file mode 100644
index 0000000..9f931a5
--- /dev/null
+++ b/demo/assets/resources/prefab.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "06de19c7-7f67-4a81-8f51-ba6a5fe6ea28",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/prefab/ball.prefab b/demo/assets/resources/prefab/ball.prefab
new file mode 100644
index 0000000..74597f4
--- /dev/null
+++ b/demo/assets/resources/prefab/ball.prefab
@@ -0,0 +1,179 @@
+[
+ {
+ "__type__": "cc.Prefab",
+ "_name": "ball",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_native": "",
+ "data": {
+ "__id__": 1
+ },
+ "optimizationPolicy": 0,
+ "persistent": false
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "ball",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": null,
+ "_children": [],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 2
+ },
+ {
+ "__id__": 4
+ },
+ {
+ "__id__": 6
+ }
+ ],
+ "_prefab": {
+ "__id__": 8
+ },
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": ""
+ },
+ {
+ "__type__": "cc.Animation",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 1
+ },
+ "_enabled": true,
+ "__prefab": {
+ "__id__": 3
+ },
+ "playOnLoad": true,
+ "_clips": [
+ {
+ "__uuid__": "94e351a1-10f0-41f7-ab21-f29c24e9a2ce",
+ "__expectedType__": "cc.AnimationClip"
+ }
+ ],
+ "_defaultClip": {
+ "__uuid__": "94e351a1-10f0-41f7-ab21-f29c24e9a2ce",
+ "__expectedType__": "cc.AnimationClip"
+ },
+ "_id": ""
+ },
+ {
+ "__type__": "cc.CompPrefabInfo",
+ "fileId": "87sV3b0W5BJJar0Hag1pkp"
+ },
+ {
+ "__type__": "cc.UITransform",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 1
+ },
+ "_enabled": true,
+ "__prefab": {
+ "__id__": 5
+ },
+ "_contentSize": {
+ "__type__": "cc.Size",
+ "width": 62,
+ "height": 62
+ },
+ "_anchorPoint": {
+ "__type__": "cc.Vec2",
+ "x": 0.5,
+ "y": 0.5
+ },
+ "_id": ""
+ },
+ {
+ "__type__": "cc.CompPrefabInfo",
+ "fileId": "3dkKKpOntLKIx/L+80FwW3"
+ },
+ {
+ "__type__": "cc.Sprite",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 1
+ },
+ "_enabled": true,
+ "__prefab": {
+ "__id__": 7
+ },
+ "_customMaterial": null,
+ "_srcBlendFactor": 2,
+ "_dstBlendFactor": 4,
+ "_color": {
+ "__type__": "cc.Color",
+ "r": 255,
+ "g": 255,
+ "b": 255,
+ "a": 255
+ },
+ "_spriteFrame": {
+ "__uuid__": "274235a8-2bda-4684-b0c6-d9c089bd9dd6@f9941",
+ "__expectedType__": "cc.SpriteFrame"
+ },
+ "_type": 0,
+ "_fillType": 0,
+ "_sizeMode": 1,
+ "_fillCenter": {
+ "__type__": "cc.Vec2",
+ "x": 0,
+ "y": 0
+ },
+ "_fillStart": 0,
+ "_fillRange": 0,
+ "_isTrimmedMode": true,
+ "_useGrayscale": false,
+ "_atlas": null,
+ "_id": ""
+ },
+ {
+ "__type__": "cc.CompPrefabInfo",
+ "fileId": "60Loe2uohAiIclZesDo7Fh"
+ },
+ {
+ "__type__": "cc.PrefabInfo",
+ "root": {
+ "__id__": 1
+ },
+ "asset": {
+ "__id__": 0
+ },
+ "fileId": "c46/YsCPVOJYA4mWEpNYRx",
+ "instance": null,
+ "targetOverrides": null
+ }
+]
\ No newline at end of file
diff --git a/demo/assets/resources/prefab/ball.prefab.meta b/demo/assets/resources/prefab/ball.prefab.meta
new file mode 100644
index 0000000..d76a309
--- /dev/null
+++ b/demo/assets/resources/prefab/ball.prefab.meta
@@ -0,0 +1,13 @@
+{
+ "ver": "1.1.50",
+ "importer": "prefab",
+ "imported": true,
+ "uuid": "56dc9bdf-19c7-4319-8c27-628ea6424696",
+ "files": [
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {
+ "syncNodeName": "ball"
+ }
+}
diff --git a/demo/assets/resources/texture.meta b/demo/assets/resources/texture.meta
new file mode 100644
index 0000000..a19aad6
--- /dev/null
+++ b/demo/assets/resources/texture.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "d81b037f-9f46-4923-90e3-f08515156ace",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/texture/6101.png b/demo/assets/resources/texture/6101.png
new file mode 100644
index 0000000..33bbc71
Binary files /dev/null and b/demo/assets/resources/texture/6101.png differ
diff --git a/demo/assets/resources/texture/6101.png.meta b/demo/assets/resources/texture/6101.png.meta
new file mode 100644
index 0000000..0382914
--- /dev/null
+++ b/demo/assets/resources/texture/6101.png.meta
@@ -0,0 +1,134 @@
+{
+ "ver": "1.0.27",
+ "importer": "image",
+ "imported": true,
+ "uuid": "f60172a3-de6e-4eb5-9567-918cc82f4c3e",
+ "files": [
+ ".json",
+ ".png"
+ ],
+ "subMetas": {
+ "6c48a": {
+ "importer": "texture",
+ "uuid": "f60172a3-de6e-4eb5-9567-918cc82f4c3e@6c48a",
+ "displayName": "6101",
+ "id": "6c48a",
+ "name": "texture",
+ "userData": {
+ "wrapModeS": "clamp-to-edge",
+ "wrapModeT": "clamp-to-edge",
+ "minfilter": "linear",
+ "magfilter": "linear",
+ "mipfilter": "none",
+ "anisotropy": 0,
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "f60172a3-de6e-4eb5-9567-918cc82f4c3e",
+ "visible": false
+ },
+ "ver": "1.0.22",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ },
+ "f9941": {
+ "importer": "sprite-frame",
+ "uuid": "f60172a3-de6e-4eb5-9567-918cc82f4c3e@f9941",
+ "displayName": "6101",
+ "id": "f9941",
+ "name": "spriteFrame",
+ "userData": {
+ "trimType": "auto",
+ "trimThreshold": 1,
+ "rotated": false,
+ "offsetX": 0,
+ "offsetY": 0,
+ "trimX": 0,
+ "trimY": 0,
+ "width": 79,
+ "height": 92,
+ "rawWidth": 79,
+ "rawHeight": 92,
+ "borderTop": 0,
+ "borderBottom": 0,
+ "borderLeft": 0,
+ "borderRight": 0,
+ "packable": true,
+ "pixelsToUnit": 100,
+ "pivotX": 0.5,
+ "pivotY": 0.5,
+ "meshType": 0,
+ "vertices": {
+ "rawPosition": [
+ -39.5,
+ -46,
+ 0,
+ 39.5,
+ -46,
+ 0,
+ -39.5,
+ 46,
+ 0,
+ 39.5,
+ 46,
+ 0
+ ],
+ "indexes": [
+ 0,
+ 1,
+ 2,
+ 2,
+ 1,
+ 3
+ ],
+ "uv": [
+ 0,
+ 92,
+ 79,
+ 92,
+ 0,
+ 0,
+ 79,
+ 0
+ ],
+ "nuv": [
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1
+ ],
+ "minPos": [
+ -39.5,
+ -46,
+ 0
+ ],
+ "maxPos": [
+ 39.5,
+ 46,
+ 0
+ ]
+ },
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "f60172a3-de6e-4eb5-9567-918cc82f4c3e@6c48a",
+ "atlasUuid": ""
+ },
+ "ver": "1.0.12",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ }
+ },
+ "userData": {
+ "hasAlpha": true,
+ "type": "sprite-frame",
+ "fixAlphaTransparencyArtifacts": false,
+ "redirect": "f60172a3-de6e-4eb5-9567-918cc82f4c3e@6c48a"
+ }
+}
diff --git a/demo/assets/resources/ui.meta b/demo/assets/resources/ui.meta
new file mode 100644
index 0000000..c6138be
--- /dev/null
+++ b/demo/assets/resources/ui.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "147ab882-97f7-401f-b394-f07060d515e1",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/ui/Condition.bin b/demo/assets/resources/ui/Condition.bin
new file mode 100644
index 0000000..47bad72
Binary files /dev/null and b/demo/assets/resources/ui/Condition.bin differ
diff --git a/demo/assets/resources/ui/Condition.bin.meta b/demo/assets/resources/ui/Condition.bin.meta
new file mode 100644
index 0000000..3082f57
--- /dev/null
+++ b/demo/assets/resources/ui/Condition.bin.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.0.3",
+ "importer": "buffer",
+ "imported": true,
+ "uuid": "0c4eb7a1-ff02-4654-b1e8-cebd83073e64",
+ "files": [
+ ".bin",
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/ui/Condition_atlas0.png b/demo/assets/resources/ui/Condition_atlas0.png
new file mode 100644
index 0000000..4670d1e
Binary files /dev/null and b/demo/assets/resources/ui/Condition_atlas0.png differ
diff --git a/demo/assets/resources/ui/Condition_atlas0.png.meta b/demo/assets/resources/ui/Condition_atlas0.png.meta
new file mode 100644
index 0000000..c74aabb
--- /dev/null
+++ b/demo/assets/resources/ui/Condition_atlas0.png.meta
@@ -0,0 +1,42 @@
+{
+ "ver": "1.0.27",
+ "importer": "image",
+ "imported": true,
+ "uuid": "5e20beb7-4e36-4009-b2fc-12363dd586c1",
+ "files": [
+ ".json",
+ ".png"
+ ],
+ "subMetas": {
+ "6c48a": {
+ "importer": "texture",
+ "uuid": "5e20beb7-4e36-4009-b2fc-12363dd586c1@6c48a",
+ "displayName": "Condition_atlas0",
+ "id": "6c48a",
+ "name": "texture",
+ "userData": {
+ "wrapModeS": "repeat",
+ "wrapModeT": "repeat",
+ "minfilter": "linear",
+ "magfilter": "linear",
+ "mipfilter": "none",
+ "anisotropy": 0,
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "5e20beb7-4e36-4009-b2fc-12363dd586c1",
+ "visible": false
+ },
+ "ver": "1.0.22",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ }
+ },
+ "userData": {
+ "fixAlphaTransparencyArtifacts": true,
+ "hasAlpha": true,
+ "type": "texture",
+ "redirect": "5e20beb7-4e36-4009-b2fc-12363dd586c1@6c48a"
+ }
+}
diff --git a/demo/assets/resources/ui/Game.bin b/demo/assets/resources/ui/Game.bin
new file mode 100644
index 0000000..839613d
Binary files /dev/null and b/demo/assets/resources/ui/Game.bin differ
diff --git a/demo/assets/resources/ui/Game.bin.meta b/demo/assets/resources/ui/Game.bin.meta
new file mode 100644
index 0000000..034b839
--- /dev/null
+++ b/demo/assets/resources/ui/Game.bin.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.0.3",
+ "importer": "buffer",
+ "imported": true,
+ "uuid": "acd5e6e2-5bcf-4670-9401-cd449b76d3e3",
+ "files": [
+ ".bin",
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/ui/Home.bin.meta b/demo/assets/resources/ui/Home.bin.meta
new file mode 100644
index 0000000..12b6c4f
--- /dev/null
+++ b/demo/assets/resources/ui/Home.bin.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.0.3",
+ "importer": "buffer",
+ "imported": true,
+ "uuid": "331f22ee-2a7d-48af-bc79-762e6fab0930",
+ "files": [
+ ".bin",
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/ui/Home_atlas0.png.meta b/demo/assets/resources/ui/Home_atlas0.png.meta
new file mode 100644
index 0000000..9f96c1d
--- /dev/null
+++ b/demo/assets/resources/ui/Home_atlas0.png.meta
@@ -0,0 +1,42 @@
+{
+ "ver": "1.0.26",
+ "importer": "image",
+ "imported": true,
+ "uuid": "72aef8d1-c0b9-4064-a070-05ef73bc7a9e",
+ "files": [
+ ".json",
+ ".png"
+ ],
+ "subMetas": {
+ "6c48a": {
+ "importer": "texture",
+ "uuid": "72aef8d1-c0b9-4064-a070-05ef73bc7a9e@6c48a",
+ "displayName": "Home_atlas0",
+ "id": "6c48a",
+ "name": "texture",
+ "userData": {
+ "wrapModeS": "clamp-to-edge",
+ "wrapModeT": "clamp-to-edge",
+ "minfilter": "linear",
+ "magfilter": "linear",
+ "mipfilter": "none",
+ "anisotropy": 0,
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "72aef8d1-c0b9-4064-a070-05ef73bc7a9e",
+ "visible": false
+ },
+ "ver": "1.0.22",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ }
+ },
+ "userData": {
+ "hasAlpha": true,
+ "type": "texture",
+ "fixAlphaTransparencyArtifacts": false,
+ "redirect": "72aef8d1-c0b9-4064-a070-05ef73bc7a9e@6c48a"
+ }
+}
diff --git a/demo/assets/resources/ui/HotUpdate.bin b/demo/assets/resources/ui/HotUpdate.bin
new file mode 100644
index 0000000..e6d5fd9
Binary files /dev/null and b/demo/assets/resources/ui/HotUpdate.bin differ
diff --git a/demo/assets/resources/ui/HotUpdate.bin.meta b/demo/assets/resources/ui/HotUpdate.bin.meta
new file mode 100644
index 0000000..d7d4e87
--- /dev/null
+++ b/demo/assets/resources/ui/HotUpdate.bin.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.0.3",
+ "importer": "buffer",
+ "imported": true,
+ "uuid": "bcc566a0-e9a7-4aa6-874b-1cb226f10f57",
+ "files": [
+ ".bin",
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/ui/MiniGame.bin b/demo/assets/resources/ui/MiniGame.bin
new file mode 100644
index 0000000..64fc8b4
Binary files /dev/null and b/demo/assets/resources/ui/MiniGame.bin differ
diff --git a/demo/assets/resources/ui/MiniGame.bin.meta b/demo/assets/resources/ui/MiniGame.bin.meta
new file mode 100644
index 0000000..bb4be91
--- /dev/null
+++ b/demo/assets/resources/ui/MiniGame.bin.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.0.3",
+ "importer": "buffer",
+ "imported": true,
+ "uuid": "1aafc8a5-bc8e-4c4b-8116-90a779354554",
+ "files": [
+ ".bin",
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/ui/Socket.bin b/demo/assets/resources/ui/Socket.bin
new file mode 100644
index 0000000..a892497
Binary files /dev/null and b/demo/assets/resources/ui/Socket.bin differ
diff --git a/demo/assets/resources/ui/Socket.bin.meta b/demo/assets/resources/ui/Socket.bin.meta
new file mode 100644
index 0000000..af31ed5
--- /dev/null
+++ b/demo/assets/resources/ui/Socket.bin.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.0.3",
+ "importer": "buffer",
+ "imported": true,
+ "uuid": "f89db7d4-cac2-4d81-9b9f-042a0abbe9c7",
+ "files": [
+ ".bin",
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/ui/Window.bin b/demo/assets/resources/ui/Window.bin
new file mode 100644
index 0000000..9b512d0
Binary files /dev/null and b/demo/assets/resources/ui/Window.bin differ
diff --git a/demo/assets/resources/ui/Window.bin.meta b/demo/assets/resources/ui/Window.bin.meta
new file mode 100644
index 0000000..521d821
--- /dev/null
+++ b/demo/assets/resources/ui/Window.bin.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.0.3",
+ "importer": "buffer",
+ "imported": true,
+ "uuid": "5aa1ffee-27a7-4a3b-85cf-e5714ab05803",
+ "files": [
+ ".bin",
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/ui/Window_atlas0.png b/demo/assets/resources/ui/Window_atlas0.png
new file mode 100644
index 0000000..6847890
Binary files /dev/null and b/demo/assets/resources/ui/Window_atlas0.png differ
diff --git a/demo/assets/resources/ui/Window_atlas0.png.meta b/demo/assets/resources/ui/Window_atlas0.png.meta
new file mode 100644
index 0000000..86cf788
--- /dev/null
+++ b/demo/assets/resources/ui/Window_atlas0.png.meta
@@ -0,0 +1,42 @@
+{
+ "ver": "1.0.27",
+ "importer": "image",
+ "imported": true,
+ "uuid": "b57ac369-668d-4a88-a919-d38170c49e26",
+ "files": [
+ ".json",
+ ".png"
+ ],
+ "subMetas": {
+ "6c48a": {
+ "importer": "texture",
+ "uuid": "b57ac369-668d-4a88-a919-d38170c49e26@6c48a",
+ "displayName": "Window_atlas0",
+ "id": "6c48a",
+ "name": "texture",
+ "userData": {
+ "wrapModeS": "repeat",
+ "wrapModeT": "repeat",
+ "minfilter": "linear",
+ "magfilter": "linear",
+ "mipfilter": "none",
+ "anisotropy": 0,
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "b57ac369-668d-4a88-a919-d38170c49e26",
+ "visible": false
+ },
+ "ver": "1.0.22",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ }
+ },
+ "userData": {
+ "fixAlphaTransparencyArtifacts": true,
+ "hasAlpha": true,
+ "type": "texture",
+ "redirect": "b57ac369-668d-4a88-a919-d38170c49e26@6c48a"
+ }
+}
diff --git a/demo/assets/resources/ui/manual.meta b/demo/assets/resources/ui/manual.meta
new file mode 100644
index 0000000..203ae12
--- /dev/null
+++ b/demo/assets/resources/ui/manual.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "786712f2-5631-4265-bf7b-690f4763a3aa",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/ui/manual/Basics.bin b/demo/assets/resources/ui/manual/Basics.bin
new file mode 100644
index 0000000..1d9ec71
Binary files /dev/null and b/demo/assets/resources/ui/manual/Basics.bin differ
diff --git a/demo/assets/resources/ui/manual/Basics.bin.meta b/demo/assets/resources/ui/manual/Basics.bin.meta
new file mode 100644
index 0000000..212d5cd
--- /dev/null
+++ b/demo/assets/resources/ui/manual/Basics.bin.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.0.3",
+ "importer": "buffer",
+ "imported": true,
+ "uuid": "8d6a01b1-dad8-46b4-9fdc-5bbfcc52444a",
+ "files": [
+ ".bin",
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/resources/ui/manual/Basics_atlas0.png b/demo/assets/resources/ui/manual/Basics_atlas0.png
new file mode 100644
index 0000000..c306d41
Binary files /dev/null and b/demo/assets/resources/ui/manual/Basics_atlas0.png differ
diff --git a/demo/assets/resources/ui/manual/Basics_atlas0.png.meta b/demo/assets/resources/ui/manual/Basics_atlas0.png.meta
new file mode 100644
index 0000000..be50bff
--- /dev/null
+++ b/demo/assets/resources/ui/manual/Basics_atlas0.png.meta
@@ -0,0 +1,42 @@
+{
+ "ver": "1.0.27",
+ "importer": "image",
+ "imported": true,
+ "uuid": "e79e7e68-6506-4516-8ef2-f6b50b340044",
+ "files": [
+ ".json",
+ ".png"
+ ],
+ "subMetas": {
+ "6c48a": {
+ "importer": "texture",
+ "uuid": "e79e7e68-6506-4516-8ef2-f6b50b340044@6c48a",
+ "displayName": "Basics_atlas0",
+ "id": "6c48a",
+ "name": "texture",
+ "userData": {
+ "wrapModeS": "repeat",
+ "wrapModeT": "repeat",
+ "minfilter": "linear",
+ "magfilter": "linear",
+ "mipfilter": "none",
+ "anisotropy": 0,
+ "isUuid": true,
+ "imageUuidOrDatabaseUri": "e79e7e68-6506-4516-8ef2-f6b50b340044",
+ "visible": false
+ },
+ "ver": "1.0.22",
+ "imported": true,
+ "files": [
+ ".json"
+ ],
+ "subMetas": {}
+ }
+ },
+ "userData": {
+ "fixAlphaTransparencyArtifacts": true,
+ "hasAlpha": true,
+ "type": "texture",
+ "redirect": "e79e7e68-6506-4516-8ef2-f6b50b340044@6c48a"
+ }
+}
diff --git a/demo/assets/resources/ui/manual/Home.bin b/demo/assets/resources/ui/manual/Home.bin
new file mode 100644
index 0000000..7e0f3fb
Binary files /dev/null and b/demo/assets/resources/ui/manual/Home.bin differ
diff --git a/demo/assets/resources/ui/manual/Home.bin.meta b/demo/assets/resources/ui/manual/Home.bin.meta
new file mode 100644
index 0000000..132ae76
--- /dev/null
+++ b/demo/assets/resources/ui/manual/Home.bin.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.0.3",
+ "importer": "buffer",
+ "imported": true,
+ "uuid": "0ddbad49-93fa-4a05-b864-4b0855833c48",
+ "files": [
+ ".bin",
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/scene.meta b/demo/assets/scene.meta
new file mode 100644
index 0000000..b243f5d
--- /dev/null
+++ b/demo/assets/scene.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "6f3166a3-36ba-4512-bae8-889c2a7d7d98",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/scene/GameEntry.scene b/demo/assets/scene/GameEntry.scene
new file mode 100644
index 0000000..67bed75
--- /dev/null
+++ b/demo/assets/scene/GameEntry.scene
@@ -0,0 +1,1525 @@
+[
+ {
+ "__type__": "cc.SceneAsset",
+ "_name": "GameEntry",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_native": "",
+ "scene": {
+ "__id__": 1
+ }
+ },
+ {
+ "__type__": "cc.Scene",
+ "_name": "GameEntry",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": null,
+ "_children": [
+ {
+ "__id__": 2
+ },
+ {
+ "__id__": 27
+ }
+ ],
+ "_active": true,
+ "_components": [],
+ "_prefab": {
+ "__id__": 39
+ },
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "autoReleaseAssets": false,
+ "_globals": {
+ "__id__": 40
+ },
+ "_id": "bef93422-3e63-4c0f-a5cf-d926e7360673"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "Canvas",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 1
+ },
+ "_children": [
+ {
+ "__id__": 3
+ }
+ ],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 24
+ },
+ {
+ "__id__": 25
+ },
+ {
+ "__id__": 26
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 375.00000000000006,
+ "y": 667,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 33554432,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "beI88Z2HpFELqR4T5EMHpg"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "Camera",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 2
+ },
+ "_children": [
+ {
+ "__id__": 4
+ }
+ ],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 23
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 1000
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "ebFwiq8gBFaYpqYbdoDODe"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "root",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 3
+ },
+ "_children": [
+ {
+ "__id__": 5
+ },
+ {
+ "__id__": 9
+ },
+ {
+ "__id__": 13
+ },
+ {
+ "__id__": 17
+ }
+ ],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 21
+ },
+ {
+ "__id__": 22
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": -1000
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "61IfeQ6J5Kpp0fCcAF/VJO"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "bgNode",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 4
+ },
+ "_children": [],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 6
+ },
+ {
+ "__id__": 7
+ },
+ {
+ "__id__": 8
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 1000
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "39XkoKPdFBZ5dnqzBjUSKD"
+ },
+ {
+ "__type__": "cc.UITransform",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 5
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_contentSize": {
+ "__type__": "cc.Size",
+ "width": 750,
+ "height": 1624
+ },
+ "_anchorPoint": {
+ "__type__": "cc.Vec2",
+ "x": 0.5,
+ "y": 0.5
+ },
+ "_id": "08AYF/vChIA4SHkM+BuHl8"
+ },
+ {
+ "__type__": "cc.Sprite",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 5
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_customMaterial": null,
+ "_srcBlendFactor": 2,
+ "_dstBlendFactor": 4,
+ "_color": {
+ "__type__": "cc.Color",
+ "r": 255,
+ "g": 255,
+ "b": 255,
+ "a": 255
+ },
+ "_spriteFrame": {
+ "__uuid__": "efb639df-cc0d-4a17-8b33-2d555c8147b4@f9941",
+ "__expectedType__": "cc.SpriteFrame"
+ },
+ "_type": 0,
+ "_fillType": 0,
+ "_sizeMode": 0,
+ "_fillCenter": {
+ "__type__": "cc.Vec2",
+ "x": 0,
+ "y": 0
+ },
+ "_fillStart": 0,
+ "_fillRange": 0,
+ "_isTrimmedMode": true,
+ "_useGrayscale": false,
+ "_atlas": null,
+ "_id": "7csQyxHqRC3bwNg527Px4I"
+ },
+ {
+ "__type__": "cc.Widget",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 5
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_alignFlags": 18,
+ "_target": null,
+ "_left": 0,
+ "_right": 0,
+ "_top": 0,
+ "_bottom": 0,
+ "_horizontalCenter": 0,
+ "_verticalCenter": 0,
+ "_isAbsLeft": true,
+ "_isAbsRight": true,
+ "_isAbsTop": true,
+ "_isAbsBottom": true,
+ "_isAbsHorizontalCenter": true,
+ "_isAbsVerticalCenter": true,
+ "_originalWidth": 0,
+ "_originalHeight": 0,
+ "_alignMode": 2,
+ "_lockFlags": 18,
+ "_id": "89cZQ5wKlOZ79sRElbIs3P"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "image_health",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 4
+ },
+ "_children": [],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 10
+ },
+ {
+ "__id__": 11
+ },
+ {
+ "__id__": 12
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": -488,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "17zVjpMn9G2ZTOT4VDXRJt"
+ },
+ {
+ "__type__": "cc.UITransform",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 9
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_contentSize": {
+ "__type__": "cc.Size",
+ "width": 634,
+ "height": 60
+ },
+ "_anchorPoint": {
+ "__type__": "cc.Vec2",
+ "x": 0.5,
+ "y": 0.5
+ },
+ "_id": "41hM6KfP5Ncag9eGtvhD+o"
+ },
+ {
+ "__type__": "cc.Sprite",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 9
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_customMaterial": null,
+ "_srcBlendFactor": 2,
+ "_dstBlendFactor": 4,
+ "_color": {
+ "__type__": "cc.Color",
+ "r": 255,
+ "g": 255,
+ "b": 255,
+ "a": 255
+ },
+ "_spriteFrame": {
+ "__uuid__": "2e6c7534-7589-4521-9ef9-176162d783d5@f9941",
+ "__expectedType__": "cc.SpriteFrame"
+ },
+ "_type": 0,
+ "_fillType": 0,
+ "_sizeMode": 1,
+ "_fillCenter": {
+ "__type__": "cc.Vec2",
+ "x": 0,
+ "y": 0
+ },
+ "_fillStart": 0,
+ "_fillRange": 0,
+ "_isTrimmedMode": true,
+ "_useGrayscale": false,
+ "_atlas": null,
+ "_id": "65ZXXUB95MkLO4vpYX2vqr"
+ },
+ {
+ "__type__": "cc.Widget",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 9
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_alignFlags": 20,
+ "_target": null,
+ "_left": 0,
+ "_right": 0,
+ "_top": 0,
+ "_bottom": -468,
+ "_horizontalCenter": 0,
+ "_verticalCenter": 0,
+ "_isAbsLeft": true,
+ "_isAbsRight": true,
+ "_isAbsTop": true,
+ "_isAbsBottom": true,
+ "_isAbsHorizontalCenter": true,
+ "_isAbsVerticalCenter": true,
+ "_originalWidth": 0,
+ "_originalHeight": 0,
+ "_alignMode": 2,
+ "_lockFlags": 4,
+ "_id": "cekXN0JHxL9ZnhPchevMY0"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "image_health_title",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 4
+ },
+ "_children": [],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 14
+ },
+ {
+ "__id__": 15
+ },
+ {
+ "__id__": 16
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": -430.5,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "89jCmZdE9Nm5LuQFPIeYLG"
+ },
+ {
+ "__type__": "cc.UITransform",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 13
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_contentSize": {
+ "__type__": "cc.Size",
+ "width": 137,
+ "height": 29
+ },
+ "_anchorPoint": {
+ "__type__": "cc.Vec2",
+ "x": 0.5,
+ "y": 0.5
+ },
+ "_id": "c2XfNXxK1LfbvvPtv+vHWx"
+ },
+ {
+ "__type__": "cc.Sprite",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 13
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_customMaterial": null,
+ "_srcBlendFactor": 2,
+ "_dstBlendFactor": 4,
+ "_color": {
+ "__type__": "cc.Color",
+ "r": 255,
+ "g": 255,
+ "b": 255,
+ "a": 255
+ },
+ "_spriteFrame": {
+ "__uuid__": "0aa6f7d9-09d0-42bf-ae09-a445e6fd22c9@f9941",
+ "__expectedType__": "cc.SpriteFrame"
+ },
+ "_type": 0,
+ "_fillType": 0,
+ "_sizeMode": 1,
+ "_fillCenter": {
+ "__type__": "cc.Vec2",
+ "x": 0,
+ "y": 0
+ },
+ "_fillStart": 0,
+ "_fillRange": 0,
+ "_isTrimmedMode": true,
+ "_useGrayscale": false,
+ "_atlas": null,
+ "_id": "41NAJnq99FXpnRXx5VY3Mf"
+ },
+ {
+ "__type__": "cc.Widget",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 13
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_alignFlags": 20,
+ "_target": null,
+ "_left": 0,
+ "_right": 0,
+ "_top": 0,
+ "_bottom": -395,
+ "_horizontalCenter": 0,
+ "_verticalCenter": -435,
+ "_isAbsLeft": true,
+ "_isAbsRight": true,
+ "_isAbsTop": true,
+ "_isAbsBottom": true,
+ "_isAbsHorizontalCenter": true,
+ "_isAbsVerticalCenter": true,
+ "_originalWidth": 0,
+ "_originalHeight": 0,
+ "_alignMode": 2,
+ "_lockFlags": 20,
+ "_id": "11SCgpn4hNpYV74AHcQKPS"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "image_age_tip",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 4
+ },
+ "_children": [],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 18
+ },
+ {
+ "__id__": 19
+ },
+ {
+ "__id__": 20
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": -285,
+ "y": 550,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "579+PhIUFASZ1S7bJInNeB"
+ },
+ {
+ "__type__": "cc.UITransform",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 17
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_contentSize": {
+ "__type__": "cc.Size",
+ "width": 121,
+ "height": 156
+ },
+ "_anchorPoint": {
+ "__type__": "cc.Vec2",
+ "x": 0.5,
+ "y": 0.5
+ },
+ "_id": "fd/exBqAZIr4FZl6MPV5Gb"
+ },
+ {
+ "__type__": "cc.Sprite",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 17
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_customMaterial": null,
+ "_srcBlendFactor": 2,
+ "_dstBlendFactor": 4,
+ "_color": {
+ "__type__": "cc.Color",
+ "r": 255,
+ "g": 255,
+ "b": 255,
+ "a": 255
+ },
+ "_spriteFrame": {
+ "__uuid__": "21e24b19-38a1-4116-a09a-a7765ef9207d@f9941",
+ "__expectedType__": "cc.SpriteFrame"
+ },
+ "_type": 0,
+ "_fillType": 0,
+ "_sizeMode": 0,
+ "_fillCenter": {
+ "__type__": "cc.Vec2",
+ "x": 0,
+ "y": 0
+ },
+ "_fillStart": 0,
+ "_fillRange": 0,
+ "_isTrimmedMode": true,
+ "_useGrayscale": false,
+ "_atlas": null,
+ "_id": "b6P0N9eNtIz6qwe7F1yCn+"
+ },
+ {
+ "__type__": "cc.Widget",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 17
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_alignFlags": 9,
+ "_target": null,
+ "_left": -295.5,
+ "_right": 0,
+ "_top": -578,
+ "_bottom": 589,
+ "_horizontalCenter": 0,
+ "_verticalCenter": 0,
+ "_isAbsLeft": true,
+ "_isAbsRight": true,
+ "_isAbsTop": true,
+ "_isAbsBottom": true,
+ "_isAbsHorizontalCenter": true,
+ "_isAbsVerticalCenter": true,
+ "_originalWidth": 0,
+ "_originalHeight": 156,
+ "_alignMode": 2,
+ "_lockFlags": 9,
+ "_id": "15Ql87wbxHvJ/Dn2gipnV2"
+ },
+ {
+ "__type__": "cc.UITransform",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 4
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_contentSize": {
+ "__type__": "cc.Size",
+ "width": 100,
+ "height": 100
+ },
+ "_anchorPoint": {
+ "__type__": "cc.Vec2",
+ "x": 0.5,
+ "y": 0.5
+ },
+ "_id": "f2tzcWDiBNNKKrnPd07n/y"
+ },
+ {
+ "__type__": "cc.Widget",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 4
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_alignFlags": 18,
+ "_target": null,
+ "_left": 0,
+ "_right": 0,
+ "_top": 0,
+ "_bottom": 0,
+ "_horizontalCenter": 0,
+ "_verticalCenter": 0,
+ "_isAbsLeft": true,
+ "_isAbsRight": true,
+ "_isAbsTop": true,
+ "_isAbsBottom": true,
+ "_isAbsHorizontalCenter": true,
+ "_isAbsVerticalCenter": true,
+ "_originalWidth": 0,
+ "_originalHeight": 0,
+ "_alignMode": 2,
+ "_lockFlags": 18,
+ "_id": "0f+BSXru9DValkOkklwcLG"
+ },
+ {
+ "__type__": "cc.Camera",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 3
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_projection": 0,
+ "_priority": 0,
+ "_fov": 45,
+ "_fovAxis": 0,
+ "_orthoHeight": 667,
+ "_near": 0,
+ "_far": 2000,
+ "_color": {
+ "__type__": "cc.Color",
+ "r": 0,
+ "g": 0,
+ "b": 0,
+ "a": 255
+ },
+ "_depth": 1,
+ "_stencil": 0,
+ "_clearFlags": 7,
+ "_rect": {
+ "__type__": "cc.Rect",
+ "x": 0,
+ "y": 0,
+ "width": 1,
+ "height": 1
+ },
+ "_aperture": 19,
+ "_shutter": 7,
+ "_iso": 0,
+ "_screenScale": 1,
+ "_visibility": 1108344832,
+ "_targetTexture": null,
+ "_postProcess": null,
+ "_usePostProcess": false,
+ "_cameraType": -1,
+ "_trackingType": 0,
+ "_id": "63WIch3o5BEYRlXzTT0oWc"
+ },
+ {
+ "__type__": "cc.UITransform",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 2
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_contentSize": {
+ "__type__": "cc.Size",
+ "width": 750,
+ "height": 1334
+ },
+ "_anchorPoint": {
+ "__type__": "cc.Vec2",
+ "x": 0.5,
+ "y": 0.5
+ },
+ "_id": "d6rUX5yfhMlKoWX2bSbawx"
+ },
+ {
+ "__type__": "cc.Canvas",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 2
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_cameraComponent": {
+ "__id__": 23
+ },
+ "_alignCanvasWithScreen": true,
+ "_id": "12O/ljcVlEqLmVm3U2gEOQ"
+ },
+ {
+ "__type__": "cc.Widget",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 2
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_alignFlags": 45,
+ "_target": null,
+ "_left": 5.684341886080802e-14,
+ "_right": 5.684341886080802e-14,
+ "_top": 5.684341886080802e-14,
+ "_bottom": 5.684341886080802e-14,
+ "_horizontalCenter": 0,
+ "_verticalCenter": 0,
+ "_isAbsLeft": true,
+ "_isAbsRight": true,
+ "_isAbsTop": true,
+ "_isAbsBottom": true,
+ "_isAbsHorizontalCenter": true,
+ "_isAbsVerticalCenter": true,
+ "_originalWidth": 0,
+ "_originalHeight": 0,
+ "_alignMode": 2,
+ "_lockFlags": 0,
+ "_id": "c5V1EV8IpMtrIvY1OE9t2u"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "GameEntry",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 1
+ },
+ "_children": [
+ {
+ "__id__": 28
+ },
+ {
+ "__id__": 36
+ }
+ ],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 38
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "37BpNbARFHXqth05PHNBRa"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "UI",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 27
+ },
+ "_children": [
+ {
+ "__id__": 29
+ },
+ {
+ "__id__": 31
+ },
+ {
+ "__id__": 33
+ }
+ ],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 35
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "fe5e9iTVNGXacpcb1uGBMC"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "Window",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 28
+ },
+ "_children": [],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 30
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "8dI/Ft78BF5YI/MZDpCEE2"
+ },
+ {
+ "__type__": "CocosWindowContainer",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 29
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "ignoreQuery": false,
+ "swallowTouch": true,
+ "bgAlpha": 0.75,
+ "_id": "caS/zue7hP6ZijSHfV8JST"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "Toast",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 28
+ },
+ "_children": [],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 32
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "0cpxn16+dFz6sgnr/U0c06"
+ },
+ {
+ "__type__": "CocosWindowContainer",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 31
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "ignoreQuery": true,
+ "swallowTouch": false,
+ "bgAlpha": 0.75,
+ "_id": "8esjOPtvxOoae45nWAx2v4"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "Wait",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 28
+ },
+ "_children": [],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 34
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "83puExzHVKPIbdYwrq1FoY"
+ },
+ {
+ "__type__": "CocosWindowContainer",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 33
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "ignoreQuery": true,
+ "swallowTouch": true,
+ "bgAlpha": 0,
+ "_id": "50qi/ehLlPG5oiVdlzl7So"
+ },
+ {
+ "__type__": "CocosUIModule",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 28
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_id": "b1WB0lc+dOyry12ArRCj4V"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "ConditionNode",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 27
+ },
+ "_children": [],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 37
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "abfYkC3NNEXomnw+j+sFIs"
+ },
+ {
+ "__type__": "ConditionModule",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 36
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "updateDeltaTime": 0.3,
+ "_id": "76UGIafEBJbLTdpKGfxwav"
+ },
+ {
+ "__type__": "e5804qewX9N9op0d4aH4r7B",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 27
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "uiConfig": {
+ "__uuid__": "35d3b8e9-0096-4aa9-82a1-505784157bf8",
+ "__expectedType__": "cc.JsonAsset"
+ },
+ "fps": 60,
+ "root": {
+ "__id__": 4
+ },
+ "manifest": null,
+ "_id": "4dPt98muFPo7hLJwjnjK9U"
+ },
+ {
+ "__type__": "cc.PrefabInfo",
+ "root": null,
+ "asset": null,
+ "fileId": "bef93422-3e63-4c0f-a5cf-d926e7360673",
+ "instance": null,
+ "targetOverrides": null
+ },
+ {
+ "__type__": "cc.SceneGlobals",
+ "ambient": {
+ "__id__": 41
+ },
+ "shadows": {
+ "__id__": 42
+ },
+ "_skybox": {
+ "__id__": 43
+ },
+ "fog": {
+ "__id__": 44
+ },
+ "octree": {
+ "__id__": 45
+ },
+ "skin": {
+ "__id__": 46
+ },
+ "lightProbeInfo": {
+ "__id__": 47
+ },
+ "postSettings": {
+ "__id__": 48
+ },
+ "bakedWithStationaryMainLight": false,
+ "bakedWithHighpLightmap": false
+ },
+ {
+ "__type__": "cc.AmbientInfo",
+ "_skyColorHDR": {
+ "__type__": "cc.Vec4",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 0.520833125
+ },
+ "_skyColor": {
+ "__type__": "cc.Vec4",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 0.520833125
+ },
+ "_skyIllumHDR": 20000,
+ "_skyIllum": 20000,
+ "_groundAlbedoHDR": {
+ "__type__": "cc.Vec4",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 0
+ },
+ "_groundAlbedo": {
+ "__type__": "cc.Vec4",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 0
+ },
+ "_skyColorLDR": {
+ "__type__": "cc.Vec4",
+ "x": 0.2,
+ "y": 0.5,
+ "z": 0.8,
+ "w": 1
+ },
+ "_skyIllumLDR": 20000,
+ "_groundAlbedoLDR": {
+ "__type__": "cc.Vec4",
+ "x": 0.2,
+ "y": 0.2,
+ "z": 0.2,
+ "w": 1
+ }
+ },
+ {
+ "__type__": "cc.ShadowsInfo",
+ "_enabled": false,
+ "_type": 0,
+ "_normal": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 1,
+ "z": 0
+ },
+ "_distance": 0,
+ "_planeBias": 1,
+ "_shadowColor": {
+ "__type__": "cc.Color",
+ "r": 76,
+ "g": 76,
+ "b": 76,
+ "a": 255
+ },
+ "_maxReceived": 4,
+ "_size": {
+ "__type__": "cc.Vec2",
+ "x": 512,
+ "y": 512
+ }
+ },
+ {
+ "__type__": "cc.SkyboxInfo",
+ "_envLightingType": 0,
+ "_envmapHDR": null,
+ "_envmap": null,
+ "_envmapLDR": null,
+ "_diffuseMapHDR": null,
+ "_diffuseMapLDR": null,
+ "_enabled": false,
+ "_useHDR": true,
+ "_editableMaterial": null,
+ "_reflectionHDR": null,
+ "_reflectionLDR": null,
+ "_rotationAngle": 0
+ },
+ {
+ "__type__": "cc.FogInfo",
+ "_type": 0,
+ "_fogColor": {
+ "__type__": "cc.Color",
+ "r": 200,
+ "g": 200,
+ "b": 200,
+ "a": 255
+ },
+ "_enabled": false,
+ "_fogDensity": 0.3,
+ "_fogStart": 0.5,
+ "_fogEnd": 300,
+ "_fogAtten": 5,
+ "_fogTop": 1.5,
+ "_fogRange": 1.2,
+ "_accurate": false
+ },
+ {
+ "__type__": "cc.OctreeInfo",
+ "_enabled": false,
+ "_minPos": {
+ "__type__": "cc.Vec3",
+ "x": -1024,
+ "y": -1024,
+ "z": -1024
+ },
+ "_maxPos": {
+ "__type__": "cc.Vec3",
+ "x": 1024,
+ "y": 1024,
+ "z": 1024
+ },
+ "_depth": 8
+ },
+ {
+ "__type__": "cc.SkinInfo",
+ "_enabled": false,
+ "_blurRadius": 0.01,
+ "_sssIntensity": 3
+ },
+ {
+ "__type__": "cc.LightProbeInfo",
+ "_giScale": 1,
+ "_giSamples": 1024,
+ "_bounces": 2,
+ "_reduceRinging": 0,
+ "_showProbe": true,
+ "_showWireframe": true,
+ "_showConvex": false,
+ "_data": null,
+ "_lightProbeSphereVolume": 1
+ },
+ {
+ "__type__": "cc.PostSettingsInfo",
+ "_toneMappingType": 0
+ }
+]
\ No newline at end of file
diff --git a/demo/assets/scene/GameEntry.scene.meta b/demo/assets/scene/GameEntry.scene.meta
new file mode 100644
index 0000000..819d3d7
--- /dev/null
+++ b/demo/assets/scene/GameEntry.scene.meta
@@ -0,0 +1,11 @@
+{
+ "ver": "1.1.50",
+ "importer": "scene",
+ "imported": true,
+ "uuid": "bef93422-3e63-4c0f-a5cf-d926e7360673",
+ "files": [
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/scene/NativeGameEntry.scene b/demo/assets/scene/NativeGameEntry.scene
new file mode 100644
index 0000000..25bd2cd
--- /dev/null
+++ b/demo/assets/scene/NativeGameEntry.scene
@@ -0,0 +1,1524 @@
+[
+ {
+ "__type__": "cc.SceneAsset",
+ "_name": "NativeGameEntry",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_native": "",
+ "scene": {
+ "__id__": 1
+ }
+ },
+ {
+ "__type__": "cc.Scene",
+ "_name": "NativeGameEntry",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": null,
+ "_children": [
+ {
+ "__id__": 2
+ },
+ {
+ "__id__": 27
+ }
+ ],
+ "_active": true,
+ "_components": [],
+ "_prefab": {
+ "__id__": 39
+ },
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "autoReleaseAssets": false,
+ "_globals": {
+ "__id__": 40
+ },
+ "_id": "f75274b3-ee34-4805-a3bb-44d0c4617d01"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "Canvas",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 1
+ },
+ "_children": [
+ {
+ "__id__": 3
+ }
+ ],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 24
+ },
+ {
+ "__id__": 25
+ },
+ {
+ "__id__": 26
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 375,
+ "y": 667,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 33554432,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "beI88Z2HpFELqR4T5EMHpg"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "Camera",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 2
+ },
+ "_children": [
+ {
+ "__id__": 4
+ }
+ ],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 23
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 1000
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "ebFwiq8gBFaYpqYbdoDODe"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "root",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 3
+ },
+ "_children": [
+ {
+ "__id__": 5
+ },
+ {
+ "__id__": 9
+ },
+ {
+ "__id__": 13
+ },
+ {
+ "__id__": 17
+ }
+ ],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 21
+ },
+ {
+ "__id__": 22
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": -1000
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "61IfeQ6J5Kpp0fCcAF/VJO"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "bgNode",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 4
+ },
+ "_children": [],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 6
+ },
+ {
+ "__id__": 7
+ },
+ {
+ "__id__": 8
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 1000
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "39XkoKPdFBZ5dnqzBjUSKD"
+ },
+ {
+ "__type__": "cc.UITransform",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 5
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_contentSize": {
+ "__type__": "cc.Size",
+ "width": 750,
+ "height": 1624
+ },
+ "_anchorPoint": {
+ "__type__": "cc.Vec2",
+ "x": 0.5,
+ "y": 0.5
+ },
+ "_id": "08AYF/vChIA4SHkM+BuHl8"
+ },
+ {
+ "__type__": "cc.Sprite",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 5
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_customMaterial": null,
+ "_srcBlendFactor": 2,
+ "_dstBlendFactor": 4,
+ "_color": {
+ "__type__": "cc.Color",
+ "r": 255,
+ "g": 255,
+ "b": 255,
+ "a": 255
+ },
+ "_spriteFrame": {
+ "__uuid__": "efb639df-cc0d-4a17-8b33-2d555c8147b4@f9941",
+ "__expectedType__": "cc.SpriteFrame"
+ },
+ "_type": 0,
+ "_fillType": 0,
+ "_sizeMode": 0,
+ "_fillCenter": {
+ "__type__": "cc.Vec2",
+ "x": 0,
+ "y": 0
+ },
+ "_fillStart": 0,
+ "_fillRange": 0,
+ "_isTrimmedMode": true,
+ "_useGrayscale": false,
+ "_atlas": null,
+ "_id": "7csQyxHqRC3bwNg527Px4I"
+ },
+ {
+ "__type__": "cc.Widget",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 5
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_alignFlags": 18,
+ "_target": null,
+ "_left": -325,
+ "_right": -325,
+ "_top": -762,
+ "_bottom": -762,
+ "_horizontalCenter": 0,
+ "_verticalCenter": 0,
+ "_isAbsLeft": true,
+ "_isAbsRight": true,
+ "_isAbsTop": true,
+ "_isAbsBottom": true,
+ "_isAbsHorizontalCenter": true,
+ "_isAbsVerticalCenter": true,
+ "_originalWidth": 750,
+ "_originalHeight": 1624,
+ "_alignMode": 2,
+ "_lockFlags": 18,
+ "_id": "89cZQ5wKlOZ79sRElbIs3P"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "image_health",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 4
+ },
+ "_children": [],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 10
+ },
+ {
+ "__id__": 11
+ },
+ {
+ "__id__": 12
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": -560,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "17zVjpMn9G2ZTOT4VDXRJt"
+ },
+ {
+ "__type__": "cc.UITransform",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 9
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_contentSize": {
+ "__type__": "cc.Size",
+ "width": 634,
+ "height": 60
+ },
+ "_anchorPoint": {
+ "__type__": "cc.Vec2",
+ "x": 0.5,
+ "y": 0.5
+ },
+ "_id": "41hM6KfP5Ncag9eGtvhD+o"
+ },
+ {
+ "__type__": "cc.Sprite",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 9
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_customMaterial": null,
+ "_srcBlendFactor": 2,
+ "_dstBlendFactor": 4,
+ "_color": {
+ "__type__": "cc.Color",
+ "r": 255,
+ "g": 255,
+ "b": 255,
+ "a": 255
+ },
+ "_spriteFrame": {
+ "__uuid__": "2e6c7534-7589-4521-9ef9-176162d783d5@f9941",
+ "__expectedType__": "cc.SpriteFrame"
+ },
+ "_type": 0,
+ "_fillType": 0,
+ "_sizeMode": 1,
+ "_fillCenter": {
+ "__type__": "cc.Vec2",
+ "x": 0,
+ "y": 0
+ },
+ "_fillStart": 0,
+ "_fillRange": 0,
+ "_isTrimmedMode": true,
+ "_useGrayscale": false,
+ "_atlas": null,
+ "_id": "65ZXXUB95MkLO4vpYX2vqr"
+ },
+ {
+ "__type__": "cc.Widget",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 9
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_alignFlags": 20,
+ "_target": null,
+ "_left": 0,
+ "_right": 0,
+ "_top": 0,
+ "_bottom": -540,
+ "_horizontalCenter": 0,
+ "_verticalCenter": 0,
+ "_isAbsLeft": true,
+ "_isAbsRight": true,
+ "_isAbsTop": true,
+ "_isAbsBottom": true,
+ "_isAbsHorizontalCenter": true,
+ "_isAbsVerticalCenter": true,
+ "_originalWidth": 0,
+ "_originalHeight": 0,
+ "_alignMode": 2,
+ "_lockFlags": 4,
+ "_id": "ee7gMDxetH64JbfUqavnzG"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "image_health_title",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 4
+ },
+ "_children": [],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 14
+ },
+ {
+ "__id__": 15
+ },
+ {
+ "__id__": 16
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": -499.5,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "89jCmZdE9Nm5LuQFPIeYLG"
+ },
+ {
+ "__type__": "cc.UITransform",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 13
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_contentSize": {
+ "__type__": "cc.Size",
+ "width": 137,
+ "height": 29
+ },
+ "_anchorPoint": {
+ "__type__": "cc.Vec2",
+ "x": 0.5,
+ "y": 0.5
+ },
+ "_id": "c2XfNXxK1LfbvvPtv+vHWx"
+ },
+ {
+ "__type__": "cc.Sprite",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 13
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_customMaterial": null,
+ "_srcBlendFactor": 2,
+ "_dstBlendFactor": 4,
+ "_color": {
+ "__type__": "cc.Color",
+ "r": 255,
+ "g": 255,
+ "b": 255,
+ "a": 255
+ },
+ "_spriteFrame": {
+ "__uuid__": "0aa6f7d9-09d0-42bf-ae09-a445e6fd22c9@f9941",
+ "__expectedType__": "cc.SpriteFrame"
+ },
+ "_type": 0,
+ "_fillType": 0,
+ "_sizeMode": 1,
+ "_fillCenter": {
+ "__type__": "cc.Vec2",
+ "x": 0,
+ "y": 0
+ },
+ "_fillStart": 0,
+ "_fillRange": 0,
+ "_isTrimmedMode": true,
+ "_useGrayscale": false,
+ "_atlas": null,
+ "_id": "41NAJnq99FXpnRXx5VY3Mf"
+ },
+ {
+ "__type__": "cc.Widget",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 13
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_alignFlags": 20,
+ "_target": null,
+ "_left": 0,
+ "_right": 0,
+ "_top": 0,
+ "_bottom": -464,
+ "_horizontalCenter": 0,
+ "_verticalCenter": 0,
+ "_isAbsLeft": true,
+ "_isAbsRight": true,
+ "_isAbsTop": true,
+ "_isAbsBottom": true,
+ "_isAbsHorizontalCenter": true,
+ "_isAbsVerticalCenter": true,
+ "_originalWidth": 0,
+ "_originalHeight": 0,
+ "_alignMode": 2,
+ "_lockFlags": 4,
+ "_id": "cdHJdQNPlAap8CVTLLCK5z"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "image_age_tip",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 4
+ },
+ "_children": [],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 18
+ },
+ {
+ "__id__": 19
+ },
+ {
+ "__id__": 20
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": -285,
+ "y": 550,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "579+PhIUFASZ1S7bJInNeB"
+ },
+ {
+ "__type__": "cc.UITransform",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 17
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_contentSize": {
+ "__type__": "cc.Size",
+ "width": 121,
+ "height": 156
+ },
+ "_anchorPoint": {
+ "__type__": "cc.Vec2",
+ "x": 0.5,
+ "y": 0.5
+ },
+ "_id": "fd/exBqAZIr4FZl6MPV5Gb"
+ },
+ {
+ "__type__": "cc.Sprite",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 17
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_customMaterial": null,
+ "_srcBlendFactor": 2,
+ "_dstBlendFactor": 4,
+ "_color": {
+ "__type__": "cc.Color",
+ "r": 255,
+ "g": 255,
+ "b": 255,
+ "a": 255
+ },
+ "_spriteFrame": {
+ "__uuid__": "21e24b19-38a1-4116-a09a-a7765ef9207d@f9941",
+ "__expectedType__": "cc.SpriteFrame"
+ },
+ "_type": 0,
+ "_fillType": 0,
+ "_sizeMode": 0,
+ "_fillCenter": {
+ "__type__": "cc.Vec2",
+ "x": 0,
+ "y": 0
+ },
+ "_fillStart": 0,
+ "_fillRange": 0,
+ "_isTrimmedMode": true,
+ "_useGrayscale": false,
+ "_atlas": null,
+ "_id": "b6P0N9eNtIz6qwe7F1yCn+"
+ },
+ {
+ "__type__": "cc.Widget",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 17
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_alignFlags": 9,
+ "_target": null,
+ "_left": -295.5,
+ "_right": 0,
+ "_top": -578,
+ "_bottom": 589,
+ "_horizontalCenter": 0,
+ "_verticalCenter": 0,
+ "_isAbsLeft": true,
+ "_isAbsRight": true,
+ "_isAbsTop": true,
+ "_isAbsBottom": true,
+ "_isAbsHorizontalCenter": true,
+ "_isAbsVerticalCenter": true,
+ "_originalWidth": 0,
+ "_originalHeight": 156,
+ "_alignMode": 2,
+ "_lockFlags": 9,
+ "_id": "15Ql87wbxHvJ/Dn2gipnV2"
+ },
+ {
+ "__type__": "cc.UITransform",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 4
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_contentSize": {
+ "__type__": "cc.Size",
+ "width": 100,
+ "height": 100
+ },
+ "_anchorPoint": {
+ "__type__": "cc.Vec2",
+ "x": 0.5,
+ "y": 0.5
+ },
+ "_id": "f2tzcWDiBNNKKrnPd07n/y"
+ },
+ {
+ "__type__": "cc.Widget",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 4
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_alignFlags": 18,
+ "_target": null,
+ "_left": 0,
+ "_right": 0,
+ "_top": 0,
+ "_bottom": 0,
+ "_horizontalCenter": 0,
+ "_verticalCenter": 0,
+ "_isAbsLeft": true,
+ "_isAbsRight": true,
+ "_isAbsTop": true,
+ "_isAbsBottom": true,
+ "_isAbsHorizontalCenter": true,
+ "_isAbsVerticalCenter": true,
+ "_originalWidth": 0,
+ "_originalHeight": 0,
+ "_alignMode": 2,
+ "_lockFlags": 18,
+ "_id": "0f+BSXru9DValkOkklwcLG"
+ },
+ {
+ "__type__": "cc.Camera",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 3
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_projection": 0,
+ "_priority": 0,
+ "_fov": 45,
+ "_fovAxis": 0,
+ "_orthoHeight": 667,
+ "_near": 0,
+ "_far": 2000,
+ "_color": {
+ "__type__": "cc.Color",
+ "r": 0,
+ "g": 0,
+ "b": 0,
+ "a": 255
+ },
+ "_depth": 1,
+ "_stencil": 0,
+ "_clearFlags": 7,
+ "_rect": {
+ "__type__": "cc.Rect",
+ "x": 0,
+ "y": 0,
+ "width": 1,
+ "height": 1
+ },
+ "_aperture": 19,
+ "_shutter": 7,
+ "_iso": 0,
+ "_screenScale": 1,
+ "_visibility": 1108344832,
+ "_targetTexture": null,
+ "_postProcess": null,
+ "_usePostProcess": false,
+ "_cameraType": -1,
+ "_trackingType": 0,
+ "_id": "63WIch3o5BEYRlXzTT0oWc"
+ },
+ {
+ "__type__": "cc.UITransform",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 2
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_contentSize": {
+ "__type__": "cc.Size",
+ "width": 750,
+ "height": 1334
+ },
+ "_anchorPoint": {
+ "__type__": "cc.Vec2",
+ "x": 0.5,
+ "y": 0.5
+ },
+ "_id": "d6rUX5yfhMlKoWX2bSbawx"
+ },
+ {
+ "__type__": "cc.Canvas",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 2
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_cameraComponent": {
+ "__id__": 23
+ },
+ "_alignCanvasWithScreen": true,
+ "_id": "12O/ljcVlEqLmVm3U2gEOQ"
+ },
+ {
+ "__type__": "cc.Widget",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 2
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_alignFlags": 45,
+ "_target": null,
+ "_left": 0,
+ "_right": 0,
+ "_top": 5.684341886080802e-14,
+ "_bottom": 5.684341886080802e-14,
+ "_horizontalCenter": 0,
+ "_verticalCenter": 0,
+ "_isAbsLeft": true,
+ "_isAbsRight": true,
+ "_isAbsTop": true,
+ "_isAbsBottom": true,
+ "_isAbsHorizontalCenter": true,
+ "_isAbsVerticalCenter": true,
+ "_originalWidth": 0,
+ "_originalHeight": 0,
+ "_alignMode": 2,
+ "_lockFlags": 0,
+ "_id": "c5V1EV8IpMtrIvY1OE9t2u"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "GameEntry",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 1
+ },
+ "_children": [
+ {
+ "__id__": 28
+ },
+ {
+ "__id__": 36
+ }
+ ],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 38
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "37BpNbARFHXqth05PHNBRa"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "UI",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 27
+ },
+ "_children": [
+ {
+ "__id__": 29
+ },
+ {
+ "__id__": 31
+ },
+ {
+ "__id__": 33
+ }
+ ],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 35
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "fe5e9iTVNGXacpcb1uGBMC"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "Window",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 28
+ },
+ "_children": [],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 30
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "8dI/Ft78BF5YI/MZDpCEE2"
+ },
+ {
+ "__type__": "CocosWindowContainer",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 29
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "ignoreQuery": false,
+ "swallowTouch": true,
+ "bgAlpha": 0.75,
+ "_id": "caS/zue7hP6ZijSHfV8JST"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "Toast",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 28
+ },
+ "_children": [],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 32
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "0cpxn16+dFz6sgnr/U0c06"
+ },
+ {
+ "__type__": "CocosWindowContainer",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 31
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "ignoreQuery": true,
+ "swallowTouch": false,
+ "bgAlpha": 0.75,
+ "_id": "8esjOPtvxOoae45nWAx2v4"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "Wait",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 28
+ },
+ "_children": [],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 34
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "83puExzHVKPIbdYwrq1FoY"
+ },
+ {
+ "__type__": "CocosWindowContainer",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 33
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "ignoreQuery": true,
+ "swallowTouch": true,
+ "bgAlpha": 0,
+ "_id": "50qi/ehLlPG5oiVdlzl7So"
+ },
+ {
+ "__type__": "CocosUIModule",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 28
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "_id": "b1WB0lc+dOyry12ArRCj4V"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "ConditionNode",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "_parent": {
+ "__id__": 27
+ },
+ "_children": [],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 37
+ }
+ ],
+ "_prefab": null,
+ "_lpos": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_lrot": {
+ "__type__": "cc.Quat",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 1
+ },
+ "_lscale": {
+ "__type__": "cc.Vec3",
+ "x": 1,
+ "y": 1,
+ "z": 1
+ },
+ "_mobility": 0,
+ "_layer": 1073741824,
+ "_euler": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_id": "abfYkC3NNEXomnw+j+sFIs"
+ },
+ {
+ "__type__": "ConditionModule",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 36
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "updateDeltaTime": 0.3,
+ "_id": "76UGIafEBJbLTdpKGfxwav"
+ },
+ {
+ "__type__": "e5804qewX9N9op0d4aH4r7B",
+ "_name": "",
+ "_objFlags": 0,
+ "__editorExtras__": {},
+ "node": {
+ "__id__": 27
+ },
+ "_enabled": true,
+ "__prefab": null,
+ "uiConfig": {
+ "__uuid__": "35d3b8e9-0096-4aa9-82a1-505784157bf8",
+ "__expectedType__": "cc.JsonAsset"
+ },
+ "ecConfig": {
+ "__uuid__": "74f73a17-1358-4937-8b5b-c36149e05152",
+ "__expectedType__": "cc.JsonAsset"
+ },
+ "fps": 60,
+ "root": {
+ "__id__": 4
+ },
+ "manifest": {
+ "__uuid__": "61f59735-b08e-4496-9ad8-0731b9d684ca",
+ "__expectedType__": "cc.Asset"
+ },
+ "_id": "4dPt98muFPo7hLJwjnjK9U"
+ },
+ {
+ "__type__": "cc.PrefabInfo",
+ "root": null,
+ "asset": null,
+ "fileId": "bef93422-3e63-4c0f-a5cf-d926e7360673",
+ "instance": null,
+ "targetOverrides": null
+ },
+ {
+ "__type__": "cc.SceneGlobals",
+ "ambient": {
+ "__id__": 41
+ },
+ "shadows": {
+ "__id__": 42
+ },
+ "_skybox": {
+ "__id__": 43
+ },
+ "fog": {
+ "__id__": 44
+ },
+ "octree": {
+ "__id__": 45
+ },
+ "skin": {
+ "__id__": 46
+ },
+ "lightProbeInfo": {
+ "__id__": 47
+ },
+ "bakedWithStationaryMainLight": false,
+ "bakedWithHighpLightmap": false
+ },
+ {
+ "__type__": "cc.AmbientInfo",
+ "_skyColorHDR": {
+ "__type__": "cc.Vec4",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 0.520833125
+ },
+ "_skyColor": {
+ "__type__": "cc.Vec4",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 0.520833125
+ },
+ "_skyIllumHDR": 20000,
+ "_skyIllum": 20000,
+ "_groundAlbedoHDR": {
+ "__type__": "cc.Vec4",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 0
+ },
+ "_groundAlbedo": {
+ "__type__": "cc.Vec4",
+ "x": 0,
+ "y": 0,
+ "z": 0,
+ "w": 0
+ },
+ "_skyColorLDR": {
+ "__type__": "cc.Vec4",
+ "x": 0.2,
+ "y": 0.5,
+ "z": 0.8,
+ "w": 1
+ },
+ "_skyIllumLDR": 20000,
+ "_groundAlbedoLDR": {
+ "__type__": "cc.Vec4",
+ "x": 0.2,
+ "y": 0.2,
+ "z": 0.2,
+ "w": 1
+ }
+ },
+ {
+ "__type__": "cc.ShadowsInfo",
+ "_enabled": false,
+ "_type": 0,
+ "_normal": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 1,
+ "z": 0
+ },
+ "_distance": 0,
+ "_shadowColor": {
+ "__type__": "cc.Color",
+ "r": 76,
+ "g": 76,
+ "b": 76,
+ "a": 255
+ },
+ "_maxReceived": 4,
+ "_size": {
+ "__type__": "cc.Vec2",
+ "x": 512,
+ "y": 512
+ }
+ },
+ {
+ "__type__": "cc.SkyboxInfo",
+ "_envLightingType": 0,
+ "_envmapHDR": null,
+ "_envmap": null,
+ "_envmapLDR": null,
+ "_diffuseMapHDR": null,
+ "_diffuseMapLDR": null,
+ "_enabled": false,
+ "_useHDR": true,
+ "_editableMaterial": null,
+ "_reflectionHDR": null,
+ "_reflectionLDR": null,
+ "_rotationAngle": 0
+ },
+ {
+ "__type__": "cc.FogInfo",
+ "_type": 0,
+ "_fogColor": {
+ "__type__": "cc.Color",
+ "r": 200,
+ "g": 200,
+ "b": 200,
+ "a": 255
+ },
+ "_enabled": false,
+ "_fogDensity": 0.3,
+ "_fogStart": 0.5,
+ "_fogEnd": 300,
+ "_fogAtten": 5,
+ "_fogTop": 1.5,
+ "_fogRange": 1.2,
+ "_accurate": false
+ },
+ {
+ "__type__": "cc.OctreeInfo",
+ "_enabled": false,
+ "_minPos": {
+ "__type__": "cc.Vec3",
+ "x": -1024,
+ "y": -1024,
+ "z": -1024
+ },
+ "_maxPos": {
+ "__type__": "cc.Vec3",
+ "x": 1024,
+ "y": 1024,
+ "z": 1024
+ },
+ "_depth": 8
+ },
+ {
+ "__type__": "cc.SkinInfo",
+ "_enabled": false,
+ "_blurRadius": 0.01,
+ "_sssIntensity": 3
+ },
+ {
+ "__type__": "cc.LightProbeInfo",
+ "_giScale": 1,
+ "_giSamples": 1024,
+ "_bounces": 2,
+ "_reduceRinging": 0,
+ "_showProbe": true,
+ "_showWireframe": true,
+ "_showConvex": false,
+ "_data": null,
+ "_lightProbeSphereVolume": 1
+ }
+]
\ No newline at end of file
diff --git a/demo/assets/scene/NativeGameEntry.scene.meta b/demo/assets/scene/NativeGameEntry.scene.meta
new file mode 100644
index 0000000..ca10f1d
--- /dev/null
+++ b/demo/assets/scene/NativeGameEntry.scene.meta
@@ -0,0 +1,11 @@
+{
+ "ver": "1.1.50",
+ "importer": "scene",
+ "imported": true,
+ "uuid": "f75274b3-ee34-4805-a3bb-44d0c4617d01",
+ "files": [
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script.meta b/demo/assets/script.meta
new file mode 100644
index 0000000..44e737f
--- /dev/null
+++ b/demo/assets/script.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "448b0525-daf3-4ad4-be4a-04a7e181f028",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/Binary.ts.meta b/demo/assets/script/Binary.ts.meta
new file mode 100644
index 0000000..5e4d3fa
--- /dev/null
+++ b/demo/assets/script/Binary.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.23",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "24de22b8-8818-44a6-be2a-6aaa539447b0",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/Data.meta b/demo/assets/script/Data.meta
new file mode 100644
index 0000000..b554d88
--- /dev/null
+++ b/demo/assets/script/Data.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "204786f0-6faa-434f-bb4a-365be227bf25",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/Data/DataHelper.ts b/demo/assets/script/Data/DataHelper.ts
new file mode 100644
index 0000000..bebfd9e
--- /dev/null
+++ b/demo/assets/script/Data/DataHelper.ts
@@ -0,0 +1,24 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-02-17
+ * @Description: 准备一个数据类
+ */
+
+import { GlobalEvent } from "kunpocc-event";
+
+export class DataHelper {
+ private static _data: Map = new Map();
+
+ public static getValue(key: string, defaultValue: T): T {
+ if (this._data.has(key)) {
+ return this._data.get(key) as T;
+ }
+ return defaultValue;
+ }
+
+ public static setValue(key: string, value: any): void {
+ this._data.set(key, value);
+ /** 数据改变后发送事件 */
+ GlobalEvent.send(key);
+ }
+}
diff --git a/demo/assets/script/Data/DataHelper.ts.meta b/demo/assets/script/Data/DataHelper.ts.meta
new file mode 100644
index 0000000..6e597f5
--- /dev/null
+++ b/demo/assets/script/Data/DataHelper.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "7340bacc-d167-47e8-a83b-2224c46b7fd0",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/Debug.ts b/demo/assets/script/Debug.ts
new file mode 100644
index 0000000..4205f99
--- /dev/null
+++ b/demo/assets/script/Debug.ts
@@ -0,0 +1,65 @@
+/**
+ * @Author: LQ
+ * @Date: 2023-04-17
+ * @Description:
+ */
+
+import { cc, kunpo } from "./header";
+
+const tt = window['tt'];
+
+export class Debug {
+ public static Register(): void {
+ this._registerSystemEvent();
+ }
+
+ private static _registerSystemEvent(): void {
+ cc.input.on(cc.Input.EventType.KEY_DOWN, (event: cc.EventKeyboard) => {
+ if (event.keyCode == cc.KeyCode.KEY_Q) {
+ kunpo.WindowManager.showWindow("HomeWindow")
+ } else if (event.keyCode == cc.KeyCode.KEY_W) {
+ kunpo.WindowManager.showWindow("HideAllWindow");
+ } else if (event.keyCode == cc.KeyCode.KEY_E) {
+ kunpo.WindowManager.showWindow("HideOneWindow");
+ } else if (event.keyCode == cc.KeyCode.KEY_R) {
+ kunpo.WindowManager.showWindow("CloseAllWindow");
+ } else if (event.keyCode == cc.KeyCode.KEY_T) {
+ kunpo.WindowManager.showWindow("CloseOneWindow");
+ } else if (event.keyCode == cc.KeyCode.KEY_Y) {
+ kunpo.WindowManager.showWindow("GameWindow");
+ } else if (event.keyCode == cc.KeyCode.KEY_U) {
+
+ } else if (event.keyCode == cc.KeyCode.KEY_A) {
+ kunpo.WindowManager.showWindow("PopWindowHeader1");
+ // new NetAuth().start();
+ } else if (event.keyCode == cc.KeyCode.KEY_S) {
+ kunpo.WindowManager.showWindow("PopWindowHeader2");
+ } else if (event.keyCode == cc.KeyCode.KEY_D) {
+ kunpo.WindowManager.showWindow("PopWindow");
+ } else if (event.keyCode == cc.KeyCode.KEY_F) {
+
+ } else if (event.keyCode == cc.KeyCode.KEY_G) {
+
+ } else if (event.keyCode == cc.KeyCode.KEY_H) {
+
+ } else if (event.keyCode == cc.KeyCode.KEY_J) {
+
+ }
+ });
+ }
+
+ /** 跳转侧边栏 */
+ public navigateToScene(): void {
+ if (tt['navigateToScene']) {
+ tt['navigateToScene']({
+ scene: "sidebar",
+ success: (res: { errMsg: string }) => {
+ console.log(`侧边栏跳转成功:${res.errMsg}`);
+ },
+ fail: (res: { errMsg: string, errNo: number }) => {
+ console.log(`侧边栏跳转失败 code:${res.errNo}; msg:${res.errMsg}`);
+ },
+ });
+ }
+ }
+}
\ No newline at end of file
diff --git a/demo/assets/script/Debug.ts.meta b/demo/assets/script/Debug.ts.meta
new file mode 100644
index 0000000..8598c04
--- /dev/null
+++ b/demo/assets/script/Debug.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "cb6cfaf4-abaa-446a-bdba-a6b6f32cd810",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/GameEntry.ts b/demo/assets/script/GameEntry.ts
new file mode 100644
index 0000000..155384b
--- /dev/null
+++ b/demo/assets/script/GameEntry.ts
@@ -0,0 +1,87 @@
+import { Debug } from './Debug';
+import { cc, fgui, kunpo, KunpoAssets } from './header';
+import { SDKHelper } from './Helper/SDKHelper';
+import { UIPackageRegister } from './UIPackageRegister';
+const { ccclass, property, menu } = cc._decorator;
+@ccclass("GameEntry")
+@menu("kunpo/GameEntry")
+export class GameEntry extends kunpo.CocosEntry {
+ @property(cc.Node)
+ private root: cc.Node = null;
+ @property(cc.Asset)
+ private manifest: cc.Asset = null;
+
+ public getConfig(): kunpo.FrameConfig {
+ return {
+ debug: false
+ };
+ }
+
+ onInit(): void {
+ let deviceId = cc.sys.localStorage.getItem('xBBres');
+ if (!deviceId || deviceId === "") {
+ deviceId = "browser@" + Date.now().toString();
+ cc.sys.localStorage.setItem('xBBres', deviceId);
+ }
+ kunpo.Platform.deviceId = deviceId;
+
+ Debug.Register();
+ UIPackageRegister.Register();
+ SDKHelper.manifestUrl = this.manifest?.nativeUrl;
+ this.loadBaseResources();
+ }
+
+ /** 1. 加载基础资源 */
+ private loadBaseResources(): void {
+ let paths: KunpoAssets.IAssetConfig[] = [
+ { path: "ui/manual", type: cc.Asset }, // 手动加载UI基础资源
+ ];
+ let loader = new KunpoAssets.AssetLoader("load");
+ loader.start({
+ configs: paths,
+ complete: () => {
+ fgui.UIPackage.addPackage("ui/manual/Basics");
+ fgui.UIPackage.addPackage("ui/manual/Home");
+ this.loadResources();
+ },
+ fail: (msg: string, err: Error) => {
+
+ },
+ progress: (percent: number) => {
+
+ }
+ });
+ }
+
+ /** 2. 加载剩余资源 */
+ private loadResources(): void {
+ let paths: KunpoAssets.IAssetConfig[] = [
+ { path: "prefab", type: cc.Prefab },
+ { path: "config/buffer", type: cc.BufferAsset },
+ // { path: "icon", type: cc.SpriteFrame },
+ // { path: "texture/6101/spriteFrame", type: cc.SpriteFrame, isFile: true },
+ // { path: "pet", type: cc.SpriteFrame, bundle: "bundle_res" },
+ ];
+ let loader = new KunpoAssets.AssetLoader("load");
+ loader.start({
+ configs: paths,
+ complete: () => {
+ this.loadComplete();
+ },
+ fail: (msg: string, err: Error) => {
+
+ },
+ progress: (percent: number) => {
+
+ }
+ });
+ }
+
+
+ private loadComplete(): void {
+ kunpo.WindowManager.showWindow("HomeWindow", "这是一个测试窗口").then(() => {
+ kunpo.log("窗口显示成功");
+ this.root.active = false;
+ });
+ }
+}
\ No newline at end of file
diff --git a/demo/assets/script/GameEntry.ts.meta b/demo/assets/script/GameEntry.ts.meta
new file mode 100644
index 0000000..a93d713
--- /dev/null
+++ b/demo/assets/script/GameEntry.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "e5804a9e-c17f-4df6-8a74-778687e2bec1",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/Helper.meta b/demo/assets/script/Helper.meta
new file mode 100644
index 0000000..2418e58
--- /dev/null
+++ b/demo/assets/script/Helper.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "62ab5824-ce9f-4472-98ad-23bd415ec454",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/Helper/NativeCallJS.ts b/demo/assets/script/Helper/NativeCallJS.ts
new file mode 100644
index 0000000..68565f0
--- /dev/null
+++ b/demo/assets/script/Helper/NativeCallJS.ts
@@ -0,0 +1,20 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-03-22
+ * @Description:
+ */
+
+function KunpoNativeCallJsHandler(jsonString: string) {
+ console.log("KunpoNativeCallJsHandler", jsonString);
+ // let json = JSON.parse(jsonString);
+ // let functionName = json.function;
+ // let args = json.args;
+ // let func = _global[functionName];
+ // if (func) {
+ // func(...args);
+ // }
+}
+
+
+let _global = globalThis || window || global;
+(_global as any)["KunpoNativeCallJsHandler"] = KunpoNativeCallJsHandler;
\ No newline at end of file
diff --git a/demo/assets/script/Helper/NativeCallJS.ts.meta b/demo/assets/script/Helper/NativeCallJS.ts.meta
new file mode 100644
index 0000000..e8f5b2c
--- /dev/null
+++ b/demo/assets/script/Helper/NativeCallJS.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "6dd5b452-10ce-4d6c-9013-c0c991560dd7",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/Helper/SDKHelper.ts b/demo/assets/script/Helper/SDKHelper.ts
new file mode 100644
index 0000000..f2bf542
--- /dev/null
+++ b/demo/assets/script/Helper/SDKHelper.ts
@@ -0,0 +1,27 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-03-22
+ * @Description:
+ */
+
+import { GlobalEvent } from "kunpocc-event";
+
+export class SDKHelper {
+ private static _manifestUrl: string = "";
+ public static getSystemInfo(): Promise<{ version: string, build: number }> {
+ return new Promise((resolve, reject) => {
+ KunpoSDK.SDKHelper.getInstance().getSystemInfo();
+ GlobalEvent.addOnce("calljs::getSystemInfo", (data: { version: string, build: number }) => {
+ resolve(data);
+ }, this);
+ });
+ }
+
+ public static set manifestUrl(url: string) {
+ this._manifestUrl = url;
+ }
+
+ public static get manifestUrl(): string {
+ return this._manifestUrl;
+ }
+}
diff --git a/demo/assets/script/Helper/SDKHelper.ts.meta b/demo/assets/script/Helper/SDKHelper.ts.meta
new file mode 100644
index 0000000..21cd44f
--- /dev/null
+++ b/demo/assets/script/Helper/SDKHelper.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "76eb0078-54f0-400d-a151-68586eaa78f3",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/Math.ts b/demo/assets/script/Math.ts
new file mode 100644
index 0000000..475da93
--- /dev/null
+++ b/demo/assets/script/Math.ts
@@ -0,0 +1,73 @@
+interface Math {
+ /**
+ * 限制值
+ * @param value 当前值
+ * @param min 最小值
+ * @param max 最大值
+ */
+ clampf(value: number, min: number, max: number): number;
+
+ /**
+ * 随机从 min 到 max 的整数(包含min和max)
+ * @param min
+ * @param max
+ */
+ rand(min: number, max: number): number;
+
+ /**
+ * 随机从 min 到 max的数
+ * @param min
+ * @param max
+ */
+ randRange(min: number, max: number): number;
+
+ /**
+ * 角度转弧度
+ * @param angle 角度
+ */
+ rad(angle: number): number;
+
+ /**
+ * 弧度转角度
+ * @param radian 弧度
+ */
+ deg(radian: number): number;
+
+ /**
+ * 数值平滑渐变
+ * @param num1
+ * @param num2
+ * @param elapsedTime
+ * @param responseTime
+ */
+ smooth(num1: number, num2: number, elapsedTime: number, responseTime: number): number;
+}
+
+Math.clampf = function (value: number, min: number, max: number): number {
+ return Math.min(Math.max(value, min), max);
+};
+
+Math.rand = function (min: number, max: number): number {
+ return Math.floor(Math.random() * (max - min + 1) + min);
+};
+
+Math.randRange = function (min: number, max: number): number {
+ return Math.random() * (max - min) + min;
+};
+
+Math.rad = function (angle: number): number {
+ return (angle * Math.PI) / 180;
+};
+
+Math.deg = function (radian: number): number {
+ return (radian * 180) / Math.PI;
+};
+
+Math.smooth = function (num1: number, num2: number, elapsedTime: number, responseTime: number): number {
+ let out: number = num1;
+ if (elapsedTime > 0) {
+ out = out + (num2 - num1) * (elapsedTime / (elapsedTime + responseTime));
+ }
+ return out;
+};
+
diff --git a/demo/assets/script/Math.ts.meta b/demo/assets/script/Math.ts.meta
new file mode 100644
index 0000000..454a584
--- /dev/null
+++ b/demo/assets/script/Math.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "a336ce23-5d73-4280-b2e9-084389a3877e",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/Net.meta b/demo/assets/script/Net.meta
new file mode 100644
index 0000000..670a0b4
--- /dev/null
+++ b/demo/assets/script/Net.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "fcf6e6db-b041-4ade-a17c-c2ac3d72aed0",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/Net/NetHelper.ts b/demo/assets/script/Net/NetHelper.ts
new file mode 100644
index 0000000..1c2bf43
--- /dev/null
+++ b/demo/assets/script/Net/NetHelper.ts
@@ -0,0 +1,43 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2024-05-20
+ * @Description:
+ */
+import { HttpManager, IHttpEvent } from "kunpocc-net";
+import { kunpo } from "../header";
+import { ServerConfig } from "./header";
+
+
+export class NetHelper {
+ public static get url(): string { return ServerConfig.url };
+ public static get appid(): string { return ServerConfig.appid };
+ public static get secret(): string { return ServerConfig.secret };
+
+ public static send(url: string, data: any, netEvent: IHttpEvent) {
+ netEvent.data = new Date().getTime();
+ let sendData = JSON.stringify(data);
+ console.log(`http request\n name:${netEvent.name}\n url=${this.url + url}\n data=${sendData}`);
+ HttpManager.post(this.url + url, sendData, "json", netEvent, this.formatHeaders(netEvent.data, data), 5);
+ }
+
+ private static formatHeaders(time: number, data: any): any[] {
+ return ["content-type", "application/json", "sign", this.signCalculateJSON(time, data), "time", encodeURIComponent(String(time)), "authorization", ""];
+ }
+
+ /** 计算签名 */
+ public static signCalculateJSON(time: number, data: any): string {
+ let signData = {
+ appid: this.appid,
+ signkey: this.secret,
+ time: time,
+ body: JSON.stringify(data)
+ }
+ let keys = Object.keys(signData);
+ keys.sort();
+ let signStr = [];
+ for (let key of keys) {
+ signStr.push(`${key}=${signData[key]}&`);
+ }
+ return encodeURIComponent(kunpo.md5(signStr.join("")));
+ }
+}
\ No newline at end of file
diff --git a/demo/assets/script/Net/NetHelper.ts.meta b/demo/assets/script/Net/NetHelper.ts.meta
new file mode 100644
index 0000000..bcae994
--- /dev/null
+++ b/demo/assets/script/Net/NetHelper.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "e9a1a84a-bf3a-4b94-aeea-9160d84713f8",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/Net/NetTaskBase.ts b/demo/assets/script/Net/NetTaskBase.ts
new file mode 100644
index 0000000..62bea5a
--- /dev/null
+++ b/demo/assets/script/Net/NetTaskBase.ts
@@ -0,0 +1,65 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2024-05-20
+ * @Description: 网络基类
+ */
+
+import { HttpTask, IHttpResponse } from "kunpocc-net";
+import { INetResponse } from "./header";
+
+export abstract class NetTaskBase extends HttpTask {
+ protected url: string = '';
+ private _succeed: (data: any) => void;
+ private _httpError: (data: any) => void;
+ private _taskError: (data: any) => void;
+
+ /**
+ * 设置回调
+ * @param {object} res 回调函数
+ * @param {function} res.succeed 任务成功回调
+ * @param {function} res.taskError 任务错误回调 (一般是服务端返回错误码)
+ * @param {function} res.httpError http错误回调 (一般是网络错误)
+ */
+ public setTaskCallback(res: { succeed: (response: any) => void, taskError?: (response: any) => void, httpError?: (response: any) => void }) {
+ this._succeed = res?.succeed;
+ this._httpError = res?.httpError;
+ this._taskError = res?.taskError;
+ }
+
+ public onComplete(response: IHttpResponse): void {
+ try {
+ let data = response.data as INetResponse;
+ if (data.responseStatus == 0) {
+ console.log(`http response\n name:${this.name}\n url=${this.url}\n data=${JSON.stringify(data)}`);
+ this.onTaskComplete(data);
+ this._succeed?.(data);
+ } else {
+ throw new Error("任务错误");
+ }
+ } catch (error) {
+ let data = response.data as INetResponse;
+ console.log(`http response task error\n name:${this.name}\n url:${this.url}\n responseStatus:${data.responseStatus}\n data:${JSON.stringify(data)}`);
+ this.onTaskError(data.responseStatus, response.data);
+ this._taskError?.(response.data);
+ }
+ }
+
+ public onError(response: IHttpResponse): void {
+ let message = response.message;
+ let statusCode = response.statusCode;
+ console.log(`http response error\n name:${this.name}\n url:${this.url}\n message:${message}\n statusCode:${statusCode}`);
+ this.onHttpError(message);
+ this._httpError?.(response.data);
+ }
+
+ /** 任务完成 子类必须实现 */
+ protected abstract onTaskComplete(data: any): void;
+ /** 任务错误 子类实现 */
+ protected onTaskError(errcode: number, data: any): void {
+
+ };
+ /** http错误 子类实现 */
+ protected onHttpError(message: string): void {
+
+ };
+}
\ No newline at end of file
diff --git a/demo/assets/script/Net/NetTaskBase.ts.meta b/demo/assets/script/Net/NetTaskBase.ts.meta
new file mode 100644
index 0000000..1138094
--- /dev/null
+++ b/demo/assets/script/Net/NetTaskBase.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "8c6e5935-bded-41fb-9df8-21dd76f82186",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/Net/header.ts b/demo/assets/script/Net/header.ts
new file mode 100644
index 0000000..d9b8d36
--- /dev/null
+++ b/demo/assets/script/Net/header.ts
@@ -0,0 +1,28 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2024-12-28
+ * @Description:
+ */
+
+export interface INetResponse {
+ responseStatus: number;
+ packet: any;
+}
+
+export interface IServerInfo {
+ /** 名称 */
+ name: string,
+ /** http地址 */
+ url: string,
+ /** 应用id */
+ appid: string,
+ /** 密钥 */
+ secret: string,
+}
+
+export const ServerConfig: IServerInfo = {
+ name: "dev-gblnn",
+ url: "",
+ appid: "",
+ secret: "",
+}
\ No newline at end of file
diff --git a/demo/assets/script/Net/header.ts.meta b/demo/assets/script/Net/header.ts.meta
new file mode 100644
index 0000000..1f3587e
--- /dev/null
+++ b/demo/assets/script/Net/header.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "cad69694-c4c3-4d7d-b490-26e5ebd1141e",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/Net/task.meta b/demo/assets/script/Net/task.meta
new file mode 100644
index 0000000..9a0a328
--- /dev/null
+++ b/demo/assets/script/Net/task.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "35d378d9-a2a5-407b-afec-9c7e55e408cf",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/Net/task/NetAuth.ts b/demo/assets/script/Net/task/NetAuth.ts
new file mode 100644
index 0000000..1b253c7
--- /dev/null
+++ b/demo/assets/script/Net/task/NetAuth.ts
@@ -0,0 +1,44 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2024-05-20
+ * @Description: 新版鉴权接口
+ */
+import { kunpo } from "../../header";
+import { INetResponse } from "../header";
+import { NetHelper } from "../NetHelper";
+import { NetTaskBase } from "../NetTaskBase";
+
+interface IAuthResponse extends INetResponse {
+ token: string;
+ uid: number; // 用户id
+ sdkId: string;
+ channel: number;
+ /** 注册渠道 */
+ regChannel: number;
+}
+
+/** 账户认证 */
+export class NetAuth extends NetTaskBase {
+ name: string = "NetSocketAuth";
+ url: string = '/api/game/auth';
+ constructor() {
+ super()
+ }
+
+ public start(): void {
+ let data = {
+ channel: 25,
+ token: kunpo.Platform.deviceId,
+ openid: kunpo.Platform.deviceId,
+ sdkChannel: 25,
+ distinctId: ''
+ }
+ NetHelper.send(this.url, data, this);
+ }
+
+ protected onTaskComplete(data: IAuthResponse): void {
+
+ }
+}
+
+
diff --git a/demo/assets/script/Net/task/NetAuth.ts.meta b/demo/assets/script/Net/task/NetAuth.ts.meta
new file mode 100644
index 0000000..2f7247e
--- /dev/null
+++ b/demo/assets/script/Net/task/NetAuth.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "10bbcb28-912a-4ba5-9bfd-a21668ee8763",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/Socket.meta b/demo/assets/script/Socket.meta
new file mode 100644
index 0000000..d643890
--- /dev/null
+++ b/demo/assets/script/Socket.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "4d07e39e-8369-4331-890e-80d2472a6b52",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/Socket/ProtoInfos.ts b/demo/assets/script/Socket/ProtoInfos.ts
new file mode 100644
index 0000000..62263b2
--- /dev/null
+++ b/demo/assets/script/Socket/ProtoInfos.ts
@@ -0,0 +1,26 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2024-08-06
+ * @Description:
+ */
+
+import { protocol } from "../header";
+import { com } from "./proto/proto";
+
+export interface ProtocolFormat {
+ request: number;
+ response: number;
+ desc: string;
+}
+
+export class ProtoInfos {
+ public encodeData(protoCode: number, data: string): ArrayBuffer {
+ return protocol.CommonMessage.encode({ cmdCode: 0, protocolId: protoCode, responseStatus: 1, msgId: 1, msg: data }).finish();
+ }
+
+ /** 前四个字节是长度信息 */
+ public decodeData(buffer: Uint8Array | ArrayBufferLike): com.kunpo.proto.CommonMessage {
+ let response_buffer = new Uint8Array(buffer);
+ return protocol.CommonMessage.decode(response_buffer);
+ }
+}
\ No newline at end of file
diff --git a/demo/assets/script/Socket/ProtoInfos.ts.meta b/demo/assets/script/Socket/ProtoInfos.ts.meta
new file mode 100644
index 0000000..25378ca
--- /dev/null
+++ b/demo/assets/script/Socket/ProtoInfos.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "d686884b-fad9-4a58-8781-5bac09b47041",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/Socket/proto.meta b/demo/assets/script/Socket/proto.meta
new file mode 100644
index 0000000..edaa6a8
--- /dev/null
+++ b/demo/assets/script/Socket/proto.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "6961d096-69d0-4c14-9fd7-fa98afc5357e",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/Socket/proto/proto.d.ts b/demo/assets/script/Socket/proto/proto.d.ts
new file mode 100644
index 0000000..954ac59
--- /dev/null
+++ b/demo/assets/script/Socket/proto/proto.d.ts
@@ -0,0 +1,53 @@
+import * as $protobuf from "protobufjs";
+import Long = require("long");
+export namespace com {
+
+ namespace kunpo {
+
+ namespace proto {
+
+ interface ICommonMessage {
+ cmdCode?: (number|null);
+ protocolId?: (number|null);
+ data?: (Uint8Array|null);
+ responseStatus?: (number|null);
+ msg?: (string|null);
+ msgId?: (number|null);
+ }
+
+ class CommonMessage implements ICommonMessage {
+ constructor(p?: com.kunpo.proto.ICommonMessage);
+ public cmdCode: number;
+ public protocolId: number;
+ public data: Uint8Array;
+ public responseStatus: number;
+ public msg: string;
+ public msgId: number;
+ public static encode(m: com.kunpo.proto.ICommonMessage, w?: $protobuf.Writer): $protobuf.Writer;
+ public static decode(r: ($protobuf.Reader|Uint8Array), l?: number): com.kunpo.proto.CommonMessage;
+ }
+
+ namespace test {
+
+ interface IUserInfo {
+ userId?: (number|null);
+ userName?: (string|null);
+ nickName?: (string|null);
+ level?: (number|null);
+ createTime?: (number|null);
+ }
+
+ class UserInfo implements IUserInfo {
+ constructor(p?: com.kunpo.proto.test.IUserInfo);
+ public userId: number;
+ public userName: string;
+ public nickName: string;
+ public level: number;
+ public createTime: number;
+ public static encode(m: com.kunpo.proto.test.IUserInfo, w?: $protobuf.Writer): $protobuf.Writer;
+ public static decode(r: ($protobuf.Reader|Uint8Array), l?: number): com.kunpo.proto.test.UserInfo;
+ }
+ }
+ }
+ }
+}
diff --git a/demo/assets/script/Socket/proto/proto.d.ts.meta b/demo/assets/script/Socket/proto/proto.d.ts.meta
new file mode 100644
index 0000000..22df5cb
--- /dev/null
+++ b/demo/assets/script/Socket/proto/proto.d.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "1508669b-41ae-40e9-b24e-c4af0f01120d",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/Socket/proto/proto.js b/demo/assets/script/Socket/proto/proto.js
new file mode 100644
index 0000000..24e5fd5
--- /dev/null
+++ b/demo/assets/script/Socket/proto/proto.js
@@ -0,0 +1 @@
+"use strict";var $protobuf=protobuf;var $Reader=$protobuf.Reader,$Writer=$protobuf.Writer,$util=$protobuf.util;var $root=$protobuf.roots["default"]||($protobuf.roots["default"]={});$root.com=function(){var com={};com.kunpo=function(){var kunpo={};kunpo.proto=function(){var proto={};proto.CommonMessage=function(){function CommonMessage(p){if(p)for(var ks=Object.keys(p),i=0;i>>3){case 1:{m.cmdCode=r.int32();break}case 2:{m.protocolId=r.int32();break}case 3:{m.data=r.bytes();break}case 4:{m.responseStatus=r.sint32();break}case 5:{m.msg=r.string();break}case 6:{m.msgId=r.int32();break}default:r.skipType(t&7);break}}return m};return CommonMessage}();proto.test=function(){var test={};test.UserInfo=function(){function UserInfo(p){if(p)for(var ks=Object.keys(p),i=0;i>>3){case 1:{m.userId=r.int32();break}case 2:{m.userName=r.string();break}case 3:{m.nickName=r.string();break}case 4:{m.level=r.int32();break}case 5:{m.createTime=r.int64();break}default:r.skipType(t&7);break}}return m};return UserInfo}();return test}();return proto}();return kunpo}();return com}();module.exports=$root;
\ No newline at end of file
diff --git a/demo/assets/script/Socket/proto/proto.js.meta b/demo/assets/script/Socket/proto/proto.js.meta
new file mode 100644
index 0000000..c411f0c
--- /dev/null
+++ b/demo/assets/script/Socket/proto/proto.js.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "javascript",
+ "imported": true,
+ "uuid": "e777207e-c569-4375-838f-aeb51ff06a30",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI.meta b/demo/assets/script/UI.meta
new file mode 100644
index 0000000..cb97f4b
--- /dev/null
+++ b/demo/assets/script/UI.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "ce0bb648-7b41-4640-be24-62109ab2ad59",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Basics.meta b/demo/assets/script/UI/Basics.meta
new file mode 100644
index 0000000..1a3636f
--- /dev/null
+++ b/demo/assets/script/UI/Basics.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "eae449a2-8b5c-42ff-8917-888937877f85",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Basics/Common.meta b/demo/assets/script/UI/Basics/Common.meta
new file mode 100644
index 0000000..d6115e9
--- /dev/null
+++ b/demo/assets/script/UI/Basics/Common.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "e7f088c6-38b1-4278-8ba4-4f7de40afb3d",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Basics/Common/AlertWindow.ts b/demo/assets/script/UI/Basics/Common/AlertWindow.ts
new file mode 100644
index 0000000..c2e1a3a
--- /dev/null
+++ b/demo/assets/script/UI/Basics/Common/AlertWindow.ts
@@ -0,0 +1,126 @@
+import { cc, fgui, kunpo } from '../../../header';
+const { uiclass, uiprop, uiclick } = kunpo._uidecorator;
+
+interface WindowData {
+ content: string;
+ title?: string;
+ okTitle?: string;
+ cancelTitle?: string;
+ showClose?: boolean; // 显示关闭按钮
+ emptyAreaClose?: boolean; // 点击空白区域关闭
+ align?: cc.HorizontalTextAlignment; // 内容文本水平对齐方式 default:居中对齐
+ leading?: number;//行距
+ okNotClose?: boolean; // 点击OK按钮时不关闭本界面
+ cancelNotClose?: boolean; // 点击取消按钮时不关闭本界面
+ complete?: () => void; // 确定按钮的回调
+ cancel?: () => void; // 取消按钮的回调
+ close?: () => void; // 关闭界面的回调 (只有点击关闭按钮和空白位置关闭时才会触发)
+}
+
+
+@uiclass("Window", "Basics", "AlertWindow")
+export class AlertWindow extends kunpo.Window {
+ @uiprop private bg: fgui.GLoader;
+ @uiprop private lab_title: fgui.GTextField;
+ @uiprop private lab_content: fgui.GTextField;
+ @uiprop private btn_close: fgui.GButton;
+ @uiprop private btn_ok: fgui.GButton;
+ @uiprop private btn_cancel: fgui.GButton;
+
+ private _isEmptyAreaClose: boolean = false;
+ private _window_data: WindowData = null;
+
+ private _complete: () => void;
+ private _cancel: () => void;
+ private _closeFunc: () => void;
+
+ protected onInit(): void {
+ this.adapterType = kunpo.AdapterType.Full;
+ this.type = kunpo.WindowType.Normal;
+ }
+
+ protected onAdapted() {
+ }
+
+ protected onShow(data: WindowData): void {
+ this._complete = data.complete;
+ this._cancel = data.cancel;
+ this._closeFunc = data.close;
+ this._window_data = data;
+
+ // 标题
+ if (data.title) {
+ this.lab_title.text = data.title;
+ } else {
+ this.lab_title.visible = false;
+ }
+
+ // 关闭按钮
+ this.btn_close.visible = !!data.showClose;
+
+ // 空白位置关闭标记
+ this._isEmptyAreaClose = !!data.emptyAreaClose;
+
+ // 确定按钮
+ if (data.okTitle) {
+ this.btn_ok.title = data.okTitle;
+ } else {
+ this.btn_ok.visible = false;
+ }
+
+ // 取消按钮
+ if (data.cancelTitle) {
+ this.btn_cancel.text = data.cancelTitle;
+ } else {
+ this.btn_cancel.visible = false;
+ }
+
+ this.lab_content.text = data.content;
+ let align = typeof data.align == "number" ? data.align : cc.Label.HorizontalAlign.CENTER;
+ let leading = typeof data.leading == "number" ? data.leading : this.lab_content.leading;
+ this.lab_content.align = align;
+ this.lab_content.leading = leading;
+ this.lab_content.ensureSizeCorrect();
+
+ // 限制背景框高度
+ if (this.bg.height < 500) {
+ this.bg.height = 500;
+ }
+
+ // 确定取消按钮位置调整
+ if (this.btn_ok.visible && !this.btn_cancel.visible) {
+ this.btn_ok.x = this.bg.x + (this.bg.width - this.btn_ok.width) * 0.5;
+ } else if (this.btn_cancel.visible && !this.btn_ok.visible) {
+ this.btn_cancel.x = this.bg.x + (this.bg.width - this.btn_cancel.width) * 0.5;
+ }
+ }
+
+ protected onClose(): void {
+
+ }
+
+ protected onEmptyAreaClick(): void {
+ if (this._isEmptyAreaClose) {
+ kunpo.WindowManager.closeWindow(this.name);
+ this._closeFunc && this._closeFunc();
+ }
+ }
+
+ @uiclick
+ private onClickBtnClose(): void {
+ kunpo.WindowManager.closeWindow(this.name);
+ this._closeFunc && this._closeFunc();
+ }
+
+ @uiclick
+ private onClickBtnOk(): void {
+ !this._window_data.okNotClose && kunpo.WindowManager.closeWindow(this.name);
+ this._complete && this._complete();
+ }
+
+ @uiclick
+ private onClickBtnCancel(): void {
+ !this._window_data.cancelNotClose && kunpo.WindowManager.closeWindow(this.name);
+ this._cancel && this._cancel();
+ }
+}
\ No newline at end of file
diff --git a/demo/assets/script/UI/Basics/Common/AlertWindow.ts.meta b/demo/assets/script/UI/Basics/Common/AlertWindow.ts.meta
new file mode 100644
index 0000000..5540120
--- /dev/null
+++ b/demo/assets/script/UI/Basics/Common/AlertWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "434791ba-2680-4643-aea0-ecf8bebc2ff9",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Basics/Common/LoadUIWindow.ts b/demo/assets/script/UI/Basics/Common/LoadUIWindow.ts
new file mode 100644
index 0000000..627ea6b
--- /dev/null
+++ b/demo/assets/script/UI/Basics/Common/LoadUIWindow.ts
@@ -0,0 +1,13 @@
+
+
+import { kunpo } from '../../../header';
+const { uiclass, uiprop } = kunpo._uidecorator;
+
+/** UI界面资源加载等待界面 */
+@uiclass("Wait", "Basics", "LoadUIWindow")
+export class LoadUIWindow extends kunpo.Window {
+ protected onInit(): void {
+ this.adapterType = kunpo.AdapterType.Full;
+ this.type = kunpo.WindowType.Normal;
+ }
+}
\ No newline at end of file
diff --git a/demo/assets/script/UI/Basics/Common/LoadUIWindow.ts.meta b/demo/assets/script/UI/Basics/Common/LoadUIWindow.ts.meta
new file mode 100644
index 0000000..e2ffd43
--- /dev/null
+++ b/demo/assets/script/UI/Basics/Common/LoadUIWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "0b7e1ba3-9877-45ea-9d1b-71115f04744b",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Basics/Common/ToastWindow.ts b/demo/assets/script/UI/Basics/Common/ToastWindow.ts
new file mode 100644
index 0000000..858e4e9
--- /dev/null
+++ b/demo/assets/script/UI/Basics/Common/ToastWindow.ts
@@ -0,0 +1,86 @@
+/*
+ * @Description: 通用Toast提示
+ * @Author: Gongxh
+ * @Date: 2021-04-27 09:20:14
+ */
+
+import { cc, fgui, kunpo } from "../../../header";
+interface ToastData {
+ text: string, // 文本
+ duration?: number, // 持续时间
+ swallowTouch?: boolean, // 吞噬touch事件
+ showMask?: boolean, // 显示遮罩
+ align?: cc.HorizontalTextAlignment // 对齐方式
+}
+
+const { uiclass, uiprop } = kunpo._uidecorator;
+@uiclass("Toast", "Basics", "ToastWindow")
+export class ToastWindow extends kunpo.Window {
+ @uiprop private toast: fgui.GComponent;
+ @uiprop private labTips: fgui.GTextField;
+ @uiprop private bgMask: fgui.GGraph;
+
+ private _showTransition: fgui.Transition;
+ private _hideTransition: fgui.Transition;
+
+ private _swallowTouch: boolean = false; // 吞噬touch事件
+ protected onInit(): void {
+ this.adapterType = kunpo.AdapterType.Full;
+ this.type = kunpo.WindowType.Normal;
+ this.bgAlpha = 0;
+
+ this._showTransition = this.toast.getTransition("show");
+ this._hideTransition = this.toast.getTransition("hide");
+ }
+
+ /**
+ * 参数说明
+ * @param {string} data.text toast文本
+ * @param {number} data.duration 存在时间( < 0)为常驻 default 2秒
+ * @param {boolean} data.swallowTouch 吞噬touch事件 default 不吞噬
+ * @param {boolean} data.showMask 是否显示半透明遮罩 (当显示遮罩时,必定吞噬touch事件) default 不显示
+ * @param {cc.HorizontalTextAlignment} data.align 横向文本对齐方式 default 居中对齐
+ */
+ protected onShow(data: ToastData): void {
+ this.bgMask.visible = data.showMask;
+ this._swallowTouch = data.showMask ? true : (data.swallowTouch || false);
+ this.opaque = this._swallowTouch;
+ // if (this._swallowTouch) {
+ // this.node.on(cc.Node.EventType.TOUCH_END, () => { }, this.node);
+ // } else {
+ // this.node.targetOff(this.node);
+ // }
+
+ this.labTips.text = data.text;
+
+ let align = data.align || cc.HorizontalTextAlignment.CENTER;
+ this.labTips.align = align;
+ this.labTips.autoSize = fgui.AutoSizeType.Both;
+ this.labTips.ensureSizeCorrect();
+ // 调整文本尺寸
+ let maxWidht = 504;
+ if (this.labTips.width > maxWidht) {
+ this.labTips.autoSize = fgui.AutoSizeType.Height;
+ this.labTips.width = maxWidht;
+ this.labTips.ensureSizeCorrect();
+ } else {
+ this.labTips.autoSize = fgui.AutoSizeType.Both;
+ }
+
+
+ this._showTransition.stop(true);
+ this._hideTransition.stop(true);
+ this._showTransition.play(() => {
+ let duration = data.duration || 2.0
+ if (duration > 0) {
+ this._hideTransition.play(() => {
+ kunpo.WindowManager.closeWindow(this.name);
+ }, 1, duration);
+ }
+ }, 1, 0);
+ }
+
+ protected onClose(): void {
+
+ }
+}
\ No newline at end of file
diff --git a/demo/assets/script/UI/Basics/Common/ToastWindow.ts.meta b/demo/assets/script/UI/Basics/Common/ToastWindow.ts.meta
new file mode 100644
index 0000000..07698c6
--- /dev/null
+++ b/demo/assets/script/UI/Basics/Common/ToastWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "993ce544-0214-4132-ba2c-2d464aa39257",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Basics/Header.meta b/demo/assets/script/UI/Basics/Header.meta
new file mode 100644
index 0000000..d461432
--- /dev/null
+++ b/demo/assets/script/UI/Basics/Header.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "d53b1983-3f1e-4e89-8114-88dfcc95075f",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Basics/Header/WindowHeader.ts b/demo/assets/script/UI/Basics/Header/WindowHeader.ts
new file mode 100644
index 0000000..fe8d16e
--- /dev/null
+++ b/demo/assets/script/UI/Basics/Header/WindowHeader.ts
@@ -0,0 +1,31 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-01-12
+ * @Description:
+ */
+import { fgui, kunpo } from '../../../header';
+const { uiheader, uiprop, uiclick } = kunpo._uidecorator;
+
+@uiheader("Basics", "WindowHeader")
+export class WindowHeader extends kunpo.WindowHeader {
+ @uiprop btn_close: fgui.GButton;
+ protected onInit(): void {
+ this.adapterType = kunpo.AdapterType.Bang;
+
+ this.btn_close.onClick(() => {
+ kunpo.log("WindowHeader btn_close");
+ }, this);
+ }
+
+ protected onShow(window: kunpo.Window, userdata?: any): void {
+ kunpo.log("WindowHeader onShow:");
+ }
+
+ protected onHide(): void {
+ kunpo.log("WindowHeader onHide");
+ }
+
+ protected onClose(): void {
+ kunpo.log("WindowHeader onClose");
+ }
+}
diff --git a/demo/assets/script/UI/Basics/Header/WindowHeader.ts.meta b/demo/assets/script/UI/Basics/Header/WindowHeader.ts.meta
new file mode 100644
index 0000000..f59289b
--- /dev/null
+++ b/demo/assets/script/UI/Basics/Header/WindowHeader.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "bcb15a03-27d3-46b7-9f6b-53040cd6bbcb",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Basics/Header/WindowHeader2.ts b/demo/assets/script/UI/Basics/Header/WindowHeader2.ts
new file mode 100644
index 0000000..2957abc
--- /dev/null
+++ b/demo/assets/script/UI/Basics/Header/WindowHeader2.ts
@@ -0,0 +1,32 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-01-12
+ * @Description:
+ */
+
+import { fgui, kunpo } from '../../../header';
+const { uiheader, uiprop, uiclick } = kunpo._uidecorator;
+
+@uiheader("Basics", "WindowHeader2")
+export class WindowHeader2 extends kunpo.WindowHeader {
+ @uiprop btn_close: fgui.GButton;
+ protected onInit(): void {
+ this.adapterType = kunpo.AdapterType.Bang;
+
+ this.btn_close.onClick(() => {
+ kunpo.log("WindowHeader btn_close");
+ }, this);
+ }
+
+ protected onShow(window: kunpo.Window, userdata?: any): void {
+ kunpo.log("WindowHeader onShow:");
+ }
+
+ protected onHide(): void {
+ kunpo.log("WindowHeader onHide");
+ }
+
+ protected onClose(): void {
+ kunpo.log("WindowHeader onClose");
+ }
+}
diff --git a/demo/assets/script/UI/Basics/Header/WindowHeader2.ts.meta b/demo/assets/script/UI/Basics/Header/WindowHeader2.ts.meta
new file mode 100644
index 0000000..2d2d36b
--- /dev/null
+++ b/demo/assets/script/UI/Basics/Header/WindowHeader2.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "2a956cae-8688-40b9-89d3-86407a1f3631",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/CloseAllWindow.ts.meta b/demo/assets/script/UI/CloseAllWindow.ts.meta
new file mode 100644
index 0000000..2dcdbab
--- /dev/null
+++ b/demo/assets/script/UI/CloseAllWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.23",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "c59e1239-0afc-4df7-b1e9-b7b968b48709",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/CloseOneWindow.ts.meta b/demo/assets/script/UI/CloseOneWindow.ts.meta
new file mode 100644
index 0000000..4b2495e
--- /dev/null
+++ b/demo/assets/script/UI/CloseOneWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.23",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "ecbe9481-c878-4ffd-863c-d9db4641ef2a",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Components.meta b/demo/assets/script/UI/Components.meta
new file mode 100644
index 0000000..b76c99e
--- /dev/null
+++ b/demo/assets/script/UI/Components.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "3896f27e-b6e5-4757-a872-8a1b925a24f3",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Condition.meta b/demo/assets/script/UI/Condition.meta
new file mode 100644
index 0000000..1e80ca6
--- /dev/null
+++ b/demo/assets/script/UI/Condition.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "aa136c25-aeef-4b18-9051-246cf5cd1176",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Condition/ConditionWindow.ts b/demo/assets/script/UI/Condition/ConditionWindow.ts
new file mode 100644
index 0000000..c3c01fe
--- /dev/null
+++ b/demo/assets/script/UI/Condition/ConditionWindow.ts
@@ -0,0 +1,82 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-02-17
+ * @Description:
+ */
+
+import { ConditionType } from "../../condition/ConditionType";
+import { DataHelper } from "../../Data/DataHelper";
+import { fgui, kunpo } from "../../header";
+const { uiclass, uiprop, uiclick } = kunpo._uidecorator;
+
+@uiclass("Window", "Condition", "ConditionWindow")
+export class ConditionWindow extends kunpo.Window {
+ @uiprop reddot1: fgui.GComponent;
+ @uiprop reddot2: fgui.GComponent;
+
+ @uiprop btn_condition1: fgui.GButton;
+ @uiprop btn_condition2: fgui.GButton;
+ @uiprop btn_condition3: fgui.GButton;
+ @uiprop btn_condition4: fgui.GButton;
+
+ protected onInit(): void {
+ this.adapterType = kunpo.AdapterType.Bang;
+ this.type = kunpo.WindowType.HideOne;
+
+ /** 初始化注册的所有条件 (临时写到这里,应该放到项目数据初始化之后 调用这个方法) */
+ kunpo.ConditionManager.initCondition();
+
+ this.btn_condition1.title = `条件1: ${DataHelper.getValue("condition1", true)}`;
+ this.btn_condition2.title = `条件2: ${DataHelper.getValue("condition2", true)}`;
+ this.btn_condition3.title = `条件3: ${DataHelper.getValue("condition3", true)}`;
+ this.btn_condition4.title = `条件4: ${DataHelper.getValue("condition4", true)}`;
+
+ /** 任意一个满足 显示节点 */
+ new kunpo.ConditionAnyNode(this.reddot1, ConditionType.Condition1, ConditionType.Condition2, ConditionType.Condition3, ConditionType.Condition4);
+
+ /** 所有条件都满足 显示节点 */
+ new kunpo.ConditionAllNode(this.reddot2, ConditionType.Condition1, ConditionType.Condition2, ConditionType.Condition3, ConditionType.Condition4);
+ }
+
+ protected onShow(userdata?: any): void {
+
+ }
+
+ protected onClose(): void {
+
+ }
+
+ @uiclick
+ private onClickBtnClose(): void {
+ kunpo.WindowManager.closeWindow(this.name);
+ }
+
+ @uiclick
+ private onClickBtnCondition1(): void {
+ const value = DataHelper.getValue("condition1", true);
+ DataHelper.setValue("condition1", !value);
+
+ this.btn_condition1.title = `条件1: ${!value}`;
+ }
+
+ @uiclick
+ private onClickBtnCondition2(): void {
+ const value = DataHelper.getValue("condition2", true);
+ DataHelper.setValue("condition2", !value);
+ this.btn_condition2.title = `条件2: ${!value}`;
+ }
+
+ @uiclick
+ private onClickBtnCondition3(): void {
+ const value = DataHelper.getValue("condition3", true);
+ DataHelper.setValue("condition3", !value);
+ this.btn_condition3.title = `条件3: ${!value}`;
+ }
+
+ @uiclick
+ private onClickBtnCondition4(): void {
+ const value = DataHelper.getValue("condition4", true);
+ DataHelper.setValue("condition4", !value);
+ this.btn_condition4.title = `条件4: ${!value}`;
+ }
+}
diff --git a/demo/assets/script/UI/Condition/ConditionWindow.ts.meta b/demo/assets/script/UI/Condition/ConditionWindow.ts.meta
new file mode 100644
index 0000000..0d0f056
--- /dev/null
+++ b/demo/assets/script/UI/Condition/ConditionWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "addf31f0-70a4-4238-8b2f-c9971873eaa9",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/ConditionWindow.ts.meta b/demo/assets/script/UI/ConditionWindow.ts.meta
new file mode 100644
index 0000000..e7d149b
--- /dev/null
+++ b/demo/assets/script/UI/ConditionWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.23",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "d73deef4-cfcf-4381-8ff4-afee0930c850",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Game.meta b/demo/assets/script/UI/Game.meta
new file mode 100644
index 0000000..7090a13
--- /dev/null
+++ b/demo/assets/script/UI/Game.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "d0871aff-1fb9-4f5b-96d6-dc008b804d82",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/HideAllWindow.ts.meta b/demo/assets/script/UI/HideAllWindow.ts.meta
new file mode 100644
index 0000000..30d3968
--- /dev/null
+++ b/demo/assets/script/UI/HideAllWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.23",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "1a445c8e-e43f-46b8-8483-c721a76d716e",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/HideOneWindow.ts.meta b/demo/assets/script/UI/HideOneWindow.ts.meta
new file mode 100644
index 0000000..8504144
--- /dev/null
+++ b/demo/assets/script/UI/HideOneWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.23",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "34d16557-9a49-4995-8331-123fe8e47e79",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/HomeWindow.ts b/demo/assets/script/UI/HomeWindow.ts
new file mode 100644
index 0000000..3428abd
--- /dev/null
+++ b/demo/assets/script/UI/HomeWindow.ts
@@ -0,0 +1,103 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2024-12-11
+ * @Description:
+ */
+
+import { AssetPool } from "kunpocc-assets";
+import { cc, fgui, kunpo, KunpoAssets } from "../header";
+const { uiclass, uiprop, uiclick, uicontrol, uitransition } = kunpo._uidecorator;
+
+@uiclass("Window", "Home", "HomeWindow")
+export class HomeWindow extends kunpo.Window {
+ @uicontrol private status: fgui.Controller;
+ @uicontrol private sta2: fgui.Controller;
+
+ @uitransition private t0: fgui.Transition;
+ @uitransition private t1: fgui.Transition;
+
+ protected onInit(): void {
+ this.adapterType = kunpo.AdapterType.Bang;
+ this.type = kunpo.WindowType.CloseAll;
+ }
+
+ protected onShow(userdata?: any): void {
+ kunpo.log("HomeWindow onShow:", userdata);
+ }
+
+ @uiclick
+ private onClickUI(): void {
+ kunpo.WindowManager.showWindow("UIBaseWindow");
+ }
+
+ @uiclick
+ private onSocketWindow(): void {
+ kunpo.WindowManager.showWindow("SocketTestWindow");
+ }
+
+ @uiclick
+ private onClickBtnCondition(): void {
+ kunpo.WindowManager.showWindow("ConditionWindow");
+ }
+
+
+ @uiclick
+ private onClickMiniGame(): void {
+ if (kunpo.Platform.isWX || kunpo.Platform.isAlipay || kunpo.Platform.isBytedance) {
+ kunpo.WindowManager.showWindow("MiniGameWindow");
+ } else {
+ kunpo.WindowManager.showWindowIm("ToastWindow", { text: "当前平台不是 微信/阿里/抖音小游戏" })
+ }
+ }
+
+ @uiclick
+ private onClickBtnHotUpdate(): void {
+ if (kunpo.Platform.isNativeMobile) {
+ kunpo.WindowManager.showWindow("HotUpdateWindow");
+ } else {
+ kunpo.WindowManager.showWindowIm("ToastWindow", { text: "只有原生平台才支持热更新" })
+ }
+ }
+
+ @uiclick
+ private onClickLoadBuffer(): void {
+ let paths: KunpoAssets.IAssetConfig[] = [
+ { path: "config/buffer", type: cc.BufferAsset },
+ ];
+ let loader = new KunpoAssets.AssetLoader("load");
+ loader.start({
+ configs: paths,
+ complete: () => {
+ kunpo.log("加载成功");
+
+ let basic = AssetPool.get("config/buffer/basic");
+ kunpo.log("basic", JSON.stringify(kunpo.Binary.toJson(basic.buffer())));
+
+ let dict = AssetPool.get("config/buffer/dict");
+ kunpo.log("dict", JSON.stringify(kunpo.Binary.toJson(dict.buffer())));
+
+ let listDict = AssetPool.get("config/buffer/list_dict");
+ kunpo.log("list_dict", JSON.stringify(kunpo.Binary.toJson(listDict.buffer())));
+
+ let aaa = {
+ a: 1,
+ b: 2,
+ c: 3,
+ d: 4,
+ e: 5,
+ };
+ kunpo.log("aaa", JSON.stringify(kunpo.Binary.toJson(aaa)));
+ },
+ fail: (msg: string, err: Error) => {
+ kunpo.log("加载失败", msg, err);
+ },
+ progress: (percent: number) => {
+
+ }
+ });
+ }
+
+ public getHeaderInfo(): kunpo.WindowHeaderInfo {
+ return kunpo.WindowHeaderInfo.create("WindowHeader", "aaa");
+ }
+}
diff --git a/demo/assets/script/UI/HomeWindow.ts.meta b/demo/assets/script/UI/HomeWindow.ts.meta
new file mode 100644
index 0000000..a0ed08d
--- /dev/null
+++ b/demo/assets/script/UI/HomeWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "a82b56f3-6cfa-4fd1-a090-44137d7e62d4",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/HotUpdate.meta b/demo/assets/script/UI/HotUpdate.meta
new file mode 100644
index 0000000..f976230
--- /dev/null
+++ b/demo/assets/script/UI/HotUpdate.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "d1a31574-d301-493b-9a96-b3bfcba60ba9",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/HotUpdate/HotUpdateWindow.ts b/demo/assets/script/UI/HotUpdate/HotUpdateWindow.ts
new file mode 100644
index 0000000..08bea46
--- /dev/null
+++ b/demo/assets/script/UI/HotUpdate/HotUpdateWindow.ts
@@ -0,0 +1,139 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-04-18
+ * @Description:
+ */
+
+import { HotUpdateCode, log } from "kunpocc";
+import { fgui, kunpo } from "../../header";
+import { SDKHelper } from "../../Helper/SDKHelper";
+const { uiclass, uiprop, uiclick } = kunpo._uidecorator;
+
+@uiclass("Window", "HotUpdate", "HotUpdateWindow")
+export class HotUpdateWindow extends kunpo.Window {
+ @uiprop lab_version: fgui.GTextField = null;
+ @uiprop lab_desc: fgui.GTextField = null;
+
+ protected onInit(): void {
+ this.adapterType = kunpo.AdapterType.Bang;
+ this.type = kunpo.WindowType.HideAll;
+ }
+
+ protected onShow(userdata?: any): void {
+ let version = KunpoSDK.SDKHelper.getInstance().getVersionCode()
+ kunpo.HotUpdateManager.getInstance().init(SDKHelper.manifestUrl, version);
+ this.lab_version.text = `当前资源版本号:` + kunpo.HotUpdateManager.getInstance().resVersion;
+
+ this.lab_desc.text = "点击检查更新按钮,检查是否有新版本 或者 点击更新按钮,直接更新 hahaha";
+ }
+
+ protected onClose(): void {
+ kunpo.log("CloseAllWindow onClose");
+ }
+
+ private refreshTips(tips: string, touchable: boolean = false): void {
+ this.lab_desc.text = tips;
+ this.touchable = touchable;
+ }
+
+ @uiclick
+ private onClickClose(): void {
+ kunpo.WindowManager.closeWindow(this.name);
+ }
+
+ @uiclick
+ private onCheckUpdate(): void {
+ this.refreshTips("正在检查更新... 请稍后", false);
+
+ kunpo.HotUpdateManager.getInstance().checkUpdate().then((res: kunpo.ICheckUpdatePromiseResult) => {
+ kunpo.log("发现热更新:", JSON.stringify(res));
+ this.refreshTips(`发现热更新 需更新大小:${Math.floor(res.size / 1024 * 1000) * 0.001}MB`, true);
+ kunpo.WindowManager.showWindowIm("AlertWindow", {
+ title: "提示",
+ content: `发现热更新 需更新大小:${Math.floor(res.size / 1024 * 1000) * 0.001}MB`,
+ okTitle: "更新",
+ cancelTitle: "取消",
+ complete: () => {
+ this.startUpdate(true);
+ },
+ cancel: () => {
+ kunpo.log("取消");
+ },
+ });
+ }).catch((res: any) => {
+ log("检查热更新出错了", JSON.stringify(res));
+ if (res.code == HotUpdateCode.LatestVersion) {
+ this.refreshTips(`已经是最新版本了`, true);
+ kunpo.WindowManager.showWindowIm("AlertWindow", {
+ title: "提示",
+ content: `已经是最新版本了`,
+ okTitle: "知道了",
+ });
+ } else {
+ this.refreshTips(`出错了 code:${res.code} message:${res.message}`, true);
+ kunpo.WindowManager.showWindowIm("AlertWindow", {
+ title: "提示",
+ content: `出错了 code:${res.code} message:${res.message}`,
+ okTitle: "知道了",
+ });
+ }
+ });
+ }
+
+ @uiclick
+ private onStartUpdate(): void {
+ this.startUpdate(false);
+ }
+
+ private startUpdate(skipCheck: boolean = false): void {
+ this.refreshTips(`正在更新... 请稍后`, false);
+
+ kunpo.HotUpdateManager.getInstance().startUpdate({
+ skipCheck: skipCheck,
+ progress: (kb: number, total: number) => {
+ kunpo.log("热更新进度", kb, total);
+ this.refreshTips(`正在更新... 请稍后 ${Math.floor(kb / total * 100)}% `, false);
+ },
+ complete: (code: HotUpdateCode, message: string) => {
+ kunpo.log("热更新完成", code, message);
+ if (code == HotUpdateCode.LatestVersion) {
+ this.refreshTips(`已经是最新版了 不需要更新`, true);
+ // 已经是最新版了
+ kunpo.WindowManager.showWindowIm("AlertWindow", {
+ title: "提示",
+ content: `已经是最新版了 不需要更新`,
+ okTitle: "知道了",
+ });
+ } else if (code == HotUpdateCode.UpdateFailed) {
+ this.refreshTips(`更新失败了 code:${code} message:${message}`, true);
+ kunpo.WindowManager.showWindowIm("AlertWindow", {
+ title: "提示",
+ content: `热更新失败了 是否重试失败的资源 message:${message}`,
+ okTitle: "重试",
+ cancelTitle: "取消",
+ complete: () => {
+ kunpo.HotUpdateManager.getInstance().retryUpdate();
+ },
+ cancel: () => {
+ kunpo.log("取消");
+ },
+ });
+ } else if (code == HotUpdateCode.LoadVersionFailed || code == HotUpdateCode.ParseVersionFailed) {
+ this.refreshTips(`更新失败了 code:${code} message:${message}`, true);
+ kunpo.WindowManager.showWindowIm("AlertWindow", {
+ title: "提示",
+ content: `更新失败了 code:${code} message:${message} 可以选择跳过热更新`,
+ okTitle: "知道了",
+ });
+ } else {
+ this.refreshTips(`更新失败了 code:${code} message:${message}`, true);
+ kunpo.WindowManager.showWindowIm("AlertWindow", {
+ title: "提示",
+ content: `热更新失败了, 根据code的值,看是重启游戏,还是跳过更新 message:${message}`,
+ okTitle: "知道了",
+ });
+ }
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/demo/assets/script/UI/HotUpdate/HotUpdateWindow.ts.meta b/demo/assets/script/UI/HotUpdate/HotUpdateWindow.ts.meta
new file mode 100644
index 0000000..456d886
--- /dev/null
+++ b/demo/assets/script/UI/HotUpdate/HotUpdateWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "25c11bf0-c7a2-4b27-8172-22a0fba89114",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/MiniGame.meta b/demo/assets/script/UI/MiniGame.meta
new file mode 100644
index 0000000..454aa55
--- /dev/null
+++ b/demo/assets/script/UI/MiniGame.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "fc664f7f-0b4b-406b-8240-8c6b974b3c38",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/MiniGame/MiniGameWindow.ts b/demo/assets/script/UI/MiniGame/MiniGameWindow.ts
new file mode 100644
index 0000000..58d10c3
--- /dev/null
+++ b/demo/assets/script/UI/MiniGame/MiniGameWindow.ts
@@ -0,0 +1,122 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-04-12
+ * @Description:
+ */
+
+
+import { fgui, kunpo } from "../../header";
+const { uiclass, uiprop, uiclick } = kunpo._uidecorator;
+
+let IsInitAds = false;
+let AdId = "";
+
+let IsInitPay = false;
+
+// private static readonly wechat_ads_id: string = "adunit-c9b71a32c0fb3d3d";
+// private static readonly byte_ads_id: string = "592b3kadh11b27p317";
+// private static readonly aliy_ads_id: string = "ad_tiny_2021004170666283_202410082200196957";
+
+@uiclass("Window", "MiniGame", "MiniGameWindow")
+export class MiniGameWindow extends kunpo.Window {
+ @uiprop btn_close: fgui.GButton;
+ @uiprop lab_adid: fgui.GTextInput;
+ @uiprop lab_payQuantity: fgui.GTextInput;
+
+ protected onInit(): void {
+ this.adapterType = kunpo.AdapterType.Bang;
+ this.type = kunpo.WindowType.HideAll;
+ }
+
+ protected onShow(userdata?: any): void {
+ kunpo.log("MiniGameWindow onShow:", userdata);
+ this.lab_adid.text = "592b3kadh11b27p317";
+
+ if (IsInitAds) {
+ this.lab_adid.text = AdId;
+ this.lab_adid.touchable = false;
+ }
+ }
+
+ protected onClose(): void {
+ kunpo.log("CloseAllWindow onClose");
+ }
+
+ @uiclick
+ private onClickBtnClose(): void {
+ kunpo.WindowManager.closeWindow(this.name);
+ }
+
+ @uiclick
+ private onClickBtnInitAds(): void {
+ if (!IsInitAds) {
+ if (this.lab_adid.text) {
+ kunpo.MiniHelper.ad().init(this.lab_adid.text);
+ IsInitAds = true;
+
+ kunpo.MiniHelper.ad().showAds({
+ success: () => {
+ kunpo.log("广告显示成功");
+ },
+ fail: (errCode, errMsg) => {
+ kunpo.log("广告显示失败", errCode, errMsg);
+ }
+ });
+ }
+ } else {
+ kunpo.MiniHelper.ad().showAds({
+ success: () => {
+ kunpo.log("广告显示成功");
+ },
+ fail: (errCode, errMsg) => {
+ kunpo.log("广告显示失败", errCode, errMsg);
+ }
+ });
+ }
+ }
+ @uiclick
+ private onClickBtnPay(): void {
+ if (!IsInitPay) {
+ let payQuantity = parseInt(this.lab_payQuantity.text);
+ if (isNaN(payQuantity) || payQuantity <= 0) {
+ kunpo.log("请输入正确的值");
+ return;
+ } else {
+ console.log("初始化支付", payQuantity);
+ kunpo.MiniHelper.pay().init("1450135093", payQuantity);
+ IsInitPay = true;
+ }
+ kunpo.MiniHelper.pay().pay({
+ rmb: 1,
+ orderId: `order_${kunpo.Time.now()}`,
+ shopId: "1234",
+ shopName: "测试商品",
+ extraInfo: {
+ "test": "test"
+ },
+ success: () => {
+ kunpo.log("支付调用成功");
+ },
+ fail: (res) => {
+ kunpo.log("支付调用失败", res.errCode, res.errMsg);
+ }
+ });
+ } else {
+ kunpo.MiniHelper.pay().pay({
+ rmb: 1,
+ orderId: kunpo.Time.now() + "",
+ shopId: "1234",
+ shopName: "测试商品",
+ extraInfo: {
+ "test": "test"
+ },
+ success: () => {
+ kunpo.log("支付调用成功");
+ },
+ fail: (res) => {
+ kunpo.log("支付调用失败", res.errCode, res.errMsg);
+ }
+ });
+ }
+ }
+}
\ No newline at end of file
diff --git a/demo/assets/script/UI/MiniGame/MiniGameWindow.ts.meta b/demo/assets/script/UI/MiniGame/MiniGameWindow.ts.meta
new file mode 100644
index 0000000..49e8c01
--- /dev/null
+++ b/demo/assets/script/UI/MiniGame/MiniGameWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "1b9f360b-3ad4-4eb1-9092-1fdab6270a16",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/PopWindow.ts.meta b/demo/assets/script/UI/PopWindow.ts.meta
new file mode 100644
index 0000000..0f3b693
--- /dev/null
+++ b/demo/assets/script/UI/PopWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.23",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "5377ee34-e10a-4312-9e6e-d4c3e242a880",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/PopWindowHeader1.ts.meta b/demo/assets/script/UI/PopWindowHeader1.ts.meta
new file mode 100644
index 0000000..ef716e6
--- /dev/null
+++ b/demo/assets/script/UI/PopWindowHeader1.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.23",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "a7ecfd55-c16b-4dbf-9451-e11dd2bbdb40",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/PopWindowHeader2.ts.meta b/demo/assets/script/UI/PopWindowHeader2.ts.meta
new file mode 100644
index 0000000..90843be
--- /dev/null
+++ b/demo/assets/script/UI/PopWindowHeader2.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.23",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "d2f063c7-ff7e-44c7-85bb-9ca5f4f452e4",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Socket.meta b/demo/assets/script/UI/Socket.meta
new file mode 100644
index 0000000..ebf9658
--- /dev/null
+++ b/demo/assets/script/UI/Socket.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "dd0d6cdf-59a4-446e-840b-ddd9c17db824",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Socket/SocketTestWindow.ts b/demo/assets/script/UI/Socket/SocketTestWindow.ts
new file mode 100644
index 0000000..469674f
--- /dev/null
+++ b/demo/assets/script/UI/Socket/SocketTestWindow.ts
@@ -0,0 +1,83 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-03-29
+ * @Description:
+ */
+import { Socket } from "kunpocc-net";
+import { fgui, kunpo } from "../../header";
+import { ProtoInfos } from "../../Socket/ProtoInfos";
+const { uiclass, uiprop, uiclick } = kunpo._uidecorator;
+
+@uiclass("Window", "Socket", "SocketTestWindow")
+export class SocketTestWindow extends kunpo.Window {
+ @uiprop private text_input: fgui.GTextInput;
+ @uiprop private text_input_message: fgui.GTextInput;
+
+ private _status: fgui.Controller;
+ private socket: Socket;
+ protected onInit(): void {
+ this.adapterType = kunpo.AdapterType.Bang;
+ this.type = kunpo.WindowType.Normal;
+
+ this._status = this.getController("status");
+
+ this.text_input.text = "ws://10.8.36.142:8080";
+ }
+
+ @uiclick
+ private onCloseWindow(): void {
+ kunpo.WindowManager.closeWindow(this.name);
+ }
+
+ @uiclick
+ private onConnection(): void {
+ if (this.socket) {
+ kunpo.WindowManager.showWindowIm("ToastWindow", { text: "已经存在一个连接" });
+ return;
+ }
+ this.socket = new Socket(this.text_input.text, { binaryType: "arraybuffer" });
+ this.socket.onopen = () => {
+ kunpo.log("连接成功");
+ kunpo.WindowManager.showWindowIm("ToastWindow", { text: "连接成功" });
+ this._status.setSelectedIndex(1);
+ }
+ this.socket.onmessage = (data: any) => {
+ kunpo.log("收到消息", data);
+ }
+
+ this.socket.onclose = (code: number, reason: string) => {
+ kunpo.log("连接关闭", code, reason);
+ this._status.setSelectedIndex(0);
+ kunpo.WindowManager.showWindowIm("ToastWindow", { text: `连接断开 code:${code} reason:${reason}` });
+ this.socket = null;
+ }
+ }
+
+ @uiclick
+ private onDisconnect(): void {
+ this.socket?.close(3001, "主动断开");
+ }
+
+ @uiclick
+ private onSendText(): void {
+ if (!this.text_input_message.text) {
+ kunpo.WindowManager.showWindowIm("ToastWindow", { text: "请输入要发送的消息" });
+ return;
+ }
+ this.socket?.send(this.text_input_message.text);
+ }
+
+ /**
+ * 发送二进制这里使用 protobuf
+ */
+ @uiclick
+ private onSendBinary(): void {
+ if (!this.text_input_message.text) {
+ kunpo.WindowManager.showWindowIm("ToastWindow", { text: "请输入要发送的消息" });
+ return;
+ }
+ let protoInfos = new ProtoInfos();
+ let buffer = protoInfos.encodeData(1, this.text_input_message.text);
+ this.socket?.sendBuffer(buffer);
+ }
+}
diff --git a/demo/assets/script/UI/Socket/SocketTestWindow.ts.meta b/demo/assets/script/UI/Socket/SocketTestWindow.ts.meta
new file mode 100644
index 0000000..20b1b38
--- /dev/null
+++ b/demo/assets/script/UI/Socket/SocketTestWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "bf8b0dec-aa56-401f-bec1-f9200ac1042d",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/SocketTestWindow.ts.meta b/demo/assets/script/UI/SocketTestWindow.ts.meta
new file mode 100644
index 0000000..c99f4e4
--- /dev/null
+++ b/demo/assets/script/UI/SocketTestWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.23",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "f4e808a7-37da-486d-b371-35f2d4f4918b",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Window.meta b/demo/assets/script/UI/Window.meta
new file mode 100644
index 0000000..17ff884
--- /dev/null
+++ b/demo/assets/script/UI/Window.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "151a2b6f-f082-4e0f-bf54-718c31f777af",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Window/CloseAllWindow.ts b/demo/assets/script/UI/Window/CloseAllWindow.ts
new file mode 100644
index 0000000..e0bcbd3
--- /dev/null
+++ b/demo/assets/script/UI/Window/CloseAllWindow.ts
@@ -0,0 +1,49 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2024-12-21
+ * @Description:
+ */
+import { fgui, kunpo } from "../../header";
+const { uiclass, uiprop, uiclick } = kunpo._uidecorator;
+
+@uiclass("Window", "Window", "CloseAllWindow")
+export class CloseAllWindow extends kunpo.Window {
+ @uiprop btn_close: fgui.GButton;
+ protected onInit(): void {
+ this.adapterType = kunpo.AdapterType.Bang;
+ this.type = kunpo.WindowType.CloseAll;
+ }
+
+ protected onShow(userdata?: any): void {
+ kunpo.log("CloseAllWindow onShow:", userdata);
+ }
+
+ protected onHide(): void {
+ kunpo.log("CloseAllWindow onHide");
+ }
+
+ protected onCover(): void {
+ kunpo.log("CloseAllWindow onCover");
+ }
+
+ protected onRecover(): void {
+ kunpo.log("CloseAllWindow onRecover");
+ }
+
+ protected onShowFromHide(): void {
+ kunpo.log("CloseAllWindow onShowFromHide");
+ }
+
+ protected onEmptyAreaClick(): void {
+ kunpo.log("CloseAllWindow 点击空白区域");
+ }
+
+ protected onClose(): void {
+ kunpo.log("CloseAllWindow onClose");
+ }
+
+ @uiclick
+ private onClickBtnClose(): void {
+ kunpo.WindowManager.closeWindow(this.name);
+ }
+}
diff --git a/demo/assets/script/UI/Window/CloseAllWindow.ts.meta b/demo/assets/script/UI/Window/CloseAllWindow.ts.meta
new file mode 100644
index 0000000..d6d768b
--- /dev/null
+++ b/demo/assets/script/UI/Window/CloseAllWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "323b9ed8-0b74-4c65-99d4-a9e46e33cd6a",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Window/CloseOneWindow.ts b/demo/assets/script/UI/Window/CloseOneWindow.ts
new file mode 100644
index 0000000..d3e37d2
--- /dev/null
+++ b/demo/assets/script/UI/Window/CloseOneWindow.ts
@@ -0,0 +1,50 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2024-12-21
+ * @Description:
+ */
+
+import { fgui, kunpo } from "../../header";
+const { uiclass, uiprop, uiclick } = kunpo._uidecorator;
+
+@uiclass("Window", "Window", "CloseOneWindow")
+export class CloseOneWindow extends kunpo.Window {
+ @uiprop btn_close: fgui.GButton;
+ protected onInit(): void {
+ this.adapterType = kunpo.AdapterType.Bang;
+ this.type = kunpo.WindowType.CloseOne;
+ }
+
+ protected onShow(userdata?: any): void {
+ kunpo.log("CloseOneWindow onShow:", userdata);
+ }
+
+ protected onHide(): void {
+ kunpo.log("CloseOneWindow onHide");
+ }
+
+ protected onCover(): void {
+ kunpo.log("CloseOneWindow onCover");
+ }
+
+ protected onRecover(): void {
+ kunpo.log("CloseOneWindow onRecover");
+ }
+
+ protected onShowFromHide(): void {
+ kunpo.log("CloseOneWindow onShowFromHide");
+ }
+
+ protected onEmptyAreaClick(): void {
+ kunpo.log("CloseOneWindow 点击空白区域");
+ }
+
+ protected onClose(): void {
+ kunpo.log("CloseOneWindow onClose");
+ }
+
+ @uiclick
+ private onClickBtnClose(): void {
+ kunpo.WindowManager.closeWindow(this.name);
+ }
+}
diff --git a/demo/assets/script/UI/Window/CloseOneWindow.ts.meta b/demo/assets/script/UI/Window/CloseOneWindow.ts.meta
new file mode 100644
index 0000000..b9e3c59
--- /dev/null
+++ b/demo/assets/script/UI/Window/CloseOneWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "f107c3dc-ff92-4b78-8384-b8908fa51bd8",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Window/Components.meta b/demo/assets/script/UI/Window/Components.meta
new file mode 100644
index 0000000..e3875f3
--- /dev/null
+++ b/demo/assets/script/UI/Window/Components.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "179bd030-c5da-4803-a8aa-999bc7106a35",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Window/Components/CustomComponents.ts b/demo/assets/script/UI/Window/Components/CustomComponents.ts
new file mode 100644
index 0000000..1d8e00e
--- /dev/null
+++ b/demo/assets/script/UI/Window/Components/CustomComponents.ts
@@ -0,0 +1,17 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2024-12-26
+ * @Description:
+ */
+
+import { fgui, kunpo } from "../../../header";
+const { uiheader, uiprop, uicom, uiclick } = kunpo._uidecorator;
+
+@uicom("Window", "CustomComponents")
+export class CustomComponents extends fgui.GComponent {
+ @uiprop n1: fgui.GTextField;
+
+ public onInit(): void {
+ kunpo.log("CustomComponents onInit");
+ }
+}
diff --git a/demo/assets/script/UI/Window/Components/CustomComponents.ts.meta b/demo/assets/script/UI/Window/Components/CustomComponents.ts.meta
new file mode 100644
index 0000000..9613ddb
--- /dev/null
+++ b/demo/assets/script/UI/Window/Components/CustomComponents.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "a8d4cfe1-8b55-4d01-8a17-fddb82a3c035",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Window/HideAllWindow.ts b/demo/assets/script/UI/Window/HideAllWindow.ts
new file mode 100644
index 0000000..5ae9a98
--- /dev/null
+++ b/demo/assets/script/UI/Window/HideAllWindow.ts
@@ -0,0 +1,49 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2024-12-21
+ * @Description:
+ */
+import { fgui, kunpo } from "../../header";
+const { uiclass, uiprop, uiclick } = kunpo._uidecorator;
+
+@uiclass("Window", "Window", "HideAllWindow")
+export class HideAllWindow extends kunpo.Window {
+ @uiprop btn_close: fgui.GButton;
+ protected onInit(): void {
+ this.adapterType = kunpo.AdapterType.Bang;
+ this.type = kunpo.WindowType.HideAll;
+ }
+
+ protected onShow(userdata?: any): void {
+ kunpo.log("HideAllWindow onShow:", userdata);
+ }
+
+ protected onHide(): void {
+ kunpo.log("HideAllWindow onHide");
+ }
+
+ protected onCover(): void {
+ kunpo.log("HideAllWindow onCover");
+ }
+
+ protected onRecover(): void {
+ kunpo.log("HideAllWindow onRecover");
+ }
+
+ protected onShowFromHide(): void {
+ kunpo.log("HideAllWindow onShowFromHide");
+ }
+
+ protected onEmptyAreaClick(): void {
+ kunpo.log("HideAllWindow 点击空白区域");
+ }
+
+ protected onClose(): void {
+ kunpo.log("HideAllWindow onClose");
+ }
+
+ @uiclick
+ private onClickBtnClose(): void {
+ kunpo.WindowManager.closeWindow(this.name);
+ }
+}
diff --git a/demo/assets/script/UI/Window/HideAllWindow.ts.meta b/demo/assets/script/UI/Window/HideAllWindow.ts.meta
new file mode 100644
index 0000000..1f5373a
--- /dev/null
+++ b/demo/assets/script/UI/Window/HideAllWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "c9f63827-cffb-45c8-9bde-6580385ef829",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Window/HideOneWindow.ts b/demo/assets/script/UI/Window/HideOneWindow.ts
new file mode 100644
index 0000000..4011388
--- /dev/null
+++ b/demo/assets/script/UI/Window/HideOneWindow.ts
@@ -0,0 +1,50 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2024-12-21
+ * @Description:
+ */
+
+import { fgui, kunpo } from "../../header";
+const { uiclass, uiprop, uiclick } = kunpo._uidecorator;
+
+@uiclass("Window", "Window", "HideOneWindow")
+export class HideOneWindow extends kunpo.Window {
+ @uiprop btn_close: fgui.GButton;
+ protected onInit(): void {
+ this.adapterType = kunpo.AdapterType.Bang;
+ this.type = kunpo.WindowType.HideOne;
+ }
+
+ protected onShow(userdata?: any): void {
+ kunpo.log("HideOneWindow onShow:", userdata);
+ }
+
+ protected onHide(): void {
+ kunpo.log("HideOneWindow onHide");
+ }
+
+ protected onCover(): void {
+ kunpo.log("HideOneWindow onCover");
+ }
+
+ protected onRecover(): void {
+ kunpo.log("HideOneWindow onRecover");
+ }
+
+ protected onShowFromHide(): void {
+ kunpo.log("HideOneWindow onShowFromHide");
+ }
+
+ protected onEmptyAreaClick(): void {
+ kunpo.log("HideOneWindow 点击空白区域");
+ }
+
+ protected onClose(): void {
+ kunpo.log("HideOneWindow onClose");
+ }
+
+ @uiclick
+ private onClickBtnClose(): void {
+ kunpo.WindowManager.closeWindow(this.name);
+ }
+}
diff --git a/demo/assets/script/UI/Window/HideOneWindow.ts.meta b/demo/assets/script/UI/Window/HideOneWindow.ts.meta
new file mode 100644
index 0000000..9824849
--- /dev/null
+++ b/demo/assets/script/UI/Window/HideOneWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "3735a1a5-aa89-42a5-b71d-07b405970080",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Window/PopWindow.ts b/demo/assets/script/UI/Window/PopWindow.ts
new file mode 100644
index 0000000..d930946
--- /dev/null
+++ b/demo/assets/script/UI/Window/PopWindow.ts
@@ -0,0 +1,22 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-01-12
+ * @Description:
+ */
+
+import { fgui, kunpo } from "../../header";
+const { uiclass, uiprop, uiclick } = kunpo._uidecorator;
+
+@uiclass("Window", "Window", "PopWindow")
+export class PopWindow extends kunpo.Window {
+ @uiprop btn_close: fgui.GButton;
+ protected onInit(): void {
+ this.adapterType = kunpo.AdapterType.Bang;
+ this.type = kunpo.WindowType.Normal;
+ }
+
+ @uiclick
+ private onCloseWindow(): void {
+ kunpo.WindowManager.closeWindow(this.name);
+ }
+}
diff --git a/demo/assets/script/UI/Window/PopWindow.ts.meta b/demo/assets/script/UI/Window/PopWindow.ts.meta
new file mode 100644
index 0000000..a5f9dec
--- /dev/null
+++ b/demo/assets/script/UI/Window/PopWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "3f040196-71f3-4af5-af01-ca1c2ed874b8",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Window/PopWindowHeader1.ts b/demo/assets/script/UI/Window/PopWindowHeader1.ts
new file mode 100644
index 0000000..46a48b3
--- /dev/null
+++ b/demo/assets/script/UI/Window/PopWindowHeader1.ts
@@ -0,0 +1,26 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2024-12-14
+ * @Description:
+ */
+
+import { fgui, kunpo } from "../../header";
+const { uiclass, uiprop, uiclick } = kunpo._uidecorator;
+
+@uiclass("Window", "Window", "PopWindowHeader1")
+export class PopWindowHeader1 extends kunpo.Window {
+ @uiprop btn_close: fgui.GButton;
+ protected onInit(): void {
+ this.adapterType = kunpo.AdapterType.Bang;
+ this.type = kunpo.WindowType.Normal;
+ }
+
+ getHeaderInfo(): kunpo.WindowHeaderInfo {
+ return kunpo.WindowHeaderInfo.create("WindowHeader", "aaa");
+ }
+
+ @uiclick
+ private onCloseWindow(): void {
+ kunpo.WindowManager.closeWindow(this.name);
+ }
+}
diff --git a/demo/assets/script/UI/Window/PopWindowHeader1.ts.meta b/demo/assets/script/UI/Window/PopWindowHeader1.ts.meta
new file mode 100644
index 0000000..71263ba
--- /dev/null
+++ b/demo/assets/script/UI/Window/PopWindowHeader1.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "0760d294-bd0b-4749-b644-0cfe78c3e5d9",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Window/PopWindowHeader2.ts b/demo/assets/script/UI/Window/PopWindowHeader2.ts
new file mode 100644
index 0000000..65d70b4
--- /dev/null
+++ b/demo/assets/script/UI/Window/PopWindowHeader2.ts
@@ -0,0 +1,26 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-01-12
+ * @Description:
+ */
+
+import { fgui, kunpo } from "../../header";
+const { uiclass, uiprop, uiclick } = kunpo._uidecorator;
+
+@uiclass("Window", "Window", "PopWindowHeader2")
+export class PopWindowHeader2 extends kunpo.Window {
+ @uiprop btn_close: fgui.GButton;
+ protected onInit(): void {
+ this.adapterType = kunpo.AdapterType.Bang;
+ this.type = kunpo.WindowType.Normal;
+ }
+
+ getHeaderInfo(): kunpo.WindowHeaderInfo {
+ return kunpo.WindowHeaderInfo.create("WindowHeader2", "aaa");
+ }
+
+ @uiclick
+ private onCloseWindow(): void {
+ kunpo.WindowManager.closeWindow(this.name);
+ }
+}
diff --git a/demo/assets/script/UI/Window/PopWindowHeader2.ts.meta b/demo/assets/script/UI/Window/PopWindowHeader2.ts.meta
new file mode 100644
index 0000000..23c4ab1
--- /dev/null
+++ b/demo/assets/script/UI/Window/PopWindowHeader2.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "28191db1-d974-4911-9fe5-2104cfc45050",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UI/Window/UIBaseWindow.ts b/demo/assets/script/UI/Window/UIBaseWindow.ts
new file mode 100644
index 0000000..c9391da
--- /dev/null
+++ b/demo/assets/script/UI/Window/UIBaseWindow.ts
@@ -0,0 +1,88 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-04-19
+ * @Description:
+ */
+
+import { kunpo } from "../../header";
+const { uiclass, uiprop, uiclick } = kunpo._uidecorator;
+
+@uiclass("Window", "Window", "UIBaseWindow")
+export class UIBaseWindow extends kunpo.Window {
+ protected onInit(): void {
+ this.adapterType = kunpo.AdapterType.Bang;
+ this.type = kunpo.WindowType.HideAll;
+ }
+
+ protected onShow(userdata?: any): void {
+ kunpo.log("UIBaseWindow onShow:", userdata);
+ }
+
+ protected onHide(): void {
+ kunpo.log("UIBaseWindow onHide");
+ }
+
+ protected onCover(): void {
+ kunpo.log("UIBaseWindow onCover");
+ }
+
+ protected onRecover(): void {
+ kunpo.log("UIBaseWindow onRecover");
+ }
+
+ protected onShowFromHide(): void {
+ kunpo.log("UIBaseWindow onShowFromHide");
+ }
+
+ protected onEmptyAreaClick(): void {
+ kunpo.log("UIBaseWindow 点击空白区域");
+ }
+
+ protected onClose(): void {
+ kunpo.log("UIBaseWindow onClose");
+ }
+
+ @uiclick
+ private onClickBtnClose(): void {
+ kunpo.WindowManager.closeWindow(this.name);
+ }
+
+ @uiclick
+ private onClickBtnHeader1(): void {
+ kunpo.WindowManager.showWindow("PopWindowHeader1");
+ }
+
+ @uiclick
+ private onClickBtnHeader2(): void {
+ kunpo.WindowManager.showWindow("PopWindowHeader2");
+ }
+
+ @uiclick
+ private onClickBtnEmpty(): void {
+ kunpo.WindowManager.showWindow("PopWindow");
+ }
+
+ @uiclick
+ private onClickBtnCloseOne(): void {
+ kunpo.WindowManager.showWindow("CloseOneWindow");
+ }
+
+ @uiclick
+ private onClickBtnCloseAll(): void {
+ kunpo.WindowManager.showWindow("CloseAllWindow");
+ }
+
+ @uiclick
+ private onClickBtnHideOne(): void {
+ kunpo.WindowManager.showWindow("HideOneWindow");
+ }
+
+ @uiclick
+ private onClickBtnHideAll(): void {
+ kunpo.WindowManager.showWindow("HideAllWindow");
+ }
+
+ public getHeaderInfo(): kunpo.WindowHeaderInfo {
+ return kunpo.WindowHeaderInfo.create("WindowHeader", "aaa");
+ }
+}
diff --git a/demo/assets/script/UI/Window/UIBaseWindow.ts.meta b/demo/assets/script/UI/Window/UIBaseWindow.ts.meta
new file mode 100644
index 0000000..c3bed59
--- /dev/null
+++ b/demo/assets/script/UI/Window/UIBaseWindow.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "95f0b543-53f1-416e-a789-d1cc9de0e2a8",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/UIPackageRegister.ts b/demo/assets/script/UIPackageRegister.ts
new file mode 100644
index 0000000..e3e5366
--- /dev/null
+++ b/demo/assets/script/UIPackageRegister.ts
@@ -0,0 +1,51 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-02-26
+ * @Description:
+ */
+import { kunpo } from './header';
+export class UIPackageRegister {
+ public static Register(): void {
+ kunpo.WindowManager.initPackageConfig({
+ config: {
+ /** UI所在resources中的路径 */
+ uiPath: "ui",
+ /**
+ * 手动管理资源的包
+ * 1. 用于基础UI包, 提供一些最基础的组件,所有其他包都可能引用其中的内容
+ * 2. 资源header所在的包
+ * 3. 用于一些特殊场景, 比如需要和其他资源一起加载, 并且显示进度条的包
+ */
+ manualPackages: ["Basics", "Home"],
+ /**
+ * 不推荐配置 只是提供一种特殊需求的实现方式
+ * 窗口引用到其他包中的资源 需要的配置信息
+ */
+ linkPackages: {},
+ /**
+ * 关闭界面后,需要立即释放资源的包名(建议尽量少)
+ * 一般不建议包进行频繁装载卸载,因为每次装载卸载必然是要消耗CPU时间(意味着耗电)和产生大量GC的。UI系统占用的内存是可以精确估算的,你可以按照包的使用频率设定哪些包是需要立即释放的。
+ * 不包括手动管理的包
+ */
+ imReleasePackages: [],
+ },
+ showWaitWindow: this._showWaitWindow,
+ hideWaitWindow: this._hideWaitWindow,
+ fail: this._fail,
+ });
+ }
+
+ private static _showWaitWindow(): void {
+ console.log("显示资源加载等待窗");
+ kunpo.WindowManager.showWindow("LoadUIWindow");
+ }
+
+ private static _hideWaitWindow(): void {
+ console.log("关闭资源加载等待窗");
+ kunpo.WindowManager.closeWindow("LoadUIWindow");
+ }
+
+ private static _fail(windowName: string, errmsg: string, pkgs: string[]): void {
+ console.log("资源加载失败", windowName, errmsg, pkgs);
+ }
+}
diff --git a/demo/assets/script/UIPackageRegister.ts.meta b/demo/assets/script/UIPackageRegister.ts.meta
new file mode 100644
index 0000000..98094d9
--- /dev/null
+++ b/demo/assets/script/UIPackageRegister.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "f2a30cc8-4ea8-461f-86d0-d8d77d9076f4",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/condition.meta b/demo/assets/script/condition.meta
new file mode 100644
index 0000000..792ae1b
--- /dev/null
+++ b/demo/assets/script/condition.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "68249aa2-e13d-4d56-b368-3e66145a80c6",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/condition/Condition1.ts b/demo/assets/script/condition/Condition1.ts
new file mode 100644
index 0000000..78605f1
--- /dev/null
+++ b/demo/assets/script/condition/Condition1.ts
@@ -0,0 +1,23 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-02-17
+ * @Description: 条件1 关联数据conditon1
+ */
+import { GlobalEvent } from 'kunpocc-event';
+import { DataHelper } from '../Data/DataHelper';
+import { kunpo } from '../header';
+import { ConditionType } from './ConditionType';
+const { conditionClass } = kunpo._conditionDecorator;
+
+@conditionClass(ConditionType.Condition1)
+export class Condition1 extends kunpo.ConditionBase {
+ protected onInit(): void {
+ GlobalEvent.add("condition1", () => {
+ this.tryUpdate();
+ }, this);
+ }
+
+ protected evaluate(): boolean {
+ return DataHelper.getValue("condition1", true);
+ }
+}
\ No newline at end of file
diff --git a/demo/assets/script/condition/Condition1.ts.meta b/demo/assets/script/condition/Condition1.ts.meta
new file mode 100644
index 0000000..fe198e5
--- /dev/null
+++ b/demo/assets/script/condition/Condition1.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "3be3041b-9739-434b-9394-4213b24b3b59",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/condition/Condition2.ts b/demo/assets/script/condition/Condition2.ts
new file mode 100644
index 0000000..6fa3db0
--- /dev/null
+++ b/demo/assets/script/condition/Condition2.ts
@@ -0,0 +1,23 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-02-17
+ * @Description: 条件2 关联数据condition2
+ */
+import { GlobalEvent } from 'kunpocc-event';
+import { DataHelper } from '../Data/DataHelper';
+import { kunpo } from '../header';
+import { ConditionType } from './ConditionType';
+const { conditionClass } = kunpo._conditionDecorator;
+
+@conditionClass(ConditionType.Condition2)
+export class Condition2 extends kunpo.ConditionBase {
+ protected onInit(): void {
+ GlobalEvent.add("condition2", () => {
+ this.tryUpdate();
+ }, this);
+ }
+
+ protected evaluate(): boolean {
+ return DataHelper.getValue("condition2", true);
+ }
+}
\ No newline at end of file
diff --git a/demo/assets/script/condition/Condition2.ts.meta b/demo/assets/script/condition/Condition2.ts.meta
new file mode 100644
index 0000000..b4d6097
--- /dev/null
+++ b/demo/assets/script/condition/Condition2.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "1b1192af-5665-46b9-baeb-d33adc76ac6b",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/condition/Condition3.ts b/demo/assets/script/condition/Condition3.ts
new file mode 100644
index 0000000..14ab0e3
--- /dev/null
+++ b/demo/assets/script/condition/Condition3.ts
@@ -0,0 +1,23 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-02-17
+ * @Description: 条件3 关联数据condition3
+ */
+import { GlobalEvent } from 'kunpocc-event';
+import { DataHelper } from '../Data/DataHelper';
+import { kunpo } from '../header';
+import { ConditionType } from './ConditionType';
+const { conditionClass } = kunpo._conditionDecorator;
+
+@conditionClass(ConditionType.Condition3)
+export class Condition3 extends kunpo.ConditionBase {
+ protected onInit(): void {
+ GlobalEvent.add("condition3", () => {
+ this.tryUpdate();
+ }, this);
+ }
+
+ protected evaluate(): boolean {
+ return DataHelper.getValue("condition3", true);
+ }
+}
\ No newline at end of file
diff --git a/demo/assets/script/condition/Condition3.ts.meta b/demo/assets/script/condition/Condition3.ts.meta
new file mode 100644
index 0000000..2afbb2f
--- /dev/null
+++ b/demo/assets/script/condition/Condition3.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "754a11fe-b670-49db-b515-f654b6362c57",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/condition/Condition4.ts b/demo/assets/script/condition/Condition4.ts
new file mode 100644
index 0000000..1747681
--- /dev/null
+++ b/demo/assets/script/condition/Condition4.ts
@@ -0,0 +1,23 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-02-17
+ * @Description: 条件4 关联数据condition4
+ */
+import { GlobalEvent } from 'kunpocc-event';
+import { DataHelper } from '../Data/DataHelper';
+import { kunpo } from '../header';
+import { ConditionType } from './ConditionType';
+const { conditionClass } = kunpo._conditionDecorator;
+
+@conditionClass(ConditionType.Condition4)
+export class Condition4 extends kunpo.ConditionBase {
+ protected onInit(): void {
+ GlobalEvent.add("condition4", () => {
+ this.tryUpdate();
+ }, this);
+ }
+
+ protected evaluate(): boolean {
+ return DataHelper.getValue("condition4", true);
+ }
+}
\ No newline at end of file
diff --git a/demo/assets/script/condition/Condition4.ts.meta b/demo/assets/script/condition/Condition4.ts.meta
new file mode 100644
index 0000000..a6a9636
--- /dev/null
+++ b/demo/assets/script/condition/Condition4.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "858a7e41-647f-4043-ae03-a669cacff1d6",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/condition/ConditionType.ts b/demo/assets/script/condition/ConditionType.ts
new file mode 100644
index 0000000..6e38a5f
--- /dev/null
+++ b/demo/assets/script/condition/ConditionType.ts
@@ -0,0 +1,13 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-02-17
+ * @Description: 条件类型
+ */
+
+export enum ConditionType {
+ None = 0,
+ Condition1 = 1,
+ Condition2 = 2,
+ Condition3 = 3,
+ Condition4 = 4,
+}
\ No newline at end of file
diff --git a/demo/assets/script/condition/ConditionType.ts.meta b/demo/assets/script/condition/ConditionType.ts.meta
new file mode 100644
index 0000000..da3645b
--- /dev/null
+++ b/demo/assets/script/condition/ConditionType.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "76bebac7-4436-4411-b37a-caae5c016357",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/header.ts b/demo/assets/script/header.ts
new file mode 100644
index 0000000..53434dd
--- /dev/null
+++ b/demo/assets/script/header.ts
@@ -0,0 +1,18 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-01-15
+ * @Description:
+ */
+
+import * as cc from "cc";
+import * as fgui from "fairygui-cc";
+import * as kunpo from "kunpocc";
+import * as KunpoAssets from "kunpocc-assets";
+import * as protoRoot from './Socket/proto/proto.js';
+
+type ProtoType = typeof protoRoot;
+const proto = (protoRoot["default"] || protoRoot) as ProtoType;
+export const protocol = proto.com.kunpo.proto;
+
+export { cc, fgui, kunpo, KunpoAssets };
+
diff --git a/demo/assets/script/header.ts.meta b/demo/assets/script/header.ts.meta
new file mode 100644
index 0000000..cef7336
--- /dev/null
+++ b/demo/assets/script/header.ts.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "4.0.24",
+ "importer": "typescript",
+ "imported": true,
+ "uuid": "5a04ea14-2275-42d1-87e6-157402a30a33",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/script/kunpolib.meta b/demo/assets/script/kunpolib.meta
new file mode 100644
index 0000000..9fa1dd1
--- /dev/null
+++ b/demo/assets/script/kunpolib.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "20f6ade1-f37f-4b59-9945-6431970a76f1",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/uiconfig.meta b/demo/assets/uiconfig.meta
new file mode 100644
index 0000000..fdab5bf
--- /dev/null
+++ b/demo/assets/uiconfig.meta
@@ -0,0 +1,9 @@
+{
+ "ver": "1.2.0",
+ "importer": "directory",
+ "imported": true,
+ "uuid": "c0c7df86-d7a3-450e-b5c6-b93d9701ab92",
+ "files": [],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/uiconfig/ui_config.json b/demo/assets/uiconfig/ui_config.json
new file mode 100644
index 0000000..f4a886d
--- /dev/null
+++ b/demo/assets/uiconfig/ui_config.json
@@ -0,0 +1 @@
+{"Basics":{"AlertWindow":{"props":["bg",1,0,"lab_title",1,4,"lab_content",1,5,"btn_close",1,1,"btn_ok",1,3,"btn_cancel",1,2],"callbacks":["onClickBtnClose",1,1,"onClickBtnOk",1,3,"onClickBtnCancel",1,2],"controls":[],"transitions":[]},"ToastWindow":{"props":["toast",1,1,"labTips",2,1,1,"bgMask",1,0],"callbacks":[],"controls":[],"transitions":[]},"WindowHeader":{"props":["btn_close",1,0],"callbacks":[],"controls":[],"transitions":[]},"WindowHeader2":{"props":["btn_close",1,0],"callbacks":[],"controls":[],"transitions":[]}},"Condition":{"ConditionWindow":{"props":["reddot1",1,4,"reddot2",1,5,"btn_condition1",1,6,"btn_condition2",1,7,"btn_condition3",1,8,"btn_condition4",1,9],"callbacks":["onClickBtnClose",1,1,"onClickBtnCondition1",1,6,"onClickBtnCondition2",1,7,"onClickBtnCondition3",1,8,"onClickBtnCondition4",1,9],"controls":[],"transitions":[]}},"Home":{"HomeWindow":{"props":[],"callbacks":["onClickUI",1,6,"onSocketWindow",1,3,"onClickBtnCondition",1,1,"onClickMiniGame",1,4,"onClickBtnHotUpdate",1,5,"onClickLoadBuffer",1,2],"controls":["sta2","sta2","status","status"],"transitions":["t0","t0","t1","t1"]}},"HotUpdate":{"HotUpdateWindow":{"props":["lab_version",1,4,"lab_desc",1,5],"callbacks":["onClickClose",1,3,"onCheckUpdate",1,1,"onStartUpdate",1,2],"controls":[],"transitions":[]}},"MiniGame":{"MiniGameWindow":{"props":["btn_close",1,5,"lab_adid",1,8,"lab_payQuantity",1,9],"callbacks":["onClickBtnClose",1,5,"onClickBtnInitAds",1,2,"onClickBtnPay",1,3],"controls":[],"transitions":[]}},"Socket":{"SocketTestWindow":{"props":["text_input",1,7,"text_input_message",1,9],"callbacks":["onCloseWindow",1,1,"onConnection",1,3,"onDisconnect",1,2,"onSendText",1,4,"onSendBinary",1,5],"controls":[],"transitions":[]}},"Window":{"CloseAllWindow":{"props":["btn_close",1,2],"callbacks":["onClickBtnClose",1,2],"controls":[],"transitions":[]},"CloseOneWindow":{"props":["btn_close",1,2],"callbacks":["onClickBtnClose",1,2],"controls":[],"transitions":[]},"CustomComponents":{"props":["n1",1,1],"callbacks":[],"controls":[],"transitions":[]},"HideAllWindow":{"props":["btn_close",1,2],"callbacks":["onClickBtnClose",1,2],"controls":[],"transitions":[]},"HideOneWindow":{"props":["btn_close",1,2],"callbacks":["onClickBtnClose",1,2],"controls":[],"transitions":[]},"PopWindow":{"props":["btn_close",1,2],"callbacks":["onCloseWindow",1,2],"controls":[],"transitions":[]},"PopWindowHeader1":{"props":["btn_close",1,2],"callbacks":["onCloseWindow",1,2],"controls":[],"transitions":[]},"PopWindowHeader2":{"props":["btn_close",1,2],"callbacks":["onCloseWindow",1,2],"controls":[],"transitions":[]},"UIBaseWindow":{"props":[],"callbacks":["onClickBtnClose",1,8,"onClickBtnHeader1",1,1,"onClickBtnHeader2",1,2,"onClickBtnEmpty",1,3,"onClickBtnCloseOne",1,4,"onClickBtnCloseAll",1,5,"onClickBtnHideOne",1,6,"onClickBtnHideAll",1,7],"controls":[],"transitions":[]}}}
\ No newline at end of file
diff --git a/demo/assets/uiconfig/ui_config.json.meta b/demo/assets/uiconfig/ui_config.json.meta
new file mode 100644
index 0000000..3df72a0
--- /dev/null
+++ b/demo/assets/uiconfig/ui_config.json.meta
@@ -0,0 +1,11 @@
+{
+ "ver": "2.0.1",
+ "importer": "json",
+ "imported": true,
+ "uuid": "35d3b8e9-0096-4aa9-82a1-505784157bf8",
+ "files": [
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/version.json b/demo/assets/version.json
new file mode 100644
index 0000000..8309af1
--- /dev/null
+++ b/demo/assets/version.json
@@ -0,0 +1 @@
+{"version":"0.0.1"}
\ No newline at end of file
diff --git a/demo/assets/version.json.meta b/demo/assets/version.json.meta
new file mode 100644
index 0000000..b5035bd
--- /dev/null
+++ b/demo/assets/version.json.meta
@@ -0,0 +1,11 @@
+{
+ "ver": "2.0.1",
+ "importer": "json",
+ "imported": true,
+ "uuid": "a9ad4467-afe4-4869-abde-5c8bdb301339",
+ "files": [
+ ".json"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/assets/version.manifest b/demo/assets/version.manifest
new file mode 100644
index 0000000..c8487cf
--- /dev/null
+++ b/demo/assets/version.manifest
@@ -0,0 +1 @@
+{"remoteManifestUrl":"https://cdn-laonainai.lanfeitech.com/test/hot-update-debug/v0.0.1/android/0/project.manifest","remoteVersionUrl":"https://cdn-laonainai.lanfeitech.com/test/hot-update-debug/v0.0.1/android/version.manifest","version":"0","packageUrl":"https://cdn-laonainai.lanfeitech.com/test/hot-update-debug/v0.0.1/android/0"}
\ No newline at end of file
diff --git a/demo/assets/version.manifest.meta b/demo/assets/version.manifest.meta
new file mode 100644
index 0000000..8e421d8
--- /dev/null
+++ b/demo/assets/version.manifest.meta
@@ -0,0 +1,12 @@
+{
+ "ver": "1.0.0",
+ "importer": "*",
+ "imported": true,
+ "uuid": "4c477e27-edde-4d59-9963-d7f41168d40e",
+ "files": [
+ ".json",
+ ".manifest"
+ ],
+ "subMetas": {},
+ "userData": {}
+}
diff --git a/demo/excel/test.xlsx b/demo/excel/test.xlsx
new file mode 100644
index 0000000..3d83bc4
Binary files /dev/null and b/demo/excel/test.xlsx differ
diff --git a/demo/extensions-config/.gitignore b/demo/extensions-config/.gitignore
new file mode 100644
index 0000000..aa052db
--- /dev/null
+++ b/demo/extensions-config/.gitignore
@@ -0,0 +1 @@
+local/
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Basics/AlertWindow.json b/demo/extensions-config/fgui/Basics/AlertWindow.json
new file mode 100644
index 0000000..ad5d59a
--- /dev/null
+++ b/demo/extensions-config/fgui/Basics/AlertWindow.json
@@ -0,0 +1,52 @@
+{
+ "props": {
+ "bg": {
+ "name": "bg",
+ "idPath": "n0_eqwn",
+ "namePath": "bg"
+ },
+ "btn_close": {
+ "name": "btn_close",
+ "idPath": "n3_eqwn",
+ "namePath": "btn_close"
+ },
+ "btn_ok": {
+ "name": "btn_ok",
+ "idPath": "n9_kjg6",
+ "namePath": "btn_ok"
+ },
+ "btn_cancel": {
+ "name": "btn_cancel",
+ "idPath": "n10_jtaa",
+ "namePath": "btn_cancel"
+ },
+ "lab_title": {
+ "name": "lab_title",
+ "idPath": "n2_eqwn",
+ "namePath": "lab_title"
+ },
+ "lab_content": {
+ "name": "lab_content",
+ "idPath": "n4_eqwn",
+ "namePath": "lab_content"
+ }
+ },
+ "callbacks": {
+ "onClickBtnClose": {
+ "name": "btn_close",
+ "idPath": "n3_eqwn",
+ "namePath": "btn_close"
+ },
+ "onClickBtnCancel": {
+ "name": "btn_cancel",
+ "idPath": "n10_jtaa",
+ "namePath": "btn_cancel"
+ },
+ "onClickBtnOk": {
+ "name": "btn_ok",
+ "idPath": "n9_kjg6",
+ "namePath": "btn_ok"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Basics/LoadUIWindow.json b/demo/extensions-config/fgui/Basics/LoadUIWindow.json
new file mode 100644
index 0000000..0dc313c
--- /dev/null
+++ b/demo/extensions-config/fgui/Basics/LoadUIWindow.json
@@ -0,0 +1,11 @@
+{
+ "props": {
+ "lab_desc": {
+ "name": "lab_tips",
+ "idPath": "n1_tihq",
+ "namePath": "lab_tips"
+ }
+ },
+ "callbacks": {},
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Basics/ToastWindow.json b/demo/extensions-config/fgui/Basics/ToastWindow.json
new file mode 100644
index 0000000..b83aea6
--- /dev/null
+++ b/demo/extensions-config/fgui/Basics/ToastWindow.json
@@ -0,0 +1,21 @@
+{
+ "props": {
+ "toast": {
+ "name": "toast",
+ "idPath": "n1_e679",
+ "namePath": "toast"
+ },
+ "labTips": {
+ "name": "labTips",
+ "idPath": "n1_e679/n0_8ej8",
+ "namePath": "toast/labTips"
+ },
+ "bgMask": {
+ "name": "bgMask",
+ "idPath": "n2_q3s0",
+ "namePath": "bgMask"
+ }
+ },
+ "callbacks": {},
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Basics/WindowHeader.json b/demo/extensions-config/fgui/Basics/WindowHeader.json
new file mode 100644
index 0000000..e9194df
--- /dev/null
+++ b/demo/extensions-config/fgui/Basics/WindowHeader.json
@@ -0,0 +1,11 @@
+{
+ "props": {
+ "btn_close": {
+ "name": "n0",
+ "idPath": "n0_g5jd",
+ "namePath": "n0"
+ }
+ },
+ "callbacks": {},
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Basics/WindowHeader2.json b/demo/extensions-config/fgui/Basics/WindowHeader2.json
new file mode 100644
index 0000000..e9194df
--- /dev/null
+++ b/demo/extensions-config/fgui/Basics/WindowHeader2.json
@@ -0,0 +1,11 @@
+{
+ "props": {
+ "btn_close": {
+ "name": "n0",
+ "idPath": "n0_g5jd",
+ "namePath": "n0"
+ }
+ },
+ "callbacks": {},
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Condition/ConditionWindow.json b/demo/extensions-config/fgui/Condition/ConditionWindow.json
new file mode 100644
index 0000000..28c4520
--- /dev/null
+++ b/demo/extensions-config/fgui/Condition/ConditionWindow.json
@@ -0,0 +1,62 @@
+{
+ "props": {
+ "reddot1": {
+ "name": "reddot1",
+ "idPath": "n7_eiv0",
+ "namePath": "reddot1"
+ },
+ "reddot2": {
+ "name": "reddot2",
+ "idPath": "n8_eiv0",
+ "namePath": "reddot2"
+ },
+ "btn_condition1": {
+ "name": "btn_condition1",
+ "idPath": "n9_eiv0",
+ "namePath": "btn_condition1"
+ },
+ "btn_condition2": {
+ "name": "btn_condition2",
+ "idPath": "n10_eiv0",
+ "namePath": "btn_condition2"
+ },
+ "btn_condition3": {
+ "name": "btn_condition3",
+ "idPath": "n11_eiv0",
+ "namePath": "btn_condition3"
+ },
+ "btn_condition4": {
+ "name": "btn_condition4",
+ "idPath": "n12_eiv0",
+ "namePath": "btn_condition4"
+ }
+ },
+ "callbacks": {
+ "onClickBtnClose": {
+ "name": "btn_close",
+ "idPath": "n4_fnoh",
+ "namePath": "btn_close"
+ },
+ "onClickBtnCondition1": {
+ "name": "btn_condition1",
+ "idPath": "n9_eiv0",
+ "namePath": "btn_condition1"
+ },
+ "onClickBtnCondition2": {
+ "name": "btn_condition2",
+ "idPath": "n10_eiv0",
+ "namePath": "btn_condition2"
+ },
+ "onClickBtnCondition3": {
+ "name": "btn_condition3",
+ "idPath": "n11_eiv0",
+ "namePath": "btn_condition3"
+ },
+ "onClickBtnCondition4": {
+ "name": "btn_condition4",
+ "idPath": "n12_eiv0",
+ "namePath": "btn_condition4"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Game/GameWindow.json b/demo/extensions-config/fgui/Game/GameWindow.json
new file mode 100644
index 0000000..ac71c42
--- /dev/null
+++ b/demo/extensions-config/fgui/Game/GameWindow.json
@@ -0,0 +1,27 @@
+{
+ "props": {
+ "container": {
+ "name": "container",
+ "idPath": "n0_qphy",
+ "namePath": "container"
+ },
+ "btn_back": {
+ "name": "btn _back",
+ "idPath": "n1_cmn3",
+ "namePath": "btn _back"
+ }
+ },
+ "callbacks": {
+ "onBack": {
+ "name": "btn _back",
+ "idPath": "n1_cmn3",
+ "namePath": "btn _back"
+ },
+ "onCreateEntity": {
+ "name": "btn _add",
+ "idPath": "n2_y5yg",
+ "namePath": "btn _add"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Home/CloseAllWindow.json b/demo/extensions-config/fgui/Home/CloseAllWindow.json
new file mode 100644
index 0000000..6dbd4e0
--- /dev/null
+++ b/demo/extensions-config/fgui/Home/CloseAllWindow.json
@@ -0,0 +1,17 @@
+{
+ "props": {
+ "btn_close": {
+ "name": "btn_close",
+ "idPath": "n4_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "callbacks": {
+ "onClickBtnClose": {
+ "name": "btn_close",
+ "idPath": "n4_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Home/CloseOneWindow.json b/demo/extensions-config/fgui/Home/CloseOneWindow.json
new file mode 100644
index 0000000..6dbd4e0
--- /dev/null
+++ b/demo/extensions-config/fgui/Home/CloseOneWindow.json
@@ -0,0 +1,17 @@
+{
+ "props": {
+ "btn_close": {
+ "name": "btn_close",
+ "idPath": "n4_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "callbacks": {
+ "onClickBtnClose": {
+ "name": "btn_close",
+ "idPath": "n4_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Home/ConditionWindow.json b/demo/extensions-config/fgui/Home/ConditionWindow.json
new file mode 100644
index 0000000..28c4520
--- /dev/null
+++ b/demo/extensions-config/fgui/Home/ConditionWindow.json
@@ -0,0 +1,62 @@
+{
+ "props": {
+ "reddot1": {
+ "name": "reddot1",
+ "idPath": "n7_eiv0",
+ "namePath": "reddot1"
+ },
+ "reddot2": {
+ "name": "reddot2",
+ "idPath": "n8_eiv0",
+ "namePath": "reddot2"
+ },
+ "btn_condition1": {
+ "name": "btn_condition1",
+ "idPath": "n9_eiv0",
+ "namePath": "btn_condition1"
+ },
+ "btn_condition2": {
+ "name": "btn_condition2",
+ "idPath": "n10_eiv0",
+ "namePath": "btn_condition2"
+ },
+ "btn_condition3": {
+ "name": "btn_condition3",
+ "idPath": "n11_eiv0",
+ "namePath": "btn_condition3"
+ },
+ "btn_condition4": {
+ "name": "btn_condition4",
+ "idPath": "n12_eiv0",
+ "namePath": "btn_condition4"
+ }
+ },
+ "callbacks": {
+ "onClickBtnClose": {
+ "name": "btn_close",
+ "idPath": "n4_fnoh",
+ "namePath": "btn_close"
+ },
+ "onClickBtnCondition1": {
+ "name": "btn_condition1",
+ "idPath": "n9_eiv0",
+ "namePath": "btn_condition1"
+ },
+ "onClickBtnCondition2": {
+ "name": "btn_condition2",
+ "idPath": "n10_eiv0",
+ "namePath": "btn_condition2"
+ },
+ "onClickBtnCondition3": {
+ "name": "btn_condition3",
+ "idPath": "n11_eiv0",
+ "namePath": "btn_condition3"
+ },
+ "onClickBtnCondition4": {
+ "name": "btn_condition4",
+ "idPath": "n12_eiv0",
+ "namePath": "btn_condition4"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Home/CustomComponents.json b/demo/extensions-config/fgui/Home/CustomComponents.json
new file mode 100644
index 0000000..7ddfc73
--- /dev/null
+++ b/demo/extensions-config/fgui/Home/CustomComponents.json
@@ -0,0 +1,11 @@
+{
+ "props": {
+ "n1": {
+ "name": "n1",
+ "idPath": "n1_hg37",
+ "namePath": "n1"
+ }
+ },
+ "callbacks": {},
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Home/HideAllWindow.json b/demo/extensions-config/fgui/Home/HideAllWindow.json
new file mode 100644
index 0000000..6dbd4e0
--- /dev/null
+++ b/demo/extensions-config/fgui/Home/HideAllWindow.json
@@ -0,0 +1,17 @@
+{
+ "props": {
+ "btn_close": {
+ "name": "btn_close",
+ "idPath": "n4_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "callbacks": {
+ "onClickBtnClose": {
+ "name": "btn_close",
+ "idPath": "n4_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Home/HideOneWindow.json b/demo/extensions-config/fgui/Home/HideOneWindow.json
new file mode 100644
index 0000000..6dbd4e0
--- /dev/null
+++ b/demo/extensions-config/fgui/Home/HideOneWindow.json
@@ -0,0 +1,17 @@
+{
+ "props": {
+ "btn_close": {
+ "name": "btn_close",
+ "idPath": "n4_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "callbacks": {
+ "onClickBtnClose": {
+ "name": "btn_close",
+ "idPath": "n4_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Home/HomeWindow.json b/demo/extensions-config/fgui/Home/HomeWindow.json
new file mode 100644
index 0000000..b8325ac
--- /dev/null
+++ b/demo/extensions-config/fgui/Home/HomeWindow.json
@@ -0,0 +1,265 @@
+{
+ "props": {
+ "customComponents": {
+ "name": "n0",
+ "idPath": "n0_73ie",
+ "namePath": "n0"
+ },
+ "btn_close": {
+ "name": "n0",
+ "idPath": "n0_73ie",
+ "namePath": "n0"
+ },
+ "t1": {
+ "name": "group22",
+ "idPath": "n10_kofe",
+ "namePath": "group22"
+ },
+ "t2": {
+ "name": "btn3",
+ "idPath": "n4_zmnj",
+ "namePath": "btn3"
+ },
+ "t4": {
+ "name": "n0",
+ "idPath": "n4_zmnj/n0_zmnj",
+ "namePath": "btn3/n0"
+ },
+ "t6": {
+ "name": "n8",
+ "idPath": "n8_p4hj",
+ "namePath": "n8"
+ },
+ "t3": {
+ "name": "btn0",
+ "idPath": "n1_zmnj",
+ "namePath": "btn0"
+ },
+ "t5": {
+ "name": "btn0",
+ "idPath": "n1_zmnj",
+ "namePath": "btn0"
+ },
+ "t7": {
+ "name": "group22",
+ "idPath": "n10_kofe",
+ "namePath": "group22"
+ },
+ "t8": {
+ "name": "n8",
+ "idPath": "n8_p4hj",
+ "namePath": "n8"
+ },
+ "t9": {
+ "name": "n7",
+ "idPath": "n7_fnoh",
+ "namePath": "n7"
+ },
+ "t10": {
+ "name": "group11",
+ "idPath": "n9_kofe",
+ "namePath": "group11"
+ },
+ "t11": {
+ "name": "group33",
+ "idPath": "n11_kofe",
+ "namePath": "group33"
+ },
+ "grauphsss": {
+ "name": "grauph",
+ "idPath": "n0_73ie",
+ "namePath": "grauph"
+ },
+ "customComponentssss": {
+ "name": "com",
+ "idPath": "n8_p4hj",
+ "namePath": "com"
+ },
+ "btn0sss": {
+ "name": "btn0",
+ "idPath": "n1_zmnj",
+ "namePath": "btn0"
+ },
+ "btn2sss": {
+ "name": "btn2",
+ "idPath": "n3_zmnj",
+ "namePath": "btn2"
+ },
+ "btn3sss": {
+ "name": "btn3",
+ "idPath": "n4_zmnj",
+ "namePath": "btn3"
+ },
+ "btn4sss": {
+ "name": "btn4",
+ "idPath": "n5_zmnj",
+ "namePath": "btn4"
+ },
+ "lab_textsss": {
+ "name": "lab_text",
+ "idPath": "n7_fnoh",
+ "namePath": "lab_text"
+ },
+ "group33sss": {
+ "name": "group33",
+ "idPath": "n11_kofe",
+ "namePath": "group33"
+ },
+ "group22sss": {
+ "name": "n0",
+ "idPath": "n0_73ie",
+ "namePath": "n0"
+ },
+ "btn_header1": {
+ "name": "btn_header1",
+ "idPath": "n1_zmnj",
+ "namePath": "btn_header1"
+ },
+ "btn_header2": {
+ "name": "btn_header2",
+ "idPath": "n12_wx4p",
+ "namePath": "btn_header2"
+ },
+ "btn_empty": {
+ "name": "btn_empty",
+ "idPath": "n3_zmnj",
+ "namePath": "btn_empty"
+ },
+ "btn_closeone": {
+ "name": "btn_closeone",
+ "idPath": "n4_zmnj",
+ "namePath": "btn_closeone"
+ },
+ "btn_closeall": {
+ "name": "btn_closeall",
+ "idPath": "n5_zmnj",
+ "namePath": "btn_closeall"
+ },
+ "btn_hideone": {
+ "name": "btn_hideone",
+ "idPath": "n13_wx4p",
+ "namePath": "btn_hideone"
+ },
+ "btn_hideall": {
+ "name": "btn_hideall",
+ "idPath": "n14_wx4p",
+ "namePath": "btn_hideall"
+ },
+ "btn_game": {
+ "name": "btn_game",
+ "idPath": "n16_cmn3",
+ "namePath": "btn_game"
+ }
+ },
+ "callbacks": {
+ "onInit": {
+ "name": "group11",
+ "idPath": "n9_kofe",
+ "namePath": "group11"
+ },
+ "onShow": {
+ "name": "group33",
+ "idPath": "n11_kofe",
+ "namePath": "group33"
+ },
+ "onClick_btn0": {
+ "name": "btn0",
+ "idPath": "n1_zmnj",
+ "namePath": "btn0"
+ },
+ "onClick_btn2": {
+ "name": "btn2",
+ "idPath": "n3_zmnj",
+ "namePath": "btn2"
+ },
+ "onClick_btn3": {
+ "name": "btn3",
+ "idPath": "n4_zmnj",
+ "namePath": "btn3"
+ },
+ "onClick_btn4": {
+ "name": "btn4",
+ "idPath": "n5_zmnj",
+ "namePath": "btn4"
+ },
+ "onClickBtnHeader1": {
+ "name": "btn_header1",
+ "idPath": "n1_zmnj",
+ "namePath": "btn_header1"
+ },
+ "onClickBtnHeader2": {
+ "name": "btn_header2",
+ "idPath": "n12_wx4p",
+ "namePath": "btn_header2"
+ },
+ "onClickBtnEmpty": {
+ "name": "btn_empty",
+ "idPath": "n3_zmnj",
+ "namePath": "btn_empty"
+ },
+ "onClickBtnCloseOne": {
+ "name": "btn_closeone",
+ "idPath": "n4_zmnj",
+ "namePath": "btn_closeone"
+ },
+ "onClickBtnCloseAll": {
+ "name": "btn_closeall",
+ "idPath": "n5_zmnj",
+ "namePath": "btn_closeall"
+ },
+ "onClickBtnHideOne": {
+ "name": "btn_hideone",
+ "idPath": "n13_wx4p",
+ "namePath": "btn_hideone"
+ },
+ "onClickBtnHideAll": {
+ "name": "btn_hideall",
+ "idPath": "n14_wx4p",
+ "namePath": "btn_hideall"
+ },
+ "onClickBtnGame": {
+ "name": "btn_game",
+ "idPath": "n16_cmn3",
+ "namePath": "btn_game"
+ },
+ "onClickBtnCondition": {
+ "name": "btn_condition",
+ "idPath": "n17_eiv0",
+ "namePath": "btn_condition"
+ },
+ "onClickLoadBuffer": {
+ "name": "btn_config",
+ "idPath": "n18_pldv",
+ "namePath": "btn_config"
+ },
+ "onSocketWindow": {
+ "name": "btn_socket",
+ "idPath": "n19_jwlw",
+ "namePath": "btn_socket"
+ },
+ "onClickMiniGame": {
+ "name": "btn_minigame",
+ "idPath": "n20_jevi",
+ "namePath": "btn_minigame"
+ },
+ "onClickBtnHotUpdate": {
+ "name": "btn_hotupdate",
+ "idPath": "n21_bz1o",
+ "namePath": "btn_hotupdate"
+ },
+ "onClickUI": {
+ "name": "btn_ui",
+ "idPath": "n22_sf8l",
+ "namePath": "btn_ui"
+ }
+ },
+ "controls": {
+ "status": "status",
+ "sta2": "sta2"
+ },
+ "transitions": {
+ "t0": "t0",
+ "t1": "t1"
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Home/PopWindow.json b/demo/extensions-config/fgui/Home/PopWindow.json
new file mode 100644
index 0000000..2631385
--- /dev/null
+++ b/demo/extensions-config/fgui/Home/PopWindow.json
@@ -0,0 +1,17 @@
+{
+ "props": {
+ "btn_close": {
+ "name": "btn_close",
+ "idPath": "n2_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "callbacks": {
+ "onCloseWindow": {
+ "name": "btn_close",
+ "idPath": "n2_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Home/PopWindowHeader1.json b/demo/extensions-config/fgui/Home/PopWindowHeader1.json
new file mode 100644
index 0000000..2631385
--- /dev/null
+++ b/demo/extensions-config/fgui/Home/PopWindowHeader1.json
@@ -0,0 +1,17 @@
+{
+ "props": {
+ "btn_close": {
+ "name": "btn_close",
+ "idPath": "n2_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "callbacks": {
+ "onCloseWindow": {
+ "name": "btn_close",
+ "idPath": "n2_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Home/PopWindowHeader2.json b/demo/extensions-config/fgui/Home/PopWindowHeader2.json
new file mode 100644
index 0000000..2631385
--- /dev/null
+++ b/demo/extensions-config/fgui/Home/PopWindowHeader2.json
@@ -0,0 +1,17 @@
+{
+ "props": {
+ "btn_close": {
+ "name": "btn_close",
+ "idPath": "n2_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "callbacks": {
+ "onCloseWindow": {
+ "name": "btn_close",
+ "idPath": "n2_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Home/SocketTestWindow.json b/demo/extensions-config/fgui/Home/SocketTestWindow.json
new file mode 100644
index 0000000..003f73d
--- /dev/null
+++ b/demo/extensions-config/fgui/Home/SocketTestWindow.json
@@ -0,0 +1,47 @@
+{
+ "props": {
+ "text_input": {
+ "name": "text_input",
+ "idPath": "n6_jwlw",
+ "namePath": "text_input"
+ },
+ "text_input_message": {
+ "name": "text_input_message",
+ "idPath": "n9_jwlw",
+ "namePath": "text_input_message"
+ }
+ },
+ "callbacks": {
+ "onCloseWindow": {
+ "name": "btn_close",
+ "idPath": "n2_fnoh",
+ "namePath": "btn_close"
+ },
+ "onDisconnect": {
+ "name": "btn_stop",
+ "idPath": "n5_jwlw",
+ "namePath": "btn_stop"
+ },
+ "onConnection": {
+ "name": "btn_start",
+ "idPath": "n3_jwlw",
+ "namePath": "btn_start"
+ },
+ "onSend": {
+ "name": "btn_send",
+ "idPath": "n4_jwlw",
+ "namePath": "btn_send"
+ },
+ "onSendText": {
+ "name": "btn_send",
+ "idPath": "n4_jwlw",
+ "namePath": "btn_send"
+ },
+ "onSendBinary": {
+ "name": "btn_send_protobuf",
+ "idPath": "n10_fxlq",
+ "namePath": "btn_send_protobuf"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/HotUpdate/HotUpdateWindow.json b/demo/extensions-config/fgui/HotUpdate/HotUpdateWindow.json
new file mode 100644
index 0000000..8cee027
--- /dev/null
+++ b/demo/extensions-config/fgui/HotUpdate/HotUpdateWindow.json
@@ -0,0 +1,37 @@
+{
+ "props": {
+ "btn_close": {
+ "name": "btn_close",
+ "idPath": "n24_jevi",
+ "namePath": "btn_close"
+ },
+ "lab_version": {
+ "name": "lab_version",
+ "idPath": "n25_74au",
+ "namePath": "lab_version"
+ },
+ "lab_desc": {
+ "name": "lab_desc",
+ "idPath": "n26_74au",
+ "namePath": "lab_desc"
+ }
+ },
+ "callbacks": {
+ "onCheckUpdate": {
+ "name": "btn_check",
+ "idPath": "n1_zmnj",
+ "namePath": "btn_check"
+ },
+ "onStartUpdate": {
+ "name": "btn_update",
+ "idPath": "n22_jevi",
+ "namePath": "btn_update"
+ },
+ "onClickClose": {
+ "name": "btn_close",
+ "idPath": "n24_jevi",
+ "namePath": "btn_close"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/MiniGame/MiniGameWindow.json b/demo/extensions-config/fgui/MiniGame/MiniGameWindow.json
new file mode 100644
index 0000000..a0a7f8c
--- /dev/null
+++ b/demo/extensions-config/fgui/MiniGame/MiniGameWindow.json
@@ -0,0 +1,37 @@
+{
+ "props": {
+ "btn_close": {
+ "name": "btn_close",
+ "idPath": "n24_jevi",
+ "namePath": "btn_close"
+ },
+ "lab_adid": {
+ "name": "lab_adid",
+ "idPath": "n25_jevi",
+ "namePath": "lab_adid"
+ },
+ "lab_payQuantity": {
+ "name": "lab_pay",
+ "idPath": "n28_jevi",
+ "namePath": "lab_pay"
+ }
+ },
+ "callbacks": {
+ "onClickBtnPay": {
+ "name": "btn_pay",
+ "idPath": "n22_jevi",
+ "namePath": "btn_pay"
+ },
+ "onClickBtnInitAds": {
+ "name": "btn_ads",
+ "idPath": "n1_zmnj",
+ "namePath": "btn_ads"
+ },
+ "onClickBtnClose": {
+ "name": "btn_close",
+ "idPath": "n24_jevi",
+ "namePath": "btn_close"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Socket/SocketTestWindow.json b/demo/extensions-config/fgui/Socket/SocketTestWindow.json
new file mode 100644
index 0000000..5dddd57
--- /dev/null
+++ b/demo/extensions-config/fgui/Socket/SocketTestWindow.json
@@ -0,0 +1,42 @@
+{
+ "props": {
+ "text_input": {
+ "name": "text_input",
+ "idPath": "n6_jwlw",
+ "namePath": "text_input"
+ },
+ "text_input_message": {
+ "name": "text_input_message",
+ "idPath": "n9_jwlw",
+ "namePath": "text_input_message"
+ }
+ },
+ "callbacks": {
+ "onCloseWindow": {
+ "name": "btn_close",
+ "idPath": "n2_fnoh",
+ "namePath": "btn_close"
+ },
+ "onDisconnect": {
+ "name": "btn_stop",
+ "idPath": "n5_jwlw",
+ "namePath": "btn_stop"
+ },
+ "onConnection": {
+ "name": "btn_start",
+ "idPath": "n3_jwlw",
+ "namePath": "btn_start"
+ },
+ "onSendText": {
+ "name": "btn_send",
+ "idPath": "n4_jwlw",
+ "namePath": "btn_send"
+ },
+ "onSendBinary": {
+ "name": "btn_send_protobuf",
+ "idPath": "n10_fxlq",
+ "namePath": "btn_send_protobuf"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Window/CloseAllWindow.json b/demo/extensions-config/fgui/Window/CloseAllWindow.json
new file mode 100644
index 0000000..6dbd4e0
--- /dev/null
+++ b/demo/extensions-config/fgui/Window/CloseAllWindow.json
@@ -0,0 +1,17 @@
+{
+ "props": {
+ "btn_close": {
+ "name": "btn_close",
+ "idPath": "n4_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "callbacks": {
+ "onClickBtnClose": {
+ "name": "btn_close",
+ "idPath": "n4_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Window/CloseOneWindow.json b/demo/extensions-config/fgui/Window/CloseOneWindow.json
new file mode 100644
index 0000000..6dbd4e0
--- /dev/null
+++ b/demo/extensions-config/fgui/Window/CloseOneWindow.json
@@ -0,0 +1,17 @@
+{
+ "props": {
+ "btn_close": {
+ "name": "btn_close",
+ "idPath": "n4_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "callbacks": {
+ "onClickBtnClose": {
+ "name": "btn_close",
+ "idPath": "n4_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Window/CustomComponents.json b/demo/extensions-config/fgui/Window/CustomComponents.json
new file mode 100644
index 0000000..7ddfc73
--- /dev/null
+++ b/demo/extensions-config/fgui/Window/CustomComponents.json
@@ -0,0 +1,11 @@
+{
+ "props": {
+ "n1": {
+ "name": "n1",
+ "idPath": "n1_hg37",
+ "namePath": "n1"
+ }
+ },
+ "callbacks": {},
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Window/HideAllWindow.json b/demo/extensions-config/fgui/Window/HideAllWindow.json
new file mode 100644
index 0000000..6dbd4e0
--- /dev/null
+++ b/demo/extensions-config/fgui/Window/HideAllWindow.json
@@ -0,0 +1,17 @@
+{
+ "props": {
+ "btn_close": {
+ "name": "btn_close",
+ "idPath": "n4_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "callbacks": {
+ "onClickBtnClose": {
+ "name": "btn_close",
+ "idPath": "n4_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Window/HideOneWindow.json b/demo/extensions-config/fgui/Window/HideOneWindow.json
new file mode 100644
index 0000000..6dbd4e0
--- /dev/null
+++ b/demo/extensions-config/fgui/Window/HideOneWindow.json
@@ -0,0 +1,17 @@
+{
+ "props": {
+ "btn_close": {
+ "name": "btn_close",
+ "idPath": "n4_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "callbacks": {
+ "onClickBtnClose": {
+ "name": "btn_close",
+ "idPath": "n4_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Window/PopWindow.json b/demo/extensions-config/fgui/Window/PopWindow.json
new file mode 100644
index 0000000..2631385
--- /dev/null
+++ b/demo/extensions-config/fgui/Window/PopWindow.json
@@ -0,0 +1,17 @@
+{
+ "props": {
+ "btn_close": {
+ "name": "btn_close",
+ "idPath": "n2_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "callbacks": {
+ "onCloseWindow": {
+ "name": "btn_close",
+ "idPath": "n2_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Window/PopWindowHeader1.json b/demo/extensions-config/fgui/Window/PopWindowHeader1.json
new file mode 100644
index 0000000..2631385
--- /dev/null
+++ b/demo/extensions-config/fgui/Window/PopWindowHeader1.json
@@ -0,0 +1,17 @@
+{
+ "props": {
+ "btn_close": {
+ "name": "btn_close",
+ "idPath": "n2_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "callbacks": {
+ "onCloseWindow": {
+ "name": "btn_close",
+ "idPath": "n2_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Window/PopWindowHeader2.json b/demo/extensions-config/fgui/Window/PopWindowHeader2.json
new file mode 100644
index 0000000..2631385
--- /dev/null
+++ b/demo/extensions-config/fgui/Window/PopWindowHeader2.json
@@ -0,0 +1,17 @@
+{
+ "props": {
+ "btn_close": {
+ "name": "btn_close",
+ "idPath": "n2_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "callbacks": {
+ "onCloseWindow": {
+ "name": "btn_close",
+ "idPath": "n2_fnoh",
+ "namePath": "btn_close"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/extensions-config/fgui/Window/UIBaseWindow.json b/demo/extensions-config/fgui/Window/UIBaseWindow.json
new file mode 100644
index 0000000..f47626b
--- /dev/null
+++ b/demo/extensions-config/fgui/Window/UIBaseWindow.json
@@ -0,0 +1,46 @@
+{
+ "props": {},
+ "callbacks": {
+ "onClickBtnHeader1": {
+ "name": "btn_header1",
+ "idPath": "n1_zmnj",
+ "namePath": "btn_header1"
+ },
+ "onClickBtnHeader2": {
+ "name": "btn_header2",
+ "idPath": "n12_wx4p",
+ "namePath": "btn_header2"
+ },
+ "onClickBtnCloseOne": {
+ "name": "btn_closeone",
+ "idPath": "n4_zmnj",
+ "namePath": "btn_closeone"
+ },
+ "onClickBtnCloseAll": {
+ "name": "btn_closeall",
+ "idPath": "n5_zmnj",
+ "namePath": "btn_closeall"
+ },
+ "onClickBtnHideOne": {
+ "name": "btn_hideone",
+ "idPath": "n13_wx4p",
+ "namePath": "btn_hideone"
+ },
+ "onClickBtnHideAll": {
+ "name": "btn_hideall",
+ "idPath": "n14_wx4p",
+ "namePath": "btn_hideall"
+ },
+ "onClickBtnEmpty": {
+ "name": "btn_empty",
+ "idPath": "n3_zmnj",
+ "namePath": "btn_empty"
+ },
+ "onClickBtnClose": {
+ "name": "btn_close",
+ "idPath": "n22_sf8l",
+ "namePath": "btn_close"
+ }
+ },
+ "__version__": "0.0.1"
+}
\ No newline at end of file
diff --git a/demo/lib.d.ts/SDKHelper.d.ts b/demo/lib.d.ts/SDKHelper.d.ts
new file mode 100644
index 0000000..7b777b4
--- /dev/null
+++ b/demo/lib.d.ts/SDKHelper.d.ts
@@ -0,0 +1,16 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-03-21
+ * @Description:
+ */
+
+declare namespace KunpoSDK {
+ class SDKHelper {
+ static getInstance(): SDKHelper;
+
+ public getSystemInfo(): void;
+ public getVersionCode(): string;
+ public getBuildCode(): number;
+
+ }
+}
diff --git a/demo/native/engine/android/.gitignore b/demo/native/engine/android/.gitignore
new file mode 100644
index 0000000..9c4de58
--- /dev/null
+++ b/demo/native/engine/android/.gitignore
@@ -0,0 +1,7 @@
+.gradle
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
+/captures
diff --git a/demo/native/engine/android/CMakeLists.txt b/demo/native/engine/android/CMakeLists.txt
new file mode 100755
index 0000000..4b8243d
--- /dev/null
+++ b/demo/native/engine/android/CMakeLists.txt
@@ -0,0 +1,20 @@
+cmake_minimum_required(VERSION 3.8)
+
+option(APP_NAME "Project Name" "kunpocreator")
+project(${APP_NAME} CXX)
+set(CC_LIB_NAME cocos)
+set(CC_PROJECT_DIR ${CMAKE_CURRENT_LIST_DIR})
+set(CC_PROJ_SOURCES)
+set(CC_COMMON_SOURCES)
+set(CC_ALL_SOURCES)
+
+include(${CMAKE_CURRENT_LIST_DIR}/../common/CMakeLists.txt)
+
+list(APPEND CC_COMMON_SOURCES
+ ${CMAKE_CURRENT_LIST_DIR}/../common/Classes/JNIAndroid/JniTools.h
+ ${CMAKE_CURRENT_LIST_DIR}/../common/Classes/JNIAndroid/JniTools.cpp
+)
+
+cc_android_before_target(${CC_LIB_NAME})
+add_library(${CC_LIB_NAME} SHARED ${CC_ALL_SOURCES})
+cc_android_after_target(${CC_LIB_NAME})
diff --git a/demo/native/engine/android/Post-service.cmake b/demo/native/engine/android/Post-service.cmake
new file mode 100644
index 0000000..16fd033
--- /dev/null
+++ b/demo/native/engine/android/Post-service.cmake
@@ -0,0 +1 @@
+# Supported for Cocos Service!
\ No newline at end of file
diff --git a/demo/native/engine/android/Pre-service.cmake b/demo/native/engine/android/Pre-service.cmake
new file mode 100644
index 0000000..16fd033
--- /dev/null
+++ b/demo/native/engine/android/Pre-service.cmake
@@ -0,0 +1 @@
+# Supported for Cocos Service!
\ No newline at end of file
diff --git a/demo/native/engine/android/app/AndroidManifest.xml b/demo/native/engine/android/app/AndroidManifest.xml
new file mode 100644
index 0000000..ea0b2d1
--- /dev/null
+++ b/demo/native/engine/android/app/AndroidManifest.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/native/engine/android/app/build.gradle b/demo/native/engine/android/app/build.gradle
new file mode 100644
index 0000000..f0d12fa
--- /dev/null
+++ b/demo/native/engine/android/app/build.gradle
@@ -0,0 +1,113 @@
+import org.apache.tools.ant.taskdefs.condition.Os
+
+apply plugin: 'com.android.application'
+
+RES_PATH = RES_PATH.replace("\\", "/")
+COCOS_ENGINE_PATH = COCOS_ENGINE_PATH.replace("\\", "/")
+
+buildDir = "${RES_PATH}/proj/build/${project.name ==~ /^[_a-zA-Z0-9-]+$/ ? project.name : 'CocosGame'}"
+android {
+ compileSdkVersion PROP_COMPILE_SDK_VERSION.toInteger()
+ buildToolsVersion PROP_BUILD_TOOLS_VERSION
+ ndkPath PROP_NDK_PATH
+ namespace APPLICATION_ID
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ defaultConfig {
+ applicationId APPLICATION_ID
+ minSdkVersion PROP_MIN_SDK_VERSION
+ targetSdkVersion PROP_TARGET_SDK_VERSION
+ versionCode 1
+ versionName "0.0.1"
+
+ externalNativeBuild {
+ cmake {
+ targets "cocos"
+ arguments "-DRES_DIR=${RES_PATH}", "-DANDROID_STL=c++_static", "-DANDROID_TOOLCHAIN=clang", "-DANDROID_ARM_NEON=TRUE"
+ }
+ ndk { abiFilters PROP_APP_ABI.split(':') }
+ }
+ }
+
+ sourceSets.main {
+ java.srcDirs "../src", "src"
+ res.srcDirs "../res", 'res', "${RES_PATH}/proj/res"
+ jniLibs.srcDirs "../libs", 'libs'
+ manifest.srcFile "AndroidManifest.xml"
+ assets.srcDir "${RES_PATH}/data"
+ jniLibs {
+ // Vulkan validation layer
+ // srcDir "${android.ndkDirectory}/sources/third_party/vulkan/src/build-android/jniLibs"
+ }
+ }
+
+ externalNativeBuild {
+ cmake {
+ version "3.22.1"
+ path "../CMakeLists.txt"
+ buildStagingDirectory "${RES_PATH}/proj/build"
+ }
+ }
+
+ signingConfigs {
+
+ release {
+ if (project.hasProperty("RELEASE_STORE_FILE") && !RELEASE_STORE_FILE.isEmpty()) {
+ storeFile file(RELEASE_STORE_FILE)
+ storePassword RELEASE_STORE_PASSWORD
+ keyAlias RELEASE_KEY_ALIAS
+ keyPassword RELEASE_KEY_PASSWORD
+ }
+ }
+ }
+
+ buildTypes {
+ release {
+ debuggable false
+ jniDebuggable false
+ renderscriptDebuggable false
+ minifyEnabled true
+ shrinkResources true
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ if (project.hasProperty("RELEASE_STORE_FILE")) {
+ signingConfig signingConfigs.release
+ }
+
+ externalNativeBuild {
+ cmake {
+ // switch HIDE_SYMBOLS to OFF to skip compilation flag `-fvisibility=hidden`
+ arguments "-DHIDE_SYMBOLS=ON"
+ }
+ }
+
+ if (!Boolean.parseBoolean(PROP_IS_DEBUG)) {
+ getIsDefault().set(true)
+ }
+
+ }
+
+ debug {
+ debuggable true
+ jniDebuggable true
+ renderscriptDebuggable true
+ // resValue "string", "app_name", "${PROP_APP_NAME}-dbg"
+ // applicationIdSuffix ".debug"
+ }
+ }
+}
+
+dependencies {
+ implementation fileTree(dir: '../libs', include: ['*.jar','*.aar'])
+ implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
+ implementation fileTree(dir: "${COCOS_ENGINE_PATH}/cocos/platform/android/java/libs", include: ['*.jar'])
+ implementation project(':libservice')
+ implementation project(':libcocos')
+ if (Boolean.parseBoolean(PROP_ENABLE_INPUTSDK)) {
+ implementation 'com.google.android.libraries.play.games:inputmapping:1.1.0-beta'
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:1.4.10"
+ }
+}
diff --git a/demo/native/engine/android/app/proguard-rules.pro b/demo/native/engine/android/app/proguard-rules.pro
new file mode 100644
index 0000000..2dfbe31
--- /dev/null
+++ b/demo/native/engine/android/app/proguard-rules.pro
@@ -0,0 +1,57 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in E:\developSoftware\Android\SDK/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Proguard Cocos2d-x-lite for release
+-keep public class com.cocos.** { *; }
+-dontwarn com.cocos.**
+
+# Proguard Apache HTTP for release
+-keep class org.apache.http.** { *; }
+-dontwarn org.apache.http.**
+
+-keep public class com.kunpo.** { *; }
+-dontwarn com.kunpo.**
+
+# Proguard okhttp for release
+-keep class okhttp3.** { *; }
+-dontwarn okhttp3.**
+
+-keep class okio.** { *; }
+-dontwarn okio.**
+
+# Proguard Android Webivew for release. you can comment if you are not using a webview
+-keep public class android.net.http.SslError
+-keep public class android.webkit.WebViewClient
+
+-keep public class com.google.** { *; }
+
+-dontwarn android.webkit.WebView
+-dontwarn android.net.http.SslError
+-dontwarn android.webkit.WebViewClient
+
+# This is generated automatically by the Android Gradle plugin.
+-dontwarn android.hardware.BatteryState
+-dontwarn android.hardware.lights.Light
+-dontwarn android.hardware.lights.LightState$Builder
+-dontwarn android.hardware.lights.LightState
+-dontwarn android.hardware.lights.LightsManager$LightsSession
+-dontwarn android.hardware.lights.LightsManager
+-dontwarn android.hardware.lights.LightsRequest$Builder
+-dontwarn android.hardware.lights.LightsRequest
+-dontwarn android.net.ssl.SSLSockets
+-dontwarn android.os.VibratorManager
\ No newline at end of file
diff --git a/demo/native/engine/android/app/src/com/cocos/game/AppActivity.java b/demo/native/engine/android/app/src/com/cocos/game/AppActivity.java
new file mode 100644
index 0000000..7e38923
--- /dev/null
+++ b/demo/native/engine/android/app/src/com/cocos/game/AppActivity.java
@@ -0,0 +1,130 @@
+/****************************************************************************
+Copyright (c) 2015-2016 Chukong Technologies Inc.
+Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
+
+http://www.cocos2d-x.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+****************************************************************************/
+package com.cocos.game;
+
+import android.os.Bundle;
+import android.content.Intent;
+import android.content.res.Configuration;
+import android.view.WindowManager;
+
+import com.cocos.service.SDKWrapper;
+import com.cocos.lib.CocosActivity;
+import com.kunpo.KunpoHelper;
+
+public class AppActivity extends CocosActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ // DO OTHER INITIALIZATION BELOW
+ SDKWrapper.shared().init(this);
+ KunpoHelper.setActivity(this);
+ // 保持屏幕常亮
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ SDKWrapper.shared().onResume();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ SDKWrapper.shared().onPause();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ // Workaround in https://stackoverflow.com/questions/16283079/re-launch-of-activity-on-home-button-but-only-the-first-time/16447508
+ if (!isTaskRoot()) {
+ return;
+ }
+ SDKWrapper.shared().onDestroy();
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ SDKWrapper.shared().onActivityResult(requestCode, resultCode, data);
+ }
+
+ @Override
+ protected void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+ SDKWrapper.shared().onNewIntent(intent);
+ }
+
+ @Override
+ protected void onRestart() {
+ super.onRestart();
+ SDKWrapper.shared().onRestart();
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ SDKWrapper.shared().onStop();
+ }
+
+ @Override
+ public void onBackPressed() {
+ SDKWrapper.shared().onBackPressed();
+ super.onBackPressed();
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ SDKWrapper.shared().onConfigurationChanged(newConfig);
+ super.onConfigurationChanged(newConfig);
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Bundle savedInstanceState) {
+ SDKWrapper.shared().onRestoreInstanceState(savedInstanceState);
+ super.onRestoreInstanceState(savedInstanceState);
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ SDKWrapper.shared().onSaveInstanceState(outState);
+ super.onSaveInstanceState(outState);
+ }
+
+ @Override
+ protected void onStart() {
+ SDKWrapper.shared().onStart();
+ super.onStart();
+ }
+
+ @Override
+ public void onLowMemory() {
+ SDKWrapper.shared().onLowMemory();
+ super.onLowMemory();
+ }
+}
diff --git a/demo/native/engine/android/app/src/com/kunpo/KunpoHelper.java b/demo/native/engine/android/app/src/com/kunpo/KunpoHelper.java
new file mode 100644
index 0000000..0ade73f
--- /dev/null
+++ b/demo/native/engine/android/app/src/com/kunpo/KunpoHelper.java
@@ -0,0 +1,47 @@
+package com.kunpo;
+
+import android.app.Activity;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.util.Log;
+
+public class KunpoHelper {
+ private static final String TAG = "kunpo helper::";
+
+ private static Activity _activity = null;
+ public static void setActivity(Activity activity) {
+ _activity = activity;
+ }
+
+ public static void getSystemInfo() {
+
+ }
+
+ public static String getVersionCode() {
+ String localVersion = "0.0.1";
+ try {
+ PackageInfo packageInfo = _activity.getApplicationContext().getPackageManager().getPackageInfo(_activity.getPackageName(), 0);
+ localVersion = packageInfo.versionName;
+ } catch (PackageManager.NameNotFoundException e) {
+ e.printStackTrace();
+ }
+ return localVersion;
+ }
+
+ public static int getBuildCode() {
+ int localVersion = 0;
+ try {
+ PackageInfo packageInfo = _activity.getApplicationContext().getPackageManager().getPackageInfo(_activity.getPackageName(), 0);
+ localVersion = packageInfo.versionCode;
+ } catch (PackageManager.NameNotFoundException e) {
+ e.printStackTrace();
+ }
+ return localVersion;
+ }
+
+ /**
+ * 回调给JS层的接口
+ * @param json 格式 { function: string, args: string }
+ */
+ public static native void CallJS(String json);
+}
diff --git a/demo/native/engine/android/build-cfg.json b/demo/native/engine/android/build-cfg.json
new file mode 100644
index 0000000..fb658e2
--- /dev/null
+++ b/demo/native/engine/android/build-cfg.json
@@ -0,0 +1,8 @@
+{
+ "ndk_module_path" :[
+ "${COCOS_ROOT}",
+ "${COCOS_ROOT}/cocos",
+ "${COCOS_ROOT}/external"
+ ],
+ "copy_resources": []
+}
diff --git a/demo/native/engine/android/build.gradle b/demo/native/engine/android/build.gradle
new file mode 100644
index 0000000..84203e0
--- /dev/null
+++ b/demo/native/engine/android/build.gradle
@@ -0,0 +1,28 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+
+ repositories {
+ google()
+ mavenCentral()
+ // jcenter() // keeped as anchor, will be removed soon
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:8.0.2'
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ // jcenter() // keeped as anchor, will be removed soon
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/demo/native/engine/android/instantapp/AndroidManifest.xml b/demo/native/engine/android/instantapp/AndroidManifest.xml
new file mode 100644
index 0000000..68fab0f
--- /dev/null
+++ b/demo/native/engine/android/instantapp/AndroidManifest.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/native/engine/android/instantapp/build.gradle b/demo/native/engine/android/instantapp/build.gradle
new file mode 100644
index 0000000..4336667
--- /dev/null
+++ b/demo/native/engine/android/instantapp/build.gradle
@@ -0,0 +1,100 @@
+import org.apache.tools.ant.taskdefs.condition.Os
+
+apply plugin: 'com.android.application'
+
+RES_PATH = RES_PATH.replace("\\", "/")
+COCOS_ENGINE_PATH = COCOS_ENGINE_PATH.replace("\\", "/")
+buildDir = "${RES_PATH}/proj/build/instantapp"
+
+android {
+ compileSdkVersion PROP_COMPILE_SDK_VERSION.toInteger()
+ buildToolsVersion PROP_BUILD_TOOLS_VERSION
+ ndkPath PROP_NDK_PATH
+ namespace APPLICATION_ID
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ defaultConfig {
+ minSdkVersion PROP_MIN_SDK_VERSION
+ targetSdkVersion PROP_TARGET_SDK_VERSION
+ versionCode 1
+ versionName "1.0"
+
+ externalNativeBuild {
+ cmake {
+ targets "cocos"
+ arguments "-DRES_DIR=${RES_PATH}", "-DCOCOS_X_PATH=${COCOS_ENGINE_PATH}","-DANDROID_STL=c++_static", "-DANDROID_TOOLCHAIN=clang", "-DANDROID_ARM_NEON=TRUE", "-DANDROID_LD=gold"
+ cppFlags "-frtti -fexceptions -fsigned-char -DANDROID_INSTANT=1"
+ }
+ ndk { abiFilters PROP_APP_ABI.split(':') }
+ }
+ }
+
+ sourceSets.main {
+ java.srcDirs "../src", "src"
+ res.srcDirs "../res", 'res', "${RES_PATH}/proj/res"
+ jniLibs.srcDirs "../libs", 'libs'
+ manifest.srcFile "AndroidManifest.xml"
+ assets.srcDir "${RES_PATH}/data"
+ }
+
+ externalNativeBuild {
+ cmake {
+ version "3.22.1"
+ path "../CMakeLists.txt"
+ buildStagingDirectory "${RES_PATH}/proj/build"
+ }
+ }
+
+ signingConfigs {
+
+ release {
+ if (project.hasProperty("RELEASE_STORE_FILE") && !RELEASE_STORE_FILE.isEmpty()) {
+ storeFile file(RELEASE_STORE_FILE)
+ storePassword RELEASE_STORE_PASSWORD
+ keyAlias RELEASE_KEY_ALIAS
+ keyPassword RELEASE_KEY_PASSWORD
+ }
+ }
+ }
+
+ buildTypes {
+ release {
+ debuggable false
+ jniDebuggable false
+ renderscriptDebuggable false
+ minifyEnabled true
+ shrinkResources true
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ if (project.hasProperty("RELEASE_STORE_FILE")) {
+ signingConfig signingConfigs.release
+ }
+
+ externalNativeBuild {
+ cmake {
+ // switch HIDE_SYMBOLS to OFF to skip compilation flag `-fvisibility=hidden`
+ arguments "-DHIDE_SYMBOLS=ON"
+ }
+ }
+ }
+
+ debug {
+ debuggable true
+ jniDebuggable true
+ renderscriptDebuggable true
+ // resValue "string", "app_name", "${PROP_APP_NAME}-dbg"
+ // applicationIdSuffix ".debug"
+ }
+ }
+}
+
+dependencies {
+ implementation fileTree(dir: '../libs', include: ['*.jar','*.aar'])
+ implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
+ implementation fileTree(dir: "${COCOS_ENGINE_PATH}/cocos/platform/android/java/libs", include: ['*.jar'])
+ implementation project(':libservice')
+ implementation project(':libcocos')
+}
diff --git a/demo/native/engine/android/instantapp/proguard-rules.pro b/demo/native/engine/android/instantapp/proguard-rules.pro
new file mode 100644
index 0000000..fc884b7
--- /dev/null
+++ b/demo/native/engine/android/instantapp/proguard-rules.pro
@@ -0,0 +1,54 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in E:\developSoftware\Android\SDK/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Proguard Cocos2d-x-lite for release
+-keep public class com.cocos.** { *; }
+-dontwarn com.cocos.**
+
+# Proguard Apache HTTP for release
+-keep class org.apache.http.** { *; }
+-dontwarn org.apache.http.**
+
+# Proguard okhttp for release
+-keep class okhttp3.** { *; }
+-dontwarn okhttp3.**
+
+-keep class okio.** { *; }
+-dontwarn okio.**
+
+# Proguard Android Webivew for release. you can comment if you are not using a webview
+-keep public class android.net.http.SslError
+-keep public class android.webkit.WebViewClient
+
+-keep public class com.google.** { *; }
+
+-dontwarn android.webkit.WebView
+-dontwarn android.net.http.SslError
+-dontwarn android.webkit.WebViewClient
+
+# This is generated automatically by the Android Gradle plugin.
+-dontwarn android.hardware.BatteryState
+-dontwarn android.hardware.lights.Light
+-dontwarn android.hardware.lights.LightState$Builder
+-dontwarn android.hardware.lights.LightState
+-dontwarn android.hardware.lights.LightsManager$LightsSession
+-dontwarn android.hardware.lights.LightsManager
+-dontwarn android.hardware.lights.LightsRequest$Builder
+-dontwarn android.hardware.lights.LightsRequest
+-dontwarn android.net.ssl.SSLSockets
+-dontwarn android.os.VibratorManager
\ No newline at end of file
diff --git a/demo/native/engine/android/instantapp/src/com/cocos/game/InstantActivity.java b/demo/native/engine/android/instantapp/src/com/cocos/game/InstantActivity.java
new file mode 100644
index 0000000..318e839
--- /dev/null
+++ b/demo/native/engine/android/instantapp/src/com/cocos/game/InstantActivity.java
@@ -0,0 +1,125 @@
+/****************************************************************************
+Copyright (c) 2015-2016 Chukong Technologies Inc.
+Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
+
+http://www.cocos2d-x.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+****************************************************************************/
+package com.cocos.game;
+
+import android.os.Bundle;
+import android.content.Intent;
+import android.content.res.Configuration;
+
+import com.cocos.service.SDKWrapper;
+import com.cocos.lib.CocosActivity;
+
+public class InstantActivity extends CocosActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ // DO OTHER INITIALIZATION BELOW
+ SDKWrapper.shared().init(this);
+
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ SDKWrapper.shared().onResume();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ SDKWrapper.shared().onPause();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ // Workaround in https://stackoverflow.com/questions/16283079/re-launch-of-activity-on-home-button-but-only-the-first-time/16447508
+ if (!isTaskRoot()) {
+ return;
+ }
+ SDKWrapper.shared().onDestroy();
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ SDKWrapper.shared().onActivityResult(requestCode, resultCode, data);
+ }
+
+ @Override
+ protected void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+ SDKWrapper.shared().onNewIntent(intent);
+ }
+
+ @Override
+ protected void onRestart() {
+ super.onRestart();
+ SDKWrapper.shared().onRestart();
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ SDKWrapper.shared().onStop();
+ }
+
+ @Override
+ public void onBackPressed() {
+ SDKWrapper.shared().onBackPressed();
+ super.onBackPressed();
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ SDKWrapper.shared().onConfigurationChanged(newConfig);
+ super.onConfigurationChanged(newConfig);
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Bundle savedInstanceState) {
+ SDKWrapper.shared().onRestoreInstanceState(savedInstanceState);
+ super.onRestoreInstanceState(savedInstanceState);
+ }
+
+ @Override
+ protected void onSaveInstanceState(Bundle outState) {
+ SDKWrapper.shared().onSaveInstanceState(outState);
+ super.onSaveInstanceState(outState);
+ }
+
+ @Override
+ protected void onStart() {
+ SDKWrapper.shared().onStart();
+ super.onStart();
+ }
+
+ @Override
+ public void onLowMemory() {
+ SDKWrapper.shared().onLowMemory();
+ super.onLowMemory();
+ }
+}
diff --git a/demo/native/engine/android/res/mipmap-hdpi/ic_launcher.png b/demo/native/engine/android/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..888c0d5
Binary files /dev/null and b/demo/native/engine/android/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/demo/native/engine/android/res/mipmap-mdpi/ic_launcher.png b/demo/native/engine/android/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..d5e3c77
Binary files /dev/null and b/demo/native/engine/android/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/demo/native/engine/android/res/mipmap-xhdpi/ic_launcher.png b/demo/native/engine/android/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..2b6f32a
Binary files /dev/null and b/demo/native/engine/android/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/demo/native/engine/android/res/mipmap-xxhdpi/ic_launcher.png b/demo/native/engine/android/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..2f1e5a6
Binary files /dev/null and b/demo/native/engine/android/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/demo/native/engine/android/res/mipmap-xxxhdpi/ic_launcher.png b/demo/native/engine/android/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..a9ebc79
Binary files /dev/null and b/demo/native/engine/android/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/demo/native/engine/android/res/values/strings.xml b/demo/native/engine/android/res/values/strings.xml
new file mode 100644
index 0000000..8542005
--- /dev/null
+++ b/demo/native/engine/android/res/values/strings.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/demo/native/engine/common/.gitignore b/demo/native/engine/common/.gitignore
new file mode 100644
index 0000000..fc9806a
--- /dev/null
+++ b/demo/native/engine/common/.gitignore
@@ -0,0 +1 @@
+localCfg.cmake
\ No newline at end of file
diff --git a/demo/native/engine/common/CMakeLists.txt b/demo/native/engine/common/CMakeLists.txt
new file mode 100755
index 0000000..9a79c0b
--- /dev/null
+++ b/demo/native/engine/common/CMakeLists.txt
@@ -0,0 +1,64 @@
+enable_language(C ASM)
+set(DEVELOPMENT_TEAM "" CACHE STRING "APPLE Developtment Team")
+set(RES_DIR "" CACHE STRING "Resource path")
+set(COCOS_X_PATH "" CACHE STRING "Path to engine/native/")
+
+set(TARGET_OSX_VERSION "10.14" CACHE STRING "Target MacOSX version" FORCE)
+set(TARGET_IOS_VERSION "11.0" CACHE STRING "Target iOS version" FORCE)
+
+set(CMAKE_CXX_STANDARD 17)
+option(CC_DEBUG_FORCE "Force enable CC_DEBUG in release mode" OFF)
+option(USE_SE_V8 "Use V8 JavaScript Engine" ON)
+option(USE_SE_JSVM "Use JSVM JavaScript Engine" OFF)
+option(USE_SE_JSC "Use JavaScriptCore on MacOSX/iOS" OFF)
+option(USE_V8_DEBUGGER "Compile v8 inspector ws server" ON)
+option(USE_V8_DEBUGGER_FORCE "Force enable debugger in release mode" OFF)
+option(USE_SOCKET "Enable WebSocket & SocketIO" ON)
+option(USE_AUDIO "Enable Audio" ON) #Enable AudioEngine
+option(USE_EDIT_BOX "Enable EditBox" ON)
+option(USE_VIDEO "Enable VideoPlayer Component" ON)
+option(USE_WEBVIEW "Enable WebView Component" ON)
+option(USE_MIDDLEWARE "Enable Middleware" ON)
+option(USE_DRAGONBONES "Enable Dragonbones" ON)
+option(USE_SPINE_3_8 "Enable Spine 3.8" ON)
+option(USE_SPINE_4_2 "Enable Spine 4.2" OFF)
+option(USE_WEBSOCKET_SERVER "Enable WebSocket Server" OFF)
+option(USE_JOB_SYSTEM_TASKFLOW "Use taskflow as job system backend" OFF)
+option(USE_JOB_SYSTEM_TBB "Use tbb as job system backend" OFF)
+option(USE_PHYSICS_PHYSX "Use PhysX Physics" ON)
+option(USE_OCCLUSION_QUERY "Use Occlusion Query" ON)
+option(USE_DEBUG_RENDERER "Use Debug Renderer" ON)
+option(USE_GEOMETRY_RENDERER "Use Geometry Renderer" ON)
+option(USE_WEBP "Use Webp" ON)
+
+if(NOT RES_DIR)
+ message(FATAL_ERROR "RES_DIR is not set!")
+endif()
+
+include(${RES_DIR}/proj/cfg.cmake)
+
+if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/localCfg.cmake)
+ include(${CMAKE_CURRENT_LIST_DIR}/localCfg.cmake)
+endif()
+
+if(NOT COCOS_X_PATH)
+ message(FATAL_ERROR "COCOS_X_PATH is not set!")
+endif()
+
+if(USE_XR OR USE_AR_MODULE)
+ include(${CMAKE_CURRENT_LIST_DIR}/xr.cmake)
+endif()
+
+include(${COCOS_X_PATH}/CMakeLists.txt)
+
+list(APPEND CC_COMMON_SOURCES
+ ${CMAKE_CURRENT_LIST_DIR}/Classes/Game.h
+ ${CMAKE_CURRENT_LIST_DIR}/Classes/Game.cpp
+
+ ############### 添加生成的绑定类 ##############
+ ${CMAKE_CURRENT_LIST_DIR}/Classes/SDKHelper.h
+ ${CMAKE_CURRENT_LIST_DIR}/Classes/SDKHelper.cpp
+
+ ${CMAKE_CURRENT_LIST_DIR}/Classes/bindings/auto/jsb_SDKHelper_auto.h
+ ${CMAKE_CURRENT_LIST_DIR}/Classes/bindings/auto/jsb_SDKHelper_auto.cpp
+)
diff --git a/demo/native/engine/common/Classes/Game.cpp b/demo/native/engine/common/Classes/Game.cpp
new file mode 100644
index 0000000..2201707
--- /dev/null
+++ b/demo/native/engine/common/Classes/Game.cpp
@@ -0,0 +1,67 @@
+/****************************************************************************
+ Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You
+ shall not use Cocos Creator software for developing other software or tools
+ that's used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to
+ you.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ ****************************************************************************/
+#include "Game.h"
+#include "bindings/auto/jsb_SDKHelper_auto.h" // 添加新生成的绑定类头文件
+
+#ifndef GAME_NAME
+#define GAME_NAME "CocosGame";
+#endif
+
+#ifndef SCRIPT_XXTEAKEY
+#define SCRIPT_XXTEAKEY "";
+#endif
+
+Game::Game() = default;
+
+int Game::init() {
+ _windowInfo.title = GAME_NAME;
+ // configurate window size
+ // _windowInfo.height = 600;
+ // _windowInfo.width = 800;
+
+#if CC_DEBUG
+ _debuggerInfo.enabled = true;
+#else
+ _debuggerInfo.enabled = false;
+#endif
+ _debuggerInfo.port = 6086;
+ _debuggerInfo.address = "0.0.0.0";
+ _debuggerInfo.pauseOnStart = false;
+
+ _xxteaKey = SCRIPT_XXTEAKEY;
+ se::ScriptEngine::getInstance()->addRegisterCallback(register_all_SDKHelper); // 注册
+
+ BaseGame::init();
+ return 0;
+}
+
+void Game::onPause() { BaseGame::onPause(); }
+
+void Game::onResume() { BaseGame::onResume(); }
+
+void Game::onClose() { BaseGame::onClose(); }
+
+CC_REGISTER_APPLICATION(Game);
diff --git a/demo/native/engine/common/Classes/Game.h b/demo/native/engine/common/Classes/Game.h
new file mode 100644
index 0000000..521615e
--- /dev/null
+++ b/demo/native/engine/common/Classes/Game.h
@@ -0,0 +1,44 @@
+/****************************************************************************
+ Copyright (c) 2018 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You
+ shall not use Cocos Creator software for developing other software or tools
+ that's used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to
+ you.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ ****************************************************************************/
+#pragma once
+
+#include "cocos/cocos.h"
+
+/**
+ @brief The cocos2d Application.
+
+ The reason for implement as private inheritance is to hide some interface call
+ by Director.
+ */
+class Game : public cc::BaseGame {
+public:
+ Game();
+ int init() override;
+ // bool init() override;
+ void onPause() override;
+ void onResume() override;
+ void onClose() override;
+};
diff --git a/demo/native/engine/common/Classes/JNIAndroid/JniTools.cpp b/demo/native/engine/common/Classes/JNIAndroid/JniTools.cpp
new file mode 100644
index 0000000..16b9cc8
--- /dev/null
+++ b/demo/native/engine/common/Classes/JNIAndroid/JniTools.cpp
@@ -0,0 +1,38 @@
+//
+// JniTools.cpp
+// kungpowGame
+//
+// Created by GongXH on 2021/3/26.
+//
+
+#include "JniTools.h"
+#include "../SDKHelper.h"
+#include
+#include
+#include
+#include "application/ApplicationManager.h"
+using namespace cc;
+
+#define KUNPO_HELPER "com/kunpo/KunpoHelper"
+
+std::string JniTools::getVersionCode() {
+ return JniHelper::callStaticStringMethod(KUNPO_HELPER,"getVersionCode");
+}
+
+int JniTools::getBuildCode() {
+ return JniHelper::callStaticIntMethod(KUNPO_HELPER,"getBuildCode");
+}
+
+#pragma -mark java回调c++
+#if (CC_PLATFORM == CC_PLATFORM_ANDROID)
+extern "C"
+{
+ JNIEXPORT void Java_com_kunpo_KunpoHelper_CallJS(JNIEnv* env, jclass thiz, jstring jsjson)
+ {
+ std::string json = JniHelper::jstring2string(jsjson);
+ CC_CURRENT_ENGINE()->getScheduler()->performFunctionInCocosThread([=]() {
+ KunpoSDK::SDKHelper::getInstance()->callJS(json.c_str());
+ });
+ }
+}
+#endif
diff --git a/demo/native/engine/common/Classes/JNIAndroid/JniTools.h b/demo/native/engine/common/Classes/JNIAndroid/JniTools.h
new file mode 100644
index 0000000..cdbede7
--- /dev/null
+++ b/demo/native/engine/common/Classes/JNIAndroid/JniTools.h
@@ -0,0 +1,18 @@
+//
+// JniTools.hpp
+// ZumaGame
+//
+// Created by GongXH on 2021/3/26.
+//
+
+#ifndef JniTools_hpp
+#define JniTools_hpp
+#include "cocos.h"
+class JniTools
+{
+public:
+ //调用Java的方法
+ static std::string getVersionCode();
+ static int getBuildCode();
+};
+#endif /* JniTools_hpp */
diff --git a/demo/native/engine/common/Classes/SDKHelper.cpp b/demo/native/engine/common/Classes/SDKHelper.cpp
new file mode 100644
index 0000000..6f1df30
--- /dev/null
+++ b/demo/native/engine/common/Classes/SDKHelper.cpp
@@ -0,0 +1,65 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-03-21
+ * @Description:
+ */
+#include "SDKHelper.h"
+#if (CC_PLATFORM == CC_PLATFORM_ANDROID)
+#include "JNIAndroid/JniTools.h"
+#elif (CC_PLATFORM == CC_PLATFORM_IOS)
+
+#endif
+
+using namespace KunpoSDK;
+namespace KunpoSDK {
+}
+
+static SDKHelper helper;
+
+SDKHelper * SDKHelper::getInstance() {
+ return &helper;
+}
+
+SDKHelper::SDKHelper() {
+
+}
+
+/** 获取系统信息 */
+void SDKHelper::getSystemInfo() {
+#if (CC_PLATFORM == CC_PLATFORM_ANDROID)
+// return JniTools::getSystemInfo();
+#elif (CC_PLATFORM == CC_PLATFORM_IOS)
+
+#endif
+}
+
+std::string SDKHelper::getVersionCode() {
+ CC_LOG_DEBUG("SDKHelper 获取版本号");
+#if (CC_PLATFORM == CC_PLATFORM_ANDROID)
+ return JniTools::getVersionCode();
+#elif (CC_PLATFORM == CC_PLATFORM_IOS)
+
+#endif
+
+ return "0.0.1";
+}
+
+int SDKHelper::getBuildCode() {
+ CC_LOG_DEBUG("SDKHelper 获取Build号");
+#if (CC_PLATFORM == CC_PLATFORM_ANDROID)
+ return JniTools::getBuildCode();
+#elif (CC_PLATFORM == CC_PLATFORM_IOS)
+
+#endif
+ return 0;
+}
+
+
+void SDKHelper::callJS(const char *jsonString) {
+ se::Value callJsHandler;
+ if (se::ScriptEngine::getInstance()->getGlobalObject()->getProperty("KunpoNativeCallJsHandler", &callJsHandler) && callJsHandler.isObject()) {
+ se::ValueArray args;
+ args.push_back(se::Value(jsonString));
+ callJsHandler.toObject()->call(args, callJsHandler.toObject());
+ }
+}
diff --git a/demo/native/engine/common/Classes/SDKHelper.h b/demo/native/engine/common/Classes/SDKHelper.h
new file mode 100644
index 0000000..47d55d3
--- /dev/null
+++ b/demo/native/engine/common/Classes/SDKHelper.h
@@ -0,0 +1,34 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-03-21
+ * @Description:
+ */
+
+#pragma once
+#include "cocos/cocos.h"
+
+namespace KunpoSDK {
+
+ class SDKHelper {
+ public:
+ /** 单例 */
+ static SDKHelper * getInstance();
+
+ SDKHelper();
+
+ /** 获取系统信息 */
+ void getSystemInfo();
+ /** 获取版本号 */
+ std::string getVersionCode();
+ /** 获取build号 */
+ int getBuildCode();
+
+ /**
+ * c++ 回调 js
+ * 参数:jsonString 格式 { function: string, args: string }
+ */
+ void callJS(const char* jsonString);
+ private:
+
+ };
+}
diff --git a/demo/native/engine/common/Classes/bindings/auto/jsb_SDKHelper_auto.cpp b/demo/native/engine/common/Classes/bindings/auto/jsb_SDKHelper_auto.cpp
new file mode 100644
index 0000000..5cf3e61
--- /dev/null
+++ b/demo/native/engine/common/Classes/bindings/auto/jsb_SDKHelper_auto.cpp
@@ -0,0 +1,262 @@
+// clang-format off
+
+/* ----------------------------------------------------------------------------
+ * This file was automatically generated by SWIG (https://www.swig.org).
+ * Version 4.1.0
+ *
+ * Do not make changes to this file unless you know what you are doing - modify
+ * the SWIG interface file instead.
+ * ----------------------------------------------------------------------------- */
+
+/****************************************************************************
+ Copyright (c) 2022-2023 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+****************************************************************************/
+
+#if defined(__clang__)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunused-variable"
+#elif defined(__GNUC__) || defined(__GNUG__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-variable"
+#elif defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable : 4101)
+#endif
+
+
+#define SWIG_STD_MOVE(OBJ) std::move(OBJ)
+
+
+#include
+
+
+#include "bindings/jswrapper/SeApi.h"
+#include "bindings/manual/jsb_conversions.h"
+#include "bindings/manual/jsb_global.h"
+
+
+#include "jsb_SDKHelper_auto.h"
+
+
+
+se::Class* __jsb_KunpoSDK_SDKHelper_class = nullptr;
+se::Object* __jsb_KunpoSDK_SDKHelper_proto = nullptr;
+SE_DECLARE_FINALIZE_FUNC(js_delete_KunpoSDK_SDKHelper)
+
+static bool js_KunpoSDK_SDKHelper_getInstance_static(se::State& s)
+{
+ CC_UNUSED bool ok = true;
+ const auto& args = s.args();
+ size_t argc = args.size();
+ KunpoSDK::SDKHelper *result = 0 ;
+
+ if(argc != 0) {
+ SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0);
+ return false;
+ }
+ result = (KunpoSDK::SDKHelper *)KunpoSDK::SDKHelper::getInstance();
+
+ ok &= nativevalue_to_se(result, s.rval(), s.thisObject());
+ SE_PRECONDITION2(ok, false, "Error processing arguments");
+ SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval());
+
+
+ return true;
+}
+SE_BIND_FUNC(js_KunpoSDK_SDKHelper_getInstance_static)
+
+static bool js_new_KunpoSDK_SDKHelper(se::State& s) // NOLINT(readability-identifier-naming)
+{
+ CC_UNUSED bool ok = true;
+ const auto& args = s.args();
+ size_t argc = args.size();
+
+ KunpoSDK::SDKHelper *result;
+ result = (KunpoSDK::SDKHelper *)new KunpoSDK::SDKHelper();
+
+
+ auto *ptr = JSB_MAKE_PRIVATE_OBJECT_WITH_INSTANCE(result);
+ s.thisObject()->setPrivateObject(ptr);
+ return true;
+}
+SE_BIND_CTOR(js_new_KunpoSDK_SDKHelper, __jsb_KunpoSDK_SDKHelper_class, js_delete_KunpoSDK_SDKHelper)
+
+static bool js_KunpoSDK_SDKHelper_getSystemInfo(se::State& s)
+{
+ CC_UNUSED bool ok = true;
+ const auto& args = s.args();
+ size_t argc = args.size();
+ KunpoSDK::SDKHelper *arg1 = (KunpoSDK::SDKHelper *) NULL ;
+
+ if(argc != 0) {
+ SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0);
+ return false;
+ }
+ arg1 = SE_THIS_OBJECT(s);
+ if (nullptr == arg1) return true;
+ (arg1)->getSystemInfo();
+
+
+ return true;
+}
+SE_BIND_FUNC(js_KunpoSDK_SDKHelper_getSystemInfo)
+
+static bool js_KunpoSDK_SDKHelper_getVersionCode(se::State& s)
+{
+ CC_UNUSED bool ok = true;
+ const auto& args = s.args();
+ size_t argc = args.size();
+ KunpoSDK::SDKHelper *arg1 = (KunpoSDK::SDKHelper *) NULL ;
+ std::string result;
+
+ if(argc != 0) {
+ SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0);
+ return false;
+ }
+ arg1 = SE_THIS_OBJECT(s);
+ if (nullptr == arg1) return true;
+ result = (arg1)->getVersionCode();
+
+ ok &= nativevalue_to_se(result, s.rval(), s.thisObject() /*ctx*/);
+ SE_PRECONDITION2(ok, false, "Error processing arguments");
+ SE_HOLD_RETURN_VALUE(result, s.thisObject(), s.rval());
+
+
+
+ return true;
+}
+SE_BIND_FUNC(js_KunpoSDK_SDKHelper_getVersionCode)
+
+static bool js_KunpoSDK_SDKHelper_getBuildCode(se::State& s)
+{
+ CC_UNUSED bool ok = true;
+ const auto& args = s.args();
+ size_t argc = args.size();
+ KunpoSDK::SDKHelper *arg1 = (KunpoSDK::SDKHelper *) NULL ;
+ int result;
+
+ if(argc != 0) {
+ SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 0);
+ return false;
+ }
+ arg1 = SE_THIS_OBJECT(s);
+ if (nullptr == arg1) return true;
+ result = (int)(arg1)->getBuildCode();
+
+ ok &= nativevalue_to_se(result, s.rval(), s.thisObject());
+
+
+ return true;
+}
+SE_BIND_FUNC(js_KunpoSDK_SDKHelper_getBuildCode)
+
+static bool js_KunpoSDK_SDKHelper_callJS(se::State& s)
+{
+ CC_UNUSED bool ok = true;
+ const auto& args = s.args();
+ size_t argc = args.size();
+ KunpoSDK::SDKHelper *arg1 = (KunpoSDK::SDKHelper *) NULL ;
+ char *arg2 = (char *) NULL ;
+ ccstd::string temp2 ;
+
+ if(argc != 1) {
+ SE_REPORT_ERROR("wrong number of arguments: %d, was expecting %d", (int)argc, 1);
+ return false;
+ }
+ arg1 = SE_THIS_OBJECT(s);
+ if (nullptr == arg1) return true;
+
+ ok &= sevalue_to_native(args[0], &temp2);
+ SE_PRECONDITION2(ok, false, "Error processing arguments");
+ arg2 = (char *) temp2.c_str();
+ (arg1)->callJS((char const *)arg2);
+
+
+ return true;
+}
+SE_BIND_FUNC(js_KunpoSDK_SDKHelper_callJS)
+
+static bool js_delete_KunpoSDK_SDKHelper(se::State& s)
+{
+ return true;
+}
+SE_BIND_FINALIZE_FUNC(js_delete_KunpoSDK_SDKHelper)
+
+bool js_register_KunpoSDK_SDKHelper(se::Object* obj) {
+ auto* cls = se::Class::create("SDKHelper", obj, nullptr, _SE(js_new_KunpoSDK_SDKHelper));
+
+ cls->defineStaticProperty("__isJSB", se::Value(true), se::PropertyAttribute::READ_ONLY | se::PropertyAttribute::DONT_ENUM | se::PropertyAttribute::DONT_DELETE);
+
+ cls->defineFunction("getSystemInfo", _SE(js_KunpoSDK_SDKHelper_getSystemInfo));
+ cls->defineFunction("getVersionCode", _SE(js_KunpoSDK_SDKHelper_getVersionCode));
+ cls->defineFunction("getBuildCode", _SE(js_KunpoSDK_SDKHelper_getBuildCode));
+ cls->defineFunction("callJS", _SE(js_KunpoSDK_SDKHelper_callJS));
+
+
+ cls->defineStaticFunction("getInstance", _SE(js_KunpoSDK_SDKHelper_getInstance_static));
+
+
+ cls->defineFinalizeFunction(_SE(js_delete_KunpoSDK_SDKHelper));
+
+
+ cls->install();
+ JSBClassType::registerClass(cls);
+
+ __jsb_KunpoSDK_SDKHelper_proto = cls->getProto();
+ __jsb_KunpoSDK_SDKHelper_class = cls;
+ se::ScriptEngine::getInstance()->clearException();
+ return true;
+}
+
+
+
+
+bool register_all_SDKHelper(se::Object* obj) {
+ // Get the ns
+ se::Value nsVal;
+ if (!obj->getProperty("KunpoSDK", &nsVal, true))
+ {
+ se::HandleObject jsobj(se::Object::createPlainObject());
+ nsVal.setObject(jsobj);
+ obj->setProperty("KunpoSDK", nsVal);
+ }
+ se::Object* ns = nsVal.toObject();
+ /* Register classes */
+ js_register_KunpoSDK_SDKHelper(ns);
+
+ /* Register global variables & global functions */
+
+
+
+ return true;
+}
+
+
+#if defined(__clang__)
+#pragma clang diagnostic pop
+#elif defined(__GNUC__) || defined(__GNUG__)
+#pragma GCC diagnostic pop
+#elif defined(_MSC_VER)
+#pragma warning(pop)
+#endif
+// clang-format on
diff --git a/demo/native/engine/common/Classes/bindings/auto/jsb_SDKHelper_auto.h b/demo/native/engine/common/Classes/bindings/auto/jsb_SDKHelper_auto.h
new file mode 100644
index 0000000..242a359
--- /dev/null
+++ b/demo/native/engine/common/Classes/bindings/auto/jsb_SDKHelper_auto.h
@@ -0,0 +1,51 @@
+// clang-format off
+
+/* ----------------------------------------------------------------------------
+ * This file was automatically generated by SWIG (https://www.swig.org).
+ * Version 4.1.0
+ *
+ * Do not make changes to this file unless you know what you are doing - modify
+ * the SWIG interface file instead.
+ * ----------------------------------------------------------------------------- */
+
+/****************************************************************************
+ Copyright (c) 2022-2023 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+****************************************************************************/
+
+#pragma once
+#include "bindings/jswrapper/SeApi.h"
+#include "bindings/manual/jsb_conversions.h"
+#include "cocos/cocos.h"
+
+#include "../../SDKHelper.h" // 添加这行,%include 指令表示让 swig 解析此文件,并且为此文件中的类生成绑定代码。
+
+
+
+bool register_all_SDKHelper(se::Object* obj);
+
+
+JSB_REGISTER_OBJECT_TYPE(KunpoSDK::SDKHelper);
+extern se::Object *__jsb_KunpoSDK_SDKHelper_proto; // NOLINT
+extern se::Class * __jsb_KunpoSDK_SDKHelper_class; // NOLINT
+
+// clang-format on
diff --git a/demo/native/engine/common/cocos-version.json b/demo/native/engine/common/cocos-version.json
new file mode 100644
index 0000000..bb278bb
--- /dev/null
+++ b/demo/native/engine/common/cocos-version.json
@@ -0,0 +1 @@
+{"version":"3.8.6","skipCheck":false}
diff --git a/demo/native/engine/common/xr.cmake b/demo/native/engine/common/xr.cmake
new file mode 100644
index 0000000..e4d666d
--- /dev/null
+++ b/demo/native/engine/common/xr.cmake
@@ -0,0 +1,20 @@
+
+include(${COCOS_X_PATH}/cmake/predefine.cmake)
+
+if(NOT DEFINED XR_COMMON_SOURCES)
+ set(XR_COMMON_SOURCES)
+endif()
+
+if(NOT DEFINED XR_LIBS)
+ set(XR_LIBS)
+endif()
+
+if(NOT DEFINED XR_COMMON_PATH)
+ set(XR_COMMON_PATH ${CMAKE_CURRENT_LIST_DIR}/../../../extensions/xr-plugin/common)
+endif()
+
+if(NOT DEFINED XR_LIBRARY_PATH)
+ set(XR_LIBRARY_PATH ${CMAKE_CURRENT_LIST_DIR}/../../../extensions/xr-plugin/platforms)
+endif()
+
+include(${XR_COMMON_PATH}/xr.cmake)
diff --git a/demo/native/engine/harmonyos-next/.gitignore b/demo/native/engine/harmonyos-next/.gitignore
new file mode 100644
index 0000000..df681cb
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/.gitignore
@@ -0,0 +1,12 @@
+/node_modules
+/local.properties
+/oh_modules
+/.idea
+**/build
+/.hvigor
+log.txt
+oh-package-lock.json5
+.clang-format
+.clang-tidy
+.clangd
+/entry/oh_modules
\ No newline at end of file
diff --git a/demo/native/engine/harmonyos-next/AppScope/app.json5 b/demo/native/engine/harmonyos-next/AppScope/app.json5
new file mode 100644
index 0000000..e214d7e
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/AppScope/app.json5
@@ -0,0 +1,11 @@
+{
+ "app": {
+ "bundleName": "com.kunpo.test",
+ "vendor": "example",
+ "versionCode": 1,
+ "versionName": "0.0.1",
+ "icon": "$media:app_icon",
+ "label": "$string:app_name",
+ "distributedNotificationEnabled": true
+ }
+}
\ No newline at end of file
diff --git a/demo/native/engine/harmonyos-next/AppScope/resources/base/element/string.json b/demo/native/engine/harmonyos-next/AppScope/resources/base/element/string.json
new file mode 100644
index 0000000..c0031d6
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/AppScope/resources/base/element/string.json
@@ -0,0 +1,8 @@
+{
+ "string": [
+ {
+ "name": "app_name",
+ "value": "kunpocreator"
+ }
+ ]
+}
diff --git a/demo/native/engine/harmonyos-next/AppScope/resources/base/media/app_icon.png b/demo/native/engine/harmonyos-next/AppScope/resources/base/media/app_icon.png
new file mode 100644
index 0000000..2b6f32a
Binary files /dev/null and b/demo/native/engine/harmonyos-next/AppScope/resources/base/media/app_icon.png differ
diff --git a/demo/native/engine/harmonyos-next/CMakeLists.txt b/demo/native/engine/harmonyos-next/CMakeLists.txt
new file mode 100644
index 0000000..f10fbc3
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/CMakeLists.txt
@@ -0,0 +1,19 @@
+# the minimum version of CMake.
+
+cmake_minimum_required(VERSION 3.8)
+set(CC_LIB_NAME cocos)
+set(CC_PROJ_SOURCES)
+set(CC_COMMON_SOURCES)
+set(CC_ALL_SOURCES)
+
+option(APP_NAME "Project Name" "test-cases")
+project(${APP_NAME} CXX)
+
+set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -Werror=return-type")
+set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
+
+include(${COMMON_DIR}/CMakeLists.txt)
+
+cc_openharmony_before_target(${CC_LIB_NAME})
+add_library(${CC_LIB_NAME} SHARED ${CC_ALL_SOURCES})
+cc_openharmony_after_target(${CC_LIB_NAME})
\ No newline at end of file
diff --git a/demo/native/engine/harmonyos-next/build-profile.json5 b/demo/native/engine/harmonyos-next/build-profile.json5
new file mode 100644
index 0000000..2fc7c16
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/build-profile.json5
@@ -0,0 +1,36 @@
+{
+ "app": {
+ "signingConfigs": [
+ ],
+ "products": [
+ {
+ "name": "default",
+ "signingConfig": "default",
+ "compatibleSdkVersion": "5.0.1(13)",
+ "runtimeOS": "HarmonyOS"
+ }
+ ],
+ "buildModeSet": [
+ {
+ "name": "debug"
+ },
+ {
+ "name": "release"
+ }
+ ]
+ },
+ "modules": [
+ {
+ "name": "entry",
+ "srcPath": "./entry",
+ "targets": [
+ {
+ "name": "default",
+ "applyToProducts": [
+ "default"
+ ]
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/demo/native/engine/harmonyos-next/entry/.gitignore b/demo/native/engine/harmonyos-next/entry/.gitignore
new file mode 100644
index 0000000..e751b11
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/.gitignore
@@ -0,0 +1,4 @@
+/oh_modules
+/.preview
+/build
+/.cxx
\ No newline at end of file
diff --git a/demo/native/engine/harmonyos-next/entry/build-profile.json5 b/demo/native/engine/harmonyos-next/entry/build-profile.json5
new file mode 100644
index 0000000..8cb690d
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/build-profile.json5
@@ -0,0 +1,18 @@
+{
+ apiType: 'stageMode',
+ buildOption: {
+ externalNativeOptions: {
+ path: '../CMakeLists.txt',
+ arguments: 'arm-linux-ohos -DOHOS_STL=c++_shared -DRES_DIR=/Users/gongxh/work/kunpo-lib/KunpoDemo/build/harmonyos-next -DCOMMON_DIR=/Users/gongxh/work/kunpo-lib/KunpoDemo/native/engine/common -DOPENHARMONY=1',
+ abiFilters: [
+ 'arm64-v8a',
+ ],
+ cppFlags: '',
+ },
+ },
+ targets: [
+ {
+ name: 'default',
+ },
+ ],
+}
\ No newline at end of file
diff --git a/demo/native/engine/harmonyos-next/entry/hvigorfile.ts b/demo/native/engine/harmonyos-next/entry/hvigorfile.ts
new file mode 100644
index 0000000..80e4ec5
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/hvigorfile.ts
@@ -0,0 +1,2 @@
+// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently.
+export { hapTasks } from '@ohos/hvigor-ohos-plugin';
diff --git a/demo/native/engine/harmonyos-next/entry/oh-package.json5 b/demo/native/engine/harmonyos-next/entry/oh-package.json5
new file mode 100644
index 0000000..8315ec4
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/oh-package.json5
@@ -0,0 +1,12 @@
+{
+ "license": "",
+ "devDependencies": {},
+ "author": "",
+ "name": "entry",
+ "description": "Please describe the basic information.",
+ "main": "",
+ "version": "1.0.0",
+ "dependencies": {
+ "libcocos.so": "file:./src/main/cpp/types/libcocos"
+ }
+}
\ No newline at end of file
diff --git a/demo/native/engine/harmonyos-next/entry/src/main/cpp/types/libcocos/index.d.ts b/demo/native/engine/harmonyos-next/entry/src/main/cpp/types/libcocos/index.d.ts
new file mode 100644
index 0000000..049ddc2
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/src/main/cpp/types/libcocos/index.d.ts
@@ -0,0 +1,32 @@
+import { ContextType } from '../../../ets/common/Constants';
+import resourceManager from '@ohos.resourceManager';
+
+export interface context {
+ onPageShow: () => void;
+ onPageHide: () => void;
+ workerInit: () => void;
+ postMessage: (msgType: string, msgData: string) => void;
+ postSyncMessage: (msgType: string, msgData: string) => Promise;
+ setPostMessageFunction: (postMessage: (msgType: string, msgData: string) => void) => void;
+ setPostSyncMessageFunction: (postSyncMessage: (msgType: string, msgData: string) => void) => void;
+ nativeEngineInit: () => void;
+ nativeEngineStart: () => void;
+ onTextChange: (param: string) => void;
+ onComplete: (param: string) => void;
+ onConfirm: (param: string) => void;
+ shouldStartLoading: (viewTag: number, url: string) => void;
+ finishLoading: (viewTag: number, url: string) => void;
+ failLoading: (viewTag: number, url: string) => void;
+ onBackPress: () => void;
+ onCreate: () => void;
+ onDestroy: () => void;
+ onShow: () => void;
+ onHide: () => void;
+ resourceManagerInit: (resourceManager: resourceManager.ResourceManager) => void;
+ writablePathInit: (cacheDir: string) => void;
+ onVideoEvent: (param: string) => void;
+ registerFunction: (name:string ,fun:Function) => void;
+}
+
+export const getContext: (type: ContextType) => context;
+export const evalString: (value: string) => any;
diff --git a/demo/native/engine/harmonyos-next/entry/src/main/cpp/types/libcocos/oh-package.json5 b/demo/native/engine/harmonyos-next/entry/src/main/cpp/types/libcocos/oh-package.json5
new file mode 100644
index 0000000..7460650
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/src/main/cpp/types/libcocos/oh-package.json5
@@ -0,0 +1,6 @@
+{
+ "name": "libcocos.so",
+ "types": "./index.d.ts",
+ "version": "1.0.0",
+ "description": "Please describe the basic information."
+}
\ No newline at end of file
diff --git a/demo/native/engine/harmonyos-next/entry/src/main/ets/cocos/WorkerManager.ets b/demo/native/engine/harmonyos-next/entry/src/main/ets/cocos/WorkerManager.ets
new file mode 100644
index 0000000..88b7c83
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/src/main/ets/cocos/WorkerManager.ets
@@ -0,0 +1,57 @@
+/****************************************************************************
+ Copyright (c) 2022-2023 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ ****************************************************************************/
+
+import worker from '@ohos.worker';
+import { Constants } from '../common/Constants'
+
+export class WorkerManager {
+ private cocosWorker: worker.ThreadWorker;
+
+ private constructor() {
+ this.cocosWorker = new worker.ThreadWorker("entry/ets/workers/cocos_worker.ts", {
+ type: "classic",
+ name: "CocosWorker"
+ });
+ this.cocosWorker.onerror = (e) => {
+ let msg = e.message;
+ let filename = e.filename;
+ let lineno = e.lineno;
+ let colno = e.colno;
+ console.error(`on Error ${msg} ${filename} ${lineno} ${colno}`);
+ }
+ }
+
+ public static getInstance(): WorkerManager {
+ if (AppStorage.get(Constants.APP_KEY_WORKER_MANAGER) as WorkerManager == undefined) {
+ AppStorage.setOrCreate(Constants.APP_KEY_WORKER_MANAGER, new WorkerManager);
+ }
+ return AppStorage.get(Constants.APP_KEY_WORKER_MANAGER) as WorkerManager;
+ }
+
+ public getWorker(): worker.ThreadWorker {
+ return this.cocosWorker;
+ }
+}
+
diff --git a/demo/native/engine/harmonyos-next/entry/src/main/ets/cocos/oh-adapter/sys-ability-polyfill.js b/demo/native/engine/harmonyos-next/entry/src/main/ets/cocos/oh-adapter/sys-ability-polyfill.js
new file mode 100644
index 0000000..d22164e
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/src/main/ets/cocos/oh-adapter/sys-ability-polyfill.js
@@ -0,0 +1,168 @@
+/****************************************************************************
+ Copyright (c) 2022-2023 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+****************************************************************************/
+import display from '@ohos.display';
+import I18n from '@ohos.i18n';
+import deviceInfo from '@ohos.deviceInfo';
+import batteryInfo from '@ohos.batteryInfo';
+import connection from '@ohos.net.connection'
+import vibrator from '@ohos.vibrator';
+import process from '@ohos.process';
+import { ContextType } from "../../common/Constants"
+import cocos from "libcocos.so";
+
+const displayUtils = cocos.getContext(ContextType.DISPLAY_UTILS);
+
+let pro = new process.ProcessManager();
+let cutout = {
+ left: 0,
+ top: 0,
+ width: 0,
+ height: 0
+};
+
+globalThis.getSystemLanguage = function () {
+ return I18n.System.getSystemLanguage();
+}
+
+globalThis.getOSFullName = function () {
+ return deviceInfo.osFullName;
+}
+
+globalThis.getDeviceModel = function () {
+ return deviceInfo.productModel;
+}
+
+globalThis.getBatteryLevel = function () {
+ return batteryInfo.batterySOC;
+}
+
+globalThis.getDPI = function () {
+ var displayClass = display.getDefaultDisplaySync();
+ return displayClass.densityDPI;
+}
+
+globalThis.getPixelRation = function () {
+ var displayClass = display.getDefaultDisplaySync();
+ return displayClass.densityPixels;
+}
+
+let onDisplayChange = (data) => {
+ // Monitor changes in screen orientation.
+ displayUtils.onDisplayChange(globalThis.getDeviceOrientation());
+
+ // update screen cutout info
+ globalThis.initScreenInfo();
+}
+
+try {
+ display.on("change", onDisplayChange);
+} catch (exception) {
+ console.log('Failed to register callback. Code: ' + JSON.stringify(exception));
+}
+
+globalThis.getDeviceOrientation = function () {
+ var displayClass = display.getDefaultDisplaySync();
+ return displayClass.rotation;
+}
+
+globalThis.getNetworkType = function () {
+ let netHandle = connection.getDefaultNetSync();
+ if(netHandle && netHandle.netId != 0) {
+ let result = connection.getNetCapabilitiesSync(netHandle);
+ if (result && result.bearerTypes) {
+ return result.bearerTypes[0];
+ }
+ }
+ return -1;
+}
+
+globalThis.vibrate = function (duration) {
+ console.log('begin to vibrate, duration is.' + duration);
+ try {
+ vibrator.startVibration({
+ type: 'time',
+ duration: duration * 1000
+ }, {
+ id: 0,
+ usage: 'alarm'
+ }, (error) => {
+ if (error) {
+ console.error('vibrate fail, error.code: ' + error.code + 'error.message: ', + error.message);
+ return error.code;
+ }
+ console.log('Vibration start sucessful.');
+ return 0;
+ });
+ } catch (err) {
+ console.error('errCode: ' + err.code + ' ,msg: ' + err.message);
+ }
+}
+
+globalThis.terminateProcess = function () {
+ pro.exit(0);
+}
+
+globalThis.initScreenInfo = function () {
+ display.getDefaultDisplaySync().getCutoutInfo().then((data) => {
+ if (data.boundingRects.length == 0) {
+ return;
+ }
+
+ cutout.left = data.boundingRects[0].left;
+ cutout.top = data.boundingRects[0].top;
+ cutout.width = data.boundingRects[0].width;
+ cutout.height = data.boundingRects[0].height;
+ }).catch((err) => {
+ console.log("get cutout info error!");
+ });
+};
+globalThis.initScreenInfo();
+
+globalThis.getCutoutWidth = function () {
+ if(!cutout.width) {
+ return 0;
+ }
+
+ let disPlayWidth = display.getDefaultDisplaySync().width;
+ if(cutout.left + cutout.width > disPlayWidth - cutout.left) {
+ return disPlayWidth - cutout.left;
+ }
+ return cutout.left + cutout.width;
+}
+
+globalThis.getCutoutHeight = function () {
+ if(!cutout.height) {
+ return 0;
+ }
+
+ let orientation = globalThis.getDeviceOrientation();
+ if (orientation == display.Orientation.PORTRAIT) {
+ return cutout.top + cutout.height;
+ } else if(orientation == display.Orientation.PORTRAIT_INVERTED) {
+ let displayHeight = display.getDefaultDisplaySync().height;
+ return displayHeight - cutout.top;
+ }
+ return 0;
+}
diff --git a/demo/native/engine/harmonyos-next/entry/src/main/ets/common/Constants.ts b/demo/native/engine/harmonyos-next/entry/src/main/ets/common/Constants.ts
new file mode 100644
index 0000000..1188976
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/src/main/ets/common/Constants.ts
@@ -0,0 +1,42 @@
+/****************************************************************************
+ Copyright (c) 2022-2023 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+****************************************************************************/
+export enum ContextType {
+ APP_LIFECYCLE = 0,
+ JSPAGE_LIFECYCLE,
+ XCOMPONENT_CONTEXT,
+ XCOMPONENT_REGISTER_LIFECYCLE_CALLBACK,
+ NATIVE_RENDER_API,
+ WORKER_INIT,
+ ENGINE_UTILS,
+ EDITBOX_UTILS,
+ WEBVIEW_UTILS,
+ DISPLAY_UTILS,
+ UV_ASYNC_SEND,
+ VIDEO_UTILS
+}
+
+export class Constants {
+ static readonly APP_KEY_WORKER_MANAGER = "app_key_worker_manager";
+}
\ No newline at end of file
diff --git a/demo/native/engine/harmonyos-next/entry/src/main/ets/common/PortProxy.ts b/demo/native/engine/harmonyos-next/entry/src/main/ets/common/PortProxy.ts
new file mode 100644
index 0000000..0c06ca5
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/src/main/ets/common/PortProxy.ts
@@ -0,0 +1,76 @@
+/****************************************************************************
+ Copyright (c) 2022-2023 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ ****************************************************************************/
+import { ThreadWorkerGlobalScope } from '@ohos.worker';
+import { MessageEvent } from '@ohos.worker';
+
+export class PortProxy {
+ private autoId: number = 0;
+ public actionHandleMap = {}
+ private port: ThreadWorkerGlobalScope = null;
+
+ public _messageHandle?: (e: MessageEvent) => void;
+
+ constructor(worker) {
+ this.port = worker;
+ this.port.onmessage = this.onMessage.bind(this);
+ }
+
+ public onMessage(e) {
+ let data = e['data'];
+ if (data.type != "syncResult" && this._messageHandle) {
+ this._messageHandle(e);
+ } else if (data.type == "syncResult") {
+ const { id, response } = data.data;
+ if (!this.actionHandleMap[id]) {
+ return;
+ }
+ this.actionHandleMap[id].call(this, response);
+ delete this.actionHandleMap[id];
+ }
+ }
+
+ public postReturnMessage(e: any, res: any) {
+ if (e.type == "sync" && res != null && res != undefined) {
+ this.port.postMessage({ type: "syncResult", data: { id: e.data.cbId, response: res } });
+ }
+ }
+
+ public postMessage(msgName: string, msgData: any) {
+ this.port.postMessage({ type: "async", data: { name: msgName, param: msgData } });
+ }
+
+ public postSyncMessage(msgName: string, msgData: any) {
+ const id = this.autoId++;
+ return new Promise((resolve, reject) => {
+ const message = {
+ type: "sync", data: { cbId: id, name: msgName, param: msgData }
+ }
+ this.port.postMessage(message);
+ this.actionHandleMap[id] = (response) => {
+ resolve(response)
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/demo/native/engine/harmonyos-next/entry/src/main/ets/components/CocosVideoPlayer.ets b/demo/native/engine/harmonyos-next/entry/src/main/ets/components/CocosVideoPlayer.ets
new file mode 100644
index 0000000..679d479
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/src/main/ets/components/CocosVideoPlayer.ets
@@ -0,0 +1,145 @@
+/****************************************************************************
+ Copyright (c) 2022-2023 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ ****************************************************************************/
+import { PortProxy } from '../common/PortProxy';
+
+enum EventType {
+ PLAYING = 0,
+ PAUSED,
+ STOPPED,
+ COMPLETED,
+ META_LOADED,
+ CLICKED,
+ READY_TO_PLAY,
+ UPDATE,
+ QUIT_FULLSCREEN = 1000
+}
+
+interface param {
+ videoTag?: number,
+ videoEvent?: EventType,
+ args?: number
+}
+
+@Observed
+export class VideoInfo {
+ public x: number = 0;
+ public y: number = 0;
+ public w: number = 0;
+ public h: number = 0;
+ // url
+ public url: string | Resource = "";
+ public viewTag: number = 0;
+ public visible: boolean = true;
+ public duration: number = 0;
+ public currentTime: number = 0;
+ public isFullScreen: boolean = false;
+ public currentProgressRate?: number | string | PlaybackSpeed;
+ public resourceType: number = 0;
+ public isPreparedStart: boolean = false;
+ /**
+ * https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-ts/ts-media-components-video.md#videocontroller
+ *
+ */
+ public controller: VideoController = new VideoController()
+
+ constructor(x: number, y: number, w: number, h: number, viewTag: number) {
+ this.x = x;
+ this.y = y;
+ this.w = w;
+ this.h = h;
+ this.viewTag = viewTag
+ }
+}
+
+@Component
+export struct CocosVideoPlayer {
+ @ObjectLink videoInfo: VideoInfo;
+ public workPort: PortProxy | null = null;
+
+ build() {
+ Video({
+ src: this.videoInfo.url,
+ controller: this.videoInfo.controller,
+ currentProgressRate: this.videoInfo.currentProgressRate as number | string | PlaybackSpeed
+ })
+ .position({ x: this.videoInfo.x, y: this.videoInfo.y })
+ .width(this.videoInfo.w)
+ .height(this.videoInfo.h)
+ .controls(false)
+ .autoPlay(false)
+ .onStart(() => {
+ this.workPort?.postMessage("onVideoEvent", {
+ videoTag: this.videoInfo.viewTag as number,
+ videoEvent: EventType.PLAYING as EventType
+ } as param);
+ })
+ .onPause(() => {
+ this.workPort?.postMessage("onVideoEvent", {
+ videoTag: this.videoInfo.viewTag as number,
+ videoEvent: EventType.PAUSED as EventType
+ } as param);
+ })
+ .onFinish(() => {
+ this.workPort?.postMessage("onVideoEvent", {
+ videoTag: this.videoInfo.viewTag,
+ videoEvent: EventType.COMPLETED
+ } as param);
+ })
+ .onPrepared((event): void => {
+ this.videoInfo.isPreparedStart && this.videoInfo.controller.start();
+
+ this.videoInfo.duration = event?.duration as number;
+ this.workPort?.postMessage("onVideoEvent", {
+ videoTag: this.videoInfo.viewTag,
+ videoEvent: EventType.READY_TO_PLAY,
+ args: event?.duration
+ } as param);
+ })
+ .onClick((event): void => {
+ this.workPort?.postMessage("onVideoEvent", {
+ videoTag: this.videoInfo.viewTag,
+ videoEvent: EventType.CLICKED
+ } as param);
+ })
+ .onUpdate((event) => {
+ this.videoInfo.currentTime = event?.time as number;
+ this.workPort?.postMessage("onVideoEvent", {
+ videoTag: this.videoInfo.viewTag,
+ videoEvent: EventType.UPDATE,
+ args: event?.time
+ } as param);
+ })
+ .onFullscreenChange((event) => {
+ if (!event?.fullscreen) {
+ this.workPort?.postMessage("onVideoEvent", {
+ videoTag: this.videoInfo.viewTag,
+ videoEvent: EventType.QUIT_FULLSCREEN
+ } as param);
+ }
+ this.videoInfo.isFullScreen = event?.fullscreen as boolean;
+ })
+ .visibility(this.videoInfo.visible ? Visibility.Visible : Visibility.None)
+ }
+}
\ No newline at end of file
diff --git a/demo/native/engine/harmonyos-next/entry/src/main/ets/components/CocosWebView.ets b/demo/native/engine/harmonyos-next/entry/src/main/ets/components/CocosWebView.ets
new file mode 100644
index 0000000..9368735
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/src/main/ets/components/CocosWebView.ets
@@ -0,0 +1,104 @@
+/****************************************************************************
+ Copyright (c) 2022-2023 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ ****************************************************************************/
+import { PortProxy } from '../common/PortProxy';
+import web from '@ohos.web.webview';
+
+interface param {
+ viewTag: number,
+ url: string,
+}
+
+@Observed
+export class WebViewInfo {
+ // position
+ public x: number = 0;
+ public y: number = 0;
+ // size
+ public w: number = 0;
+ public h: number = 0;
+ // url
+ public url: string = '';
+ // tag
+ public viewTag: number = 0;
+ // Whether to display
+ public visible: boolean = true;
+ /*
+ * doc : https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-ts/ts-basic-components-web.md#webcontroller
+ */
+ public controller: web.WebviewController = new web.WebviewController();
+
+ constructor(x: number, y: number, w: number, h: number, viewTag: number) {
+ this.x = x;
+ this.y = y;
+ this.w = w;
+ this.h = h;
+ this.viewTag = viewTag;
+
+ web.once("webInited", () => {
+ if (this.url != '') {
+ this.controller.loadUrl(this.url);
+ }
+ });
+ }
+}
+
+@Component
+export struct CocosWebView {
+ @ObjectLink viewInfo: WebViewInfo;
+ public workPort: PortProxy | null = null;
+
+ build() {
+ Web({ src: this.viewInfo.url, controller: this.viewInfo.controller })
+ .position({ x: this.viewInfo.x, y: this.viewInfo.y })
+ .width(this.viewInfo.w)
+ .height(this.viewInfo.h)
+ .border({ width: 1 })
+ .onControllerAttached(() => {
+ if (this.viewInfo.url != '') {
+ this.viewInfo.controller.loadUrl(this.viewInfo.url);
+ }
+ })
+ .onPageBegin((event) => {
+ this.workPort?.postMessage("onPageBegin", {
+ viewTag: this.viewInfo.viewTag as number,
+ url: event?.url as string
+ } as param);
+ })
+ .onPageEnd((event) => {
+ this.workPort?.postMessage("onPageEnd", { viewTag: this.viewInfo.viewTag as number, url: event?.url as string } as param)
+ })
+ .onErrorReceive((event) => {
+ this.workPort?.postMessage("onErrorReceive", { viewTag: this.viewInfo.viewTag as number, url: this.viewInfo.url as string } as param)
+ })
+ .onHttpErrorReceive((event) => {
+ this.workPort?.postMessage("onErrorReceive", { viewTag: this.viewInfo.viewTag as number, url: this.viewInfo.url as string } as param)
+ })
+ .domStorageAccess(true)// enable DOM storage permissions
+ .databaseAccess(true)// enable database storage permissions
+ .imageAccess(true)// enable image loading permissions
+ .javaScriptAccess(true)// support JS code running
+ .visibility(this.viewInfo.visible ? Visibility.Visible : Visibility.None)
+ }
+}
\ No newline at end of file
diff --git a/demo/native/engine/harmonyos-next/entry/src/main/ets/components/EditBoxDialog.ets b/demo/native/engine/harmonyos-next/entry/src/main/ets/components/EditBoxDialog.ets
new file mode 100644
index 0000000..f8f587a
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/src/main/ets/components/EditBoxDialog.ets
@@ -0,0 +1,89 @@
+/****************************************************************************
+ Copyright (c) 2022-2023 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ ****************************************************************************/
+@Observed
+export class EditboxShowInfo {
+ public backgroundColor: number = 0xFFFFFFFF;
+ public enterKeyType: EnterKeyType = EnterKeyType.Done;
+ public type:InputType = InputType.Normal;
+ public maxLength: number = 65536;
+ public defaultMessage: string = '';
+ public textAlign: TextAlign = TextAlign.Start;
+ public showUnderline: boolean = false;
+ public multiLines: boolean = false;
+ // API12
+ public underLineColor: number = 0xFFFFFFFF;
+}
+
+@CustomDialog
+export struct EditBoxDialog {
+ private inputMessage: string = ''
+ @ObjectLink showInfo: EditboxShowInfo;
+ onTextChange?: (msg: string) => void;
+ accept?: (msg: string) => void;
+ controller?: CustomDialogController;
+ cancel?: () => void;
+ confirm?: (msg: string) => void;
+
+ build() {
+ Column() {
+ Row() {
+ TextInput({ text: this.showInfo.defaultMessage })
+ .defaultFocus(true)
+ .backgroundColor('#ffffff')
+ .backgroundColor(this.showInfo.backgroundColor)
+ .type(this.showInfo.type)
+ .maxLength(this.showInfo.maxLength)
+ .textAlign(this.showInfo.textAlign)
+ .showUnderline(this.showInfo.showUnderline)
+ .enterKeyType(this.showInfo.enterKeyType)
+ .layoutWeight(1)
+ .onChange((value) => {
+ if (this.onTextChange) {
+ this.onTextChange(value);
+ }
+ this.inputMessage = value;
+ })
+ .onSubmit((value) => {
+ if(this.confirm) {
+ this.confirm(this.inputMessage);
+ }
+ this.controller?.close();
+ })
+ Blank(8).width(16)
+ Button('完成').onClick(() => {
+ if (this.accept) {
+ this.accept(this.inputMessage);
+ }
+ this.controller?.close();
+ })
+ }.padding({ left: 8, right: 8, top: 8, bottom: 8 })
+ .backgroundColor(Color.Gray)
+ .offset({ x : 0, y : 15 })
+ }
+ .width('100%')
+
+ .justifyContent(FlexAlign.End)
+ }
+}
diff --git a/demo/native/engine/harmonyos-next/entry/src/main/ets/entryability/EntryAbility.ets b/demo/native/engine/harmonyos-next/entry/src/main/ets/entryability/EntryAbility.ets
new file mode 100644
index 0000000..c5fbeea
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/src/main/ets/entryability/EntryAbility.ets
@@ -0,0 +1,92 @@
+import UIAbility from '@ohos.app.ability.UIAbility';
+import cocos, { context } from 'libcocos.so';
+import { ContextType } from '../common/Constants';
+import window from '@ohos.window';
+import { BusinessError } from '@kit.BasicServicesKit';
+import { AbilityConstant, Want } from '@kit.AbilityKit';
+
+const nativeContext: context = cocos.getContext(ContextType.ENGINE_UTILS);
+const nativeAppLifecycle: context = cocos.getContext(ContextType.APP_LIFECYCLE);
+enum windowStageType {
+ hide,
+ show
+}
+export default class EntryAbility extends UIAbility {
+ private windowStageType: windowStageType = windowStageType.hide;
+
+ onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
+ globalThis.abilityWant = want;
+ nativeAppLifecycle.onCreate();
+ nativeContext.resourceManagerInit(this.context.resourceManager);
+ }
+
+ onDestroy() {
+ nativeAppLifecycle.onDestroy();
+ }
+
+ onWindowStageCreate(windowStage: window.WindowStage) {
+ nativeContext.writablePathInit(this.context.cacheDir);
+
+ // Get the Main window instance
+ let windowClass: window.Window | undefined = undefined;
+ windowStage.getMainWindow((err: BusinessError, data) => {
+ if (err.code) {
+ console.error('Failed to obtain the main window. Cause: ' + JSON.stringify(err));
+ return;
+ }
+ windowClass = data;
+ // Set whether to display the status bar and navigation bar. If they are not displayed, [] is displayed.
+ let systemBarPromise = windowClass.setWindowSystemBarEnable([]);
+ // Whether the window layout is displayed in full screen mode
+ let fullScreenPromise = windowClass.setWindowLayoutFullScreen(true);
+ // Sets whether the screen is always on.
+ let keepScreenOnPromise = windowClass.setWindowKeepScreenOn(true);
+ Promise.all([systemBarPromise, fullScreenPromise, keepScreenOnPromise]).then(() => {
+ console.info('Succeeded in setting the window');
+ }).catch((err:BusinessError) => {
+ console.error('Failed to set the window, cause ' + JSON.stringify(err));
+ });
+ });
+ // Main window is created, set main page for this ability
+ windowStage.loadContent("pages/index", (err, data) => {
+ if (err.code) {
+ console.error('Failed to load the content. Cause:' + JSON.stringify(err));
+ return;
+ }
+ });
+ windowStage.on("windowStageEvent", (data) => {
+ let stageEventType: window.WindowStageEventType = data;
+ switch (stageEventType) {
+ case window.WindowStageEventType.RESUMED:
+ this.onChangeWinodowStageType(windowStageType.show);
+ break;
+ case window.WindowStageEventType.PAUSED:
+ this.onChangeWinodowStageType(windowStageType.hide);
+ break;
+ default:
+ break;
+ }
+ });
+ }
+
+ onWindowStageDestroy() {
+
+ }
+
+ onForeground() {
+ // Ability has brought to foreground
+ this.onChangeWinodowStageType(windowStageType.show);
+ }
+
+ onBackground() {
+ // Ability has back to background
+ this.onChangeWinodowStageType(windowStageType.hide);
+ }
+
+ onChangeWinodowStageType(type: windowStageType) {
+ if (this.windowStageType != type) {
+ this.windowStageType = type;
+ this.windowStageType === windowStageType.show ? nativeAppLifecycle.onShow() : nativeAppLifecycle.onHide();
+ }
+ }
+}
diff --git a/demo/native/engine/harmonyos-next/entry/src/main/ets/pages/index.ets b/demo/native/engine/harmonyos-next/entry/src/main/ets/pages/index.ets
new file mode 100644
index 0000000..fca4f64
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/src/main/ets/pages/index.ets
@@ -0,0 +1,460 @@
+/****************************************************************************
+ Copyright (c) 2022-2023 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ ****************************************************************************/
+import nativerender,{context} from 'libcocos.so';
+
+import { WorkerManager } from '../cocos/WorkerManager';
+import { ContextType } from '../common/Constants';
+import { EditBoxDialog, EditboxShowInfo } from '../components/EditBoxDialog';
+import { CocosWebView, WebViewInfo } from '../components/CocosWebView';
+import { CocosVideoPlayer, VideoInfo } from '../components/CocosVideoPlayer';
+import { MessageEvent } from '@ohos.worker';
+import { PortProxy } from '../common/PortProxy';
+import { common } from '@kit.AbilityKit';
+import { BusinessError } from '@kit.BasicServicesKit';
+
+const nativePageLifecycle :context = nativerender.getContext(ContextType.JSPAGE_LIFECYCLE);
+const engineUtils :context = nativerender.getContext(ContextType.ENGINE_UTILS);
+
+
+function executeMethodAsync(nativeFunc: Function, funcData: string, funCb: Function): void {
+ nativeFunc && nativeFunc(funcData, funCb);
+}
+function executeMethodSync(nativeFunc: Function, funcData: string): string|boolean|number {
+ return nativeFunc && nativeFunc(funcData);
+}
+engineUtils.registerFunction("executeMethodAsync", executeMethodAsync);
+engineUtils.registerFunction("executeMethodSync", executeMethodSync);
+
+interface WorkerMessage {
+ type: string;
+ data: data;
+}
+
+interface data {
+ id: string,
+ name: string,
+ param: number | string | param
+}
+
+interface param {
+ tag?: number,
+ url?: string,
+ contents?: string,
+ mimeType?: string,
+ encoding?: string,
+ baseUrl?: string,
+ jsContents?: string,
+ x?: number,
+ y?: number,
+ w?: number,
+ h?: number,
+ visible?: boolean,
+ resourceType?: number,
+ time?: number,
+ fullScreen?: boolean
+}
+
+interface editboxShowInfo {
+ defaultValue?: string;
+ confirmType?: string;
+ inputType?: string;
+ maxLength?: number;
+ x?:number;
+ y?:number;
+ width?:number;
+ height?:number;
+ confirmHold?: boolean;
+ isMultiline?: boolean;
+ fontSize?: number;
+ fontColor?: number;
+ backColor?: number;
+ backgroundColor?: number;
+ isBold?: boolean;
+ isItalic?: boolean;
+ isUnderline?: boolean;
+ underlineColor?: number;
+ textAlignment?: number;
+}
+
+@Entry
+@Component
+struct Index {
+ @State showInfo: EditboxShowInfo = new EditboxShowInfo;
+ @State webViewArray: WebViewInfo[] = [];
+ @State videoArray: VideoInfo[] = [];
+ private webViewIndexMap: Map = new Map();
+ private videoIndexMap: Map = new Map();
+ private workPort: PortProxy = new PortProxy(WorkerManager.getInstance().getWorker());
+ dialogController: CustomDialogController = new CustomDialogController({
+ builder: EditBoxDialog({
+ showInfo: this.showInfo,
+ onTextChange: (msg: string): void => {
+ this.showInfo.defaultMessage = msg;
+ this.workPort.postMessage('onTextInput', msg);
+ },
+ accept: (msg: string): void => {
+ this.showInfo.defaultMessage = msg;
+ this.workPort.postMessage('onComplete', msg);
+ },
+ confirm: (msg: string): void => {
+ this.showInfo.defaultMessage = msg;
+ this.workPort.postMessage('onConfirm', msg);
+ this.workPort.postMessage('onComplete', msg);
+ },
+ }),
+ cancel: (): void => {
+ this.workPort.postMessage('onComplete', this.showInfo.defaultMessage);
+ },
+ autoCancel: true,
+ alignment: DialogAlignment.Bottom,
+ customStyle: true,
+ })
+
+ aboutToAppear(): void {
+ console.log('[LIFECYCLE-Index] cocos aboutToAppear');
+ this.workPort._messageHandle = async (e: MessageEvent): Promise => {
+ let data: WorkerMessage = e.data;
+ let msg = data.data;
+ let result: boolean | string | number | null = null;
+ switch (msg.name) {
+ // EditBox
+ case "showEditBox": {
+ let param = msg.param as editboxShowInfo;
+ this.showInfo.defaultMessage = param?.defaultValue as string;
+ this.showInfo.backgroundColor = param?.backColor as number;
+ if(param?.confirmType == 'done') {
+ this.showInfo.enterKeyType = EnterKeyType.Done;
+ } else if(param?.confirmType == 'send') {
+ this.showInfo.enterKeyType = EnterKeyType.Send;
+ } else if(param?.confirmType == 'search') {
+ this.showInfo.enterKeyType = EnterKeyType.Search;
+ } else if(param?.confirmType == 'go') {
+ this.showInfo.enterKeyType = EnterKeyType.Go;
+ } else if(param?.confirmType == 'next') {
+ this.showInfo.enterKeyType = EnterKeyType.Next;
+ } else {
+ this.showInfo.enterKeyType = EnterKeyType.Done;
+ }
+ if(param?.inputType == 'password') {
+ this.showInfo.type = InputType.Password;
+ } else if(param?.inputType === 'email') {
+ this.showInfo.type = InputType.Email;
+ } else if(param?.inputType === 'number') {
+ this.showInfo.type = InputType.Number;
+ } else if(param?.inputType === 'digit') {
+ this.showInfo.type = InputType.NUMBER_DECIMAL;
+ } else if(param?.inputType === 'tel') {
+ this.showInfo.type = InputType.PhoneNumber;
+ } else if(param?.inputType === 'url') {
+ // No url support
+ } else {
+ this.showInfo.type = InputType.Normal;
+ }
+ if(param?.maxLength != undefined && param?.maxLength > 0) {
+ this.showInfo.maxLength = param.maxLength;
+ } else {
+ this.showInfo.maxLength = 65536;
+ }
+
+ if(param?.isUnderline != undefined) {
+ this.showInfo.showUnderline = param?.isUnderline;
+ this.showInfo.underLineColor = param?.underlineColor as number;
+ } else {
+ this.showInfo.showUnderline = false;
+ }
+
+ if(param?.textAlignment == 0) {
+ this.showInfo.textAlign = TextAlign.Start;
+ } else if(param?.textAlignment == 1) {
+ this.showInfo.textAlign = TextAlign.Center;
+ } else if(param?.textAlignment == 2) {
+ this.showInfo.textAlign = TextAlign.End;
+ } else {
+ this.showInfo.textAlign = TextAlign.Start;
+ }
+ this.dialogController.open();
+ break;
+ }
+ case "hideEditBox": {
+ this.showInfo.defaultMessage = '';
+ this.dialogController.close();
+ break;
+ }
+ // WebView
+ case "createWebView": {
+ this.webViewArray.push(new WebViewInfo(0, 0, 0, 0, msg.param as number));
+ this.webViewIndexMap.set(msg.param as number, this.webViewArray.length - 1);
+ break;
+ }
+ case "removeWebView": {
+ if (this.webViewArray.length > 0) {
+ this.webViewArray.splice(this.webViewIndexMap.get(msg?.param as number) as number, 1);
+ }
+ break;
+ }
+ case "loadUrl": {
+ let web = msg.param as param;
+ let index = this.webViewIndexMap.get(web?.tag as number) as number;
+ this.webViewArray[index].url = web?.url as string;
+ this.webViewArray[index].controller.loadUrl(web?.url as string);
+ break;
+ }
+ case "loadHTMLString": {
+ let web = msg.param as param;
+ let index = this.webViewIndexMap.get(web?.tag as number) as number;
+ this.webViewArray[index].controller.loadData(
+ web?.contents as string,
+ "text/html",
+ "UTF-8",
+ web?.baseUrl
+ );
+ break;
+ }
+ case "loadData": {
+ let web = msg.param as param;
+ let index = this.webViewIndexMap.get(web?.tag as number) as number;
+ this.webViewArray[index].controller.loadData(
+ web?.contents as string,
+ web?.mimeType as string,
+ web?.encoding as string,
+ web?.baseUrl as string
+ );
+ break;
+ }
+ case "evaluateJS": {
+ let web = msg.param as param;
+ let index = this.webViewIndexMap.get(web?.tag as number) as number;
+ this.webViewArray[index].controller.runJavaScript(web?.jsContents as string);
+ break;
+ }
+ case "reload": {
+ let index = this.webViewIndexMap.get(msg.param as number) as number;
+ this.webViewArray[index].controller.refresh();
+ break;
+ }
+ case "stopLoading": {
+ let index = this.webViewIndexMap.get(msg.param as number) as number;
+ this.webViewArray[index].controller.stop();
+ break;
+ }
+ case "canGoForward": {
+ let index = this.webViewIndexMap.get(msg.param as number) as number;
+ result = this.webViewArray[index].controller.accessForward();
+ break;
+ }
+ case "canGoBack": {
+ let index = this.webViewIndexMap.get(msg.param as number) as number;
+ result = this.webViewArray[index].controller.accessBackward();
+ break;
+ }
+ case "goForward": {
+ let index = this.webViewIndexMap.get(msg.param as number) as number;
+ this.webViewArray[index].controller.forward();
+ break;
+ }
+ case "goBack": {
+ let index = this.webViewIndexMap.get(msg.param as number) as number;
+ this.webViewArray[index].controller.backward();
+ break;
+ }
+ case "setWebViewRect": {
+ let web = msg.param as param
+ let index = this.webViewIndexMap.get(web?.tag as number) as number;
+ this.webViewArray[index].x = px2vp(web?.x as number) as number;
+ this.webViewArray[index].y = px2vp(web?.y as number) as number;
+ this.webViewArray[index].w = px2vp(web?.w as number) as number;
+ this.webViewArray[index].h = px2vp(web?.h as number) as number;
+ break;
+ }
+ case "setVisible": {
+ let web = msg.param as param;
+ let index = this.webViewIndexMap.get(web?.tag as number) as number;
+ this.webViewArray[index].visible = web?.visible as boolean;
+ break;
+ }
+ // video
+ case "createVideo": {
+ this.videoArray.push(new VideoInfo(0, 0, 0, 0, msg.param as number));
+ this.videoIndexMap.set(msg.param as number, this.videoArray.length - 1);
+ break;
+ }
+ case "removeVideo": {
+ if (this.videoArray.length > 0) {
+ this.videoArray.splice(this.videoIndexMap.get(msg.param as number) as number, 1);
+ }
+ break;
+ }
+ case "setVideoUrl":
+ let video = msg.param as param;
+ let index = this.videoIndexMap.get(video?.tag as number) as number;
+ let resourceType = video.resourceType;
+ if (resourceType == 1) {
+ video.url = 'Resources/' + video.url;
+ this.videoArray[index].url = $rawfile(video.url as string);
+ } else {
+ this.videoArray[index].url = video.url as string;
+ }
+ break;
+ case "setVideoRect": {
+ let video = msg.param as param;
+ let index = this.videoIndexMap.get(video?.tag as number) as number;
+ this.videoArray[index].x = px2vp(video?.x as number) as number;
+ this.videoArray[index].y = px2vp(video?.y as number) as number;
+ this.videoArray[index].w = px2vp(video?.w as number) as number;
+ this.videoArray[index].h = px2vp(video?.h as number) as number;
+ break;
+ }
+ case "startVideo": {
+ let index = this.videoIndexMap.get(msg.param as number) as number;
+ if(this.videoArray[index].duration){
+ this.videoArray[index].controller.start();
+ }else{
+ this.videoArray[index].isPreparedStart = true;
+ }
+ break;
+ }
+ case "pauseVideo": {
+ let index = this.videoIndexMap.get(msg.param as number) as number;
+ this.videoArray[index].controller.pause();
+ break;
+ }
+ case "stopVideo": {
+ let index = this.videoIndexMap.get(msg.param as number) as number;
+ this.videoArray[index].controller.stop();
+ break;
+ }
+ case "resumeVideo": {
+ let index = this.videoIndexMap.get(msg.param as number) as number;
+ this.videoArray[index].controller.start();
+ break;
+ }
+ case "getVideoDuration": {
+ let index = this.videoIndexMap.get(msg.param as number) as number;
+ result = this.videoArray[index].duration;
+ break;
+ }
+ case "seekVideoTo": {
+ let video = msg.param as param;
+ let index = this.videoIndexMap.get(video?.tag as number) as number;
+ this.videoArray[index].controller.setCurrentTime(video?.time as number, SeekMode.Accurate);
+ break;
+ }
+ case "setVideoVisible": {
+ let video = msg.param as param;
+ let index = this.videoIndexMap.get(video?.tag as number) as number;
+ this.videoArray[index].visible = video.visible as boolean;
+ break;
+ }
+ case "setFullScreenEnabled": {
+ let video = msg.param as param;
+ let index = this.videoIndexMap.get(video?.tag as number) as number;
+ this.videoArray[index].isFullScreen = video.fullScreen as boolean;
+ break;
+ }
+ case "currentTime": {
+ let index = this.videoIndexMap.get(msg.param as number) as number;
+ result = this.videoArray[index].currentTime;
+ break;
+ }
+ case "exitGame": {
+ this.terminateSelf();
+ break;
+ }
+ default: {
+
+ }
+ }
+ if (result != null || result != undefined) {
+ this.workPort.postReturnMessage(data, result);
+ }
+ }
+ }
+
+ aboutToDisappear(): void {
+ console.log('[LIFECYCLE-Index] cocos aboutToDisappear');
+// this.cocosWorker.postMessage({type: "JSPageLifecycle", data: "aboutToAppear"});
+// nativePageLifecycle.aboutToDisappear();
+ }
+
+ onPageShow(): void {
+ console.log('[LIFECYCLE-Page] cocos onPageShow');
+ nativePageLifecycle.onPageShow();
+ }
+
+ onPageHide(): void {
+ console.log('[LIFECYCLE-Page] cocos onPageHide');
+ nativePageLifecycle.onPageHide();
+ }
+
+ onBackPress() {
+ console.log("[LIFECYCLE-Page] cocos onBackPress");
+ this.workPort.postMessage("backPress", "");
+ // If disable system exit needed, remove comment "return true"
+ // return true;
+ }
+
+ terminateSelf() {
+ try {
+ (getContext(this) as common.UIAbilityContext).terminateSelf((err: BusinessError) => {
+ if (err.code) {
+ console.error(`terminateSelf failed, code is ${err.code}, message is ${err.message}`);
+ return;
+ }
+ console.info('terminateSelf succeed');
+ });
+ } catch (err) {
+ let code = (err as BusinessError).code;
+ let message = (err as BusinessError).message;
+ console.error(`terminateSelf failed, code is ${code}, message is ${message}`);
+ }
+ }
+
+ build() {
+ Flex({
+ direction: FlexDirection.Column,
+ alignItems: ItemAlign.Center,
+ justifyContent: FlexAlign.Center
+ } as FlexOptions) {
+ XComponent({ id: 'xcomponentId', type: 'surface', libraryname: 'cocos' })
+ .onLoad((context) => {
+ // Set the cache directory in the ts layer.
+ this.workPort.postMessage("onXCLoad", "XComponent");
+ })
+ .onDestroy(() => {
+ console.log('cocos onDestroy')
+ })
+
+ ForEach(this.webViewArray, (item: WebViewInfo) => {
+ CocosWebView({ viewInfo: item, workPort: this.workPort })
+ }, (item: WebViewInfo): string => item.viewTag.toString())
+
+ ForEach(this.videoArray, (item: VideoInfo) => {
+ CocosVideoPlayer({ videoInfo: item, workPort: this.workPort })
+ }, (item: VideoInfo): string => item.viewTag.toString())
+ }
+ .width('100%')
+ .height('100%')
+ }
+}
diff --git a/demo/native/engine/harmonyos-next/entry/src/main/ets/workers/cocos_worker.ts b/demo/native/engine/harmonyos-next/entry/src/main/ets/workers/cocos_worker.ts
new file mode 100644
index 0000000..ee34bf3
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/src/main/ets/workers/cocos_worker.ts
@@ -0,0 +1,120 @@
+/****************************************************************************
+ Copyright (c) 2022-2023 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+****************************************************************************/
+
+import worker from '@ohos.worker';
+import cocos from 'libcocos.so';
+import hilog from '@ohos.hilog';
+
+import { ContextType } from '../common/Constants';
+
+import { PortProxy } from '../common/PortProxy';
+
+
+ globalThis.importPolyfill = async function () {
+ await import('../cocos/oh-adapter/sys-ability-polyfill.js');
+ }
+ globalThis.importPolyfill();
+ globalThis.oh = {};
+
+
+if (!(console as any).assert) {
+ (console as any).assert = function(cond, msg) {
+ if (!cond) {
+ throw new Error(msg);
+ }
+ };
+}
+
+const nativeContext = cocos.getContext(ContextType.WORKER_INIT);
+nativeContext.workerInit();
+
+const nativeEditBox = cocos.getContext(ContextType.EDITBOX_UTILS);
+const nativeWebView = cocos.getContext(ContextType.WEBVIEW_UTILS);
+const appLifecycle = cocos.getContext(ContextType.APP_LIFECYCLE);
+const nativeVideo = cocos.getContext(ContextType.VIDEO_UTILS);
+
+let uiPort = new PortProxy(worker.workerPort);
+
+nativeContext.postMessage = function (msgType: string, msgData: string): void {
+ uiPort.postMessage(msgType, msgData);
+}
+
+nativeContext.postSyncMessage = async function (msgType: string, msgData: string): Promise {
+ const result = await uiPort.postSyncMessage(msgType, msgData) as boolean | string | number;
+ return result;
+}
+
+// The purpose of this is to avoid being GC
+nativeContext.setPostMessageFunction.call(nativeContext, nativeContext.postMessage)
+nativeContext.setPostSyncMessageFunction.call(nativeContext, nativeContext.postSyncMessage)
+
+globalThis.terminateProcess = function () {
+ uiPort.postMessage("exitGame",0);
+}
+
+uiPort._messageHandle = function (e) {
+ var data = e.data;
+ var msg = data.data;
+
+ switch (msg.name) {
+ case "onXCLoad":
+ const renderContext = cocos.getContext(ContextType.NATIVE_RENDER_API);
+ renderContext.nativeEngineInit();
+
+ // @ts-ignore
+ globalThis.oh.postMessage = nativeContext.postMessage;
+ // @ts-ignore
+ globalThis.oh.postSyncMessage = nativeContext.postSyncMessage;
+ renderContext.nativeEngineStart();
+ break;
+ case "onTextInput":
+ nativeEditBox.onTextChange(msg.param);
+ break;
+ case "onComplete":
+ nativeEditBox.onComplete(msg.param);
+ break;
+ case "onConfirm":
+ nativeEditBox.onConfirm(msg.param);
+ break;
+ case "onPageBegin":
+ nativeWebView.shouldStartLoading(msg.param.viewTag, msg.param.url);
+ break;
+ case "onPageEnd":
+ nativeWebView.finishLoading(msg.param.viewTag, msg.param.url);
+ break;
+ case "onErrorReceive":
+ nativeWebView.failLoading(msg.param.viewTag, msg.param.url);
+ break;
+ case "onVideoEvent":
+ nativeVideo.onVideoEvent(JSON.stringify(msg.param));
+ break;
+ case "backPress":
+ appLifecycle.onBackPress();
+ break;
+ default:
+ console.error("cocos worker: message type unknown");
+ break;
+ }
+}
diff --git a/demo/native/engine/harmonyos-next/entry/src/main/module.json5 b/demo/native/engine/harmonyos-next/entry/src/main/module.json5
new file mode 100644
index 0000000..9c3fe94
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/src/main/module.json5
@@ -0,0 +1,58 @@
+{
+ "module": {
+ "name": "entry",
+ "type": "entry",
+ "description": "$string:entry_desc",
+ "mainElement": "EntryAbility",
+ "deviceTypes": [
+ "default"
+ ],
+ "requestPermissions": [
+ {
+ "name": "ohos.permission.INTERNET"
+ },
+ {
+ "name": "ohos.permission.VIBRATE"
+ },
+ {
+ "name": "ohos.permission.GET_NETWORK_INFO"
+ },
+ {
+ "name": "ohos.permission.ACCELEROMETER"
+ },
+ {
+ "name": "ohos.permission.GYROSCOPE"
+ }
+ ],
+ "deliveryWithInstall": true,
+ "installationFree": false,
+ "pages": "$profile:main_pages",
+ "abilities": [
+ {
+ "name": "EntryAbility",
+ "srcEntry": "./ets/entryability/EntryAbility.ets",
+ "description": "$string:MainAbility_desc",
+ "orientation": "portrait",
+ "icon": "$media:icon",
+ "label": "$string:MainAbility_label",
+ "startWindowIcon": "$media:icon",
+ "removeMissionAfterTerminate": true,
+ "startWindowBackground": "$color:white",
+ "supportWindowMode": [
+ "fullscreen"
+ ],
+ "exported": true,
+ "skills": [
+ {
+ "entities": [
+ "entity.system.home"
+ ],
+ "actions": [
+ "action.system.home"
+ ]
+ }
+ ]
+ }
+ ]
+ }
+}
diff --git a/demo/native/engine/harmonyos-next/entry/src/main/resources/.gitignore b/demo/native/engine/harmonyos-next/entry/src/main/resources/.gitignore
new file mode 100755
index 0000000..e8ca1f9
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/src/main/resources/.gitignore
@@ -0,0 +1,2 @@
+/rawfile/
+.DS_Store
\ No newline at end of file
diff --git a/demo/native/engine/harmonyos-next/entry/src/main/resources/base/element/color.json b/demo/native/engine/harmonyos-next/entry/src/main/resources/base/element/color.json
new file mode 100644
index 0000000..28b0c53
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/src/main/resources/base/element/color.json
@@ -0,0 +1,12 @@
+{
+ "color": [
+ {
+ "name": "white",
+ "value": "#FFFFFF"
+ },
+ {
+ "name": "black",
+ "value": "#000000"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/demo/native/engine/harmonyos-next/entry/src/main/resources/base/element/string.json b/demo/native/engine/harmonyos-next/entry/src/main/resources/base/element/string.json
new file mode 100644
index 0000000..343a109
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/src/main/resources/base/element/string.json
@@ -0,0 +1,20 @@
+{
+ "string": [
+ {
+ "name": "entry_desc",
+ "value": "description"
+ },
+ {
+ "name": "MainAbility_label",
+ "value": "kunpocreator"
+ },
+ {
+ "name": "MainAbility_desc",
+ "value": "description"
+ },
+ {
+ "name": "permissions_label",
+ "value": "label"
+ }
+ ]
+}
diff --git a/demo/native/engine/harmonyos-next/entry/src/main/resources/base/media/icon.png b/demo/native/engine/harmonyos-next/entry/src/main/resources/base/media/icon.png
new file mode 100644
index 0000000..2b6f32a
Binary files /dev/null and b/demo/native/engine/harmonyos-next/entry/src/main/resources/base/media/icon.png differ
diff --git a/demo/native/engine/harmonyos-next/entry/src/main/resources/base/profile/main_pages.json b/demo/native/engine/harmonyos-next/entry/src/main/resources/base/profile/main_pages.json
new file mode 100644
index 0000000..feec276
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/entry/src/main/resources/base/profile/main_pages.json
@@ -0,0 +1,5 @@
+{
+ "src": [
+ "pages/index"
+ ]
+}
diff --git a/demo/native/engine/harmonyos-next/hvigor/hvigor-config.json5 b/demo/native/engine/harmonyos-next/hvigor/hvigor-config.json5
new file mode 100644
index 0000000..2662c04
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/hvigor/hvigor-config.json5
@@ -0,0 +1,22 @@
+{
+ "modelVersion": "5.0.0",
+ "dependencies": {
+ },
+ "execution": {
+ // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */
+ // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */
+ // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */
+ // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */
+ // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */
+ },
+ "logging": {
+ // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */
+ },
+ "debugging": {
+ // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */
+ },
+ "nodeOptions": {
+ // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/
+ // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/
+ }
+}
\ No newline at end of file
diff --git a/demo/native/engine/harmonyos-next/hvigorfile.ts b/demo/native/engine/harmonyos-next/hvigorfile.ts
new file mode 100644
index 0000000..f3cb9f1
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/hvigorfile.ts
@@ -0,0 +1,6 @@
+import { appTasks } from '@ohos/hvigor-ohos-plugin';
+
+export default {
+ system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */
+ plugins:[] /* Custom plugin to extend the functionality of Hvigor. */
+}
diff --git a/demo/native/engine/harmonyos-next/oh-package.json5 b/demo/native/engine/harmonyos-next/oh-package.json5
new file mode 100644
index 0000000..98f2469
--- /dev/null
+++ b/demo/native/engine/harmonyos-next/oh-package.json5
@@ -0,0 +1,13 @@
+{
+ modelVersion: '5.0.0',
+ devDependencies: {
+ '@ohos/hypium': '1.0.18',
+ '@ohos/hamock': '1.0.0',
+ },
+ author: '',
+ name: 'kunpocreator',
+ description: 'example description',
+ main: '',
+ version: '1.0.0',
+ dependencies: {},
+}
\ No newline at end of file
diff --git a/demo/native/engine/ios/AppDelegate.h b/demo/native/engine/ios/AppDelegate.h
new file mode 100644
index 0000000..d91c20e
--- /dev/null
+++ b/demo/native/engine/ios/AppDelegate.h
@@ -0,0 +1,41 @@
+/****************************************************************************
+ Copyright (c) 2010-2013 cocos2d-x.org
+ Copyright (c) 2013-2016 Chukong Technologies Inc.
+ Copyright (c) 2017-2022 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You
+shall not use Cocos Creator software for developing other software or tools
+that's used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to
+you.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+****************************************************************************/
+
+#pragma once
+
+#import "platform/ios/AppDelegateBridge.h"
+#import
+
+@class ViewController;
+
+@interface AppDelegate : NSObject {
+}
+
+@property(nonatomic, readonly) ViewController *viewController;
+@property(nonatomic, readonly) AppDelegateBridge *appDelegateBridge;
+@end
diff --git a/demo/native/engine/ios/AppDelegate.mm b/demo/native/engine/ios/AppDelegate.mm
new file mode 100644
index 0000000..cf3202c
--- /dev/null
+++ b/demo/native/engine/ios/AppDelegate.mm
@@ -0,0 +1,107 @@
+/****************************************************************************
+ Copyright (c) 2010-2013 cocos2d-x.org
+ Copyright (c) 2013-2016 Chukong Technologies Inc.
+ Copyright (c) 2017-2022 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+****************************************************************************/
+
+#import "AppDelegate.h"
+#import "ViewController.h"
+#import "View.h"
+
+#include "platform/ios/IOSPlatform.h"
+#import "platform/ios/AppDelegateBridge.h"
+#import "service/SDKWrapper.h"
+
+@implementation AppDelegate
+@synthesize window;
+@synthesize appDelegateBridge;
+
+#pragma mark -
+#pragma mark Application lifecycle
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+ [[SDKWrapper shared] application:application didFinishLaunchingWithOptions:launchOptions];
+ appDelegateBridge = [[AppDelegateBridge alloc] init];
+
+ // Add the view controller's view to the window and display.
+ CGRect bounds = [[UIScreen mainScreen] bounds];
+ self.window = [[UIWindow alloc] initWithFrame:bounds];
+
+ // Should create view controller first, cc::Application will use it.
+ _viewController = [[ViewController alloc] init];
+ _viewController.view = [[View alloc] initWithFrame:bounds];
+ _viewController.view.contentScaleFactor = UIScreen.mainScreen.scale;
+ _viewController.view.multipleTouchEnabled = true;
+ [self.window setRootViewController:_viewController];
+
+ [self.window makeKeyAndVisible];
+ [appDelegateBridge application:application didFinishLaunchingWithOptions:launchOptions];
+ return YES;
+}
+
+- (void)applicationWillResignActive:(UIApplication *)application {
+ /*
+ Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
+ Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
+ */
+ [[SDKWrapper shared] applicationWillResignActive:application];
+ [appDelegateBridge applicationWillResignActive:application];
+}
+
+- (void)applicationDidBecomeActive:(UIApplication *)application {
+ /*
+ Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
+ */
+ [[SDKWrapper shared] applicationDidBecomeActive:application];
+ [appDelegateBridge applicationDidBecomeActive:application];
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application {
+ /*
+ Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
+ If your application supports background execution, called instead of applicationWillTerminate: when the user quits.
+ */
+ [[SDKWrapper shared] applicationDidEnterBackground:application];
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application {
+ /*
+ Called as part of transition from the background to the inactive state: here you can undo many of the changes made on entering the background.
+ */
+ [[SDKWrapper shared] applicationWillEnterForeground:application];
+}
+
+- (void)applicationWillTerminate:(UIApplication *)application {
+ [[SDKWrapper shared] applicationWillTerminate:application];
+ [appDelegateBridge applicationWillTerminate:application];
+}
+
+#pragma mark -
+#pragma mark Memory management
+
+- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
+ [[SDKWrapper shared] applicationDidReceiveMemoryWarning:application];
+}
+
+@end
diff --git a/demo/native/engine/ios/Base.lproj/LaunchScreen.storyboard b/demo/native/engine/ios/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000..a2c9831
--- /dev/null
+++ b/demo/native/engine/ios/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demo/native/engine/ios/Base.lproj/Localizable.strings b/demo/native/engine/ios/Base.lproj/Localizable.strings
new file mode 100644
index 0000000..2a177ff
--- /dev/null
+++ b/demo/native/engine/ios/Base.lproj/Localizable.strings
@@ -0,0 +1,9 @@
+/*
+ Localizable.strings
+ */
+
+"done" = "Done";
+"next" = "Next";
+"search" = "Search";
+"go" = "Go";
+"send" = "Send";
diff --git a/demo/native/engine/ios/CMakeLists.txt b/demo/native/engine/ios/CMakeLists.txt
new file mode 100755
index 0000000..326ec1b
--- /dev/null
+++ b/demo/native/engine/ios/CMakeLists.txt
@@ -0,0 +1,20 @@
+cmake_minimum_required(VERSION 3.8)
+
+set(CMAKE_SYSTEM_NAME iOS)
+set(APP_NAME "kunpocreator" CACHE STRING "Project Name")
+
+project(${APP_NAME} CXX)
+
+set(CC_PROJECT_DIR ${CMAKE_CURRENT_LIST_DIR})
+set(CC_UI_RESOURCES)
+set(CC_PROJ_SOURCES)
+set(CC_ASSET_FILES)
+set(CC_COMMON_SOURCES)
+set(CC_ALL_SOURCES)
+
+include(${CC_PROJECT_DIR}/../common/CMakeLists.txt)
+set(EXECUTABLE_NAME ${APP_NAME}-mobile)
+
+cc_ios_before_target(${EXECUTABLE_NAME})
+add_executable(${EXECUTABLE_NAME} ${CC_ALL_SOURCES})
+cc_ios_after_target(${EXECUTABLE_NAME})
diff --git a/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/1024.png b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/1024.png
new file mode 100644
index 0000000..6e877e3
Binary files /dev/null and b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/1024.png differ
diff --git a/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/114.png b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/114.png
new file mode 100644
index 0000000..62145c9
Binary files /dev/null and b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/114.png differ
diff --git a/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/120.png b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/120.png
new file mode 100644
index 0000000..eff8dda
Binary files /dev/null and b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/120.png differ
diff --git a/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/180.png b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/180.png
new file mode 100644
index 0000000..f39ed53
Binary files /dev/null and b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/180.png differ
diff --git a/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/29.png b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/29.png
new file mode 100644
index 0000000..ad2b7dd
Binary files /dev/null and b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/29.png differ
diff --git a/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/40.png b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/40.png
new file mode 100644
index 0000000..b5e86a1
Binary files /dev/null and b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/40.png differ
diff --git a/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/57.png b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/57.png
new file mode 100644
index 0000000..119f531
Binary files /dev/null and b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/57.png differ
diff --git a/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/58.png b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/58.png
new file mode 100644
index 0000000..e844967
Binary files /dev/null and b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/58.png differ
diff --git a/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/60.png b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/60.png
new file mode 100644
index 0000000..a5361b7
Binary files /dev/null and b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/60.png differ
diff --git a/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/80.png b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/80.png
new file mode 100644
index 0000000..6a51790
Binary files /dev/null and b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/80.png differ
diff --git a/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/87.png b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/87.png
new file mode 100644
index 0000000..7f4b761
Binary files /dev/null and b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/87.png differ
diff --git a/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/Contents.json b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..73d3b7f
--- /dev/null
+++ b/demo/native/engine/ios/Images.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1 @@
+{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"}]}
\ No newline at end of file
diff --git a/demo/native/engine/ios/Images.xcassets/Contents.json b/demo/native/engine/ios/Images.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/demo/native/engine/ios/Images.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/demo/native/engine/ios/Info.plist b/demo/native/engine/ios/Info.plist
new file mode 100644
index 0000000..3da7064
--- /dev/null
+++ b/demo/native/engine/ios/Info.plist
@@ -0,0 +1,55 @@
+
+
+
+
+ UILaunchStoryboardName
+ LaunchScreen
+ CFBundleDevelopmentRegion
+ English
+ CFBundleDisplayName
+ ${PRODUCT_NAME}
+ CFBundleExecutable
+ ${CC_EXECUTABLE_NAME}
+ CFBundleIcons~ipad
+
+ CFBundleIdentifier
+ ${MACOSX_BUNDLE_GUI_IDENTIFIER}
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ ${PRODUCT_NAME}
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ 1.0.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0
+ LSRequiresIPhoneOS
+
+ NSAppTransportSecurity
+
+ NSAllowsArbitraryLoads
+
+
+ UIPrerenderedIcon
+
+ UIRequiredDeviceCapabilities
+
+ accelerometer
+
+ opengles-1
+
+
+ UIRequiresFullScreen
+
+ UIStatusBarHidden
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+
+
+
+
diff --git a/demo/native/engine/ios/LaunchScreenBackground.png b/demo/native/engine/ios/LaunchScreenBackground.png
new file mode 100644
index 0000000..8ef1a42
Binary files /dev/null and b/demo/native/engine/ios/LaunchScreenBackground.png differ
diff --git a/demo/native/engine/ios/LaunchScreenBackgroundLandscape.png b/demo/native/engine/ios/LaunchScreenBackgroundLandscape.png
new file mode 100644
index 0000000..02c860d
Binary files /dev/null and b/demo/native/engine/ios/LaunchScreenBackgroundLandscape.png differ
diff --git a/demo/native/engine/ios/LaunchScreenBackgroundPortrait.png b/demo/native/engine/ios/LaunchScreenBackgroundPortrait.png
new file mode 100644
index 0000000..8ef1a42
Binary files /dev/null and b/demo/native/engine/ios/LaunchScreenBackgroundPortrait.png differ
diff --git a/demo/native/engine/ios/Post-service.cmake b/demo/native/engine/ios/Post-service.cmake
new file mode 100644
index 0000000..16fd033
--- /dev/null
+++ b/demo/native/engine/ios/Post-service.cmake
@@ -0,0 +1 @@
+# Supported for Cocos Service!
\ No newline at end of file
diff --git a/demo/native/engine/ios/Pre-service.cmake b/demo/native/engine/ios/Pre-service.cmake
new file mode 100644
index 0000000..16fd033
--- /dev/null
+++ b/demo/native/engine/ios/Pre-service.cmake
@@ -0,0 +1 @@
+# Supported for Cocos Service!
\ No newline at end of file
diff --git a/demo/native/engine/ios/Prefix.pch b/demo/native/engine/ios/Prefix.pch
new file mode 100644
index 0000000..168ddec
--- /dev/null
+++ b/demo/native/engine/ios/Prefix.pch
@@ -0,0 +1,8 @@
+//
+// Prefix header for all source files of the 'HelloJavascript' target in the 'HelloJavascript' project
+//
+
+#ifdef __OBJC__
+ #import
+ #import
+#endif
diff --git a/demo/native/engine/ios/ViewController.h b/demo/native/engine/ios/ViewController.h
new file mode 100644
index 0000000..caeb7ee
--- /dev/null
+++ b/demo/native/engine/ios/ViewController.h
@@ -0,0 +1,35 @@
+/****************************************************************************
+ Copyright (c) 2013 cocos2d-x.org
+ Copyright (c) 2013-2016 Chukong Technologies Inc.
+ Copyright (c) 2017-2022 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You
+shall not use Cocos Creator software for developing other software or tools
+that's used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to
+you.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+****************************************************************************/
+
+#pragma once
+
+#import
+
+@interface ViewController : UIViewController
+
+@end
diff --git a/demo/native/engine/ios/ViewController.mm b/demo/native/engine/ios/ViewController.mm
new file mode 100644
index 0000000..eba965c
--- /dev/null
+++ b/demo/native/engine/ios/ViewController.mm
@@ -0,0 +1,76 @@
+/****************************************************************************
+ Copyright (c) 2013 cocos2d-x.org
+ Copyright (c) 2013-2016 Chukong Technologies Inc.
+ Copyright (c) 2017-2022 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+****************************************************************************/
+
+#import "ViewController.h"
+#import "AppDelegate.h"
+#import "platform/ios/AppDelegateBridge.h"
+//#include "cocos/platform/Device.h"
+
+namespace {
+// cc::Device::Orientation _lastOrientation;
+}
+
+@interface ViewController ()
+
+@end
+
+@implementation ViewController
+
+
+- (BOOL) shouldAutorotate {
+ return YES;
+}
+
+//fix not hide status on ios7
+- (BOOL)prefersStatusBarHidden {
+ return YES;
+}
+
+// Controls the application's screen edge gesture delay to prevent accidental touches
+- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures
+{
+ return UIRectEdgeAll;
+}
+
+// Controls the application's preferred home indicator auto-showing otherwise preferredScreenEdgesDeferringSystemGestures is invalidation
+- (BOOL)prefersHomeIndicatorAutoHidden {
+ return NO;
+}
+
+- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator {
+ AppDelegate* delegate = [[UIApplication sharedApplication] delegate];
+ [delegate.appDelegateBridge viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
+ float pixelRatio = [delegate.appDelegateBridge getPixelRatio];
+
+ //CAMetalLayer is available on ios8.0, ios-simulator13.0.
+ CAMetalLayer *layer = (CAMetalLayer *)self.view.layer;
+ CGSize tsize = CGSizeMake(static_cast(size.width * pixelRatio),
+ static_cast(size.height * pixelRatio));
+ layer.drawableSize = tsize;
+}
+
+@end
diff --git a/demo/native/engine/ios/main.mm b/demo/native/engine/ios/main.mm
new file mode 100644
index 0000000..e8238c6
--- /dev/null
+++ b/demo/native/engine/ios/main.mm
@@ -0,0 +1,42 @@
+/****************************************************************************
+ Copyright (c) 2021-2022 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You shall
+ not use Cocos Creator software for developing other software or tools that's
+ used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to you.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+****************************************************************************/
+
+#include
+
+#include "platform/BasePlatform.h"
+#include "AppDelegate.h"
+
+int main(int argc, const char * argv[]) {
+ cc::BasePlatform* platform = cc::BasePlatform::getPlatform();
+ if (platform->init()) {
+ return -1;
+ }
+ platform->run(argc, argv);
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+ int retVal = UIApplicationMain(argc, (char**)argv, nil, @"AppDelegate");
+ [pool release];
+ return retVal;
+}
+
diff --git a/demo/native/engine/ios/service/SDKWrapper.h b/demo/native/engine/ios/service/SDKWrapper.h
new file mode 100644
index 0000000..e933342
--- /dev/null
+++ b/demo/native/engine/ios/service/SDKWrapper.h
@@ -0,0 +1,60 @@
+/****************************************************************************
+ Copyright (c) 2017-2022 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos.com
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated engine source code (the "Software"), a limited,
+ worldwide, royalty-free, non-assignable, revocable and non-exclusive license
+ to use Cocos Creator solely to develop games on your target platforms. You
+shall not use Cocos Creator software for developing other software or tools
+that's used for developing games. You are not granted to publish, distribute,
+ sublicense, and/or sell copies of Cocos Creator.
+
+ The software or tools in this License Agreement are licensed, not sold.
+ Xiamen Yaji Software Co., Ltd. reserves all rights not expressly granted to
+you.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+****************************************************************************/
+
+#pragma once
+
+#import
+#import
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol SDKDelegate
+
+@optional
+- (void)application:(UIApplication *)application
+ didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
+- (void)applicationDidBecomeActive:(UIApplication *)application;
+- (void)applicationWillResignActive:(UIApplication *)application;
+- (void)applicationDidEnterBackground:(UIApplication *)application;
+- (void)applicationWillEnterForeground:(UIApplication *)application;
+- (void)applicationWillTerminate:(UIApplication *)application;
+- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;
+
+@end
+
+@interface SDKWrapper : NSObject
+@property(nonatomic, strong) NSString *name;
++ (instancetype)shared;
+- (void)application:(UIApplication *)application
+ didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
+- (void)applicationDidBecomeActive:(UIApplication *)application;
+- (void)applicationWillResignActive:(UIApplication *)application;
+- (void)applicationDidEnterBackground:(UIApplication *)application;
+- (void)applicationWillEnterForeground:(UIApplication *)application;
+- (void)applicationWillTerminate:(UIApplication *)application;
+- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/demo/native/engine/ios/service/SDKWrapper.m b/demo/native/engine/ios/service/SDKWrapper.m
new file mode 100644
index 0000000..8feb233
--- /dev/null
+++ b/demo/native/engine/ios/service/SDKWrapper.m
@@ -0,0 +1,142 @@
+/****************************************************************************
+ Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd.
+
+ http://www.cocos2d-x.org
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ ****************************************************************************/
+#import "SDKWrapper.h"
+
+@interface SDKWrapper ()
+
+@property (nonatomic, strong) NSArray *serviceInstances;
+
+@end
+
+@implementation SDKWrapper
+
+#pragma mark -
+#pragma mark Singleton
+
+static SDKWrapper *mInstace = nil;
+
++ (instancetype)shared {
+ static dispatch_once_t onceToken;
+ dispatch_once(&onceToken, ^{
+ mInstace = [[super allocWithZone:NULL] init];
+ [mInstace initSDKWrapper];
+ });
+ return mInstace;
+}
++ (id)allocWithZone:(struct _NSZone *)zone {
+ return [SDKWrapper shared];
+}
+
++ (id)copyWithZone:(struct _NSZone *)zone {
+ return [SDKWrapper shared];
+}
+
+#pragma mark -
+#pragma mark private methods
+- (void)initSDKWrapper {
+ [self loadSDKClass];
+}
+
+- (void)loadSDKClass {
+ NSMutableArray *sdks = [NSMutableArray array];
+ @try {
+ NSString *path = [NSString stringWithFormat:@"%@/service.json", [[NSBundle mainBundle] resourcePath]];
+ NSData *data = [NSData dataWithContentsOfFile:path options:NSDataReadingMappedIfSafe error:nil];
+ id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
+ id dic = obj[@"serviceClasses"];
+ if (dic == nil) @throw [[NSException alloc] initWithName:@"JSON Exception" reason:@"serviceClasses not found" userInfo:nil];
+ for (NSString *str in dic) {
+ NSString *className = [[str componentsSeparatedByString:@"."] lastObject];
+ Class clazz = NSClassFromString(className);
+ if (clazz == nil) @throw [[NSException alloc] initWithName:@"Cass Exception"
+ reason:[NSString stringWithFormat:@"class '%@' not found", className]
+ userInfo:nil];
+ id sdk = [[clazz alloc] init];
+ [sdks addObject:sdk];
+ }
+ } @catch (NSException *e) {
+ }
+ self.serviceInstances = [NSArray arrayWithArray:sdks];
+}
+
+#pragma mark -
+#pragma mark Application lifecycle
+- (void)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+ for (id sdk in self.serviceInstances) {
+ if ([sdk respondsToSelector:@selector(application:didFinishLaunchingWithOptions:)]) {
+ [sdk application:application didFinishLaunchingWithOptions:launchOptions];
+ }
+ }
+
+}
+
+- (void)applicationDidBecomeActive:(UIApplication *)application {
+ for (id sdk in self.serviceInstances) {
+ if ([sdk respondsToSelector:@selector(applicationDidBecomeActive:)]) {
+ [sdk applicationDidBecomeActive:application];
+ }
+ }
+}
+
+- (void)applicationWillResignActive:(UIApplication *)application {
+ for (id sdk in self.serviceInstances) {
+ if ([sdk respondsToSelector:@selector(applicationWillResignActive:)]) {
+ [sdk applicationWillResignActive:application];
+ }
+ }
+}
+
+- (void)applicationDidEnterBackground:(UIApplication *)application {
+ for (id sdk in self.serviceInstances) {
+ if ([sdk respondsToSelector:@selector(applicationDidEnterBackground:)]) {
+ [sdk applicationDidEnterBackground:application];
+ }
+ }
+}
+
+- (void)applicationWillEnterForeground:(UIApplication *)application {
+ for (id sdk in self.serviceInstances) {
+ if ([sdk respondsToSelector:@selector(applicationWillEnterForeground:)]) {
+ [sdk applicationWillEnterForeground:application];
+ }
+ }
+}
+
+- (void)applicationWillTerminate:(UIApplication *)application {
+ for (id sdk in self.serviceInstances) {
+ if ([sdk respondsToSelector:@selector(applicationWillTerminate:)]) {
+ [sdk applicationWillTerminate:application];
+ }
+ }
+}
+
+- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
+ for (id sdk in self.serviceInstances) {
+ if ([sdk respondsToSelector:@selector(applicationDidReceiveMemoryWarning:)]) {
+ [sdk applicationDidReceiveMemoryWarning:application];
+ }
+ }
+}
+
+@end
diff --git a/demo/native/engine/ios/zh-Hans.lproj/Localizable.strings b/demo/native/engine/ios/zh-Hans.lproj/Localizable.strings
new file mode 100644
index 0000000..5524fc7
--- /dev/null
+++ b/demo/native/engine/ios/zh-Hans.lproj/Localizable.strings
@@ -0,0 +1,9 @@
+/*
+ Localizable.strings
+ */
+
+"done" = "完成";
+"next" = "下一个";
+"search" = "搜索";
+"go" = "前往";
+"send" = "发送";
diff --git a/demo/package.json b/demo/package.json
new file mode 100755
index 0000000..2cf6e1c
--- /dev/null
+++ b/demo/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "kunpocreator",
+ "uuid": "f5d24040-9cd4-4a5a-8559-38bf55e621f7",
+ "creator": {
+ "version": "3.8.6"
+ },
+ "dependencies": {
+ "fairygui-cc": "^1.2.2",
+ "kunpocc": "^1.1.5",
+ "kunpocc-assets": "^0.0.1",
+ "kunpocc-event": "^0.0.2",
+ "kunpocc-net": "^0.0.2",
+ "ts-node": "^10.9.2"
+ }
+}
diff --git a/demo/proto/AutoExport.js b/demo/proto/AutoExport.js
new file mode 100644
index 0000000..3bbbff7
--- /dev/null
+++ b/demo/proto/AutoExport.js
@@ -0,0 +1,76 @@
+const { execSync } = require('child_process');
+const path = require('path');
+const fs = require('fs');
+// 颜色输出
+const colors = {
+ black: '\x1b[30m',
+ red: '\x1b[31m',
+ green: '\x1b[32m',
+ yellow: '\x1b[33m',
+ blue: '\x1b[34m',
+ magenta: '\x1b[35m',
+ cyan: '\x1b[36m',
+ white: '\x1b[37m',
+ reset: '\x1b[0m'
+};
+
+// 日志输出函数
+function cclog(text, color = 'white') {
+ console.log(`${colors[color]}${text}${colors.reset}`);
+}
+
+// 执行命令函数
+function executeCommon(command) {
+ try {
+ console.log(`执行命令: ${command}`);
+ execSync(command, { stdio: 'inherit' });
+ } catch (error) {
+ cclog(`命令执行失败: ${command}`, 'red');
+ process.exit(1);
+ }
+}
+
+function modifyProtoJS() {
+ cclog("修改js文件");
+ // 修改 libbase中 build.gradle 的版本号
+ const protojs_path = path.join("../", "assets", "script", "Socket", "proto", "proto.js")
+ const content = fs.readFileSync(protojs_path, "utf-8");
+ let index = content.indexOf(`var $protobuf = require("protobufjs/minimal");`);
+ // 使用 var $protobuf = protobuf; 替换掉 var $protobuf = require("protobufjs/minimal");
+ const newContent = content.replace(`var $protobuf = require("protobufjs/minimal");`, "var $protobuf = protobuf;");
+ fs.writeFileSync(protojs_path, newContent);
+ cclog("修改protojs完成");
+}
+
+// 主函数
+function main() {
+ // 修改当前工作目录为脚本所在目录
+ process.chdir(__dirname);
+
+ // 设置路径
+ const absPath = process.cwd();
+ const jsPath = path.join(absPath, '..', 'assets', 'script', 'Socket', 'proto', 'proto.js');
+ const tsPath = path.join(absPath, '..', 'assets', 'script', 'Socket', 'proto', 'proto.d.ts');
+ const protoPath = '*.proto';
+
+ // 生成js文件,使用 commonjs 格式
+ const jsCommand = `pbjs -t static-module -w commonjs -o ${jsPath} --no-verify --no-convert --no-delimited --no-beautify --no-create --no-typeurl --force-number ${protoPath}`;
+
+ executeCommon(jsCommand);
+ cclog('生成js文件成功', 'green');
+
+ modifyProtoJS();
+
+ // 生成.d.ts文件
+ const tsCommand = `pbts --no-comments -o ${tsPath} ${jsPath}`;
+ executeCommon(tsCommand);
+ cclog('生成.d.ts文件成功', 'green');
+
+ // 压缩 proto.js文件
+ const uglifyCommand = `uglifyjs ${jsPath} -o ${jsPath}`;
+ executeCommon(uglifyCommand);
+ cclog('proto文件转换完成', 'green');
+}
+
+// 执行主函数
+main();
\ No newline at end of file
diff --git a/demo/proto/CommonMessage.proto b/demo/proto/CommonMessage.proto
new file mode 100644
index 0000000..366c49c
--- /dev/null
+++ b/demo/proto/CommonMessage.proto
@@ -0,0 +1,18 @@
+syntax = "proto3";
+
+package com.kunpo.proto;
+
+message CommonMessage {
+ // 请求命令类型: 0 心跳,1 业务
+ int32 cmdCode=1;
+ // 业务路由
+ int32 protocolId=2;
+ // 业务数据
+ bytes data=3;
+ // 响应码: 0:成功, 其他为有错误
+ sint32 responseStatus=4;
+ // 错误消息、异常消息
+ string msg=5;
+ // 消息标记号;由前端请求时设置,服务器响应时会携带上
+ int32 msgId=6;
+}
diff --git a/demo/proto/test.proto b/demo/proto/test.proto
new file mode 100644
index 0000000..2798b07
--- /dev/null
+++ b/demo/proto/test.proto
@@ -0,0 +1,12 @@
+syntax = "proto3";
+
+package com.kunpo.proto.test;
+
+// 用户基本信息
+message UserInfo {
+ int32 userId = 1;
+ string userName = 2;
+ string nickName = 3;
+ int32 level = 4;
+ int64 createTime = 5;
+}
diff --git a/demo/settings/v2/packages/builder.json b/demo/settings/v2/packages/builder.json
new file mode 100644
index 0000000..774fb01
--- /dev/null
+++ b/demo/settings/v2/packages/builder.json
@@ -0,0 +1,80 @@
+{
+ "__version__": "1.3.9",
+ "bundleConfig": {
+ "custom": {
+ "default": {
+ "displayName": "i18n:builder.asset_bundle.defaultConfig",
+ "configs": {
+ "native": {
+ "preferredOptions": {
+ "isRemote": false,
+ "compressionType": "merge_all_json"
+ }
+ },
+ "web": {
+ "preferredOptions": {
+ "isRemote": false,
+ "compressionType": "merge_dep"
+ },
+ "fallbackOptions": {
+ "compressionType": "merge_dep"
+ }
+ },
+ "miniGame": {
+ "fallbackOptions": {
+ "isRemote": true,
+ "compressionType": "merge_all_json"
+ },
+ "configMode": "fallback",
+ "overwriteSettings": {
+ "alipay-mini-game": {
+ "isRemote": true,
+ "compressionType": "merge_all_json"
+ },
+ "bytedance-mini-game": {
+ "isRemote": true,
+ "compressionType": "merge_all_json"
+ },
+ "fb-instant-games": {
+ "isRemote": true,
+ "compressionType": "merge_all_json"
+ },
+ "huawei-quick-game": {
+ "isRemote": true,
+ "compressionType": "merge_all_json"
+ },
+ "migu-mini-game": {
+ "isRemote": false,
+ "compressionType": "merge_all_json"
+ },
+ "oppo-mini-game": {
+ "isRemote": true,
+ "compressionType": "merge_all_json"
+ },
+ "taobao-mini-game": {
+ "isRemote": true,
+ "compressionType": "merge_all_json"
+ },
+ "vivo-mini-game": {
+ "isRemote": true,
+ "compressionType": "merge_all_json"
+ },
+ "wechatgame": {
+ "isRemote": true,
+ "compressionType": "merge_all_json"
+ },
+ "xiaomi-quick-game": {
+ "isRemote": true,
+ "compressionType": "merge_all_json"
+ },
+ "taobao-creative-app": {
+ "isRemote": true,
+ "compressionType": "merge_all_json"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/demo/settings/v2/packages/cocos-service.json b/demo/settings/v2/packages/cocos-service.json
new file mode 100644
index 0000000..9cc4921
--- /dev/null
+++ b/demo/settings/v2/packages/cocos-service.json
@@ -0,0 +1,23 @@
+{
+ "__version__": "3.0.9",
+ "game": {
+ "name": "未知游戏",
+ "app_id": "UNKNOW",
+ "c_id": "0"
+ },
+ "appConfigMaps": [
+ {
+ "app_id": "UNKNOW",
+ "config_id": "8c18cb"
+ }
+ ],
+ "configs": [
+ {
+ "app_id": "UNKNOW",
+ "config_id": "8c18cb",
+ "config_name": "Default",
+ "config_remarks": "",
+ "services": []
+ }
+ ]
+}
diff --git a/demo/settings/v2/packages/device.json b/demo/settings/v2/packages/device.json
new file mode 100644
index 0000000..70e599e
--- /dev/null
+++ b/demo/settings/v2/packages/device.json
@@ -0,0 +1,3 @@
+{
+ "__version__": "1.0.1"
+}
diff --git a/demo/settings/v2/packages/engine.json b/demo/settings/v2/packages/engine.json
new file mode 100644
index 0000000..744d139
--- /dev/null
+++ b/demo/settings/v2/packages/engine.json
@@ -0,0 +1,226 @@
+{
+ "__version__": "1.0.12",
+ "modules": {
+ "graphics": {
+ "pipeline": "legacy-pipeline"
+ },
+ "configs": {
+ "migrationsConfig": {
+ "name": "迁移生成的配置",
+ "cache": {
+ "base": {
+ "_value": true
+ },
+ "gfx-webgl": {
+ "_value": true
+ },
+ "gfx-webgl2": {
+ "_value": true
+ },
+ "gfx-webgpu": {
+ "_value": false
+ },
+ "animation": {
+ "_value": true
+ },
+ "skeletal-animation": {
+ "_value": true
+ },
+ "3d": {
+ "_value": false
+ },
+ "meshopt": {
+ "_value": false
+ },
+ "2d": {
+ "_value": true
+ },
+ "xr": {
+ "_value": false
+ },
+ "rich-text": {
+ "_value": true
+ },
+ "mask": {
+ "_value": true
+ },
+ "graphics": {
+ "_value": true
+ },
+ "ui-skew": {
+ "_value": false
+ },
+ "affine-transform": {
+ "_value": true
+ },
+ "ui": {
+ "_value": true
+ },
+ "particle": {
+ "_value": false
+ },
+ "physics": {
+ "_value": false,
+ "_option": "physics-ammo"
+ },
+ "physics-ammo": {
+ "_value": false,
+ "_flags": {
+ "LOAD_BULLET_MANUALLY": false
+ }
+ },
+ "physics-cannon": {
+ "_value": false
+ },
+ "physics-physx": {
+ "_value": false,
+ "_flags": {
+ "LOAD_PHYSX_MANUALLY": false
+ }
+ },
+ "physics-builtin": {
+ "_value": false
+ },
+ "physics-2d": {
+ "_value": false,
+ "_option": "physics-2d-box2d"
+ },
+ "physics-2d-box2d": {
+ "_value": false
+ },
+ "physics-2d-box2d-wasm": {
+ "_value": false,
+ "_flags": {
+ "LOAD_BOX2D_MANUALLY": false
+ }
+ },
+ "physics-2d-builtin": {
+ "_value": false
+ },
+ "physics-2d-box2d-jsb": {
+ "_value": false
+ },
+ "intersection-2d": {
+ "_value": true
+ },
+ "primitive": {
+ "_value": false
+ },
+ "profiler": {
+ "_value": true
+ },
+ "occlusion-query": {
+ "_value": false
+ },
+ "geometry-renderer": {
+ "_value": false
+ },
+ "debug-renderer": {
+ "_value": false
+ },
+ "particle-2d": {
+ "_value": true
+ },
+ "audio": {
+ "_value": true
+ },
+ "video": {
+ "_value": true
+ },
+ "webview": {
+ "_value": true
+ },
+ "tween": {
+ "_value": true
+ },
+ "websocket": {
+ "_value": true
+ },
+ "websocket-server": {
+ "_value": false
+ },
+ "terrain": {
+ "_value": false
+ },
+ "light-probe": {
+ "_value": false
+ },
+ "tiled-map": {
+ "_value": false
+ },
+ "vendor-google": {
+ "_value": false
+ },
+ "spine": {
+ "_value": true,
+ "_option": "spine-3.8"
+ },
+ "spine-3.8": {
+ "_value": true,
+ "_flags": {
+ "LOAD_SPINE_MANUALLY": false
+ }
+ },
+ "spine-4.2": {
+ "_value": false,
+ "_flags": {
+ "LOAD_SPINE_MANUALLY": false
+ }
+ },
+ "dragon-bones": {
+ "_value": false
+ },
+ "marionette": {
+ "_value": false
+ },
+ "procedural-animation": {
+ "_value": true
+ },
+ "custom-pipeline-post-process": {
+ "_value": false
+ },
+ "render-pipeline": {
+ "_value": true,
+ "_option": "legacy-pipeline"
+ },
+ "custom-pipeline": {
+ "_value": true
+ },
+ "legacy-pipeline": {
+ "_value": false
+ }
+ },
+ "flags": {},
+ "includeModules": [
+ "2d",
+ "affine-transform",
+ "animation",
+ "audio",
+ "base",
+ "gfx-webgl",
+ "gfx-webgl2",
+ "graphics",
+ "intersection-2d",
+ "legacy-pipeline",
+ "mask",
+ "particle-2d",
+ "procedural-animation",
+ "profiler",
+ "rich-text",
+ "skeletal-animation",
+ "spine-3.8",
+ "tween",
+ "ui",
+ "video",
+ "websocket",
+ "webview"
+ ],
+ "noDeprecatedFeatures": {
+ "value": false,
+ "version": ""
+ }
+ }
+ },
+ "globalConfigKey": "migrationsConfig"
+ }
+}
diff --git a/demo/settings/v2/packages/information.json b/demo/settings/v2/packages/information.json
new file mode 100644
index 0000000..62fccb5
--- /dev/null
+++ b/demo/settings/v2/packages/information.json
@@ -0,0 +1,23 @@
+{
+ "__version__": "1.0.1",
+ "information": {
+ "customSplash": {
+ "id": "customSplash",
+ "label": "customSplash",
+ "enable": true,
+ "customSplash": {
+ "complete": false,
+ "form": "https://creator-api.cocos.com/api/form/show?sid=39d299030f31eb42b71bc53d67bdc54e"
+ }
+ },
+ "removeSplash": {
+ "id": "removeSplash",
+ "label": "removeSplash",
+ "enable": true,
+ "removeSplash": {
+ "complete": false,
+ "form": "https://creator-api.cocos.com/api/form/show?sid=39d299030f31eb42b71bc53d67bdc54e"
+ }
+ }
+ }
+}
diff --git a/demo/settings/v2/packages/ios.json b/demo/settings/v2/packages/ios.json
new file mode 100644
index 0000000..34d2e00
--- /dev/null
+++ b/demo/settings/v2/packages/ios.json
@@ -0,0 +1,11 @@
+{
+ "__version__": "1.0.1",
+ "splash-setting": {
+ "displayRatio": 1,
+ "totalTime": 0,
+ "watermarkLocation": "default",
+ "autoFit": true,
+ "base64src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAADICAYAAAA6CQlEAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAADg1SURBVHgB7V0HeFNl277TNOneLS0tLZuyN8gUEFERRcWFLBHZqIgDEUREQf0+/RFkKaAs16cCylC2svempYwW6KR77zb53+ctKUnOyWySDnJz9aI95yQ5Oec+z/vsB6jjcJHKljrBKRx2WAQOqOuQKMsdHBXnXWSy6W5wC4IdduiDXCp9ysVRpmQ/Ckaa065OTkPZZmfYYYcO+Dk7ysrukoZ+CtjPIi94+cAOO8TACHNRjTD8x1kmi2LS5km2WwI7jIYU9wFkDg5NGS96qW9jLPGHUvmc3MGhJ6TSSIVCkcI2K2GHXtwXhJFLJK6QSIaL7GLfX9LcQYmHZY5SpbNCEVMCFMAOnbhfxLE/W4buQP8DUsoux45yB8wtKSm5DDtEcV9IGIYCmYN0FPvfT88xdC1aOigwWC6RFpUqFRfY3wrYoYG674dRQYnzRh0nQWOlA5a5SB1/YX8Fww4N3D+EccBR4UadK7Ij03medXWUbXOTyTrCjkrcN4Rh1DgELSvIzc0F4yeOh4+vt+hr2MGdFUrlLmepfCTup4dLD+6biyAtLb3F/rumvi0/vwDNW7TAjp070a9/Pzg4iEkcST2JRLmBeYl/Yn+44z7H/aL0gpnLpTKJtDcTNW3Ut3t5euKF4cMx9KmhcHZ2xulTp1FWVqb9cmJSW0cHx65yRfl+Zk7l4j7F/SRmy5gIOaa9MepKFIqLiuAok2Hq66/j2zWr4O0tvkRJoHxE6Sjb7yqTdcV9ivtqXVYqy89qb7t5MwbZ2dmVfw8YOBD7DvyDRwc/yhzAopcnXKnEARZaGIf7MKxw3yxJbnJ5e6bFrmK/aqQ4lJaWYcBD/RHWsOG9Y93cMHjwYLavFJcuXhJbomSMKYNkkBaUKRWncR/5a+4HwkhcHB17KpXKbezXZmIHhIWGoWdvjVATky5SdH/gAWZB+eD82XMoYsuWFmRMvgyUOTi6lSnKD4OWvPsAdZ0wTkzfmCSBZA0jS4Cug+ROcjz+xBNwdHTU2E6kad+hA1q2DMftW7dx584d7ZfSmtWLeYbDmGf4X/Z7Eeo46jJhnF2lsiXMlzKH/e6q78DCgkI8PewZeDCLSRsSCXP9NmmCbt27IfJyBJKSkgSHsH8dmKRpyyTNXtTx4GWdJIwv4CmRypcrJXgVRij2BQUFGPjwQA09RvCefn7o+2BfJMTH4WbMTaZACzIhWrB4VXeZQrGnrA6b3XWOMB7sxpU4yjayp/4ZU14XEhKCXn16639vJoEe7NePzC2cP3ceCoVA120kcZAOkCoUOxlpslEHUacI4wZZx3Kp9E9Gli7a+0gf6cUU29ycbKbAFgte68T0mMeYZSSTy/V+Bjn3evftw453wsmTJ1FeVq59SH0HB+lAByZp2J4M1DHUGT+MMxz7KB2VaxhZmortnzBpIl6f/gZycvNFXx8ZcQU5OTkwBqTXvDL+VcycNZOb4Npgi1U7qaPsDyegGeoY6gRh3BwdBzo4SlYqIRGVLNPfehNvvfsOoqKuQFF+TyJ079EdnncV3fT0dERH34CxIAkzdtyr+GDeXPYeHoL9jDRt7pKmKeoQaj1hXKXSxxWQ/MZuUFvtfS4uLvhu7Xd4+913OXGOHT1euS+kQQgWLVmCtRvXwcXVlSuxBw8chCmQsXDCyNGjsZp9hrZJTrhLmk0uQCjqCBzFNrqRN1QmC0QNd30zpbOpUuKwkv0qKBlxd3fHD7/8hM5dKoROLlturkRG8t/JDh4z9mWEhYXxnwWffoLZs2bj0oWLTL8pZHqKC0xBz169sfybFZg2earAK8xI00HiKPvdGcp3pBJJbbGelJLS0qQ8IEV7hwZh3BydHlNKlPPYrz1QGyARF5A+Pj5YtnJ5JVkIiYmJiI+L47+HtwrnEWoVnn9xOHKyc/DNym/4/6YShjB4yBB9pOnuIJEcrE2hJ6VMrnSD5LBEWf5hXlnZv6rtKitJ7u7kxJ5U5SL2lRqghkNJ/3QUhLRt2xorV32Lbsytr44tmzbxJYdyXma88zZ69OypsZ/IRboI6SZB9evDHFBuzQNML9qze49YKIFnb5HCXEtAJ9qQnfBYudTRq1RRvo/9reCEcZbKX2R7F6KWQBdZmjdvhiXLl6JNu3aCfd+sWIHoG9Fo3749Ppw/n+sf2mjTti28vL3YPv2mtT40YHGpevUCcOTIEZSUlIgeU4tIo0JPZ4n0XImyPMqBKSpuLIr/DmoJFDrYQmT56OP5aNW6jej+KxGRnCRvzHgTrq7ikQK6ka6ubqgqnho2DHPmfsCUaeHSRmevVNa+erlyBwlxxMkh39GxKzv9WtEOQxdZwllw8NP/fI6+/fuL7k9LTUFCQgIeHvQwBjz0EKwNsphIR5o56z2e0acNTppaVmQpgbK1i0zW0VGplITRg6XzQAcHyL19IZU7obpQXlqGorQ7ovvCwkLxxaIv0bFTZ52vP37sOFyZg+2992fxzDpbgKTZqDFjkJOVjWVfL0WptiLM+CJl+pKzrz9qAsqLi1CSlcnOS2dqj7tUIWlEVpLO8ICjixvCX50B/659q40w5Gi7sua/SPp3p2CfKxP58xcu0EsWwonjxzFq9Cg0bmpbHxop0BOnTkF8Qjw2/fY7cwNoShUlexjbvjkf7mHV7xAmwqSfO4rrP6xAcUaa2CEyJhVdHHW9Aa3nbabNQYPBz6O6zEFa629t3YCkA7sE+0jsL/zsUzw0cKDB9yH/ypp1a6tF2aTQwZwPPkB6Wjr+2f+Phv5SXliAK98tQo//rofcs/q7j7iHNkUZO6dr65dCUVIseoxOT69LcCjqP1S93TAS9m1B5IrPBWYRLS8LP1+IZ557ziAJku8kYdBjj8A/IADVBV9/fyxdsRxdugoiF8i+FoEzH78GRVkpqh3sWoYNGQ65l6/OQ3QSxpFFZaVOpjuwLIWsaxcRsWwhFKVC03TS5El47oUXmU/FcGQjJTmFx3yqG5QasXTFMhaSEFbfpp07gVt/bEBNgMzDm11X3UkMNTKWVJKVhojlC1GSkyXY16dvH0xmeoHMSOW1VZs2ohHl6kBIg1DMnvMBPDy0gpVMgl5dt4QR5yhqOmocYUg0R61bjKwrFwT7WrZuha+XL+PBQmMhFhTUh7TUVFgTjz8xBDPeniEgfFlBPi783xzkxcXofX3hnVhmMSahulDjCBO/63fE/fW7YE339vFmkefvra6LTJk4CZEREbAWpIzAr06ciOEjhP2NChJjcXHRbGax6E4LTjqyF7F//4bqQo0iTPaNCESt/UpAFlJsv162FKEssmxNUPwnNjYOw59/AdevXYO1QN/nfWY5NWgQItiXcekMYn7/XudrMy6eQvzuzagu1BjClBcXInLlp8wHkK6xnYKFo18ejf428NDG3r6FosJCZGVmYdTwl1jsyfiEKlNB6RcrV6+Cp5eXxnalQoGYTeuRcfmU4DWl+bnIuh6B/IQ4pJ09jOpAjSHMrT83Iu38CcF2SsymBChb4Pq168jLy+O/JyXdwbtvvY2srCxYCx06dsT8T+bz5C51lGRl4NLieSjN08wjz4w4w/cRbu/4H6oDNYIwOdGRuP7TSoG/pX79+pj9wRz4+PrCFrh08SIvj1Xh3Nlz+Gb5cpSXW6+ocRjzJT0zTFjgkBNzlVlOi6De0ib9wnGUFxXy35OP7Udpju1zzKudMOSSjvjmM/blNROwyYqY/tYMtG7TFraAQlGOY0fvNXegrLxyFpbYuGEjDpmYumkKSJ+Zx6LsoaHCNKTYHb8j9fShivMrK0HqqXvLUDnTtxIO/AVbo9oJE/3bGrYeC7pwsCdvGF4a8ZJRzjlL4ObNm7h2tULRDagXgDnz5vDMvdycXHy24FMksmi3teDl7c1J4+au6S+ih+ny8gUoTkvmEidXy+RO3LuV6zy2RLUSJi82GjG/rhEsRcHB9TFh0iQeKbcVjh0+gvz8fK5PfDj/I0ycPAWLvl6M+sHBuH79On7cuBHWRN9+/TBq1Ghoh2LyYmMQt3cLky4HoCjWjO/kMTM892YUbIlqJUz0b6uZYqeZF02ONqohat6iOWwFCgju3rWb//7UsKfx5NCh/Pf+Awbgs88/Rf2gIPz5x59IT0+DtUAVDqNfeRkdOrTTPjlmNa3D7e2/CF5TkpmO5OP/wJaoNsJkRJxG/J6tgu39H+qPF14aztZ2251a3O3bXMFt3aY1Zr3/fuUySNKmHzPnFzMfkJRt2751G6yJ0NBQvDNrJk/bUEdxeioKk4XeXVqOEv/drtfRZ2lUC2GUTMGMWLFAEEIPDgnG62+8wWItnrAl9u/bB3cPd15poJ0ATqTp9kB3rFj1LSdM/l2z2xogBfjBB/vxThLGIu92DNIvnoStUC2ESdj/J7KiNLuz08UaziRLuw4dYEuQJXTyxAlGiG/QrHkLncdRgjiVx16NugJrgvS2iZMnc4XbGCjKyhC/90/YCjYnDHl0r63/WqDoBjE9Ydhzz5ocLKwqSktLMHPWLHQykLVHeHzIEDRpZn3dqknTphg/aYLRCV9pp4+wgGQybAGbE+bm5nXcta0OEvuTp01BWMNGsDWoaK1RkyZGH6+rw6al8cqrr/IaJ2NQzLy/iQe2wxawKWHKCvIQt3OTYDtZRC8MfxF23APFml6bPp1bTwbBpHX83m028cnYlDBJh3aiIElTupBHd/K0qXBzM73JNkWXy8vLUZtgyjn37NWLd8bSRstWwqqgfObUK0i6DWvDZoQpyclE9P/WcCVNHV27da30e5iCGBZJfnnECJ6zW5uw6++/MfPtt1CQn2/wWHqYZs6eBRfnezNNSa9ZtHgx/P01J/lQAlbKiX9hbdiMMHcO70J+/C2NbVSSOnmK8emWKsTHx2PS+AmIirqGwqLa1bgyLy8fv/3vd3w8f75YyzMBGjK97uFHB1X+HRoWirbt2+OJoU8Kjk06uAtKKwZKCTYhDFlGFI7XToxq374t+vR7EKaAosnvvDkDV1nch0R7YX7talqZkVaRAvrLjz/jzy1bDB5PEmXKtGmVeckP3V2inmBSWaIVRsiOvoK8+JuwJswiTFlBLvM8xht9fMrJA8iNEWawkUfXVOlC6QZHj1QkS5NJnJlRu9rIpd89X5Iuc2d/gPNnzxp8DfmAhjw5hCeT9exV0XWiS9euTNpoRrjL8vNYdNt6kXWC2YS5tmEJ99gaAmnut7f9xCOv6qjPAoxPDxsGU3Ds6BEsWbyk8m9q+56ZXbuaVWZmZFb+Tj313p7xFvJy9fcZIikz+uWX0bBRIxZrqpj3Ra4IsWUp+eh+KEqLYS2YvSSlnDyIhH+2GjyOJBHlqWpj5KiRxpmMqvcpLMS8ufNQUnyvToka9+Qa2ciwpiAhXlMyU5bf8qVLDb6OOpJPZdZkQL16ldv69O0rOC731nXksyi2tWA2YZQKJSKXf4bcWP15r3eO7BFIF6rLeWnkSJiC71etQlSk0C2fmmLdshBLgnSuVJEylrXfrcXtm7f0vpakzPMvvqixhFMDI+pFow5y4mVeOQdroUpKb3FWOi7+32wodZR5luZmIfGgsIj+iaFPaDwphpCdlYXly1ZU/k3tPVR5I6lptYcw1CM49+7yQ2UzvndTT6kT+apvvzH4eget3F9/f3907NRJ8yDmxOPmtZV60JhFmHJmqai8ihmXzyJm81rR47KuX0bezataWyVsORoFU7Bl8+bK5OxBjwzi9UlNmjbif99JtJ4fJifHsvpRdnYOiu8uqTQBjjp4qiTE1j+2mlylQDVO1M5e8DnXIlGcnQ5rwCzCKJlorSQw++XahmVMVxGmMCYf349SLQcVeSnJj2AsyMG1cX1F3fEDPXrgq6VfI4wpf1QuS1ZD8p1kPlHN0jh88GDl51oKGcxCIl3Mz88P4ydOQKfOXbDquzUsPuXFh3z9/MMPMBW9+vSBzFHT0ixMSWTxuluwBizihyEv4/kv3tMonC/OTEHqyUOCY19kprQpebrbt21DTHQMX4bW/7ChshHzsOeexzPPDkNaWprYWJoqgXw9s96did07d8GSuH3zJjenP/l0ARo1rgh4dmbm8bqNG3iUftOmLZWdPo0FVVa0bttaYxs90NlXL8EasJjjLv3CSV5bpAK1schP0IxtEFF69e5t9HtS6uRv//uVX8xvVn/L23yoIJfLMXvuXKYLeImNpKkSqOMmVUASUaOuWC7/5eLFixgzdgweHTxYYzuRZuy4schIT8fff5lWCeDGgpTtRSQ2JY1bo5eexQhDrL7+40rk3KrQWe4c28e3qaNNm9ZoEGp8U+yIS5dwhVlGr4x/BU1F8lACAgIwa/Zsi95Uwupvv+X/0zKxf+9eWALFxcV86Xx31ixRZ+X0GTN4s4Gtf/xpUkCVrKfuPR4QbM9lumNZoeF4lamwaGigJDsTF7+cxWukMyOEHszHHh8sbHWhBzu272A6T0tMmTpN5zFUQtt/QH9YCqS7XI2655Xe/Ptm5OdVvYE3keD1N6fr/P5UarLw04Xc7D510rSUy06dOwtampCEKcu1vFPT4rGkrKgIXPthqWA5cpQ5mlQfXVJSjKPMszvtjdcNVj6q9AFLQHtJiGM6hSoUURVQq9eg+sF6j+nATOTH2UNFFZimwMvLi1mNjTW2lTOJliOwUKsOixOGwgV3Du7hlXnqCA9vwbPijcXVqCi0atVK0LHbmiApcOa0plearJotmzYbFVmuKmipGj12rMAbbAiUbCW2ZGdfuwxLw2bpDTShVbtTgT5cvRKFkaNHmRQ+qCpu3YxhN0vlHpAwMV/RuOjE8RNMl7Jezxh1NGzYkN38ZsyDbXyOLvlj2rYTlhTn3IyyeO88mxGGRt+ZYk6HhASjbdt2sCUuX7pcOWSrR8/u+GDeh8wak3HTnaw1W4C8uT169mDnYZre1EGk2iI/MY6nxVoSNiEMicx27U27+R27dLVpqSzh4oWL3BSVsSd2zodzMfTppzGJOQip3+6eXXusWvmojsZNmpo8ICOkQQM4OWv2Ui68E4fywkJYEha9I+R5JTNP9b8KZOl4e5vWh9aWS5EKqmVn0KOPoEPHTtyimTptGjPdZ6GYKeE7d9imWwL5nUxt5EjHkwdZHaUsblWUYVmnpsUIQydLCiotO1Tmqk4Y6k8rd6q+1vPGoIRZFTdjbvHzf3fWzMrt5BgbN2ECfvjpR27mpyTbpv7HVFBbV7Hit9zYGFgSFiMMT1h+710ehSWoE4b8BDUdqSkp3CIi/aFJU2Er95atW2PpyhVISkxETQRJpaD6gYLtBRZO2bToktQ8PByvM7+JKtWUnlb6Iq3btEFNR2ZWFo8hkXNRV8UhSdEO2ukENQiNGjYWbCtMTbZovZLFtUpKjOpHw8BRIWX8A/yZ1Kn+PvqGkJWZwSd5qHJmayPE/Fw0BcaSKZtmEcZBJueKrTp4umReHm+6PH3Gm8znUhFVpnhPdSiwpoLKP1q0aIHgkBo/wVAnGoQJCVOak80IY7nSE/MII3XggwzUwecwlleIvk5dumDipIlcwpCSaCjJuSaAlqM2zPlFLoDaCl+2ZGo3MyjOTqt+CSN1doFEK11QwchSpJa7+/K4cXwCWlpaOn7+8UdYCuQnIRc+STSaqUg/VD1ArvuqhvMpQctaI3I0z7u08rzLeTKaZdIQKF6l3YyoNDeHPciW8/aa1VvD0cWdOdU0X0o3rFgto5+e1PkLPuGpB+u+X8tLSkxJbdAGXVjKfc3PL+Cfoz3ql54sJyc5+1w3vgRq9741BKmjFC1btoSlwYvtCov4eVMdFZFFnSCO7HMpt4f8KHSz6bzNJS1dc8oZUvcSU0xPUVLNS5JEKoODk+bkVbqBeVrdmaih4MLPP0M2c7d/t2qVWdo6ETE3Nw/x8YlISUnjF16bLKrPp33Jyan82IzMLJMChg1CQkx2LupDOftsyuFNTExi55TCrw0RXVualJXRg1CI1NQ0fiy9xtxAJxHPyclZsL0k13L5vWZbSY5ansgyFuQSqxHq3bcvhr/4Ijb9vhnXr5vWv59IkJqazi+mGEn0vY4KxhISkvjNMEbkt2zVmo8griros8ifk8RuPi3HJFGMBS1R6ekZnPSmfF8ViDBykeSssnzL6ZBmE8bJW3O4JT0pJAkEH0CeU+ZapySnZUuWVpZZGEJRUTG74Yn8yTR3jSc9gVrAE+EMZbGRJ1oqrVr3K5IMmUyyJSUlayzPpoKWXhXZTQHlHFGwVBtlRZaLJ5lNGLm3ZtyCbkhWVqbosZ6eXnyiax5bW69FGe4rSxZLhVSxTO8XIjJJKnOeWmNRrijn50yEsYQSWyFd03g/GWNB1QNi6Z+W7KFjPmG8hK27kvVk74cwhXfmnPexd/duPilWF+jLkVjWNVXeXFDTZloirEEaIkgKW0bIl2NJ0Lla5JwtmAxuNmFc/YME20i504eWrVrhqWeewR0dWf504UnpM1UUGwtSivnypLDcE0fnTPVG1jpnWtrI6qmK1NI1IdYcmC9hfIWBrvhYwy2zKIhXPyREdB/pLaTjWKM8QgW6sZkZlBxtmc/IyspmP9ZtCFBRMWn+TXeQWS5TwGwtz8lbmJh9h0kYWm4cDPhAxPwMdPso281UvYUy+jnJ2O/uzHHl7uFpMPGKPsfV1Zk7uqoCsoZIZzEEegBymQOtgJYs9tXd3dzh5uFhtL9FwU30bG4FmTWsw8FyzkjzCeMrnL2Yx5RLSmesFxgIU1HGTEpycBkCXfzLFy/i9MkTPEMuOSWZ6zvkaSanFxW4t2rdCl27d0e37g/AydlZ9D3S0jIQEuJksoNPhYpODBk6pSFNdrt44TwvGaEqgGwmiUopv1ZZ4WSkSogu3bqiOzvPtu3aG3zI8vMLmZ+olGf/6T6nMlEfjiW912YTxjVQuKxQaIDyRcwhDCmlhrT5UydOYPU3KxETozvHIzMzE9HR0di+bTv3nlIb9hdHjGDSRNNvRJZYenomC476mXVBaSkqFZmpTQrqzz9sxB+bt3CpoAv0YNFcyV9+/IkHaF+b/gZ69emr81y4fsd0mQB/uc5jyOcjtnTJqyhJ1WG2DiN1dmWmtaalVMj0gzgTSyQICoWSK6S6QBLkS+Yxfn/mTL1k0QaR8MeNP+CVUaNx+ZKw1ph8PEVmFPKXMLLlicwcuMEIMPnVV7F+7Tq9ZNEGFa/N/3Ae/rNwIXtf3X6qQuaf0ecFLqHQQ6nQUSh1tVxAtUr5MO6hTTX+JglBBeemgkSpLqWusLAAn33yCXb+vRPmIj09He+98zb+2PS7xhKisspMVYBp6Ja2rrXr77/w+tSpuHXrFswBEWHvnj14/513dZaY0GeWlur2HFN3rhIRh6HM3XLdy6tEGM8mwgbDEZdNL54i60hMF8hiy8v8uR/i8KFDqCqK2Wd8s2Il8zYv4cqqCmQ1meK+JzNX3d9CN5CWoC8+/4/em2ksrrBg7SfzPtKZEqLPg5zDFOv8fE3JJ3VmeprcGZZClQjj0VhYbXf16lWUm+hoEpMupAusX/s9zp45YzEzm95zx7Zt+HPzvbnPFRaM8Q43cturHGkkFXb+tYMve5ZEZGQkln/9tejyo8+8JpWAzk8dcncvZlab1qlUH6omYZq2FmzLzMjijZeNBd0wsSfz+NGjzCu8x+IlqnSzf9iwAWdO3ZsLXaFwG/4cVYqFChfOncX679eapQcZwj/79+PQgQOC7fqkYWaGMNgp8/KFg6MclkKVCOPVtBUctIJdpAzeuH7d2LfghNHWB0i52/rHHxpLhyVBN5iWpuS7JSNEWGMcY7xlx90lITMzA8uYFLDWXGsi9oZ16wTvr2/Zu31L6DilEI6DBUt8qkQYqbObYFmimxF9I9rYt+CE0ZYiF86fM7mDgamgrgw/Md1DtXySlWZo6VOlSvBGR7/8InqDLInY27exb89ujW36MgtviliQzgHBOnWY4sxUpJw6gOxo4+vGq1w14BMurOm9etX4Saf03RVqsR3yFO/etcsiCqQhHPz3Xz4xlkBEN7T8kXJOoDzlwwerrogbAhHj3337uRNQHbrOM1YkNONW/56/rJzFlKiP7+3tP+HUvMk4NO1ZXFoyD1In46ssqzz+zK99d9za+rPGtsiISD4b0c2ohGqlRjA1MTHB4h2ldIHM461/bEGL8HBOUNJRdHl+Vfm4hH1791q8TZouRMfEMCdfKhqEhlVuI7+V9mkWFRWKBn/JB5N06G+knz/Ju5rSgJCSrLvt9pkDsPGwl+EW0hDGouqE6fQA9zyqi0kSjdTcL5xFp00FLWdpqbYpeiccY8p1DnOyUe0UOQgpXiMG0rOINDTb4PDBA1YNkKqDSnipobU6YcQcvUR+8h5r4/r6Zbx1mVh6rLN/IBoNHWGSp7vKS5KTTz24a1XckSVx+sxpo16vKt5X4RpbzmzRvEcFutA3blQsS/p8HKr8HAo7xN6OhS0RFXVFg6BiAch0Rhb1OQYqlObnipKFrnuDQU/BvYFp3bssUPkogV8HYbXgoX8PGvkUSjRmVMfFmtZ21BI4ffLUXWutTOc5l94tBrt86aJVzGh9oPyh0ruErXjAhLft4sULJj1oLoHBaPj4i+LiSg8sUiob1OdhwbYL5y+wm2/4SaTzVRVf0UWxlpmqD1FXIitH6+kiDCW5E6Eunj8PW4NSKMruBmbFpu4SUU4cOwFjQekfTZ4fB9dg43UXFSxCGL/2DzB/jKatn8ii1mIBP8EJ8IL9Cg2OB8+KLZcdZiwowk6WCCmTYqgw/SnulIWMjEzYGmVqaQtiObsURoiIMN40dgtthAaPPAtzYBHCUEaXd0vN5sJ0kXf+9bdRy1KlomkpPZJJLamLC/NwGqfT0xNMUd4KH4f4MfQ96MbkGdmClSpDHdk5WLqLllhVQEpKCh+jow4aXBHWMEz0PZo8+wpkbsa3v1WHxaaKB/UaiIyLpzS2HT58GIksTBBioOJRVXzl7OwMuZP5bmzyajYdPhnBA4bAyS8QyrISZFw6jajV/0X29Uidr+MZbcyt3qCB/kJ8itUUGUjycqkXjHZvfQJf5m6gB6k0LxuJ+7fi6vdf8Ylp5oBqjVR6i1gC1aGDB3lfnq5du6J33z7o1LkTfLy9MWbUGMGxrkHBCH3sOZgLi9E/oHs//kSpIz0tHYcOHTT4Wrnckfs/qBukapaAqXBgUqrJi+PRaNhYThaChMVQ/Dr1QrdPv4NroP4eucV3E6V16YC0XaFU8FQMXZC5e6Dbwm/h36VvZR6tjAX/Gg4djY7vf2l2EJCuiaqEVkzCEEl27d2Db79bgzFjx/IMvq1bt4l4fiVoNnJylWJLFiMMZeD5tNHsNEVifMvmLQa1d7oYqoZ+oWbWX3uyuFaDR54TXQKohip0yAt6X+/sTHXNui+HyjpRt+i0EfbEcLg3ChfdF9CtH+p1N20gqgr1AoP4sk0Kr5hjsUWLcPgH3EuZpT6/f23fIchgdAttiNBB5ksXgsUI4+jihuB+NHRB8xElaynegLVEN8PVpWJZIq+rOSmTniymJffS3THcr5PuRkES5gdy9/C4SwiJ6Pk5OEjhzJZOZyfduSX+Xfvq+Qwpcz88AHNAk1z4NXJ1MZgETg/nryzOpW1w0HdsPeFdgXFiKiyqkfl36QPX+pq5vgUsqLdt21aDUoYy+OmiUEdrc2qc6Ybog74kay8m8l1c3fgTrIusMpkj3NlxHl66l0yJoWoJMxLO6Zza3+3BS50pDD1M5I/ZuGGjwOLz79Ibgb0eQVVhUcI4+wch8IF+gu07tu0QnXWoDrowzmxZCgoORuMmpnkfCTk3r6G8UHdecOZl3eN+aQYATZ/XNxKZdAfq6e+vZ+5B5qVTOvdRS/3MqAswFdQBI6BeIG9l4mQgTYHSQlZ8vZTrjuqQsKW25fi3LWKxWbZPr6MMIQ89ycLpml8s4nIEjh05ove19OR4eLjzi0LTUk1dlrJvROLO4Z2ibnAam3xrywadr20R3oKXo+i7IUQm0iOoEE8XbrMgbFGqeFAyk1mQqScMGwDaoJa19NkeRtQx0WCNf/b/K9ju360PvJsbPwVPHyzeFNGrZScekFQHKb9rVq3mJSD64Obmzi/OQwMfNrkTtoI5/C59NRe3/1jPorEVQTgls2gyLp7AyZljkJ8kngVIN4Ha2pOE0xV4JNB++unZpzdfnsRQlJaM42+NQPq5I5U9/ktyMhhZ1+Hi/73PfjfNi+3n74dHHn3sLmH0R/5pKt3SxV8LEsHk3j5oO3UuLAWL+WFUIGdZ/X6P8/F96k476uO/b88ePPeCbmuFgpA+Pl481WDw4Mew9vu1JkWFFex1UWu+QMymdXD28WU+kFwUp6fqbXcRzER+i/CW3AfkoKdCkIhFxzRv3oIPHL9xXXygZ8GdBJyaMwnOAYGQe3hxkhRlpDFCmx5/6tOnL5o0a8ZnQupTdul6fb96DWJitJs4M53whfEmBxj1weIShhDU62G4BGk6wUjp3bBuPU8P0AcqPqOloT+XMkEwFdQxsiglCVlXaYRgrMHeKD169eRtvmhyiSGRT8c4M1/T4CFD9B5Lsy8LEuPYOVxGAZNs5pAlOKQ+Hn/yCW4MkLKrD8ePHuGJ6NoPl3d4W+YDMm0+uCFYhTByTx80HjZG4AWj0tZ///lH72vpRvj5+fJ+eK+MG2dQ0asKiJBPDB3KlyIXF8OlGHQMLQ8PD3oETZpY7qnVBn3GSOalbdK0KXx9fPRKl8SEBHz80ceCRk1SZvW1mTYHMlfzQgC6YBXCEBo8/BTzjbTQ2EZSZtF/vzCYcE3Wkre3Jx5iN2bo00+ZV4BuAOQAoybUoWENmSfVw6gaazoPOi/KJKTyW0eZxVd0joEPD8TDjz7Ke+65uunucUzX8dMFC3A1Sjh5rfHTo+DTugssDasRRu7lx6WMREsvuB0bxxskGgLNQKRumK+8Oh59HjTPQ6oPdFMeeewxrsgaUijVQTXaJPUGDByIQYMGWbxNa9u2bTBxyhS+NPuw+JC+99+9cye2/blNsN09rDEjzBirjA+yGmEIpPz6dugu2L50ydcGS1Ec2IUKqOfPp3S8O+s9PtHNUpKma7dumPLa6/zGG1IotUHhAz+/imVi6htvoN+A/hYhDb1Hjx498OHHLHDp54967LvrC1XERN/Ah3M+EOgt1Ial1YSZ3CdmDUjlDtKO7Gyf1t7h5OuHhk9WTWEif4xbSCgSdv/J+/irQFr9lchIPPPss3qXAim7KSRlKJ+2d58+vLqAwvjmtvCim9KX+Xhmzn6fOeG8WTjAjUd1Tb3hpGOo6qm6s5tcxByGV69eMzvPl8z0Z5n1+PqMGbwNSFBQPb0mPvW3Gct0nFitkAsFN5s+Pw5hQ4brjXkZwi1mZZbmizRJUuJPqxKGQEzPuHIWBQmaXy6BKWskcjt30b/O0lNGlgKt1zT0inq/RF+P5nXESoXxN4j0lDEvj8H4KZO5v4fiMv5+fmb3hyHpRHm+xBEaVE5LCEnNIhMsIloyqD/w5GlT8ezzL1RMnmVk0afo08M26513cOjQYcG+wF4D0PLVd+DoXLX2HtVKGGK6R6NmSPznL0GvtZjoaPTr9yDvka8PRBq6IVQG6h9QD337P8hutj9vqUFlrrokDi0bFJci6TRz9mz07vtgZQjCnznFZFWoOVYFAylxnKLCNOKHehLTUpqaksqzB0XjZ0yYURgiOLg+RowchdemT0cr9lp6r8BA/ZKF3o+GsK9ZtUawT+buiQ7v/gduZqRdakMfYSRuUtlY9i3Xau/zbNoCfVdZbmRd9G+rcXXtYsF44l69e2HpiuVMX6ln8D0qCufzKnJc784aILPyZkw0rxKkAjPKfSVyUQyGmjWHhYVxBbryezFJQ2a7pfQhuonU445ykVVLUkZGOhLi4hF94wYS4uOYNMzly6ufvz+f59iseXOENAjhfYFJwnmxgCbpUvqWRnrvv7Zvx/TX3hB0GCVnaZd5XyOo96OwBP4Z0R8FySKecYXyFevYhSJo+MRLSGfxlOSj+zXagJ46eQpLFn2FufM/MuhzoQtKN5wCcdRxgaRLo8aN+Y8h0Hv7+lZYXpa0bIh45J2mcyLSUHWkL5PO9NNOZNKr+neh2QBezEx3khtOaDp54jjee2emaDtaSooK7DkItoDNCEMDLcLHvIHc6KvMfX6PvbQmb960GQ0bN8L4iRONupl080l0e3q683pnKtqn5Uo7YUgVH3J3d+X6gTX8OQQ6Z/ICk2OPqg9ICqrOR31ZImlCCi6Rls7Hych01MjLlzFt8tTKEcnqCO7/GJqPmGqzCbw2IwzBq3lbNHtpAi4t/kjDoqCOD8u/XsYThR7s19+o96pIV5TzHxLpdHOoZYfqfSkuxNM+zVRqzQERsmIEjStfMtXPh54D1fmYIuGoGmDCuPFsuRWWwXq3bIf2by6waFtVQ7ANLdUQNuQlhD31kmA7NUd+87XpLHxges4I3QDV+BtSaOmHiGRLsmhD+3xIKupL0BIDXYv3353Jy4614VKvPjp/sBgyT9uOR7Q5YSgzrs3E2fDr0FWwj2qDJzLPrq2K8Wsyzp09iw/en81TXLVB1RFd5y9jFlEj2Bo2JwyBJrp1nr0Yrg2EdTOJCYl4ZczL9zVpTp86iVkz3+Nk0XYGOjIfUue5S1gkuiOqA9VCGIJzQH10n/8NnHyEPpiE+ASMfmmkRlux+wXUs2b82HG4EhEpIAs9aN0XfIuAzn1QXag2whA8GoejC3taZB7CxGpqJzZ29MvY+fdfFp27XFNBSvsvP/6I8eNeFS3HdWRBz06zvuBlydWJaiUMwa9jT3Ses4iLWm2QJ/e1ydOwcvly1GWQJFn4ySd8GRKrrKRr0+XDJaj/4GCTuy1YGtVOGEK97gPwwKerRWcwkaPq808/Z3oNC7bdvoW6BCIKtY9/7ulnsObb1SLNAJhzL6wJen65nl+jmoAaQRiCb7vu6P7Jt3CuJx6W37dnH5575lls/u03Qc+32ggKpm5i3+WFYc9xb7c2yPz2atkW7d9aUG0KrhhqDGEIPm27oucXG+DZTHwc8J2kO5gxfQYT3TN5eoSiFuo2JFXiYm9j4fyP8fabb/G29tqgcp2A7g+i03vVr7Now+rRalNB5a7BbK2m+p6CpFgoRSLRVyKvYM+uXbyvfnBICC8wqw3IZrEmGlzxyUcf45/94rnN5Kdq9PRItJnyPlyDzJ/zXRVUa3qDOSDzMaBrX0hdXJEXd1N0jC4FHo8fO8aDchTEoyJ+udxyHa8tiYKCfOzfux8ffvABfvn5F531WXIvH7YEfYwmz4+3ePK2KdBHGJvGkkyBo6s7mr4wAd4t2uHGTyuReuao4Bhaki5duIR3mGjv3qM7xo4bh169e/P0hpoACqwePXIYq79dhRPHT/ABGbrg16Eb2r35MTwatkBNRo0lDIGSr/w79eL+mvg9m3Fzy0YU3kkQHEcK5KEDh3DqxCn06NUDAwc+jEGPPsKXq+rA9atXcYxJvx1bt+PM2TOiI2lUkHt682R5kirUAaOmw2YJVFWHEkXpKbj+wzLEbv+f3lHGFOSrF1gPjw1+jFcGdO7Smfd/sSaSEhJw5PBh7N61G6eYh5oK9hR6UkjJCgrsMxAtx73DTOdmFq8+qAr0JVDVIsJUQFFehuRje3Bt3RLkxBgegkG5J1Sw9giTOD179eKplIFBQVW+QSTVom9c5/GeA8ydf5ItOdQnt9wIy80tJAzNRk5Bg4eeqnK/FmugThFGhdK8HMTu+hUxv37PLKpko15DksfTy5MryO07tEd4eDhCGoQyAgXy2iQPpjyTJHJl/5cx/YOUVRpaQfk6WUxixCcmIvbWLW6lRUZEII2ZxPl5+UZXC5CPqfHQEQgdMhxOXn6oqagRKZqWBiU9N312PBoNGYE40m9+X8ctKn2gpKaM9Az+I5Y2YB1ImA7WjOspDR5+GlInyw3srA7UWsKoQMNKGz05CmGDX0Dy8X9w45dvkB11yaQSFGuAaoQCuvRCo6dGMhdBP0iktf5Sc9SNbwHwzpD1+zzKf3JuXkHC3q2I27UJxRnpsBmYXuTTugNCBz+HoF6D4OTtj7qGOkMYdXg2bgXPCa14yWju7evIvHwGyScOICf6Ctd9qF9u1VImJGxpceIpB87+9eDLQhrkyvdp2VFvY8a6gDpJmHuQcEcY/VAucVlhHvJiY5AfF4OcW1G8f0x+YixKs7N4TxduqlNJr4pL0oqumhJqd+rkDJeAQJ4W6RbWGB5hzdn7NoULc98bashYl1DHCaMJKnXxDm/Pf9RdeorSYpTmZqKU5g3QkM27Ph6JkwxSmZwr2I6unjYr5ajJuK8IowtUpuHkG4Sa5xGpebA/MnaYBJ2EUZbX/TxaO4SomJqr+97rJEwp83IW3NHf8t2Ouoci5uEty8/WuV8nYagT5bXv/48PmLTj/gA1wI5cuQCl+brvuV6lN2H/XyhMTkRgjwFVGpliR81HeUkR0s4cRdqFk3qP028lsfUs4/I5/mOHHQS7lWSHSbATxg6TYCeMHSbBThg7TIJRoQGaaurt48OHJHh4ekBmZm7HufMXBG3F1N/fx5d9hqurSemTND44Kyubl27QiGBjkt+oqsDXz4e3X3Wjz4PpiI2LQ0qKcGgYddGkzp3UB5iulZMJnToVNOqYmbRZmVm8wK1cT96yCpRF6MOuHU2V9fRwZ9+laqmnN6Jj9A6bN3jnKZ1x/KQJeLDfgwhr1LhKXZ36dO+J+Ph73ZSIGAMeGoBxE8ajQ8eOvOu3OaAocxy7gft27cJXXy1BrkgvOAJ1rXz8icF4eexYtGrbtkrlKMsWL8aX//1SY5ufnx8mTJ7IB15QxYK5PfWo4O3smTNYuWwZTp7Q3fKkTbs2mD7jTXTr/gBvCG0JUMnO77/+qnO/XsLQsOyVa1ahbbt2sAaGPTsMn33xX8irOLGE5jnSDKNxkyahRatWmDJxEiONZvEb3bw3334TU19/jRPH0qCnfMNPG9lNrPrkM2oTS7MMevTsyW7gDOzYvkNwTPPmzbB2wwbUCwyELaHzEaCn/705s6xGFmrZPvfjj6pMFm3QIIuJkycJJGGPnj0w5TXrkIUwe+4ci5BFHS5sufzgo3kI1CIFrdiff/mFzclC0EkYqlfu1996LSZoiaPxLtYADYzQHpg++IkhfL23Bkh6Pfb447AGaJRhMyZN1EFT5Dp1sfxoG2Og8wqSAqqrO3dJcTHKFYYVMm0o1F7TPDxcxzEK9v5FMCaFu2KsnrBAjbp/0+Q0qNUwN2wYJvoepFiWlOif3yQG9QbL1DBal/5VWlpi9DANJ7mTYFwyfcfmLVrgyOF7Q1apk7iYfsSvHfsu5g7JIJTdnVWpCzoJI5PLRa2V9d9/jz+3bGGKpunpD4mJiZW/iy1F1Ab+qy+/5BNLjDF3pExiPP/iixg+coTGdk9moUi10iadRAaU0zCJRV98gcT4BJiKeLXXuLgIS0fopu3662+sWbWK1zgZAl1rUpQX/udzbjGqw91N8/2pG7o2iMBffP45Tp84WSXC3LgRrXe/yTL6+zXf4fat27AGaJzLpt82mdT3xZuRQ5swxlon506fxt87/q7SBdaF4qIi/PzjDzh96rTRr4mMjMSI0aP4kAt9kIp8v/y8PGzfug1JiUmwJky2+8rLrJtYZWqToHKl+edTXl5mFbJUvr+Jc53oXIqLzOuuRa8t1VP0bynYPb12mAQ7YewwCXbC2GES7ISpIyBz3FFu/oQ5Y2GvS6qFKBRpfUam9mtvvI5tW/4wKmhJULJ/eXn5PIiazQK4CiMMCDthaiHiYoXVHA7M7zTq5Zf5jykg6yqDRcapweSSRYtw7aqB8dCwo9aBRh7H3baML4wchjSLcsiTT+Ln335DaGgDvcfbCVMLQUvOvLlzkZWZAUuCiPP6m9P1zt60E6aWgvr+Tps4Gf/u28e8u4koLbGM045GNqtP4dWGXYepxThy5CjOnj2HBg1C4O3ra1JyG0mRoU8P5QPW1RHEIuFyme4aNDthajloou716zdgDkgyaRPGEOnsS9J9DBrhbCrshLHDJNgJY4dJsBPGDpNgJ0yNgqRGzRwQg8mEadehrdW+VEBAAILqG58JT+fRpGkTmIvm4S2tNpyLUlDbtm9v0rUKDKyHZi3CYQvQefXs2QOmQqdZTZ20Kc6g/YVXrFrFYw+lZiROT3jlVVy6dLni/UUCXU2bNcOh48f4+xvTR1fu5CxawFVYUMACaZoBOLHsty7duuHU+bPIoObPJmbeUTrkgo8X3H1vYbCP0kTfmzMHk6ZONSqLjo738fOHTKRSskQrJ7h3n974v8WLUBVQzravn7DxNCX4K6H72uskTF5uLotgZsLbR/OGqGIP5sBJbWKaWACNIGNOo8Cg+qgK7txJEgyzunPnjuixJAmC6gfDVHj73hsukc4IR5UB2mUsdK0sUZEYH6c5KMLZ2Zk52KwzCyqWxaj0DWHVuSRlZWfh9EnrTaY/eOAgn1hmDZw6cRI5Odlan3fAakNFi4tLcPTQIVgDaWlpuHjBVoM0gMPse1Cqgy7oJEwhc+qs/nY1H/diDcTejsWKr5danDS3bsZg5fIV7H01l6B/9//DlpGtViPNfz//D5KSLJuxzysPNm5k73sHtgDN0F79zSqU6cmn0TkklECu44jLlxHAliAPL08uCqui8P76889IVLuoVyIjkJ6axpY4P7i6uUJu5rApIkFqSgoOHTyI6a+9zsmojSK2RJ05dRr5bKmlAj0aLCqtQiVkZEQkdu/cVfl3Cvv8w+zz6zHFnbo2uLq4mN05nHQwujZLFy/BhnXrBQ9VkyZN8NQzz8ASoMqJZLZc7929Gx/P+wg3b+oZIaTEnzoHbKmDAlVUTVgvqB6cRQrCjMXRw0dQyJ4adRAByToKoQCajw9vl2EqCtiam8z0lvi4BI2KRDGQckm1ysEhwfBkFpKDmQ/ArZu3EB0tLPpyZLGYZi2asYcggF0r0x8AynpLTUlFHCN9to4uFNQkoUPHDrAE6NrR+EEqzDNYoalQjmGEkb/EFqYNsAci7dCPMqWi/BkHiRQXmazJgh126IMSaQqZLMIhr6QkSqmU/As77NAHCfYUFRXdIq2sXC5Rfsr+L4AddoiAaXnZpRJ8zn5VcjU+q7T0PKQOT7E9cbDDDjUwssRIlA5PMmMi8u7fGnB3k8nGs/+fZLtq7pxcO2wAZSojx+a80tJ17I9K1+//A1xB8vOOSuDYAAAAAElFTkSuQmCC",
+ "bgBase64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWQAAADICAMAAADobGszAAAANlBMVEUhISYRERQeHiMYGB0VFRgXFxocHCAMDA4TExYQEBIKCgwbGx4GBgcODhAICAkDAwMFBQUAAABUX61LAAAAEXRSTlPh7+Po7Orl9O3x9uf58vf8+yEC6CIAABXZSURBVHjazJ3bctswEEN9l53Isvv/P1tHnBSVsctDWcrEaKcvfeoZDIhdUunmdrs/ft3ugfpYQ6iPJ3XjH4Gu4x+uS6DtZZvo/ND4h3Q4nB+/nlT+alt0+dJ1VFf08aXhYxg1/uvu/f2hW9GfdbRxvr3ouhCwEHeZHG8h7Ir5joglIZ7oeBTm7bdE+VogF4lxL8brYd5EBo4xD1+/Jnp4IBHjlRzxVg42GeGRoggLcqHsVr4wZFl5fch9mhGDeXhkPMSAnfH163fEN/BwhbAiQowjHc3JGBii3K9OeQMGFmDjOzjemoe7wL/XGSEsxEj5+IVYkMf4Nit3ZuWhDxJjZSfPsXAh7JCbCcvCnMFKCUuK1MVPkL8Zy8qiLMzAeAnkXnxNSUQMjSmchQTwdczyMKeE9D9kaxiKC3fyqHUhZ4oMrBhmDwd8cwdXKAf+PQeETfKyrOxHX8GcQl6D86YvwiZRHDxUjjkn3C2qwmprHMJHMXbK9X7RQcH4IciDAEtpVftIQsJ8HBO+VHpESw4fRdh1cMqqyvnRdy9aH7Is7MpOucjGgouEt7mPC18KiWOBbNo/ZKl8Tqzc1fKiJMbKkMMaIcjo4WsEmaY5jwi3cHDIFRnfEXFE2apyl7e4dfNiYw7mkMi3Eu1V4pKVNejCXiPcxEXHvUFOx76iGPKfFSCnMSwD28QBZViKUngUVDVow3FGfAMWZFE+hJA7r3G9DyQrQB6GcOCY5eCCmFcS9T7sXXgE7IhjC5smLc6qsp19A+TFIsiusA53SmFTexuW+JzLBuaDGThTYWxjX3W2dicvp7xprGoFcnLSMd6sEJ+TeSNS6WRu4BSzWlywwLh6V/Yt0WqQPYI9hJMybHiv5dcME/O0IQubMrqfn6KsUJ4UDOrK935NyLAchojwrY97mAc6NrEz3leC4tNSGXZx6V55XcgyMhO+AmIlhJU1OOdixBHgB8AE8ChRDo6+y8UbRrAmWhOy+HpKwPIdL5BmOTheSrgE2PFKcvJReRG0uKu3OLcyc2YnB4CTnURYhh0xXx+5i4MmbIxrATFF7C3OUznYKkOLWxNyc0pkBr6kA12EFxaX3Nc+pzpNMOeQfewb4LJvUSa/tHy/ZPdHqY+jUQ5HZgfsfIU5tLJDDkI5o7w25FlNAgzsm0u6BdVFPqSwNPLdTzx8Ok0wt+2VnbKvlZdBFmVwMFzj00CXPEVhE+/TlBBfcf6mPNkSpWtlQf7BgWTTT6yMHuaJ2fmGVeIceLiR74NtmMMPvKdRI2MbSMzJ3JWhX7Q7uXfIamtcJKwKwx2zYhjWakphcnDh+03YrDyKrSzIYgyXfe2QPS+SLiwh4nMlJZoPulhxRExl/eLY9DAOWtwCyL3lhbVhfOnj4s27FPAVYlMA2CCfkoJxLsp2cdTibmtBLoKdBK0kQjlc5bARBrzqEokE2ShvX+0Xy25GhlEJ5EtImJ+rsYuP7YijiAhNvDvtnlN5b7P1Obu37gQZKM+H7FamkY4J+9aHDzpIiDQjhPgh93L96NMGw6a+UWtBdsrVky5R++3cgbua8O4jC3+GgIs8luvzSH0Xd+/h6Gt2cpLK7UddHBFhl4C9pVc172rOd/w9oTxr6hNkGkhur0MumB3yFZqa+hp4uCh2cGLjz1gnl/hmkLnFdfWp774cclowWp60QpOQkpiIFIZEnMKu047zIrGyLvt4gTEfcmLl69IbOgXEGMaWE8yYHeyKKR/g6waY+ooWOdkgXztifA6qBKeElA50ey7DI8YcsQeGKLuVr/A4YD0nF1mLCymfoxwOl2rHpKpVlsOzCLOT/eQ70AJDXZmt3A7Zvaz1hSDLvwWv87UbpGztw9dHhVBEONVm/F1S2TYYgpx5uasv728LIWMqU1cTXnqJkh50Li9ruzLQMWQFRn5vbRsMWHgC5mYni3KaF1kX5sWwmlp0yu19NTzLxCPhh0TZnMxPPG0eUV6MWs3JWcGgKsH3zHFIBDd0hY/PGxXC/+Rd+aF4HqE34d7i8qbMkO9BKBdZiZu7lDD34tJHfJ9yIqRcqG4kUZaVYerT2cdH36ucN/c+TWXPi3pZg0MODrp03MhzeDMl/BwYdnEtyLXhOmtxuCfiT8w8L7SHE+Xq3idEfGwow6mBRTe0caFqiEclVdmOPn4cwFeqDFmUPTAM8laQhTc750LpnBPfwMMcwyIMeWHvXGAiwYFkMeSPcE2kFufHHawkaHOJFnYVuDsjXKiLsawM99atX+oscfL9fyP71OdWBhM3X4G6h3meM/ca5ezo21dD2QOD8mI+ZD/5hHnKWJThxSXfgHIZ9pxAKS/QyunG0wvG9FPgZZDzXdzWrUx8ZWC+x2fCimByslOeeW8NXwK/AlmB0fsCI2lxgkwpIb4wz2WMN3Iwy8a+5hcY/CScA4MhZzeqwuwtDgnHE50LMwIx+9HXNpB4weA10Z+5kG8TyE5ZBcOtTA+zGXAREAa+4GSjjAWDP294GbKsPPjR5wMJUW4emXO8wJcoC7Ioi/GBXx8OSmWyMkP2vKgv7y2V03lOAsAuxMtOnhx9tlUu8gVGEVTlVyDnE4lb+ew1zkKiJSO4p+1WofxplOstzse+gR8H8A/fwxaXO1mQBRgYU0T8G+hQTNmtrBWGQYYWt8jJUysrlM3KyUQiyDzQ8fLdtBZlv4aCtTJRvs2CHHg5CeXtJVhgiPLT/ed8E5eMoEYxfyCxrkyvA8R4Pci3GmRf3p/l5KNZGZ5JwEAHbNsp+9S34Ae69AMEBkPmVPYrVVH+r8bVm8QJCa+nHdyopj8r1Sn7AiNmzJBtIMlKHA0k5mLI4WI6IV4fM1s56cofUDAWOFl5EVKO1spAeYd7S2a8/OjjtbJZOWDcw0NayGSj7AsMsLI6HAIW4peDGEN544HhX/ZlLY5fYMyHXDD3VDDUL9zKk2naDjq4ZV5d/jogW977msitDGW5HbLP1l4w4htVzdaCXBifOCSY9HLI/HWDWzkNjMWQey8Y3Qensrad01Cu8iW86x99+Zc6sPAMXtK+CNkpy8l49gmynPxQNtEJ9Y9qsZX584bZThZlOPrg7BPln+0RzBgKhqfyzLz400p580eQbSKpvovbzoHsl/g/L4acP4zrrlUn3xfEhQKjuStXq7K2Er8huFE91G9IrvYD4wYIZXIyj33dtMXJyRUry8g/GBO8v4CvGw52Q0KzNQwkBLn3vOhs4ZlOJH72ifFvSKmcP7w/wxOM5Lny7T4T8hQzfEOSMD7UU3nzC5x3bf0ihMxj30wni/L/mdzza+XgGkqZ/Ez5l+SjNSzvYepLUpkhPznZjz4cSJTKb5YX8rItMGb9MPbhmbIwt0EWY1gTmZfTBcb+bSjT1Ccrw4/9pc+h2p1cVH0TnjwJ9xb3BnmRpLI9wUhbHN9DtUNWJs9c3p+LjLLP1utUuPWnvmx3T4+J7KELQDbKfZXyhd65FMg+kWx+R9biqGBAXoCVGbJTnn9DIi//elzYQDJtyhpIqpd9XDBuTZC5KpuVo43nW1LOPoeab2XYxbGTJ4HBn1uL8Uj5bY8+eTmaSPz/LVr+A+PYyRpIiqo/BIPyQlZ+ixonxmDlS9PYNxdykVPmJxii7Gffe0wkMrJ15dbdPVu5HTIcfVHBUF4c/IbkfQLjL3Xnsts2EENRe1zJSeNY9v//bIEMDMK4ujnU1K0YpasusjghOHxcktaUO2MnwXDj1kaCwZCDclZHqx2SSK0rJddN0r6UYovnrS+yK5UhL0/+wmZ9UPDsX62nLyh/N3PmOqqp/U9ZyHeKL3wxDp++sOQqHuPBuH/klfkw4vaHz03qxPEAmiGRp69GEKfCe8mtHWUyZYIcn6Wc6VtrLS4otxqpdaMCRv5Se3Aeg5zXeIZmSzskAXn3gmcLyr4NpZItP0MSjPOQg7FSvjpTNsL7dchtZ6fcyJQVMgy1S0t1K+TbF2V8+tRf6AxJjQpGlIka9aGOuSjOemWGHE45ojiWK0dC0hkL5f1z6wZpn+4+fJehM/AXDJmdMqwyU69cKbc+cELiNlhvz60ZMkg8fcWTvPLcdlIHeKELZ315tTJbsnv6sBbHmvAyDZINy5WPmRkS//Qx5LthvGG8YXqqxZ1qJCSHA7RIMhpPgrwsDBmafcaUbcWzVPG+ocRTxQFWssX7nxhy/zxkVhOVqyp/fWLJtGokM249CBkqnjA+KeLDKh0SffrYX+jxBrykypBVghGMnTDOC+9rhcrfhHEC2eviTJnoNgSZCxiGsjrlGhLPbsqurNy/5BbPKxbjGLLIlbNl5dqSre8sWTZYx9uHgzrBWCgr5KBs+lC8W9klJEUotwMNtY/e4GJLlv+hhETDOD/eEJALxMrUtgavzOrDPOQlV8E4J9TK1TqqUlaWIZIYbzDjUAR5AcjSIBF/AW+f+oupVBQnuTXPkORN+cY+2VPOrQlXyJ1yqVi52aEzdcq0XHkcslJW9WFeghGUi3RUgzLf+OSZM654siUrZR/FHdeK96XLyk2c8olqcX6D9W0E8oKUeW2OUp4LQZ55I62P4kCtvBBkTvsoigtLLmnKMj0pkN3+JzblG0DWz8yc2SguKNunb96/QwJPH90h+QTIEsWNWrJowkl4X+rto618nPWFw5ChdoTMtTh2yuGT3+rX4jIVz/wydnQXSPkCQ+3aUbUSz901Ww2yPoFM/sJPNzDkO0wCG69sy0RVqkTQITGTfVG8h6U5AJm8Ml+TU8oldS7kMEyAkUlIhDFbsq4yu+CuVD9CUkVI2xnTpXatxX3ay8uwakQgC+XxDZNcwDjsFcX5e7Uw2CcSDD10Bu4CTTkYuwoGTzdUSkg0VIbjDXxNLsI4hpxXK3vIYsplavedMq7x1JM6rm+tJ/vAkjFWVshBWdO+jrnW+GSDtb/CeGCDdd5d3GFhnFsTvu6VP+qUiaxk62TLygayxBfhLwAySLY4wHDigBqU4fDyRgkG96EY8rhXDsonA3m/QR3vMODyskRxnPYxZDZlvdQelKPXV1QcQG2ooAzj1pCQAOT+waoR8RcmI4korpXyymrJeh1KYmVcYM2QVRwAq8xMGDc9ueVqgzoi2YJYOXsdiiFr6V4o+w6JE94XLROJKQdkWHnPZaKFIbNX5vHJymv5YLxhwliZ074kZL+aKH8caqq4z6UdDtDt2zhufbV3EfOWbM9PuqdPvPKpZt/aZ31cJjqTJHwhyDxDstoiOdrdh1OptrVUMKSA4UyZOySBOQuZtmzZvrV3GPO8/7x1A+F9Tudy1nEogJz3yhcYapdYuWCAgdfkNlQ8gXIesu1bs/xQnXIByFnxoaEs/kJy63HIvPvw6CKMU63VATLZB7o4LBP5I+IM+b42QwLXoSTA6F9lU+6rUmHvr4FM563zkG/c7PNqooqbA8zTB6YcmKGsTJB5UOcKwnsDudbWnO4xSOcC+1ycU74ZyGTKekgVN9J6dcBcYZcZJCRCWWtxv22snPfJfiGtS/tUSPv2EwsYYcurd4tMmchqwgMyU1aHAf4iKBdsQ8E+l5HxBi0SpSFD1ifLlSkh+aiiPqRDqpM5qWN0tObGZ9KS77ncGjokqnMJxuVi5ZMreLoZEruVb0HIHMXxstS6M2dgynSH5DO3jD0POb/2V8tEP+bpM5rwx52z4PwpGYmpxSlkpuxMOdWGqrhqBHLrnPDeqQ+3QgZbzickD8inIgFGIzGRemWqxY1Dvrstnm5pjm7l03O1FXaZrUgw1CmnA4zLmikvCplN2U83nM2WrbeyQ6qymigwgyljFBe5dQYyXYfisjKsZ9iNcoO+NVU8H4whVs5DTsfK79Ypl5oEbv1HTBkhv4u/IMgLQWZ1wDU9DlXpxmckIhDFQYfEYh6yZG5D8e7DEqsPW/8X9WR7t8hFcW6GREPlUUvefE3uuO4vTnuFyk3NOL+RVik7SwbIrHO5wJYtNw0FWR9QfpUfFsJ5yBLFkWTLQeYOCasPyz193XzDggGyUQeAJvwqC+MYcl54n2/27bWVj+j2bCQw954qzpxxGMeQ+e1zkCFW/p91Ze8ieqoXdINxfiPt+fFps++vIFsFhkuudxtq73+0PvzqrRgh/5rSOlqd7APIm+MLLBNxat1e7onJhJXxvKEPxX1rgAyTfUP7n6Y1U44Zkhemyw/zPRjCzRIGSbhQBqcMkKlFwqastTg05dcGwuwklLC7PvkLLNllJAYyta2Xoc0Bb/9H4tkknEAL/pif+KoEQ8QB/vIyQeZvex8KAgww5Zdb8TwrZOHbQ7h82mfUyuEv8pD1cNF2yGzK/5BvE7jdRxgTdlv5OuX33uzjm8B5S+ZjLwoZKL/2+mT7nvHcf8QHz2LAgVgoYxTncuuNkOHp47sC7C9enjR//er1V25+4hvaWYU8jQ3q3DZD/tPaueQ2DMNQEK3txm2aRe9/2QLRgmiHzFCQuQiQ7eDhmR+Jkos6xR1VmjJra6XsCVsdmkfQJQiZhlFfamcHQyCbYfgqM3FlWR1geFnO0SYSKxbCQJyuPizLvkXI/rw10zjJ4mQ1kaVqlkjQhinjnG4QDs5oeOpqom+F7LcbSNnzC+5zuWMM1UM8W2wE3/DhHPCBYEHCYR9PB6xD5rDPs7j1J3W69RwZM7acMSDzAIafc1mCXCcY7sr7udy8ZyLhfZ+7WAREDMJx8F6uQ6F5b5Bdyj5S9aqPaZwOkOZELIRFwgPuIBwLoIKxjqEM8vWrifbElunKUtItJmsuYdpExNQbn4S83rzvNzC4asS25rzLeAOIB97nLyo6RG0RKWVbYP0lkC+UMt8EDsYjpBcnAyQxCcZWlHQZ40GYgKW2vnErn0L261B05Vv7EXHmyoQ8/s985QIx+XYY72ESIPyfskxU1yDzjGch5YfsVja/qG0YLYmi77PlTnwEX0EcCfIISzC49tcgu5Trsq99E3jLc2UoWOq5onNZ9316hE/GG6T8cg5FyB6uZF8T7r37QEy8BeLKhe8tF1YFh4gH4vaERCAL5zDliY33p98hQSrh9RxbwwMu+eaED/DNRRx8Abmk7JC949nOlc+WlHW68Q79SmMNCqaED0p4B14A5jkXh9yPacOgKwOyUQ66YhFlKiEm4TbB4KfveshgHMW1za0lV0ZkiKWeg0uA75HxJd0gTMZv8gQXIC+XfS5lfQ5fAEfMlHOZivc8TMEknBvGBZB/Wudo3S9oGN3GZXeGVNow8U4SDsSSYAjk+fvWX7PXJw9C9qM+7eEGXULrOQf8+YewrBpZgSxvfNZHPH010cfgW5oEo+yrdREzjXhaccEY8UilvK5kWzAJKfv1yY+AXH3mpCkhjcs9z4fTeu4sLSKHXJ9zcci+XLm9YJKU6Rc14/6I+Ugtomyr7fSIAvHgS5sYgNHxVMjrx5XZvyhceeNpItIF4217la1dkkmQLxWMSN/4XIdcSPlmy9ifwfxCjklY39JL5qjnZhiniEG5eILrF28XFtA7mE/BAAAAAElFTkSuQmCC"
+ }
+}
diff --git a/demo/settings/v2/packages/program.json b/demo/settings/v2/packages/program.json
new file mode 100644
index 0000000..916c1b2
--- /dev/null
+++ b/demo/settings/v2/packages/program.json
@@ -0,0 +1,3 @@
+{
+ "__version__": "1.0.4"
+}
diff --git a/demo/settings/v2/packages/project.json b/demo/settings/v2/packages/project.json
new file mode 100644
index 0000000..829d9dd
--- /dev/null
+++ b/demo/settings/v2/packages/project.json
@@ -0,0 +1,15 @@
+{
+ "__version__": "1.0.6",
+ "general": {
+ "designResolution": {
+ "height": 1334,
+ "width": 750,
+ "fitHeight": true
+ },
+ "highQuality": false
+ },
+ "custom_joint_texture_layouts": [],
+ "script": {
+ "preserveSymlinks": true
+ }
+}
diff --git a/demo/settings/v2/packages/scene.json b/demo/settings/v2/packages/scene.json
new file mode 100644
index 0000000..0c8c1e7
--- /dev/null
+++ b/demo/settings/v2/packages/scene.json
@@ -0,0 +1,4 @@
+{
+ "__version__": "1.0.3",
+ "current-scene": "bef93422-3e63-4c0f-a5cf-d926e7360673"
+}
diff --git a/demo/tools/swig-config/SDKHelper.i b/demo/tools/swig-config/SDKHelper.i
new file mode 100644
index 0000000..764e866
--- /dev/null
+++ b/demo/tools/swig-config/SDKHelper.i
@@ -0,0 +1,95 @@
+// Define module
+// target_namespace means the name exported to JS, could be same as which in other modules
+// assets at the last means the suffix of binding function name, different modules should use unique name
+// Note: doesn't support number prefix
+%module(target_namespace="KunpoSDK") SDKHelper
+
+// Disable some swig warnings, find warning number reference here ( https://www.swig.org/Doc4.1/Warnings.html )
+// #pragma SWIG nowarn=503,302,401,317,402
+
+// %insert(header_file) %{ ... }%} 代码块中的内容最终会被原封不动地插入到生成的头文件(.h)开头的地方
+%insert(header_file) %{
+#pragma once
+#include "bindings/jswrapper/SeApi.h"
+#include "bindings/manual/jsb_conversions.h"
+#include "cocos/cocos.h"
+
+#include "../../SDKHelper.h" // 添加这行,%include 指令表示让 swig 解析此文件,并且为此文件中的类生成绑定代码。
+%}
+
+// %{ ... %} 代码块中的内容最终会被原封不动地插入到生成的源文件(.cpp)开头的地方
+%{
+#include "jsb_SDKHelper_auto.h"
+%}
+
+
+%include "SDKHelper.h"
+// ----- 忽略的部分 ------
+// Brief: 类、方法或属性需要被忽略
+//
+// Usage:
+//
+// %ignore your_namespace::your_class_name;
+// %ignore your_namespace::your_class_name::your_method_name;
+// %ignore your_namespace::your_class_name::your_attribute_name;
+//
+// Note:
+// 1. 'Ignore Section' should be placed before attribute definition and %import/%include
+// 2. namespace is needed
+//
+
+
+// ----- 重命名部分 ------
+// Brief: 类、方法或属性需要被重命名
+//
+// Usage:
+//
+// %rename(rename_to_name) your_namespace::original_class_name;
+// %rename(rename_to_name) your_namespace::original_class_name::method_name;
+// %rename(rename_to_name) your_namespace::original_class_name::attribute_name;
+//
+// Note:
+// 1. 'Rename Section' should be placed before attribute definition and %import/%include
+// 2. namespace is needed
+
+
+
+// ----- Module Macro Section ------
+// Brief: Generated code should be wrapped inside a macro
+// Usage:
+// 1. Configure for class
+// %module_macro(CC_USE_GEOMETRY_RENDERER) cc::pipeline::GeometryRenderer;
+// 2. Configure for member function or attribute
+// %module_macro(CC_USE_GEOMETRY_RENDERER) cc::pipeline::RenderPipeline::geometryRenderer;
+// Note: Should be placed before 'Attribute Section'
+
+// Write your code bellow
+
+
+// ----- Attribute Section ------
+// Brief: Define attributes ( JS properties with getter and setter )
+// Usage:
+// 1. Define an attribute without setter
+// %attribute(your_namespace::your_class_name, cpp_member_variable_type, js_property_name, cpp_getter_name)
+// 2. Define an attribute with getter and setter
+// %attribute(your_namespace::your_class_name, cpp_member_variable_type, js_property_name, cpp_getter_name, cpp_setter_name)
+// 3. Define an attribute without getter
+// %attribute_writeonly(your_namespace::your_class_name, cpp_member_variable_type, js_property_name, cpp_setter_name)
+//
+// Note:
+// 1. Don't need to add 'const' prefix for cpp_member_variable_type
+// 2. The return type of getter should keep the same as the type of setter's parameter
+// 3. If using reference, add '&' suffix for cpp_member_variable_type to avoid generated code using value assignment
+// 4. 'Attribute Section' should be placed before 'Import Section' and 'Include Section'
+//
+
+
+// ----- Import Section ------
+// Brief: Import header files which are depended by 'Include Section'
+// Note:
+// %import "your_header_file.h" will not generate code for that header file
+//
+
+
+// ----- Include Section ------
+// Brief: Include header files in which classes and methods will be bound
\ No newline at end of file
diff --git a/demo/tools/swig-config/swig-config.js b/demo/tools/swig-config/swig-config.js
new file mode 100644
index 0000000..83875c4
--- /dev/null
+++ b/demo/tools/swig-config/swig-config.js
@@ -0,0 +1,37 @@
+/**
+ * @Author: Gongxh
+ * @Date: 2025-03-21
+ * @Description:
+ */
+
+'use strict';
+const path = require('path');
+
+// 开发者自己的模块定义配置
+// configList 是必须的
+const configList = [
+ [ 'SDKHelper.i', 'jsb_SDKHelper_auto.cpp' ],
+];
+
+const projectRoot = path.resolve(path.join(__dirname, '..', '..'));
+// interfaceDir 是可选的
+const interfacesDir = path.join(projectRoot, 'tools', 'swig-config');
+// bindingsOutDir 是可选的
+const bindingsOutDir = path.join(projectRoot, 'native', 'engine', 'common', 'Classes', 'bindings', 'auto');
+
+// includeDirs 意思是 swig 执行时候使用的头文件搜索路径
+const includeDirs = [
+ path.join(projectRoot, 'native', 'engine', 'common', 'Classes'),
+];
+
+module.exports = {
+ interfacesDir, // 可选参数, 如果没有指定,configList 中的路径必须为绝对路径或者相对于当前 swig-config.js 的相对路径
+ bindingsOutDir, // 可选参数,如果没有指定, configList 中的路径必须为绝对路径或者相对于当前 swig-config.js 的相对路径
+ includeDirs,
+ configList // 必填参数
+};
+
+
+//
+// # 如果当前终端或者命令提示符所在的目录不是在 '/Users/abc/my-project/tools/swig-config'
+// node /Applications/Cocos/Creator/3.8.0/CocosCreator.app/Contents/Resources/resources/3d/engine/native/tools/swig-config/genbindings.js -c /Users/abc/my-project/tools/swig-config/swig-config.js
\ No newline at end of file
diff --git a/demo/tsconfig.json b/demo/tsconfig.json
new file mode 100644
index 0000000..8b92104
--- /dev/null
+++ b/demo/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ /* Base configuration. Do not edit this field. */
+ "extends": "./temp/tsconfig.cocos.json",
+ /* Add your custom configuration here. */
+ "compilerOptions": {
+ "strict": false,
+ "module": "ES6",
+ "target": "ES6"
+ }
+}
\ No newline at end of file