From 7cddd83d6de8a30cc0dd759a077db79d5d09d7fd Mon Sep 17 00:00:00 2001
From: 陈炜 <5856420@qq.com>
Date: 星期二, 13 九月 2022 11:41:23 +0800
Subject: [PATCH] 合并提交
---
49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/hosts | 7
install.sh | 738 +++++++++
nginx.conf | 164 ++
haha.sh | 28
web.xml | 161 ++
0.default.conf | 7
49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/config.v2.json | 1
Android FUStaKit 集成文档.md | 1205 +++++++++++++++
开关机盒子测试报告.md | 47
STA更新日志.md | 120 +
49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/resolv.conf.hash | 1
manager.xml | 28
java_gaga.com.conf | 57
java_wa.cn.conf | 57
49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/resolv.conf | 3
Android FUStaKit Java API 参考文档.md | 867 ++++++++++
黑宝塔install_6.0.sh | 738 +++++++++
phpfpm_status.conf | 69
server.xml | 24
49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da-json.log | 251 +++
duan.md | 54
nn.cn.conf | 51
49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/hostname | 1
49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/hostconfig.json | 100 +
24 files changed, 4,779 insertions(+), 0 deletions(-)
diff --git a/0.default.conf b/0.default.conf
new file mode 100644
index 0000000..7a73121
--- /dev/null
+++ b/0.default.conf
@@ -0,0 +1,7 @@
+server
+{
+ listen 80;
+ server_name _;
+ index index.html;
+ root /www/server/nginx/html;
+}
\ No newline at end of file
diff --git a/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da-json.log b/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da-json.log
new file mode 100644
index 0000000..cf37a88
--- /dev/null
+++ b/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da-json.log
@@ -0,0 +1,251 @@
+{"log":"/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration\n","stream":"stdout","time":"2022-07-05T17:11:43.023884377Z"}
+{"log":"/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/\n","stream":"stdout","time":"2022-07-05T17:11:43.023953693Z"}
+{"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh\n","stream":"stdout","time":"2022-07-05T17:11:43.027132386Z"}
+{"log":"10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf\n","stream":"stdout","time":"2022-07-05T17:11:43.053161519Z"}
+{"log":"10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf\n","stream":"stdout","time":"2022-07-05T17:11:43.065952329Z"}
+{"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh\n","stream":"stdout","time":"2022-07-05T17:11:43.066287049Z"}
+{"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh\n","stream":"stdout","time":"2022-07-05T17:11:43.0714795Z"}
+{"log":"/docker-entrypoint.sh: Configuration complete; ready for start up\n","stream":"stdout","time":"2022-07-05T17:11:43.074755632Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: using the \"epoll\" event method\n","stream":"stderr","time":"2022-07-05T17:11:43.085978711Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: nginx/1.23.0\n","stream":"stderr","time":"2022-07-05T17:11:43.086008851Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) \n","stream":"stderr","time":"2022-07-05T17:11:43.086016264Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: OS: Linux 3.10.0-1160.el7.x86_64\n","stream":"stderr","time":"2022-07-05T17:11:43.086022197Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576\n","stream":"stderr","time":"2022-07-05T17:11:43.086027701Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: start worker processes\n","stream":"stderr","time":"2022-07-05T17:11:43.086033201Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 31\n","stream":"stderr","time":"2022-07-05T17:11:43.086185158Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 32\n","stream":"stderr","time":"2022-07-05T17:11:43.086298454Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 33\n","stream":"stderr","time":"2022-07-05T17:11:43.086508701Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 34\n","stream":"stderr","time":"2022-07-05T17:11:43.086645748Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 35\n","stream":"stderr","time":"2022-07-05T17:11:43.086846015Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 36\n","stream":"stderr","time":"2022-07-05T17:11:43.087038398Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 37\n","stream":"stderr","time":"2022-07-05T17:11:43.087223435Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 38\n","stream":"stderr","time":"2022-07-05T17:11:43.088882515Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 39\n","stream":"stderr","time":"2022-07-05T17:11:43.088898883Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 40\n","stream":"stderr","time":"2022-07-05T17:11:43.088901981Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 41\n","stream":"stderr","time":"2022-07-05T17:11:43.088904384Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 42\n","stream":"stderr","time":"2022-07-05T17:11:43.088906786Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 43\n","stream":"stderr","time":"2022-07-05T17:11:43.088909311Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 44\n","stream":"stderr","time":"2022-07-05T17:11:43.088911564Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 45\n","stream":"stderr","time":"2022-07-05T17:11:43.088969256Z"}
+{"log":"2022/07/05 17:11:43 [notice] 1#1: start worker process 46\n","stream":"stderr","time":"2022-07-05T17:11:43.089228027Z"}
+{"log":"192.168.1.21 - - [05/Jul/2022:17:11:56 +0000] \"GET / HTTP/1.1\" 200 615 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36\" \"-\"\n","stream":"stdout","time":"2022-07-05T17:11:56.614265095Z"}
+{"log":"192.168.1.21 - - [05/Jul/2022:17:11:56 +0000] \"GET /favicon.ico HTTP/1.1\" 404 555 \"http://192.168.1.233:8080/\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36\" \"-\"\n","stream":"stdout","time":"2022-07-05T17:11:56.698158889Z"}
+{"log":"2022/07/05 17:11:56 [error] 32#32: *2 open() \"/usr/share/nginx/html/favicon.ico\" failed (2: No such file or directory), client: 192.168.1.21, server: localhost, request: \"GET /favicon.ico HTTP/1.1\", host: \"192.168.1.233:8080\", referrer: \"http://192.168.1.233:8080/\"\n","stream":"stderr","time":"2022-07-05T17:11:56.698244049Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: signal 3 (SIGQUIT) received, shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.784883933Z"}
+{"log":"2022/07/05 17:27:31 [notice] 32#32: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785033304Z"}
+{"log":"2022/07/05 17:27:31 [notice] 32#32: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785043587Z"}
+{"log":"2022/07/05 17:27:31 [notice] 37#37: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.7850468Z"}
+{"log":"2022/07/05 17:27:31 [notice] 33#33: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785050024Z"}
+{"log":"2022/07/05 17:27:31 [notice] 33#33: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.78505328Z"}
+{"log":"2022/07/05 17:27:31 [notice] 37#37: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.78505666Z"}
+{"log":"2022/07/05 17:27:31 [notice] 33#33: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785059675Z"}
+{"log":"2022/07/05 17:27:31 [notice] 32#32: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785062615Z"}
+{"log":"2022/07/05 17:27:31 [notice] 37#37: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785065819Z"}
+{"log":"2022/07/05 17:27:31 [notice] 44#44: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785118012Z"}
+{"log":"2022/07/05 17:27:31 [notice] 42#42: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785124897Z"}
+{"log":"2022/07/05 17:27:31 [notice] 38#38: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785128102Z"}
+{"log":"2022/07/05 17:27:31 [notice] 35#35: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785281534Z"}
+{"log":"2022/07/05 17:27:31 [notice] 39#39: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785310007Z"}
+{"log":"2022/07/05 17:27:31 [notice] 44#44: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785316867Z"}
+{"log":"2022/07/05 17:27:31 [notice] 42#42: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.78532278Z"}
+{"log":"2022/07/05 17:27:31 [notice] 38#38: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785328734Z"}
+{"log":"2022/07/05 17:27:31 [notice] 40#40: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.78533466Z"}
+{"log":"2022/07/05 17:27:31 [notice] 35#35: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785340464Z"}
+{"log":"2022/07/05 17:27:31 [notice] 36#36: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785346727Z"}
+{"log":"2022/07/05 17:27:31 [notice] 39#39: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785352504Z"}
+{"log":"2022/07/05 17:27:31 [notice] 40#40: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785486697Z"}
+{"log":"2022/07/05 17:27:31 [notice] 31#31: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785497671Z"}
+{"log":"2022/07/05 17:27:31 [notice] 36#36: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785503664Z"}
+{"log":"2022/07/05 17:27:31 [notice] 35#35: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785509191Z"}
+{"log":"2022/07/05 17:27:31 [notice] 44#44: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785529984Z"}
+{"log":"2022/07/05 17:27:31 [notice] 42#42: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785536784Z"}
+{"log":"2022/07/05 17:27:31 [notice] 38#38: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785542237Z"}
+{"log":"2022/07/05 17:27:31 [notice] 31#31: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785547857Z"}
+{"log":"2022/07/05 17:27:31 [notice] 36#36: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785553251Z"}
+{"log":"2022/07/05 17:27:31 [notice] 39#39: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785558431Z"}
+{"log":"2022/07/05 17:27:31 [notice] 40#40: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785563757Z"}
+{"log":"2022/07/05 17:27:31 [notice] 31#31: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785569204Z"}
+{"log":"2022/07/05 17:27:31 [notice] 45#45: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785660804Z"}
+{"log":"2022/07/05 17:27:31 [notice] 45#45: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785670791Z"}
+{"log":"2022/07/05 17:27:31 [notice] 45#45: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785758197Z"}
+{"log":"2022/07/05 17:27:31 [notice] 34#34: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785874241Z"}
+{"log":"2022/07/05 17:27:31 [notice] 34#34: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785885124Z"}
+{"log":"2022/07/05 17:27:31 [notice] 43#43: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.785976184Z"}
+{"log":"2022/07/05 17:27:31 [notice] 34#34: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.785985534Z"}
+{"log":"2022/07/05 17:27:31 [notice] 43#43: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.785991021Z"}
+{"log":"2022/07/05 17:27:31 [notice] 43#43: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.786072678Z"}
+{"log":"2022/07/05 17:27:31 [notice] 41#41: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.786081931Z"}
+{"log":"2022/07/05 17:27:31 [notice] 41#41: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.786171004Z"}
+{"log":"2022/07/05 17:27:31 [notice] 41#41: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.786180041Z"}
+{"log":"2022/07/05 17:27:31 [notice] 46#46: gracefully shutting down\n","stream":"stderr","time":"2022-07-05T17:27:31.786849618Z"}
+{"log":"2022/07/05 17:27:31 [notice] 46#46: exiting\n","stream":"stderr","time":"2022-07-05T17:27:31.78699349Z"}
+{"log":"2022/07/05 17:27:31 [notice] 46#46: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.787007725Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: signal 17 (SIGCHLD) received from 40\n","stream":"stderr","time":"2022-07-05T17:27:31.792423349Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 40 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.792444142Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 39 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.792448464Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-05T17:27:31.792853331Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: signal 17 (SIGCHLD) received from 39\n","stream":"stderr","time":"2022-07-05T17:27:31.792868194Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 33 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.792901385Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 36 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.792906033Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 37 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.792952488Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 38 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.792959076Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: signal 17 (SIGCHLD) received from 44\n","stream":"stderr","time":"2022-07-05T17:27:31.793303196Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 44 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.79331285Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-05T17:27:31.793352688Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-05T17:27:31.793446618Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: signal 17 (SIGCHLD) received from 42\n","stream":"stderr","time":"2022-07-05T17:27:31.79345632Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 32 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.793525097Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 42 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.79354997Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-05T17:27:31.793665833Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: signal 17 (SIGCHLD) received from 35\n","stream":"stderr","time":"2022-07-05T17:27:31.794379787Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 35 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.794404941Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 34 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.794411194Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-05T17:27:31.794543027Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: signal 17 (SIGCHLD) received from 34\n","stream":"stderr","time":"2022-07-05T17:27:31.794555131Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: signal 17 (SIGCHLD) received from 31\n","stream":"stderr","time":"2022-07-05T17:27:31.796654336Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 31 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.796685429Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 43 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.796692869Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-05T17:27:31.796698899Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: signal 17 (SIGCHLD) received from 43\n","stream":"stderr","time":"2022-07-05T17:27:31.796704589Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 45 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.796710306Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 41 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.796724102Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-05T17:27:31.796729789Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: signal 17 (SIGCHLD) received from 41\n","stream":"stderr","time":"2022-07-05T17:27:31.796736776Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: signal 17 (SIGCHLD) received from 46\n","stream":"stderr","time":"2022-07-05T17:27:31.796897943Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: worker process 46 exited with code 0\n","stream":"stderr","time":"2022-07-05T17:27:31.796924143Z"}
+{"log":"2022/07/05 17:27:31 [notice] 1#1: exit\n","stream":"stderr","time":"2022-07-05T17:27:31.797136969Z"}
+{"log":"/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration\n","stream":"stdout","time":"2022-07-05T17:29:27.356495697Z"}
+{"log":"/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/\n","stream":"stdout","time":"2022-07-05T17:29:27.356539534Z"}
+{"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh\n","stream":"stdout","time":"2022-07-05T17:29:27.359725623Z"}
+{"log":"10-listen-on-ipv6-by-default.sh: info: IPv6 listen already enabled\n","stream":"stdout","time":"2022-07-05T17:29:27.366524468Z"}
+{"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh\n","stream":"stdout","time":"2022-07-05T17:29:27.366913132Z"}
+{"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh\n","stream":"stdout","time":"2022-07-05T17:29:27.37328057Z"}
+{"log":"/docker-entrypoint.sh: Configuration complete; ready for start up\n","stream":"stdout","time":"2022-07-05T17:29:27.376860026Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: using the \"epoll\" event method\n","stream":"stderr","time":"2022-07-05T17:29:27.387190285Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: nginx/1.23.0\n","stream":"stderr","time":"2022-07-05T17:29:27.387208187Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) \n","stream":"stderr","time":"2022-07-05T17:29:27.387212772Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: OS: Linux 3.10.0-1160.el7.x86_64\n","stream":"stderr","time":"2022-07-05T17:29:27.387215297Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576\n","stream":"stderr","time":"2022-07-05T17:29:27.387217901Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: start worker processes\n","stream":"stderr","time":"2022-07-05T17:29:27.387220406Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 24\n","stream":"stderr","time":"2022-07-05T17:29:27.387385128Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 25\n","stream":"stderr","time":"2022-07-05T17:29:27.387507241Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 26\n","stream":"stderr","time":"2022-07-05T17:29:27.38766927Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 27\n","stream":"stderr","time":"2022-07-05T17:29:27.387852483Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 28\n","stream":"stderr","time":"2022-07-05T17:29:27.388800028Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 29\n","stream":"stderr","time":"2022-07-05T17:29:27.388815818Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 30\n","stream":"stderr","time":"2022-07-05T17:29:27.388819192Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 31\n","stream":"stderr","time":"2022-07-05T17:29:27.388821416Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 32\n","stream":"stderr","time":"2022-07-05T17:29:27.388823911Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 33\n","stream":"stderr","time":"2022-07-05T17:29:27.38905136Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 34\n","stream":"stderr","time":"2022-07-05T17:29:27.389254357Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 35\n","stream":"stderr","time":"2022-07-05T17:29:27.389529243Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 36\n","stream":"stderr","time":"2022-07-05T17:29:27.390566303Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 37\n","stream":"stderr","time":"2022-07-05T17:29:27.390579337Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 38\n","stream":"stderr","time":"2022-07-05T17:29:27.390582228Z"}
+{"log":"2022/07/05 17:29:27 [notice] 1#1: start worker process 39\n","stream":"stderr","time":"2022-07-05T17:29:27.390584482Z"}
+{"log":"/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration\n","stream":"stdout","time":"2022-07-06T09:20:42.621797321Z"}
+{"log":"/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/\n","stream":"stdout","time":"2022-07-06T09:20:42.630989561Z"}
+{"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh\n","stream":"stdout","time":"2022-07-06T09:20:42.671377719Z"}
+{"log":"10-listen-on-ipv6-by-default.sh: info: IPv6 listen already enabled\n","stream":"stdout","time":"2022-07-06T09:20:42.743092643Z"}
+{"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh\n","stream":"stdout","time":"2022-07-06T09:20:42.743456494Z"}
+{"log":"/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh\n","stream":"stdout","time":"2022-07-06T09:20:42.760016Z"}
+{"log":"/docker-entrypoint.sh: Configuration complete; ready for start up\n","stream":"stdout","time":"2022-07-06T09:20:42.763675892Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: using the \"epoll\" event method\n","stream":"stderr","time":"2022-07-06T09:20:42.942126479Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: nginx/1.23.0\n","stream":"stderr","time":"2022-07-06T09:20:42.942157735Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) \n","stream":"stderr","time":"2022-07-06T09:20:42.942165355Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: OS: Linux 3.10.0-1160.el7.x86_64\n","stream":"stderr","time":"2022-07-06T09:20:42.942171169Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576\n","stream":"stderr","time":"2022-07-06T09:20:42.942177075Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: start worker processes\n","stream":"stderr","time":"2022-07-06T09:20:42.942376859Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 24\n","stream":"stderr","time":"2022-07-06T09:20:42.942603109Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 25\n","stream":"stderr","time":"2022-07-06T09:20:42.942880286Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 26\n","stream":"stderr","time":"2022-07-06T09:20:42.943177023Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 27\n","stream":"stderr","time":"2022-07-06T09:20:42.943465683Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 28\n","stream":"stderr","time":"2022-07-06T09:20:42.943775436Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 29\n","stream":"stderr","time":"2022-07-06T09:20:42.944104823Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 30\n","stream":"stderr","time":"2022-07-06T09:20:42.94444174Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 31\n","stream":"stderr","time":"2022-07-06T09:20:42.944786871Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 32\n","stream":"stderr","time":"2022-07-06T09:20:42.945142594Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 33\n","stream":"stderr","time":"2022-07-06T09:20:42.945523908Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 34\n","stream":"stderr","time":"2022-07-06T09:20:42.945921218Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 35\n","stream":"stderr","time":"2022-07-06T09:20:42.946303805Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 36\n","stream":"stderr","time":"2022-07-06T09:20:42.946722425Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 37\n","stream":"stderr","time":"2022-07-06T09:20:42.947126812Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 38\n","stream":"stderr","time":"2022-07-06T09:20:42.947589949Z"}
+{"log":"2022/07/06 09:20:42 [notice] 1#1: start worker process 39\n","stream":"stderr","time":"2022-07-06T09:20:42.94806926Z"}
+{"log":"192.168.1.21 - - [06/Jul/2022:09:20:54 +0000] \"GET / HTTP/1.1\" 200 615 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36\" \"-\"\n","stream":"stdout","time":"2022-07-06T09:20:54.337362109Z"}
+{"log":"192.168.1.21 - - [06/Jul/2022:09:20:54 +0000] \"GET /favicon.ico HTTP/1.1\" 404 555 \"http://192.168.1.233:8080/\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36\" \"-\"\n","stream":"stdout","time":"2022-07-06T09:20:54.414529771Z"}
+{"log":"2022/07/06 09:20:54 [error] 25#25: *1 open() \"/usr/share/nginx/html/favicon.ico\" failed (2: No such file or directory), client: 192.168.1.21, server: localhost, request: \"GET /favicon.ico HTTP/1.1\", host: \"192.168.1.233:8080\", referrer: \"http://192.168.1.233:8080/\"\n","stream":"stderr","time":"2022-07-06T09:20:54.414547748Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: signal 3 (SIGQUIT) received, shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.354390973Z"}
+{"log":"2022/07/06 09:21:17 [notice] 25#25: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355691939Z"}
+{"log":"2022/07/06 09:21:17 [notice] 28#28: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355729569Z"}
+{"log":"2022/07/06 09:21:17 [notice] 30#30: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355749506Z"}
+{"log":"2022/07/06 09:21:17 [notice] 24#24: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355753507Z"}
+{"log":"2022/07/06 09:21:17 [notice] 26#26: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355756232Z"}
+{"log":"2022/07/06 09:21:17 [notice] 28#28: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355759072Z"}
+{"log":"2022/07/06 09:21:17 [notice] 30#30: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355761634Z"}
+{"log":"2022/07/06 09:21:17 [notice] 26#26: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355764229Z"}
+{"log":"2022/07/06 09:21:17 [notice] 24#24: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355767152Z"}
+{"log":"2022/07/06 09:21:17 [notice] 39#39: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355769914Z"}
+{"log":"2022/07/06 09:21:17 [notice] 27#27: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355772554Z"}
+{"log":"2022/07/06 09:21:17 [notice] 28#28: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355775181Z"}
+{"log":"2022/07/06 09:21:17 [notice] 30#30: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355777776Z"}
+{"log":"2022/07/06 09:21:17 [notice] 26#26: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355780457Z"}
+{"log":"2022/07/06 09:21:17 [notice] 39#39: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355783031Z"}
+{"log":"2022/07/06 09:21:17 [notice] 27#27: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355785594Z"}
+{"log":"2022/07/06 09:21:17 [notice] 24#24: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355788269Z"}
+{"log":"2022/07/06 09:21:17 [notice] 33#33: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355790997Z"}
+{"log":"2022/07/06 09:21:17 [notice] 34#34: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355793597Z"}
+{"log":"2022/07/06 09:21:17 [notice] 39#39: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355796192Z"}
+{"log":"2022/07/06 09:21:17 [notice] 33#33: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355798749Z"}
+{"log":"2022/07/06 09:21:17 [notice] 27#27: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355801406Z"}
+{"log":"2022/07/06 09:21:17 [notice] 32#32: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355803911Z"}
+{"log":"2022/07/06 09:21:17 [notice] 29#29: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355806502Z"}
+{"log":"2022/07/06 09:21:17 [notice] 33#33: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355809192Z"}
+{"log":"2022/07/06 09:21:17 [notice] 36#36: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355811891Z"}
+{"log":"2022/07/06 09:21:17 [notice] 32#32: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355814477Z"}
+{"log":"2022/07/06 09:21:17 [notice] 29#29: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355817047Z"}
+{"log":"2022/07/06 09:21:17 [notice] 34#34: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355819574Z"}
+{"log":"2022/07/06 09:21:17 [notice] 36#36: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355822201Z"}
+{"log":"2022/07/06 09:21:17 [notice] 32#32: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355824736Z"}
+{"log":"2022/07/06 09:21:17 [notice] 34#34: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355827277Z"}
+{"log":"2022/07/06 09:21:17 [notice] 29#29: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355829912Z"}
+{"log":"2022/07/06 09:21:17 [notice] 36#36: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355832454Z"}
+{"log":"2022/07/06 09:21:17 [notice] 35#35: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355835554Z"}
+{"log":"2022/07/06 09:21:17 [notice] 35#35: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355838291Z"}
+{"log":"2022/07/06 09:21:17 [notice] 35#35: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355843702Z"}
+{"log":"2022/07/06 09:21:17 [notice] 37#37: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355956091Z"}
+{"log":"2022/07/06 09:21:17 [notice] 31#31: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.355978114Z"}
+{"log":"2022/07/06 09:21:17 [notice] 37#37: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355985071Z"}
+{"log":"2022/07/06 09:21:17 [notice] 31#31: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.355990341Z"}
+{"log":"2022/07/06 09:21:17 [notice] 37#37: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.355995661Z"}
+{"log":"2022/07/06 09:21:17 [notice] 31#31: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.356001041Z"}
+{"log":"2022/07/06 09:21:17 [notice] 38#38: gracefully shutting down\n","stream":"stderr","time":"2022-07-06T09:21:17.356326528Z"}
+{"log":"2022/07/06 09:21:17 [notice] 38#38: exiting\n","stream":"stderr","time":"2022-07-06T09:21:17.356412983Z"}
+{"log":"2022/07/06 09:21:17 [notice] 38#38: exit\n","stream":"stderr","time":"2022-07-06T09:21:17.356521935Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: signal 17 (SIGCHLD) received from 34\n","stream":"stderr","time":"2022-07-06T09:21:17.362293119Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 34 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.362310967Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 26 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.362314188Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-06T09:21:17.362422059Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: signal 17 (SIGCHLD) received from 26\n","stream":"stderr","time":"2022-07-06T09:21:17.36243076Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 28 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.362433169Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 24 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.362534199Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 29 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.362557946Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 30 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.362564769Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 27 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.362570333Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 33 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.362575993Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 36 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.362581683Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 39 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.362587236Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-06T09:21:17.362965863Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: signal 17 (SIGCHLD) received from 39\n","stream":"stderr","time":"2022-07-06T09:21:17.36299692Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: signal 17 (SIGCHLD) received from 32\n","stream":"stderr","time":"2022-07-06T09:21:17.363087306Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 32 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.363104773Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-06T09:21:17.36313471Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: signal 17 (SIGCHLD) received from 37\n","stream":"stderr","time":"2022-07-06T09:21:17.365167351Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 31 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.365185651Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 35 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.365191591Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 37 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.365211448Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-06T09:21:17.365322291Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: signal 17 (SIGCHLD) received from 31\n","stream":"stderr","time":"2022-07-06T09:21:17.365340408Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: signal 17 (SIGCHLD) received from 38\n","stream":"stderr","time":"2022-07-06T09:21:17.366217352Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: worker process 38 exited with code 0\n","stream":"stderr","time":"2022-07-06T09:21:17.366235909Z"}
+{"log":"2022/07/06 09:21:17 [notice] 1#1: signal 29 (SIGIO) received\n","stream":"stderr","time":"2022-07-06T09:21:17.366306542Z"}
diff --git a/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/config.v2.json b/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/config.v2.json
new file mode 100644
index 0000000..b28aa08
--- /dev/null
+++ b/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/config.v2.json
@@ -0,0 +1 @@
+{"StreamConfig":{},"State":{"Running":false,"Paused":false,"Restarting":false,"OOMKilled":false,"RemovalInProgress":false,"Dead":false,"Pid":0,"ExitCode":137,"Error":"","StartedAt":"2022-07-06T09:20:42.477658398Z","FinishedAt":"2022-07-06T09:21:27.449539552Z","Health":null},"ID":"49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da","Created":"2022-07-05T17:08:58.650960754Z","Managed":false,"Path":"/docker-entrypoint.sh","Args":["nginx","-g","daemon off;"],"Config":{"Hostname":"49c6b2e842c4","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"ExposedPorts":{"80/tcp":{}},"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","NGINX_VERSION=1.23.0","NJS_VERSION=0.7.5","PKG_RELEASE=1~bullseye"],"Cmd":["nginx","-g","daemon off;"],"Image":"nginx","Volumes":null,"WorkingDir":"","Entrypoint":["/docker-entrypoint.sh"],"OnBuild":null,"Labels":{"maintainer":"NGINX Docker Maintainers \u003cdocker-maint@nginx.com\u003e"},"StopSignal":"SIGQUIT"},"Image":"sha256:55f4b40fe486a5b734b46bb7bf28f52fa31426bf23be068c8e7b19e58d9b8deb","NetworkSettings":{"Bridge":"","SandboxID":"b946b0337d5c27a04f486818f98ef5a23c7e198776c380a261e50cdfc50b1af3","HairpinMode":false,"LinkLocalIPv6Address":"","LinkLocalIPv6PrefixLen":0,"Networks":{"bridge":{"IPAMConfig":null,"Links":null,"Aliases":null,"NetworkID":"d8847f36e01af680c74244f0b44c635f80f7dbd6ec7a6f03ee499cb73d0360ed","EndpointID":"","Gateway":"","IPAddress":"","IPPrefixLen":0,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"","DriverOpts":null,"IPAMOperational":false}},"Service":null,"Ports":null,"SandboxKey":"/var/run/docker/netns/b946b0337d5c","SecondaryIPAddresses":null,"SecondaryIPv6Addresses":null,"IsAnonymousEndpoint":false,"HasSwarmEndpoint":false},"LogPath":"/var/lib/docker/containers/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da-json.log","Name":"/hahan","Driver":"overlay2","OS":"linux","MountLabel":"","ProcessLabel":"","RestartCount":0,"HasBeenStartedBefore":true,"HasBeenManuallyStopped":true,"MountPoints":{},"SecretReferences":null,"ConfigReferences":null,"AppArmorProfile":"","HostnamePath":"/var/lib/docker/containers/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/hostname","HostsPath":"/var/lib/docker/containers/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/hosts","ShmPath":"","ResolvConfPath":"/var/lib/docker/containers/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/resolv.conf","SeccompProfile":"","NoNewPrivileges":false,"LocalLogCacheMeta":{"HaveNotifyEnabled":false}}
diff --git a/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/hostconfig.json b/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/hostconfig.json
new file mode 100644
index 0000000..e51af1a
--- /dev/null
+++ b/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/hostconfig.json
@@ -0,0 +1,100 @@
+{
+ "Binds": null,
+ "ContainerIDFile": "",
+ "LogConfig": {
+ "Type": "json-file",
+ "Config": {}
+ },
+ "NetworkMode": "default",
+ "PortBindings": {
+ "80/tcp": [
+ {
+ "HostIp": "",
+ "HostPort": "8080"
+ }
+ ]
+ },
+ "RestartPolicy": {
+ "Name": "no",
+ "MaximumRetryCount": 0
+ },
+ "AutoRemove": false,
+ "VolumeDriver": "",
+ "VolumesFrom": null,
+ "CapAdd": null,
+ "CapDrop": null,
+ "CgroupnsMode": "host",
+ "Dns": [],
+ "DnsOptions": [],
+ "DnsSearch": [],
+ "ExtraHosts": null,
+ "GroupAdd": null,
+ "IpcMode": "private",
+ "Cgroup": "",
+ "Links": null,
+ "OomScoreAdj": 0,
+ "PidMode": "",
+ "Privileged": false,
+ "PublishAllPorts": false,
+ "ReadonlyRootfs": false,
+ "SecurityOpt": null,
+ "UTSMode": "",
+ "UsernsMode": "",
+ "ShmSize": 67108864,
+ "Runtime": "runc",
+ "ConsoleSize": [
+ 0,
+ 0
+ ],
+ "Isolation": "",
+ "CpuShares": 0,
+ "Memory": 0,
+ "NanoCpus": 0,
+ "CgroupParent": "",
+ "BlkioWeight": 0,
+ "BlkioWeightDevice": [],
+ "BlkioDeviceReadBps": null,
+ "BlkioDeviceWriteBps": null,
+ "BlkioDeviceReadIOps": null,
+ "BlkioDeviceWriteIOps": null,
+ "CpuPeriod": 0,
+ "CpuQuota": 0,
+ "CpuRealtimePeriod": 0,
+ "CpuRealtimeRuntime": 0,
+ "CpusetCpus": "",
+ "CpusetMems": "",
+ "Devices": [],
+ "DeviceCgroupRules": null,
+ "DeviceRequests": null,
+ "KernelMemory": 0,
+ "KernelMemoryTCP": 0,
+ "MemoryReservation": 0,
+ "MemorySwap": 0,
+ "MemorySwappiness": null,
+ "OomKillDisable": false,
+ "PidsLimit": null,
+ "Ulimits": null,
+ "CpuCount": 0,
+ "CpuPercent": 0,
+ "IOMaximumIOps": 0,
+ "IOMaximumBandwidth": 0,
+ "MaskedPaths": [
+ "/proc/asound",
+ "/proc/acpi",
+ "/proc/kcore",
+ "/proc/keys",
+ "/proc/latency_stats",
+ "/proc/timer_list",
+ "/proc/timer_stats",
+ "/proc/sched_debug",
+ "/proc/scsi",
+ "/sys/firmware"
+ ],
+ "ReadonlyPaths": [
+ "/proc/bus",
+ "/proc/fs",
+ "/proc/irq",
+ "/proc/sys",
+ "/proc/sysrq-trigger"
+ ]
+}
\ No newline at end of file
diff --git a/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/hostname b/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/hostname
new file mode 100644
index 0000000..10bc8d6
--- /dev/null
+++ b/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/hostname
@@ -0,0 +1 @@
+49c6b2e842c4
diff --git a/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/hosts b/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/hosts
new file mode 100644
index 0000000..8930fb1
--- /dev/null
+++ b/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/hosts
@@ -0,0 +1,7 @@
+127.0.0.1 localhost
+::1 localhost ip6-localhost ip6-loopback
+fe00::0 ip6-localnet
+ff00::0 ip6-mcastprefix
+ff02::1 ip6-allnodes
+ff02::2 ip6-allrouters
+172.17.0.2 49c6b2e842c4
diff --git a/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/resolv.conf b/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/resolv.conf
new file mode 100644
index 0000000..b55c08e
--- /dev/null
+++ b/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/resolv.conf
@@ -0,0 +1,3 @@
+# Generated by NetworkManager
+nameserver 202.96.209.133
+nameserver 114.114.114.114
diff --git a/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/resolv.conf.hash b/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/resolv.conf.hash
new file mode 100644
index 0000000..c3d57e4
--- /dev/null
+++ b/49c6b2e842c45bff058c346866e55f799e6b3d53d116898c3386f87d2623d9da/resolv.conf.hash
@@ -0,0 +1 @@
+sha256:a5f0b8686d307e34722405f285ba7230bf9c08653699822f0dd54a95d379d5ed
\ No newline at end of file
diff --git "a/Android FUStaKit Java API \345\217\202\350\200\203\346\226\207\346\241\243.md" "b/Android FUStaKit Java API \345\217\202\350\200\203\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..54388ff
--- /dev/null
+++ "b/Android FUStaKit Java API \345\217\202\350\200\203\346\226\207\346\241\243.md"
@@ -0,0 +1,867 @@
+# FUStaSDK鎺ュ彛鏂囨。
+鏈� SDK 闆嗘垚浜� FaceUnity 鐨勮闊抽┍鍔ㄥ舰璞″紩鎿�(Speeach to Animation) 锛岃兘澶熷揩閫熸瀯寤哄苟椹卞姩铏氭嫙褰㈣薄璇磋瘽锛岃惀閫犳洿鍔犵湡瀹炶嚜鐒剁殑浜烘満浜や簰鍦烘櫙銆�
+
+## 鐗堟湰淇℃伅
+鐗堟湰鍙�:2.1
+
+鏇存柊鏃ユ湡:2022-01-21
+
+鏇存柊鍐呭:
+- 浼樺寲CPU鎬ц兘浠ュ強鏌ヨ鏁堢巼
+- 鏂板鍔ㄧ敾鎾斁閫熷害鎺у埗鎺ュ彛
+- 鏇存柊BS绯绘暟57-47
+- 淇闈欓煶甯ч棶棰�
+- 饨�鏂板璁剧疆鏃嬭浆瑙掑害
+- 浼樺寲闃村奖閿娇绠楁硶
+- 澧炲姞璇︾粏鏃ュ織鎺ュ彛
+
+## APIs
+SDK鎺ュ彛鏍规嵁浣滅敤閫昏緫褰掍负浜旂被
+- <a href="#1">閰嶇疆鍒濆鍖栨暟鎹�</a>
+- <a href="#2">鍒濆鍖�</a>
+- <a href="#3">Avatar鍒囨崲</a>
+- <a href="#4">娓叉煋鎺у埗</a>
+- <a href="#5">鍙e瀷鏌ヨ鍜岄┍鍔�</a>
+- <a href="#6">Avatar鍔ㄧ敾鍜岃〃鎯呭垏鎹�</a>
+- <a href="#7">閿�姣�</a>
+- <a href="#8">鍏朵粬</a>
+
+------
+
+
+> ### <a name="1">閰嶇疆鍒濆鍖栨暟鎹�</a>
+
+###### FUSta SDK閰嶇疆鍒濆鍖栨暟鎹�(鍦ㄧ嚎閴存潈鏁版嵁)
+
+
+ FUStaKit.Builder builder = new FUStaKit
+ .Builder(mContext)
+ .setAuth(authpack.A())
+ .setAlignData(bytesAlign)
+ //.setAsrData(bytesAsr)
+ .setFUTtsType(FUTtsType.ALIGNMENT)
+ .setCharacterDecoder(bytesDecoder);
+ mFUStaKit = builder.build();
+
+###### 鎺ュ彛璇存槑
+
+鍒濆鍖朏USta锛屼紶鍏ヤ笂涓嬫枃锛堝繀瑕侊級锛�
+鍔犺浇缃戠粶閴存潈鏁版嵁锛堝繀瑕侊級锛�
+璁剧疆璇煶鑷姩鏍″噯宸ュ叿鍖咃紙Align妯″紡闇�瑕佽缃級锛�
+璁剧疆璇煶璇嗗埆宸ュ叿鍖咃紙ASR鏂瑰紡闇�瑕佽缃紝姝ゅ鏄疉lign妯″紡鏁呮敞閲婅鏂规硶锛夛紝
+璁剧疆tts鏌ヨ鏂瑰紡锛屽繀瑕侊紙ASR鏂瑰紡闇�瑕佽缃細FUTtsType.ASR锛汚lign鏂瑰紡闇�瑕佽缃細FUTtsType.ALIGNMENT锛屾澶勬槸Align妯″紡鏁呰缃负FUTtsType.ALIGNMENT锛�
+璁剧疆鏂囧瓧缂栫爜鍔熻兘鏁版嵁鏂囦欢(ALIGN鏂瑰紡鍜屾枃鏈椂闂存埑闇�瑕佽缃�)銆�
+
+###### 鍙傛暟璇存槑
+
+``` context ```锛氫笂涓嬫枃
+
+``` setAuth(byte[]) ```锛氱綉缁滈壌鏉冩暟鎹�
+
+``` setAlignData(byte[]) ```锛氳闊宠嚜鍔ㄦ牎鍑嗗伐鍏峰寘鏁版嵁
+
+``` setAsrData(byte[]) ```锛氳闊宠瘑鍒伐鍏峰寘鏁版嵁
+
+``` setFUTtsType(TtsTypeEnum type) ```锛歵ts鏌ヨ鏂瑰紡
+
+``` setCharacterDecoder(byte[]) ```锛氭枃瀛楃紪鐮佸姛鑳芥暟鎹�
+
+###### 澶囨敞锛�
+
+App 鍚姩鍚庡彧闇�瑕� SDK閰嶇疆鍒濆鍖栨暟鎹� 涓�娆″嵆鍙紝鍏朵腑 authpack.A() 閴存潈鏁版嵁澹版槑鍦� authpack.java 涓�傚繀椤婚厤缃ソ鏈夋晥鐨勮瘉涔︼紝SDK 鎵嶈兘姝e父宸ヤ綔銆�
+鍦ㄧ嚎閴存潈鍙渶瑕佽缃產uthpack.A() 閴存潈鏁版嵁鍗冲彲銆侳USta SDK 閰嶇疆鍒濆鍖栨暟鎹瑙�"Android FUStaKit 闆嗘垚鏂囨。"銆�
+
+
+###### FUSta SDK閰嶇疆鍒濆鍖栨暟鎹�(绂荤嚎閴存潈鏁版嵁)
+
+
+ FUStaKit.Builder builder = new FUStaKit
+ .Builder(mContext)
+ .setAuth(authpack.A())
+ .setAlignData(bytesAlign)
+ //.setAsrData(bytesAsr)
+ .setFUTtsType(FUTtsType.ALIGNMENT)
+ .setCharacterDecoder(bytesDecoder);
+ .setOffLineData(offLineAuth);
+ mFUStaKit = builder.build();
+
+###### 鎺ュ彛璇存槑
+
+鍒濆鍖朏USta锛屼紶鍏ヤ笂涓嬫枃锛堝繀瑕侊級锛�
+鍔犺浇缃戠粶閴存潈鏁版嵁锛堝繀瑕侊級锛�
+璁剧疆璇煶鑷姩鏍″噯宸ュ叿鍖咃紙Align妯″紡闇�瑕佽缃級锛�
+璁剧疆璇煶璇嗗埆宸ュ叿鍖咃紙ASR鏂瑰紡闇�瑕佽缃紝姝ゅ鏄疉lign妯″紡鏁呮敞閲婅鏂规硶锛夛紝
+璁剧疆tts鏌ヨ鏂瑰紡锛屽繀瑕侊紙ASR鏂瑰紡闇�瑕佽缃細FUTtsType.ASR锛汚lign鏂瑰紡闇�瑕佽缃細FUTtsType.ALIGNMENT锛屾澶勬槸Align妯″紡鏁呰缃负FUTtsType.ALIGNMENT锛�
+璁剧疆鏂囧瓧缂栫爜鍔熻兘鏁版嵁鏂囦欢(ALIGN鏂瑰紡鍜屾枃鏈椂闂存埑闇�瑕佽缃�)銆�
+
+###### 鍙傛暟璇存槑
+
+``` context ```锛氫笂涓嬫枃
+
+``` setAuth(byte[]) ```锛氱綉缁滈壌鏉冩暟鎹�
+
+``` setAlignData(byte[]) ```锛氳闊宠嚜鍔ㄦ牎鍑嗗伐鍏峰寘鏁版嵁
+
+``` setAsrData(byte[]) ```锛氳闊宠瘑鍒伐鍏峰寘鏁版嵁
+
+``` setFUTtsType(TtsTypeEnum type) ```锛歵ts鏌ヨ鏂瑰紡
+
+``` setCharacterDecoder(byte[]) ```锛氭枃瀛楃紪鐮佸姛鑳芥暟鎹�
+
+``` setOffLineData(byte[]) ```锛氱绾块壌鏉冩暟鎹�
+
+###### 澶囨敞锛�
+
+App 鍚姩鍚庡彧闇�瑕� SDK閰嶇疆鍒濆鍖栨暟鎹� 涓�娆″嵆鍙紝鍏朵腑 authpack.A() 閴存潈鏁版嵁澹版槑鍦� authpack.java 涓�傚繀椤婚厤缃ソ鏈夋晥鐨勮瘉涔︼紝SDK 鎵嶈兘姝e父宸ヤ綔銆�
+绂荤嚎閴存潈闄や簡璁剧疆authpack.A() 閴存潈鏁版嵁锛岃繕闇�瑕佽缃绾块壌鏉冩暟鎹寘璺緞锛歴etOffLineAuth(byte[])銆�
+娉ㄦ剰锛屾湁key.bundle灏变娇鐢╧ey.bundle锛岃繖鏍蜂細璧扮绾匡紱浣跨敤鏈壌鏉冪殑bundle锛屼細鑱旂綉閴存潈銆�
+鏍规嵁搴旂敤闇�姹傦紝閴存潈鏁版嵁涔熷彲浠ヨ繍琛屾椂鎻愪緵锛堝缃戠粶涓嬭浇锛夛紝涓嶈繃瑕佹敞鎰忚瘉涔︽硠闇查闄╋紝闃叉璇佷功琚互鐢ㄣ�侳USta SDK 閰嶇疆鍒濆鍖栨暟鎹瑙�"Android FUStaKit 闆嗘垚鏂囨。"銆�
+
+---
+
+
+> ### <a name="2">鍒濆鍖�</a>
+
+###### FUSta SDK鍒濆鍖栵紙鍦ㄧ嚎閴存潈锛�
+
+```
+void init(FUAuthType.ONLINE, StaKitInitCallback listener);
+```
+
+###### 鎺ュ彛璇存槑
+
+璋冪敤FUSta SDK鍒濆鍖栨柟娉曪紝蹇呴』鏀惧湪 FUStaKit SDK閰嶇疆鍒濆鍖栨暟鎹箣鍚�
+
+###### 鍙傛暟璇存槑
+
+``` FUAuthType.ONLINE ```锛氬湪绾块壌鏉�
+``` FUStaKit.StaKitInitCallback ```锛歋DK鍒濆鍖栫姸鎬佺殑鍥炶皟锛屽弬鏁颁綅绌哄嵆娌℃湁鍒濆鍖栧畬鎴愬洖璋冪殑鏂瑰紡锛屽鏋滆皟鐢ㄨ鏂规硶涔嬪悗绱ф帴鐫�璋冪敤鍙e瀷椹卞姩鏂规硶锛屽彛鍨嬮┍鍔ㄤ换鍔′細绛夊緟鍒濆鍖栦换鍔″畬鎴愭墠寮�濮嬨�傚紑鍙戣�呭彲鏍规嵁鍒濆鍖栧洖璋冭繘琛岀浉鍏抽�昏緫澶勭悊銆�
+
+###### 澶囨敞锛�
+
+init 鍒濆鍖栨柟娉曪紝鍔″繀鍦ㄥ悗缁搷浣滃墠璋冪敤锛屽惁鍒欐棤娉曢┍鍔ㄥ彛鍨嬨��
+FUSta SDK 鍒濆鍖栬瑙�"Android FUStaKit 闆嗘垚鏂囨。鈥溿��
+
+###### FUSta SDK鍒濆鍖栵紙绂荤嚎閴存潈锛�
+
+```
+void init(FUAuthType.OFFLINE_BUNDLE, StaKitInitCallback listener);
+```
+
+###### 鎺ュ彛璇存槑
+
+璋冪敤FUSta SDK鍒濆鍖栨柟娉曪紝蹇呴』鏀惧湪 FUStaKit SDK閰嶇疆鍒濆鍖栨暟鎹箣鍚�
+
+###### 鍙傛暟璇存槑
+
+``` FUAuthType.OFFLINE_BUNDLE ```锛氱绾块壌鏉�
+``` FUStaKit.StaKitInitCallback ```锛歋DK鍒濆鍖栫姸鎬佺殑鍥炶皟锛屽弬鏁颁綅绌哄嵆娌℃湁鍒濆鍖栧畬鎴愬洖璋冪殑鏂瑰紡锛屽鏋滆皟鐢ㄨ鏂规硶涔嬪悗绱ф帴鐫�璋冪敤鍙e瀷椹卞姩鏂规硶锛屽彛鍨嬮┍鍔ㄤ换鍔′細绛夊緟鍒濆鍖栦换鍔″畬鎴愭墠寮�濮嬨�傚紑鍙戣�呭彲鏍规嵁鍒濆鍖栧洖璋冭繘琛岀浉鍏抽�昏緫澶勭悊銆�
+
+###### 澶囨敞锛�
+
+init 鍒濆鍖栨柟娉曪紝鍔″繀鍦ㄥ悗缁搷浣滃墠璋冪敤锛屽惁鍒欐棤娉曢┍鍔ㄥ彛鍨嬨��
+FUSta SDK 鍒濆鍖栬瑙�"Android FUStaKit 闆嗘垚鏂囨。鈥溿��
+
+---
+
+
+> ### <a name="3">Avatar鍒囨崲</a>
+
+###### FUSta SDK璁剧疆Avatar
+
+```
+void setAvatar(FUAvatar avatar, FUAvatarType avatarType);
+鎴�
+void setAvatar(FUAvatar avatar, FUAvatarType avatarType, OnAvatarStateListener listener);
+```
+
+###### 鎺ュ彛璇存槑
+
+鍒囨崲Avatar鏂规硶锛岃缃悗鍦ㄦ覆鏌撴椂浼氬垏鎹㈠搴擜vatar銆�
+
+
+###### 鍙傛暟璇存槑
+
+``` avatar ```锛欶UAvatar瀹炰緥
+
+``` avatarType ```锛欰vatar绫诲瀷鐨勬灇涓撅紝鐢ㄦ潵琛ㄧずAvatar绫诲瀷锛岀敤鏉ュ尯鍒唴缃〃鎯呮暟鎹簮锛岄粯璁わ細`FUAvatarType.CARTOON`
+
+``` listener ```锛欰vatar鎵ц鐘舵�佹帴鍙o紝瀹炵幇鎺ュ彛锛孉vatar鍔犺浇瀹屾垚鍥炶皟onAvatarComplete()
+
+###### 澶囨敞锛�
+
+###### FUSta SDK璁剧疆Avatar浣嶇疆
+```
+void setPosition(double positionX, double positionY, double positionZ);
+```
+###### 鎺ュ彛璇存槑
+
+璁剧疆Avatar鍦ㄥ潗鏍囩郴鐨勪綅缃��
+
+###### 鍙傛暟璇存槑
+
+``` positionX ```锛歑杞村潗鏍� 鑼冨洿`-200, 200`
+
+``` positionY ```锛歒杞村潗鏍� 鑼冨洿`-600, 800`
+
+``` positionZ ```锛歓杞村潗鏍� 鑼冨洿`-3000, 600`
+
+###### 澶囨敞锛�
+
+###### FUSta SDK璁剧疆Avatar鑳屾櫙
+```
+void setBackground(String background);
+```
+###### 鎺ュ彛璇存槑
+
+璁剧疆Avatar鑳屾櫙銆�
+
+###### 鍙傛暟璇存槑
+
+``` background ```锛氳儗鏅亾鍏疯矾寰勶紝background涓虹┖鍒欒儗鏅�忔槑
+
+###### 澶囨敞锛�
+
+###### FUSta SDK璁剧疆Avatar鍏夌収
+```
+void setLight(String light);
+```
+###### 鎺ュ彛璇存槑
+
+璁剧疆Avatar鍏夌収銆�
+
+###### 鍙傛暟璇存槑
+
+``` light ```锛氱伅鍏夐亾鍏疯矾寰�
+
+###### 澶囨敞锛�
+
+###### FUSta SDK璁剧疆Avatar鐩告満浣�
+```
+void setCamera(String camera);
+```
+###### 鎺ュ彛璇存槑
+
+璁剧疆Avatar鐩告満浣嶃��
+
+###### 鍙傛暟璇存槑
+
+``` camera ```锛氱浉鏈洪亾鍏疯矾寰�
+
+###### 澶囨敞锛�
+
+###### FUSta SDK寮�鍚槾褰�
+```
+void enableShadow(Boolean enableShadow);
+```
+###### 鎺ュ彛璇存槑
+
+璁剧疆鏄惁寮�鍚槾褰便��
+
+###### 鍙傛暟璇存槑
+
+``` enableShadow ```锛氭槸鍚﹀紑鍚槾褰�
+
+###### 澶囨敞锛�
+
+---
+
+> ### <a name="4">娓叉煋鎺у埗</a>
+
+###### FUSta SDK寮�濮嬫覆鏌�
+```
+void requestRender(GLTextureView glTextureView);
+```
+###### 鎺ュ彛璇存槑
+
+寮�濮嬫覆鏌撱��
+
+###### 鍙傛暟璇存槑
+
+``` glTextureView ```锛欸LTextureView锛孲DK鎻愪緵鐨勬覆鏌揤iew
+
+###### 澶囨敞锛�
+
+###### FUSta SDK娓叉煋鐘舵�佸悓姝�
+```
+void onResume();
+void onPause();
+void onDestroy();
+```
+###### 鎺ュ彛璇存槑
+
+onResume() 瀵瑰簲Activity onResume(),
+onPause() 瀵瑰簲Activity onPause(),
+onDestroy() 瀵瑰簲Activity onDestroy()銆�
+
+###### 鍙傛暟璇存槑
+
+###### 澶囨敞锛�
+
+onResume()涓巓nPause()鎴愬鍑虹幇锛屽湪Activity鐨刼nPause()璋冪敤鏃跺仠姝㈠悗鍙版覆鏌撳噺灏戞秷鑰楋紝骞朵笖鍦ˋctivity鐨刼nResume()璋冪敤鏃堕噸鏂板姞杞姐��
+
+onResume()涓巓nPause()鍙笉鐢ㄨ皟鐢紝鍦ˋctivity鐨刼nPause()璋冪敤鏃跺悗鍙颁細缁х画娓叉煋锛�
+
+onDestroy()蹇呴』璋冪敤銆�
+
+###### FUSta SDK璁剧疆娓叉煋鍒嗚鲸鐜�
+```
+void setCustomRenderResolution(int renderWidth, int renderHeight);
+```
+###### 鎺ュ彛璇存槑
+
+璁剧疆娓叉煋鍒嗚鲸鐜囧昂瀵搞��
+
+###### 鍙傛暟璇存槑
+
+``` renderWidth ```锛氱汗鐞嗗搴�
+
+``` renderHeight ```锛氱汗鐞嗗搴�
+
+###### 澶囨敞锛�
+
+###### FUSta SDK璁剧疆娓叉煋甯х巼
+```
+void setRenderFPS(int renderFPS);
+```
+###### 鎺ュ彛璇存槑
+
+璁剧疆娓叉煋甯х巼锛岄粯璁�30甯�/s銆�
+
+###### 鍙傛暟璇存槑
+
+``` renderFPS ```锛氭覆鏌撳抚鐜�
+
+###### 澶囨敞锛�
+
+濡傛灉浣庣璁惧鏈�澶у抚鐜囧皬浜庤缃殑甯х巼锛屽疄闄呭抚鐜囦负璇ヨ澶囩殑鏈�澶у抚鐜囥��
+
+###### FUSta SDK璁剧疆鎶楅敮榻�
+```
+void setMultiSamples(int samples);
+```
+###### 鎺ュ彛璇存槑
+
+3D鎶楅敮榻块厤缃�
+
+###### 鍙傛暟璇存槑
+
+``` samples ```锛氭姉閿娇绾у埆锛岄粯璁�4銆�
+
+###### 澶囨敞锛�
+
+###### FUSta SDK璁剧疆闃村奖鎶楅敮榻�
+```
+void setShadowPCFLevel(int level);
+```
+###### 鎺ュ彛璇存槑
+
+璁剧疆闃村奖鎶楅敮榻跨骇鍒�
+
+###### 鍙傛暟璇存槑
+
+``` level ```锛氭姉閿娇绾у埆锛岄粯璁�2銆�
+
+###### 澶囨敞锛�
+
+###### FUSta SDK璁剧疆娓叉煋淇℃伅鍥炶皟鎺ュ彛
+```
+void setEnableDebug(boolean enableDebug)
+void setStaRenderDebugListener(OnRenderDebugListener renderDebugListener);
+```
+###### 鎺ュ彛璇存槑
+
+璁剧疆娓叉煋debug鏁版嵁鐨勫洖璋�
+
+###### 鍙傛暟璇存槑
+
+``` enableDebug ```锛氳皟璇曞紑鍏充负true锛岀浉鍏砫ebug鏁版嵁鎵嶄細杩涜缁熻銆�
+``` renderDebugListener ```锛氭覆鏌揹ebug鏁版嵁鎺ュ彛锛宱nBenchmarkFPSChanged(int width, int height, double fps, double renderTime)銆�
+
+###### 澶囨敞锛�
+
+###### FUSta SDK鏃ュ織淇濆瓨鍒版湰鍦�
+```
+void setLogOutputDir(String dir);
+void enableLogOutput(boolean enableDebug)
+```
+###### 鎺ュ彛璇存槑
+
+SDK鏃ュ織淇濆瓨鍒版湰鍦�
+
+###### 鍙傛暟璇存槑
+
+``` dir ```锛氳缃繚瀛樺埌鏈湴鐨勬寚瀹氱洰褰曘��
+``` enableDebug ```锛氭槸鍚︿繚瀛樻棩蹇椾俊鎭埌鎸囧畾鐨勭洰褰曘��
+
+###### 澶囨敞锛�
+
+---
+
+> ### <a name="5">鍙e瀷鏌ヨ鍜岄┍鍔�</a>
+
+###### FUSta SDK鍒濆鍖栨挱鏀惧櫒
+
+```
+void initStaPlayer(FUPlayerConfig playerConfig);
+```
+
+###### 鎺ュ彛璇存槑
+
+鍒濆鍖栨挱鏀惧櫒
+
+###### 鍙傛暟璇存槑
+
+``` playerConfig ```锛氭挱鏀惧櫒鐩稿叧閰嶇疆锛屼富瑕佹槸閲囨牱鐜囥�佸0閬撳拰浣嶆繁锛孲DK鏍规嵁鎾斁鍣ㄧ殑閰嶇疆鍐呴儴浼氬垵濮嬪寲瀵瑰簲鎾斁鍣ㄣ��
+
+###### 澶囨敞锛�
+
+璇ユ挱鏀惧櫒鐢ㄤ簬鍐呴儴鎾斁锛屽閲囩敤澶栭儴鎾斁鍣ㄦ挱鏀惧彲涓嶈缃��
+
+###### FUSta SDK鍙e瀷椹卞姩骞朵笖鎾斁闊抽
+
+```
+void staProcess(FUStaParams staParams);
+```
+###### 鎺ュ彛璇存槑
+
+FUSta SDK鏌ヨ鍙e瀷绯绘暟锛屾挱鏀鹃煶棰戝苟椹卞姩瀵瑰簲鍙e瀷銆�
+
+浣跨敤鍦烘櫙锛�
+ 1銆佹祦寮忛煶棰戯紝鏈夋椂闂存埑锛屽彧鏀寔pcm
+ 2銆佹祦寮忛煶棰戯紝鏃犳椂闂存埑锛屽彧鏀寔pcm
+ 3銆佹祦寮忛煶棰戯紝鏃犳椂闂存埑锛屾湁Align鏂囨湰锛屽彧鏀寔pcm
+ 4銆侀潪娴佸紡闊抽锛屾湁鏃堕棿鎴筹紝鏀寔pcm涓巜av
+ 5銆侀潪娴佸紡闊抽锛屾棤鏃堕棿鎴筹紝鏀寔pcm涓巜av
+ 6銆侀潪娴佸紡闊抽锛屾棤鏃堕棿鎴筹紝鏈堿lign鏂囨湰锛屾敮鎸乸cm涓巜av
+
+###### 鍙傛暟璇存槑
+
+``` params ```锛欶UStaParams涓洪厤缃被锛屽弬鏁板熀鏈缃細 璁剧疆STA鎿嶄綔涓洪潪娴佸紡銆佽缃煶棰戞暟鎹�佽缃煶棰戞暟鎹被鍨嬨�佽缃煶棰戞暟鎹搴旀椂闂存埑绛夛紝鐩墠鏀寔 pcm 涓� wav
+
+###### 澶囨敞锛�
+
+鏈夋椂闂存埑锛屾煡璇㈠彛鍨嬬郴鏁版牴鎹椂闂存埑鏌ヨ锛岄�熷害浼氭洿蹇��
+鏃犳椂闂存埑锛屾煡璇㈠彛鍨嬬郴鏁版牴鎹煶棰戞暟鎹煡璇紝鏍规嵁鏈哄瀷閰嶇疆涓嶅悓鑰楁椂涔熸湁宸埆锛屾煡璇㈤�熷害绋嶈�楁椂銆備竴鑸棤鏃堕棿鎴虫煡璇㈠彛鍨嬬郴鏁版柟寮忔湁ASR鏂瑰紡鍜孉LIGN鏂瑰紡锛孉LIGN鏂瑰紡杈冨揩锛孉SR鏂瑰紡杈冩參銆�
+FUStaParams鍙傛暟璇︽儏涓庤鍙e瀷椹卞姩妯″紡璋冪敤瑙乣``Android FUStaKit 闆嗘垚鏂囨。```
+
+###### FUSta SDK娴佸紡鏌ヨ鐘舵�佸悓姝�
+
+```
+void notifyStaProcessStart();
+void notifyStaProcessFinish();
+```
+###### 鎺ュ彛璇存槑
+
+娴佸紡鍙e瀷椹卞姩妯″紡涓嬶紝闇�瑕佺粰SDK鍚屾鏌ヨ鐘舵�併��
+notifyStaProcessStart()瀵瑰簲浜庢祦寮忔煡璇㈠紑濮嬭皟鐢紱notifyStaProcessFinish()瀵瑰簲浜庢祦寮忔煡璇㈢粨鏉熻皟鐢ㄣ��
+
+###### 鍙傛暟璇存槑
+
+###### 澶囨敞锛�
+
+娴佸紡鏌ヨ蹇呴』瑕佺粰SDK璁剧疆鍚屾鐘舵�併�傝鎯呰```Android FUStaKit 闆嗘垚鏂囨。```
+
+###### FUSta SDK璁剧疆鍐呴儴鎾斁鍣ㄧ姸鎬佹帴鍙�
+
+```
+void setStaPlayerListener(OnStaPlayerListener staPlayerListener);
+```
+###### 鎺ュ彛璇存槑
+
+SDK閲囩敤鍐呴儴鎾斁鍣ㄦ挱鏀撅紝鎾斁鍣ㄧ姸鎬佹帴鍙c��
+
+###### 鍙傛暟璇存槑
+
+```OnStaPlayerListener```锛氬疄鐜拌鎺ュ彛锛岀浉鍏虫柟娉曞畾涔夛細
+
+```onPrepared()```锛氭挱鏀惧紑濮�
+
+```onCompleted()```锛氭挱鏀剧粨鏉�
+
+```onCancel()```锛氭挱鏀惧彇娑�
+
+```onError(String message)```锛氭挱鏀惧嚭閿�
+
+###### 澶囨敞锛�
+
+###### FUSta SDK鍙e瀷椹卞姩锛堝閮ㄦ挱鏀惧満鏅級
+
+```
+void staProcessNoPlayer(FUStaParams staParams);
+```
+###### 鎺ュ彛璇存槑
+
+FUSta SDK鏌ヨ鍙e瀷绯绘暟锛屽閮ㄦ挱鏀惧櫒鎾斁闊抽锛岄渶瑕佷袱鑰呴厤鍚堥┍鍔ㄥ搴斿彛鍨嬨��
+
+浣跨敤鍦烘櫙锛�
+ 1銆佹祦寮忛煶棰戯紝鏈夋椂闂存埑锛屽彧鏀寔pcm
+ 2銆佹祦寮忛煶棰戯紝鏃犳椂闂存埑锛屽彧鏀寔pcm
+ 3銆佹祦寮忛煶棰戯紝鏃犳椂闂存埑锛屾湁Align鏂囨湰锛屽彧鏀寔pcm
+ 4銆侀潪娴佸紡闊抽锛屾湁鏃堕棿鎴筹紝鏀寔pcm涓巜av
+ 5銆侀潪娴佸紡闊抽锛屾棤鏃堕棿鎴筹紝鏀寔pcm涓巜av
+ 6銆侀潪娴佸紡闊抽锛屾棤鏃堕棿鎴筹紝鏈堿lign鏂囨湰锛屾敮鎸乸cm涓巜av
+
+###### 鍙傛暟璇存槑
+
+``` params ```锛欶UStaParams涓洪厤缃被锛屽弬鏁板熀鏈缃細 璁剧疆STA鎿嶄綔涓洪潪娴佸紡銆佽缃煶棰戞暟鎹�佽缃煶棰戞暟鎹被鍨嬨�佽缃煶棰戞暟鎹搴旀椂闂存埑绛夛紝鐩墠鏀寔 pcm 涓� wav
+
+###### 澶囨敞锛�
+
+鏈夋椂闂存埑锛屾煡璇㈠彛鍨嬬郴鏁版牴鎹椂闂存埑鏌ヨ锛岄�熷害浼氭洿蹇��
+鏃犳椂闂存埑锛屾煡璇㈠彛鍨嬬郴鏁版牴鎹煶棰戞暟鎹煡璇紝鏍规嵁鏈哄瀷閰嶇疆涓嶅悓鑰楁椂涔熸湁宸埆锛屾煡璇㈤�熷害绋嶈�楁椂銆備竴鑸棤鏃堕棿鎴虫煡璇㈠彛鍨嬬郴鏁版柟寮忔湁ASR鏂瑰紡鍜孉LIGN鏂瑰紡锛孉LIGN鏂瑰紡杈冨揩锛孉SR鏂瑰紡杈冩參銆�
+FUStaParams鍙傛暟璇︽儏涓庤鍙e瀷椹卞姩妯″紡璋冪敤瑙乣``Android FUStaKit 闆嗘垚鏂囨。```
+
+###### FUSta SDK澶栭儴鎾斁鍦烘櫙鐘舵�佸悓姝�
+
+```
+void onExternalPlayerStart();
+void onExternalPlayerStop();
+```
+###### 鎺ュ彛璇存槑
+
+SDK鍐呴儴鍙e瀷绯绘暟鏌ヨ锛屽閮ㄦ挱鏀惧櫒鎾斁锛屼袱鑰呴厤鍚堥┍鍔ㄥ彛鍨嬶紝闇�瑕佺粰SDK鍚屾鎾斁鍣ㄧ姸鎬侊紝璁剧疆鍙e瀷椹卞姩鐨勫紑鍏炽��
+onExternalPlayerStart()瀵瑰簲浜庡閮ㄦ挱鏀惧櫒鎾斁寮�濮嬶紱onExternalPlayerStop()瀵瑰簲浜庡閮ㄦ挱鏀惧櫒鎾斁鏆傚仠鎴栫粨鏉熴��
+
+###### 鍙傛暟璇存槑
+
+###### 澶囨敞锛�
+
+澶栭儴鎾斁鍦烘櫙蹇呴』瑕佺粰SDK璁剧疆鍚屾鐘舵�併�傝鎯呰```Android FUStaKit 闆嗘垚鏂囨。```
+
+###### FUSta SDK璁剧疆澶栭儴鎾斁鍣ㄦ帴鍙�
+
+```
+void setExternalPlayerListener(OnExternalPlayerListener externalPlayerListener);
+```
+###### 鎺ュ彛璇存槑
+
+SDK鍐呴儴鍙e瀷绯绘暟鏌ヨ锛屽閮ㄦ挱鏀惧櫒鎾斁锛屼袱鑰呴厤鍚堥┍鍔ㄥ彛鍨嬶紝闇�瑕佺粰SDK鍚屾鎾斁鍣ㄨ繘搴︼紝sdk鎷垮埌鎾斁杩涘害椹卞姩瀵瑰簲鐨勫彛鍨嬨��
+
+###### 鍙傛暟璇存槑
+
+```OnExternalPlayerListener```锛氬疄鐜拌鎺ュ彛锛岀浉鍏虫柟娉曞畾涔夛細
+
+```updateCurrentPosition()```锛氳幏鍙栧閮ㄦ挱鏀惧櫒闊抽鎾斁杩涘害
+
+###### 澶囨敞锛�
+
+###### FUSta SDK璁剧疆闊抽鏁版嵁鏌ヨ鐘舵�佺殑鎺ュ彛
+
+```
+void setStaProcessListener(OnStaProcessListener onStaProcessListener);
+```
+###### 鎺ュ彛璇存槑
+
+SDK鍐呴儴鍙e瀷绯绘暟鏌ヨ锛岃鎺ュ彛浼氬洖璋冩瘡涓�娈垫煡璇㈤煶棰戞暟鎹殑鏁版嵁锛歚FUAudioProgressType`鍜屽唴閮ㄥ鐞嗚繃鍚庣殑闊抽锛岃鐘舵�佹帴鍙d富瑕佺敤浜庡閮ㄦ挱鏀惧櫒鍦烘櫙涓嬶紝涓轰簡瑙勯伩鍙e瀷绯绘暟鏌ヨ鑰楁椂鐨勫奖鍝嶏紝閫氱煡寮�鍙戣�匰DK宸茬粡鏈夊彛鍨嬫煡璇㈠畬鎴愶紝鍙互鎵ц澶栭儴鎾斁鍣ㄦ挱鏀鹃�昏緫銆�
+
+###### 鍙傛暟璇存槑
+
+```OnStaProcessListener```锛氬疄鐜拌鎺ュ彛锛岀浉鍏虫柟娉曞畾涔夛細
+
+```onStaProcess(FUAudioProgressType audioProgressType, byte[] data)```锛氬洖璋冩瘡涓�娈垫煡璇㈤煶棰戞暟鎹殑鏁版嵁
+
+###### 澶囨敞锛�
+
+```FUAudioProgressType```鏄痐寮�濮媊銆乣涓棿`銆乣缁撴潫`銆乣鏁存`鐨勬灇涓俱�俙date`鏄瘡涓�娈电殑闊抽锛屾敞鎰忚闊抽涓嶄竴瀹氱瓑浜庣敤鎴蜂紶鍏ョ殑闊抽鏍煎紡鍜屽ぇ灏忋��
+
+
+###### FUSta SDK鍋滄鍙e瀷鏌ヨ鍜岄┍鍔�
+
+```
+void stopStaProcess();
+```
+###### 鎺ュ彛璇存槑
+
+鎵撴柇SDK鍐呴儴鍙e瀷绯绘暟鏌ヨ浠诲姟锛岃鎺ュ彛浼氭竻鎺夊凡缁忔煡璇㈢殑鍙e瀷鏁版嵁鐨勭紦瀛橈紝鍋滄鍐呴儴鎾斁鍣ㄧ殑鎾斁銆�
+
+###### 鍙傛暟璇存槑
+
+###### 澶囨敞锛�
+
+澶栭儴鎾斁鍦烘櫙闇�瑕侀厤鍚堝閮ㄦ挱鏀惧櫒鍋滄鏂规硶鍜岃皟鐢⊿DK澶栭儴鎾斁鍣ㄦ挱鏀炬殏鍋滄垨缁撴潫閫氱煡鏂规硶锛歚onExternalPlayerStop()`銆�
+
+
+###### FUSta SDK璁剧疆鑻辫鍙e瀷寮犲紑骞呭害
+
+```
+void setENIntensity(float intensity);
+```
+###### 鎺ュ彛璇存槑
+
+璁剧疆鑻辫鍙e瀷寮犲紑骞呭害銆�
+
+###### 鍙傛暟璇存槑
+
+```intensity```锛氳嫳璇彛鍨嬪紶寮�骞呭害锛屽彇鍊艰寖鍥碻1.0, 1.5`锛�
+
+###### 澶囨敞锛�
+
+
+---
+
+> ### <a name="6">Avatar鍔ㄧ敾鍜岃〃鎯呭垏鎹�</a>
+
+###### 鍔ㄧ敾寰幆鎾斁
+
+```
+void playAnimation(String anim);
+鎴�
+void playAnimation(String anim, String[] prop, String[] propAnimation);
+```
+###### 鎺ュ彛璇存槑
+
+寰幆鎾斁Avatar鍔ㄧ敾銆�
+
+###### 鍙傛暟璇存槑
+
+```anim```锛歋tring锛孉vatar鍔ㄧ敾閬撳叿璺緞
+```prop```锛歋tring[], 閬撳叿璺緞鏁扮粍
+```propAnimation```锛歋tring[], 閬撳叿鍔ㄧ敾璺緞鏁扮粍
+
+###### 澶囨敞锛�
+
+###### 鍔ㄧ敾鍗曟鎾斁
+
+```
+void playAnimationOnce(String anim);
+鎴�
+void playAnimationOnce(String anim, String[] prop, String[] propAnimation);
+```
+###### 鎺ュ彛璇存槑
+
+鍗曟鎾斁Avatar鍔ㄧ敾銆�
+
+###### 鍙傛暟璇存槑
+
+```anim```锛歋tring锛孉vatar鍔ㄧ敾閬撳叿璺緞
+```prop```锛歋tring[], 閬撳叿璺緞鏁扮粍
+```propAnimation```锛歋tring[], 閬撳叿鍔ㄧ敾璺緞鏁扮粍
+
+###### 澶囨敞锛�
+
+###### 缁х画鎾斁褰撳墠鍔ㄧ敾
+
+```
+void startCurrentAnimation();
+```
+###### 鎺ュ彛璇存槑
+
+缁х画鎾斁褰撳墠鍔ㄧ敾銆�
+
+###### 鍙傛暟璇存槑
+
+###### 澶囨敞锛�
+
+###### 鏆傚仠鎾斁褰撳墠鍔ㄧ敾
+
+```
+void pauseCurrentAnimation();
+```
+###### 鎺ュ彛璇存槑
+
+缁х画鎾斁褰撳墠鍔ㄧ敾銆�
+
+###### 鍙傛暟璇存槑
+
+###### 澶囨敞锛�
+
+###### 绉婚櫎鍔ㄧ敾
+
+```
+void removeAnimation(String anim);
+```
+###### 鎺ュ彛璇存槑
+
+绉婚櫎鍔ㄧ敾銆�
+
+###### 鍙傛暟璇存槑
+
+```anim```锛歋tring锛岃绉婚櫎鐨凙vatar鍔ㄧ敾閬撳叿璺緞
+
+###### 澶囨敞锛�
+
+###### 璁剧疆鍔ㄧ敾鐨勮繃娓℃椂闂�
+
+```
+void setAnimationTransitionTime(float time);
+```
+###### 鎺ュ彛璇存槑
+
+璁剧疆鍔ㄧ敾鐨勮繃娓℃椂闂达紝鍗曚綅涓虹锛岄粯璁�0.5绉掋��
+
+###### 鍙傛暟璇存槑
+
+```time```锛歠loat锛屽姩鐢荤殑杩囨浮鏃堕棿
+
+###### 澶囨敞锛�
+
+###### 璁剧疆鍔ㄧ敾鐨勬挱鏀鹃�熷害
+
+```
+void setAnimationSpeed(float speed);
+```
+###### 鎺ュ彛璇存槑
+
+璁剧疆鍔ㄧ敾鐨勬挱鏀鹃�熷害绯绘暟锛岄粯璁や负1锛岃寖鍥碻0.2, 5.2`銆�
+
+###### 鍙傛暟璇存槑
+
+```speed```锛歠loat锛屾挱鏀鹃�熷害绯绘暟
+
+###### 澶囨敞锛�
+
+###### 鍐呯疆琛ㄦ儏鍒囨崲
+
+```
+void updateEmotion(FUEmotionType emotionType);
+鎴�
+void updateEmotion(FUEmotionType emotionType, int fpsNum);
+```
+###### 鎺ュ彛璇存槑
+
+SDK鍐呯疆琛ㄦ儏鍒囨崲锛屽湪`fpsNum`甯у唴杩囨浮鍒扮洰鏍囪〃鎯呫��
+
+###### 鍙傛暟璇存槑
+
+```emotionType```锛欶UEmotionType锛屽唴缃〃鎯呯殑鏋氫妇锛岀洰鍓嶅彧鏀寔鐗瑰畾鐨凙vatar绫诲瀷锛坄FUAvatarType.CARTOON`鍜宍FUAvatarType.REAL`锛夈��
+```fpsNum```锛歩nt锛屽湪`fpsNum`甯у唴杩囨浮鍒扮洰鏍囪〃鎯咃紝榛樿涓�0銆�
+
+###### 澶囨敞锛�
+
+###### 鑷畾涔夎〃鎯呭垏鎹�
+
+```
+void updateCustomEmotion(String path);
+鎴�
+void updateCustomEmotion(String path, int fpsNum);
+```
+###### 鎺ュ彛璇存槑
+
+鑷畾涔夎〃鎯呭垏鎹紝閫氳繃浼犲叆鑷畾涔塨s鏂囦欢锛屽唴閮ㄨВ鏋愬苟涓旈┍鍔ㄨ〃鎯咃紝鍦╜fpsNum`甯у唴杩囨浮鍒扮洰鏍囪〃鎯呫��
+
+###### 鍙傛暟璇存槑
+
+```path```锛歋tring锛岃嚜瀹氫箟琛ㄦ儏鐨勬枃浠躲��
+```fpsNum```锛歩nt锛屽湪`fpsNum`甯у唴杩囨浮鍒扮洰鏍囪〃鎯咃紝榛樿涓�0銆�
+
+###### 澶囨敞锛�
+
+###### 璁剧疆鏍囩閰嶇疆琛�
+
+```
+void setAlignTagConfig(String tagConfig, String defaultAnimation);
+```
+###### 鎺ュ彛璇存槑
+
+璁剧疆鏍囩閰嶇疆琛紝閰嶅悎Align妯″紡浣跨敤鍙畾鍒跺姩浣滆〃鎯呭垏鎹㈢殑瀹為檯銆�
+
+###### 鍙傛暟璇存槑
+
+```tagConfig```锛歋tring锛屾爣绛鹃厤缃〃
+```defaultAnimation```锛歋tring锛屾爣绛鹃厤缃〃鍔ㄤ綔鎵ц瀹屾垚鍚庢墽琛岀殑榛樿鍔ㄤ綔閬撳叿璺緞
+
+###### 澶囨敞锛�
+
+鏍囩閰嶇疆琛ㄨ皟鐢ㄨ```Android FUStaKit 闆嗘垚鏂囨。```
+
+---
+
+> ### <a name="7">閿�姣�</a>
+
+###### 閿�姣� FUSta SDK
+
+```
+void release();
+```
+###### 鎺ュ彛璇存槑
+
+閿�姣丼DK锛岄噴鏀惧唴瀛樿祫婧愩��
+
+###### 鍙傛暟璇存槑
+
+###### 澶囨敞锛�
+
+---
+
+> ### <a name="8">鍏朵粬</a>
+
+###### 鏃嬭浆Avatar
+
+```
+setRotDelta(float delta)
+```
+###### 鎺ュ彛璇存槑
+
+鏃嬭浆瑙掕壊銆�
+
+###### 鍙傛暟璇存槑
+
+```delta```锛氳〃绀烘棆杞閲忥紝鍙栧�艰寖鍥碻-1.0, 1.0`
+
+###### 澶囨敞锛�
+
+
+###### 缂╂斁Avatar
+
+```
+setScaleDelta(float delta)
+```
+###### 鎺ュ彛璇存槑
+
+缂╂斁瑙掕壊銆�
+
+###### 鍙傛暟璇存槑
+
+```delta```锛氳〃绀虹缉鏀惧閲忥紝鍙栧�艰寖鍥碻-1.0, 1.0`
+
+###### 澶囨敞锛�
+
+
+###### 涓婁笅绉诲姩Avatar
+
+```
+setTranslateDelta(float delta)
+```
+###### 鎺ュ彛璇存槑
+
+涓婁笅绉诲姩瑙掕壊銆�
+
+###### 鍙傛暟璇存槑
+
+```delta```锛氳〃绀轰笂涓嬪閲忥紝鍙栧�艰寖鍥碻-1.0, 1.0`
+
+###### 澶囨敞锛�
+
+###### 璁剧疆Avatar鏃嬭浆瑙掑害
+
+```
+setRotate(float rotate)
+```
+###### 鎺ュ彛璇存槑
+
+璁剧疆Avatar鏃嬭浆瑙掑害銆�
+
+###### 鍙傛暟璇存槑
+
+```rotate```锛氳〃绀烘棆杞搴�
+
+###### 澶囨敞锛�
+
+###### 璁剧疆bs琛ㄦ儏绯绘暟鏁版嵁
+
+```
+setBSConfigData(String configPath)
+```
+###### 鎺ュ彛璇存槑
+
+璁剧疆褰撳墠Avatarbs琛ㄦ儏绯绘暟鏁版嵁鍖呰矾寰勶紝鍙笉璁剧疆锛屼笉璁剧疆鍒欎娇鐢ㄩ粯璁ゆ暟鎹寘
+
+###### 鍙傛暟璇存槑
+
+```configPath```锛歋tring锛宐s琛ㄦ儏绯绘暟鏁版嵁鍖呰矾寰�
+
+###### 澶囨敞锛�
+
+---
+
diff --git "a/Android FUStaKit \351\233\206\346\210\220\346\226\207\346\241\243.md" "b/Android FUStaKit \351\233\206\346\210\220\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..8d1c43a
--- /dev/null
+++ "b/Android FUStaKit \351\233\206\346\210\220\346\226\207\346\241\243.md"
@@ -0,0 +1,1205 @@
+### FUStaSDK闆嗘垚鏂囨。
+
+鏈� SDK 闆嗘垚浜� FaceUnity 鐨勮闊抽┍鍔ㄥ舰璞″紩鎿�(Speeach to Animation) 锛岃兘澶熷揩閫熸瀯寤哄苟椹卞姩铏氭嫙褰㈣薄璇磋瘽锛岃惀閫犳洿鍔犵湡瀹炶嚜鐒剁殑浜烘満浜や簰鍦烘櫙銆�
+
+
+## 鐗堟湰淇℃伅
+
+* **鐗堟湰鍙�**:2.1
+
+* **鏇存柊鏃ユ湡**:2022-01-21
+
+* **鏇存柊鍐呭**:
+ 1. 浼樺寲CPU鎬ц兘浠ュ強鏌ヨ鏁堢巼
+ 2. 鏂板鍔ㄧ敾鎾斁閫熷害鎺у埗鎺ュ彛
+ 3. 鏇存柊BS绯绘暟57-47
+ 4. 淇闈欓煶甯ч棶棰�
+ 5. 鏂板璁剧疆鏃嬭浆瑙掑害
+ 6. 浼樺寲闃村奖閿娇绠楁硶
+ 7. 澧炲姞璇︾粏鏃ュ織鎺ュ彛
+
+* **澧為噺澶у皬**:
+ SDK 浣撶Н浠ュ強apk澧為噺鏁版嵁锛堝崟浣嶏細M锛夛細
+ * v7a + v8a 22.8M app 澧為噺锛�32.6M
+
+ SDK 鍐呴儴鍐呯疆璧勬簮鍏辫6.57M锛屽叾涓寘鍚細
+ 1. `controller_cpp.bundle` 鍏�1.46M锛実raphics鐩稿叧銆�
+ 2. `new_BSConfig` 鍏�4.11M锛宐s琛ㄦ儏绯绘暟鏁版嵁鍖呫��
+ 3. 鍏朵粬璧勬簮 绾�1M
+
+澶囨敞锛�
+
+ 鐩墠SDK鍙敮鎸佸綋鍓嶄袱涓灦鏋勶紝濡傛湁鐗规畩闇�姹傚彲鎵撳寘瀵瑰簲鏋舵瀯鐨凷DK銆�
+
+
+## 閰嶇疆瑕佹眰
+
+* **SDK鏀寔瀹夊崜鐗堟湰锛歚API 21` 鍙婁互涓婏紝蹇呴』鍦ㄧ‖浠跺姞閫熺殑绐楀彛涓娇鐢�**
+
+
+## 蹇�熼泦鎴�
+
+1. 棣栧厛瑕佽幏鍙栬瘉涔� `authpack.java`锛屾斁鍒� `faceunity` 妯″潡 `com.faceunity.fustademo` 鍖呬笅锛涜闊虫牎鍑嗗伐鍏峰寘`data_ali.bin`鏀惧埌`assets`鐩綍涓嬶紙ALIGN鏂瑰紡鏌ヨ鍙e瀷锛屽彲涓嶈缃級锛岃闊宠瘑鍒伐鍏峰寘`data_asr.bin`鏀惧埌`assets`鐩綍涓嬶紙ASR鏂瑰紡鏌ヨ鍙e瀷锛屽彲涓嶈缃級锛屼互涓婂伐鍏峰寘閮戒笉璁剧疆榛樿鍙敮鎸侀煶棰戞椂闂存埑鏌ヨ鍙e瀷绯绘暟銆�
+2. 鏋勫缓宸ョ▼锛岃繍琛屽埌鎵嬫満涓婏紝鍗冲彲浣撻獙 demo 鍔熻兘銆�
+3. 鎯宠浣撻獙`娴佸紡闊抽鎾姤`鍔熻兘锛屽彲鐢宠`鏍囪礉`TTS鐨刞client_id`鍜宍client_secret`鎴栬�呭鎺ュ叾浠栦笁鏂圭殑TTS鏈嶅姟銆�
+
+
+## 浣跨敤璇存槑
+
+* **FU璇煶鍔╂墜**
+
+ **鍔熻兘妯″潡**:
+
+ 1. 闈炴祦寮忛煶棰戞挱鎶�
+
+ 鎾姤涓�鏁存闊抽鏂囦欢锛屾煡璇㈤煶棰戝搴旂殑鍙e瀷绯绘暟锛屽苟鎾斁闊抽銆�
+
+ 2. 娴佸紡闊抽鎾姤
+
+ 鏂囨湰杈撳叆閫氳繃璇煶鍚堟垚锛圱TS锛夛紙鐢辩涓夋柟鏈嶅姟鍟嗗疄鐜帮級鐢熸垚闊抽浼犲叆SDK锛屾煡璇㈤煶棰戝搴旂殑鍙e瀷绯绘暟锛屽苟鎾斁闊抽銆�
+
+ 3. 姝屾洸婕斿敱
+
+ 鎾斁姝屾洸椹卞姩褰㈣薄锛屾瓕璇嶆槸甯︽湁闊崇礌鐨勬枃鏈紝鏌ヨ闊抽瀵瑰簲鐨勫彛鍨嬬郴鏁帮紝骞舵挱鏀鹃煶棰戙��
+
+
+ **Demo璧勬簮闆嗘垚**:
+
+ 浠ヤ笅鏄綋鍓岲emo鐨凙vatar璧勬簮鐩稿叧鍜孲TA鐩稿叧鏁版嵁鍖呯殑闆嗘垚鐨勮В鏋愶紝渚夸簬寮�鍙戣�呯悊瑙emo鍜孲DK璋冪敤銆備絾涓嶄粎浠呴檺浜庡綋鍓嶉泦鎴愭柟寮忥紝寮�鍙戣�呭彲鏍规嵁椤圭洰闇�姹傝嚜琛屽畾涔夐泦鎴愭柟寮忋��
+
+ 1. assets 鐩綍
+
+ 璇ョ洰褰曞瓨鏀炬墍鏈夌殑褰㈣薄璧勬簮浠ュ強STA鐩稿叧鏁版嵁鍖呰祫婧愶紝涓嶅悓璧勬簮閮藉瓨鏀惧湪瀵瑰簲鐨勫瓙鏂囦欢澶逛腑銆�
+
+ - fusta_demo/src/main/assets/sta:璇ョ洰褰曚负鎵�鏈堿vatar璧勬簮鐨勫瓨鏀剧洰褰�
+
+ - fusta_demo/src/main/assets/sta/animation:璇ョ洰褰曚负鎵�鏈堿vatar鐨勫姩鐢昏祫婧愮殑瀛樻斁鐩綍
+
+ - fusta_demo/src/main/assets/sta/body:璇ョ洰褰曚负鎵�鏈堿vatar鐨刡ody璧勬簮鐨勫瓨鏀剧洰褰�
+
+ - fusta_demo/src/main/assets/sta/builtin:璇ョ洰褰曠粨鏋勪笅鏈変竴涓� avatar_list.json 鏂囦欢锛屼富瑕佺敤鏉ラ厤缃� avatar 鍒楄〃锛屽叾鏍煎紡濡備笅锛�
+ ```
+ [
+ {
+ "name": "3D路鍗¢�氬コ",// avatar 鍚嶇О锛屽彲浠ヤ笉閰嶇疆銆�
+ "dirName": "cartoon_female_moren"// avatar 鏂囦欢澶瑰悕绉帮紝璇ユ枃浠跺す浣嶄簬 avatar 鐩綍鐨勬牴鐩綍銆�
+ },
+ {
+ "name": "3D路鍗¢�氱敺",
+ "dirName": "cartoon_male_moren"
+ }
+ ]
+ ```
+ 濡� avatar_list.json 閰嶇疆锛屾瘡涓厓绱犲搴斾竴涓猘vatar鏂囦欢澶癸紝鍦ㄦ枃浠跺す涓繚瀛樼潃褰㈣薄鐨� avatar.json 閰嶇疆鏂囦欢銆佺礌鏉愭枃浠朵互鍙婂浘鏍囩瓑鐩稿叧鏂囦欢锛宎vatar.json 鐨勬牸寮忓涓嬶細
+ ```
+ {
+ "gender": 0,// 鎬у埆锛�0鐢枫��1濂炽��2閫氱敤锛屽繀椤婚厤缃�
+ "components": [// 韬綋鍚勪釜閮ㄤ欢锛岄渶瑕侀厤缃儴浠跺悕绉板姞璺緞
+ {
+ "name": "body",
+ "path": "@assets/body/STA_avatar_kt_def_female_moren.bundle"
+ }
+ ],
+ "animations": [// 褰㈣薄鍔ㄧ敾锛岄渶瑕侀厤缃姩鐢诲悕绉板姞璺緞
+ {
+ "name": "榛樿鍛煎惛",
+ "path": "@assets/animation/STA_anim_kt_def_female_weixiao.bundle"
+ }
+ ],
+ "position": {// 褰㈣薄榛樿鐨勫潗鏍�
+ "x": 10.0,
+ "y": 50.0,
+ "z": -600.0
+ },
+ "scene": {// 鍦烘櫙閰嶇疆锛屽寘鎷儗鏅紙background锛夈�佺浉鏈猴紙camera锛夈�佺伅鍏夛紙light锛夛紝闇�瑕侀厤缃悕绉板姞璺緞
+ "background": {
+ "name": "background",
+ "path": "@assets/STA_default_bg.bundle"
+ },
+ "light": {
+ "name": "light",
+ "path": "@assets/STA_default_light.bundle"
+ }
+ },
+ "custom": ""//Demo涓氬姟閫昏緫鐩稿叧鐨勯厤缃紝涓昏鏄疉vatar鍚嶇О銆佸姩浣滃垪琛ㄥ拰鏍囩鍒楄〃鐨勫畾涔�
+ }
+ ```
+ 澶囨敞锛氳矾寰勬寚瀹氱殑鍓嶇紑@assets琛ㄧず璧勬簮瀛樺湪鐨刟ssets涓嬨��
+
+ - fusta_demo/src/main/assets/sta_kit:璇ョ洰褰曞瓨鏀炬墍鏈塖TA鐩稿叧鏁版嵁鍖呰祫婧愶紝璇ユ枃浠剁殑STA鐩稿叧璧勬簮鍖呮暟鎹細
+
+ `data_ali.bin`璇煶鑷姩鏍″噯宸ュ叿鍖咃紙Align妯″紡闇�瑕佽缃級
+
+ `data_asr.bin`璁剧疆鏂囧瓧缂栫爜鍔熻兘鏁版嵁鏂囦欢锛圓lign妯″紡鍜屾枃鏈椂闂存埑闇�瑕佽缃級
+
+ `data_decoder.bin`璁剧疆璇煶璇嗗埆宸ュ叿鍖咃紙ASR鏂瑰紡闇�瑕佽缃級
+
+ 鍦╜fusta_demo/src/main/java/com/faceunity/fustademo/util/StaKitUtils.java`鐨刞init`鏂规硶涓寜闇�鍔犺浇銆�
+
+ - fusta_demo/src/main/assets/sta_kit/emotion:璇ョ洰褰曞瓨鏀捐嚜瀹氫箟琛ㄦ儏bs鏂囦欢銆�
+
+ - fusta_demo/src/main/assets/sta_kit/song:璇ョ洰褰曞瓨鏀炬瓕鏇茬浉鍏虫枃浠讹紝鐢ㄤ簬姝屾洸鎾斁鑳藉姏灞曠ず銆�
+
+ 2. 褰㈣薄灞曠ず
+
+ `com.faceunity.fu_data.data.FUDataCenter`浼氭牴鎹厤缃殑 avatar 鐩綍璺緞锛岃鍙� avatar_list.json 浠ラ亶鍘嗘墍鏈夊舰璞℃枃浠跺す涓殑 avatar.json 锛岀敓鎴� avatar 妯″瀷鍒楄〃锛屼笂灞備笟鍔¤皟鐢ㄨ�呭彧闇�瑕佷紶鍏ヤ笅鏍囦究鍙交鏉鹃�夋嫨瑕佸睍绀虹殑褰㈣薄銆傚叿浣撹皟鐢ㄧず渚嬪涓嬶細
+
+ ```
+ FUDataCenter fuDataCenter = new FUDataCenter(mContext);
+ fuDataCenter.initWithAvatarDirAndAssetsPath(null, FUConstant.STA_ASSENTS_PATH);
+ ArrayList<FUAvatarModel> avatarModels = fuDataCenter.loadAvatarLists();
+ ```
+ `com.faceunity.fustademo.data.AvatarDataFactory`鎸佹湁`avatarModels`鍒楄〃鏁版嵁锛岃皟鐢╜setAvatar(int index)`鎷垮埌瀵瑰簲鐨刞FUAvatarModel`杩涜�屽疄鐜癆vatar鍔犺浇鎴栧垏鎹€��
+
+* **璇佷功**
+
+ demo涓殑`authpack.java`鏄垜鍙稿彂甯冪殑SDK璇佷功锛孎UStaSDK闇�瑕侀�氳繃`authpack`閴存潈骞跺垵濮嬪寲銆傛棤娉曠嫭绔嬩簬璇佷功杩愯锛屽洜姝ら渶瑕佸皢`authpack.java`鏇挎崲鍒颁綘鐨勫伐绋嬩腑銆�
+
+
+* **鏈壌鏉冪殑bundle**
+
+ 锛堢绾块壌鏉冨唴瀹癸紝鍦ㄧ嚎閴存潈妯″紡璇峰拷鐣ワ級assets鐩綍涓嬬殑`fustaengine\offline\***.bundle`鏁版嵁鏄湭閴存潈鐨刡undle鏁版嵁锛岀绾块壌鏉冭繃绋嬮鍏堥渶瑕佷娇鐢ㄦ湭閴存潈鐨刡undle鏁版嵁鑱旂綉杩涜涓�娆″湪绾块壌鏉冿紝閴存潈鎴愬姛鍚庣敓鎴恅key.bundle`锛�
+
+
+* **key.bundle**
+
+ 锛堢绾块壌鏉冨唴瀹癸紝鍦ㄧ嚎閴存潈妯″紡璇峰拷鐣ワ級`key.bundle`鏄疭DK鍐呴儴鑷姩鐢熸垚鐨刡undle锛屾湁浜嗚bundle鍚庣画寮�鍙戣�呭彲浣跨敤璇ユ枃浠惰繘琛岀绾挎潈闄愶紝涓嶅啀闇�瑕佽仈缃戞搷浣溿�俙key.bundle`鏄涓�娆¤仈缃戦壌鏉冩垚鍔熷悗鐢熸垚鐨勶紝淇濆瓨鍦⊿D鍗$洰褰曚笅鐨刓FaceUnity\FUStaKit\key.bundle
+
+
+* **FUStaKit**
+
+ `FUStaKit`鏄疭DK瀵瑰鐨勯棬闈㈢被銆傞�氳繃`FUStaKit`瀵硅薄璋冪敤SDK鐩稿叧鍔熻兘銆�
+
+
+* **閬撳叿璧勬簮**
+
+ 闄や簡SDK鍜岃瘉涔︼紝鎴戜滑杩橀渶瑕侀亾鍏疯祫婧愪緵SDK鍔犺浇锛孌emo涓殑`assets`鏂囦欢澶瑰寘鍚簡涓�浜涢缃殑璧勬簮鏂囦欢(鑳屾櫙銆佸舰璞°�佸姩浣溿�佹墿灞曞姛鑳芥暟鎹寘绛�)銆傜敱浜庨儴鍒嗛亾鍏疯祫婧愭枃浠惰緝澶э紝瀹為檯寮�鍙戣繃绋嬩腑鍙互閫夋嫨閫氳繃缃戠粶涓嬭浇鐨勬柟寮忛泦鎴愬埌浣犵殑椤圭洰涓�備綘鍙互鏆傚厛灏咲emo涓殑`assets`鏂囦欢澶规嫋鍏ュ埌浣犵殑宸ョ▼涓娇鐢ㄥ厤璐归亾鍏�
+
+## 闆嗘垚 SDK
+
+### 1. 娣诲姞渚濊禆
+
+鍦ㄥ伐绋嬬洰褰曚笅`build.gradle`->`repositories`涓嬫坊鍔燻 maven { url 'http://maven.faceunity.com/repository/maven-public/' }`銆�
+
+鍦ㄩ」鐩洰褰曚笅鐨刞build.gradle`涓嬫坊鍔犱緷璧栧簱`api 'com.faceunity:sta-full-featured:2.1.0-RELEASES'`
+
+### 2. FUStaKit SDK 閰嶇疆鍒濆鍖栨暟鎹�
+
+鍦‵UStaKit SDK鍒濆鍖栦箣鍓嶏紝涓�鑸斁鍦╜Application`涓厤缃�傞壌鏉冩柟寮忓垎涓哄湪绾块壌鏉冨拰绂荤嚎閴存潈锛屽彲鏍规嵁涓氬姟闇�姹傝嚜琛岄�夋嫨锛�
+
+#### 閰嶇疆鍦ㄧ嚎閴存潈鍒濆鍖栨暟鎹�
+
+**绀轰緥浠g爜锛�**
+
+```
+public void initOnline(@NonNull Context context) {
+ mContext = context.getApplicationContext();
+ FUStaKit.Builder builder = new FUStaKit
+ //浼犲叆涓婁笅鏂囷紝蹇呰
+ .Builder(mContext)
+ //楠岃瘉璇佷功锛屽繀瑕�
+ .setAuth(authpack.A())
+ //璁剧疆tts鏌ヨ鏂瑰紡锛屽繀瑕侊紙ASR鏂瑰紡闇�瑕佽缃細FUTtsType.ASR锛汚lign鏂瑰紡闇�瑕佽缃細FUTtsType.ALIGNMENT锛�
+ .setFUTtsType(FUTtsType.ALIGNMENT)
+ //璁剧疆璇煶璇嗗埆宸ュ叿鍖咃紙ASR鏂瑰紡闇�瑕佽缃級
+ // .setAsrData(bytesAsr)
+ //璁剧疆璇煶鑷姩鏍″噯宸ュ叿鍖咃紙Align妯″紡闇�瑕佽缃級
+ .setAlignData(bytesAlign)
+ //璁剧疆鏂囧瓧缂栫爜鍔熻兘鏁版嵁鏂囦欢锛圓lign妯″紡鍜屾枃鏈椂闂存埑闇�瑕佽缃級
+ .setCharacterDecoder(bytesDecoder);
+ mFUStaKit = builder.build();
+}
+```
+澶囨敞锛�
+
+#### 閰嶇疆绂荤嚎閴存潈鍒濆鍖栨暟鎹�
+
+**绀轰緥浠g爜锛�**
+
+```
+public void initOffline(@NonNull Context context) {
+ mContext = context.getApplicationContext();
+ FUStaKit.Builder builder = new FUStaKit
+ //浼犲叆涓婁笅鏂囷紝蹇呰
+ .Builder(mContext)
+ //楠岃瘉璇佷功锛屽繀瑕�
+ .setAuth(authpack.A())
+ //璁剧疆tts鏌ヨ鏂瑰紡锛屽繀瑕侊紙ASR鏂瑰紡闇�瑕佽缃細FUTtsType.ASR锛汚lign鏂瑰紡闇�瑕佽缃細FUTtsType.ALIGNMENT锛�
+ .setFUTtsType(FUTtsType.ALIGNMENT)
+ //璁剧疆璇煶璇嗗埆宸ュ叿鍖咃紙ASR鏂瑰紡闇�瑕佽缃級
+ // .setAsrData(bytesAsr)
+ //璁剧疆璇煶鑷姩鏍″噯宸ュ叿鍖咃紙Align妯″紡闇�瑕佽缃級
+ .setAlignData(bytesAlign)
+ //璁剧疆鏂囧瓧缂栫爜鍔熻兘鏁版嵁鏂囦欢锛圓lign妯″紡鍜屾枃鏈椂闂存埑闇�瑕佽缃級
+ .setCharacterDecoder(bytesDecoder)
+ //璁剧疆绂荤嚎閴存潈鏁版嵁
+ .setOffLineData(offLineAuth);
+ mFUStaKit = builder.build();
+}
+```
+澶囨敞锛�
+
+绂荤嚎閴存潈闄や簡璁剧疆`authpack.A()` 閴存潈鏁版嵁锛岃繕闇�瑕佽缃绾块壌鏉冩暟鎹寘鏁版嵁锛歚setOffLineAuth(offLineAuth)`锛岃閫昏緫鍙弬鑰冮泦鎴怐emo涓殑绀轰緥浠g爜锛歔StaKitUtils.java: Lines 82-150](../app/src/main/java/com/faceunity/fustademo/util/StaKitUtils.java#L82-L150)銆�
+娉ㄦ剰绂荤嚎閴存潈杩橀渶瑕佹湁WRITE_EXTERNAL_STORAGE鏉冮檺銆�
+
+
+### 3. FUStaKit SDK 閴存潈
+
+FUStaKit SDK鍒濆鍖栵紝蹇呴』鏀惧湪 FUStaKit SDK閰嶇疆鍒濆鍖栨暟鎹箣鍚庯紝閴存潈鏂瑰紡鍒嗕负鍦ㄧ嚎閴存潈鍜岀绾块壌鏉冿紝鍙牴鎹笟鍔¢渶姹傝嚜琛岄�夋嫨锛�
+
+#### 閰嶇疆鍦ㄧ嚎閴存潈鍒濆鍖栨暟鎹�
+
+鏂规硶锛歚init(FUAuthType.ONLINE, StaKitInitCallback listener)`
+ `init(FUAuthType.ONLINE, null)`
+
+鍙傛暟锛歚FUAuthType.ONLINE`锛氬湪绾块壌鏉冿紱
+ `FUStaKit.StaKitInitCallback`锛孲DK鍒濆鍖栫姸鎬佺殑鍥炶皟銆傚弬鏁板彲涓虹┖銆�
+
+**绀轰緥浠g爜锛�**
+
+ 1.鏈夊垵濮嬪寲瀹屾垚鍥炶皟鐨勬柟寮忥紝SDK鍒濆鍖栧畬鎴愮殑鍥炶皟锛岃繘鍏ュ姛鑳介〉闈�
+ // 鍒濆鐘舵�佺洃鍚櫒锛岀洃鍚琲nit鏄惁鎴愬姛锛屽洖璋冨湪闈濽I绾跨▼
+ private FUStaKit.StaKitInitCallback mInitListener = new FUStaKit.StaKitInitCallback() {
+
+ @Override
+ public void onInitComplete(int code, @NotNull String msg) {
+ }
+
+ @Override
+ public void onError(int errCode, @Nullable String errMsg) {
+ }
+ };
+ // SDK 鍒濆鍖�
+ mFUStaKit.init(FUAuthType.ONLINE, mInitListener);
+
+ 2.娌℃湁鍒濆鍖栧畬鎴愬洖璋冪殑鏂瑰紡锛屽鏋滆皟鐢ㄨ鏂规硶涔嬪悗绱ф帴鐫�璋冪敤鍙e瀷椹卞姩鏂规硶锛屽彛鍨嬮┍鍔ㄤ换鍔′細绛夊緟鍒濆鍖栦换鍔″畬鎴愭墠寮�濮�
+ // SDK 鍒濆鍖�
+ mFUStaKit.init(null);
+
+澶囨敞锛�
+
+init 鍒濆鍖栨柟娉曪紝鍔″繀鍦ㄥ悗缁搷浣滃墠璋冪敤锛屽惁鍒欐棤娉曢┍鍔ㄥ彛鍨嬨��
+SDK鍒濆鍖栨柟娉曟槸鑰楁椂鐨勶紝SDK鍐呴儴宸插皢浠诲姟娣诲姞鍒板紓姝ョ嚎绋嬪鐞嗐�傚鏋淪DK鍒濆鍖栦换鍔″皻鏈鐞嗗畬姣曪紝鍚庣画鍙e瀷椹卞姩浠诲姟鍥炶皟鍔犲埌浠诲姟闃熷垪绛夊緟璇ユ柟娉曞鐞嗗畬姣曞啀鎸夌収椤哄簭鎿嶄綔锛岀敤鎴风琛ㄧ幇涓虹涓�娆″彛鍨嬮┍鍔ㄨ�楁椂鏃堕棿闀裤��
+璇ユ楠ゅ彲鍙傝�冮泦鎴怐emo涓殑绀轰緥浠g爜锛歔SplashActivity.java: Lines 72-117](../app/src/main/java/com/faceunity/fustademo/ui/SplashActivity.java#L72-L117)
+
+#### 閰嶇疆绂荤嚎閴存潈鍒濆鍖栨暟鎹�
+
+鏂规硶锛歚init(FUAuthType.OFFLINE_BUNDLE, StaKitInitCallback listener)`
+ `init(FUAuthType.OFFLINE_BUNDLE, null)`
+
+鍙傛暟锛歚FUAuthType.OFFLINE_BUNDLE`锛氱绾块壌鏉冿紱
+ `FUStaKit.StaKitInitCallback`锛歋DK鍒濆鍖栫姸鎬佺殑鍥炶皟銆傚弬鏁板彲涓虹┖銆�
+
+**绀轰緥浠g爜锛�**
+
+ 1.鏈夊垵濮嬪寲瀹屾垚鍥炶皟鐨勬柟寮忥紝SDK鍒濆鍖栧畬鎴愮殑鍥炶皟锛岃繘鍏ュ姛鑳介〉闈�
+ // SDK 鍒濆鍖�
+ mFUStaKit.init(FUAuthType.OFFLINE_BUNDLE, mInitListener);
+
+ 2.娌℃湁鍒濆鍖栧畬鎴愬洖璋冪殑鏂瑰紡锛屽鏋滆皟鐢ㄨ鏂规硶涔嬪悗绱ф帴鐫�璋冪敤鍙e瀷椹卞姩鏂规硶锛屽彛鍨嬮┍鍔ㄤ换鍔′細绛夊緟鍒濆鍖栦换鍔″畬鎴愭墠寮�濮�
+ // SDK 鍒濆鍖�
+ mFUStaKit.init(null);
+
+澶囨敞锛�
+
+### 4. FUStaKit SDK 璁剧疆榛樿FUAvatar
+
+璁剧疆榛樿鐨凢UAvatar锛屾帹鑽愬湪寮�濮嬫覆鏌撳墠璁剧疆榛樿FUAvatar銆�
+
+鏂规硶锛歚setAvatar(FUAvatar avatar, FUAvatarType avatarType, OnAvatarStateListener listener)`
+
+鏂规硶浼犲叆鍙傛暟涓昏鏄細
+`FUAvatar`锛欶UStaKit SDK Avatar浜虹墿鏁版嵁妯″瀷;
+`FUAvatarType`锛欰vatar绫诲瀷鐨勬灇涓撅細`FUAvatarType.CARTOON`銆乣FUAvatarType.REAL`锛岄粯璁ゆ槸`FUAvatarType.CARTOON`锛岃鍙傛暟涓昏鐢ㄦ潵鍖哄埆SDK鍐呯疆琛ㄦ儏銆傜己鐪佸弬鏁般��
+`OnAvatarStateListener`锛欰vatar鎵ц鐘舵�佹帴鍙o紝鏂规硶`onAvatarComplete()`琛ㄧずAvatar鍔犺浇瀹屾垚銆傜己鐪佸弬鏁般��
+
+**绀轰緥浠g爜锛�**
+
+```
+ FUAvatar fuAvatar = new FUAvatar.Builder()
+ .setAvatar(avatar)// 鍒囨崲褰㈣薄
+ .setCoordinate(x, y, z)// 璁剧疆褰㈣薄浣嶇疆
+ .setBackground(backGround)// 璁剧疆鑳屾櫙
+ .setCamera(camera)// 璁剧疆鐩告満浣�
+ .setLight(light)// 璁剧疆鍏夌収
+ .enableShadow(enable)// 璁剧疆闃村奖
+ .build();
+
+// 鍒囨崲Avatar
+mFUStaKit.setAvatar(fuAvatar);
+鎴�
+mFUStaKit.setAvatar(fuAvatar, FUAvatarType.CARTOON);
+鎴�
+mFUStaKit.setAvatar(fuAvatar, FUAvatarType.CARTOON, onAvatarStateListener);
+```
+
+澶囨敞锛�
+
+璁剧疆榛樿鐨凙vatar鍜孉vatar鍒囨崲璋冪敤鏂瑰紡涓�鑷达紝璋冪敤鏃舵満鍙互鍦ㄥ紑濮嬫覆鏌撳墠璁剧疆涔熷彲浠ュ湪娓叉煋鍚庤缃紝Avatar鍒囨崲鍏跺搴旂殑鐗瑰緛涔熶細鏈夊彉鍖栵紝渚嬪鍒囨崲Avatar涔熶細鍒囨崲瀵瑰簲鐨勮儗鏅�佸厜鐓с�佷綅缃瓑绛夈��
+
+璇ユ楠ゅ彲鍙傝�冮泦鎴怐emo涓殑绀轰緥浠g爜锛歔AvatarDataFactory.java: Lines 250-278](../app/src/main/java/com/faceunity/fustademo/data/AvatarDataFactory.java#L250-L278)
+
+
+### 5. FUStaKit SDK 寮�濮嬫覆鏌�
+
+SDK閰嶇疆娓叉煋鐩稿叧鍙傛暟骞跺紑濮嬫覆鏌撱��
+
+鏂规硶锛歚requestRender(GLTextureView glTextureView)`
+鍙傛暟: `GLTextureView` SDK鎻愪緵鐨勬覆鏌撶殑缁勪欢
+
+**绀轰緥浠g爜锛�**
+
+ mFUStaKit.requestRender(glTextureView);// 璇锋眰娓叉煋
+ mFUStaKit.setCustomRenderResolution(renderWidth, renderHeight);// 璁剧疆娓叉煋鍒嗚鲸鐜囷紝renderWidth锛氬搴︼紝榛樿1280锛況enderHeight锛氶珮搴︼紝榛樿720
+
+ // Activity onDestroy 璋冪敤
+ Activity.onDestroy() {
+ super.onDestroy();
+ mFUStaKit.onDestroy();
+ }
+
+澶囨敞锛�
+
+璇ユ楠ゅ彲鍙傝�冮泦鎴怐emo涓殑绀轰緥浠g爜锛歔AvatarDataFactory.java: Lines 149-155](../app/src/main/java/com/faceunity/fustademo/data/AvatarDataFactory.java#L149-L155)
+
+### 6. 褰㈣薄鍙e瀷鏌ヨ鍜岄┍鍔�
+
+鏍规嵁浼犲叆鐨勯煶棰戞暟鎹垨鑰呮槸鏃堕棿鎴虫暟鎹煡璇㈠彛鍨嬪苟椹卞姩鍙e瀷锛屽紑鍙戣�呭彲鏍规嵁涓氬姟鍦烘櫙鍜岄渶姹傞�夋嫨鍚堥�傜殑椹卞姩鏂瑰紡锛�
+鏍规嵁闊抽鏁版嵁鎴栬�呮椂闂存埑鏁版嵁鐨勮繑鍥炴柟寮忓彲鍒嗕负`娴佸紡闊抽椹卞姩`鍜宍闈炴祦寮忛煶棰戦┍鍔╜锛�
+鏍规嵁鑳藉鎻愪緵鐨勬暟鎹祫婧愬彲鍒嗕负`鏃堕棿鎴抽┍鍔╜銆乣Align椹卞姩`銆乣ASR椹卞姩`锛�
+鏍规嵁鏄惁鐢盨DK鎾斁鍣ㄦ挱鎶ラ煶棰戝彲鍒嗕负`SDK鍐呯疆鎾斁鍣ㄦ挱鎶銆乣鑷畾涔夋挱鏀惧櫒鎾姤`銆�
+鏂囨。浠SDK鍐呯疆鎾斁鍣ㄦ挱鎶銆乣鑷畾涔夋挱鏀惧櫒鎾姤`涓ょ妯″紡鍒嗙被璁茶В銆�
+
+#### SDK 鍐呯疆鎾斁鍣ㄦ挱鎶�
+
+鍐呯疆鎾斁鍣ㄦ挱鎶ワ紝闇�瑕佸湪鍙e瀷鏌ヨ涔嬪墠鍒濆鍖栧唴閮ㄦ挱鏀惧櫒銆�
+
+鏂规硶锛歚initStaPlayer(new FUPlayerConfig.Builder().setAudioSampleRate(sampleRate).build())`
+鍙傛暟: `FUPlayerConfig`锛氬唴閮ㄦ挱鏀惧櫒鐨勫弬鏁伴厤缃被锛屼富瑕侀厤缃噰鏍风巼銆佸0閬撴暟鍜屼綅娣便��
+
+**绀轰緥浠g爜锛�**
+
+ mFUStaKit.initStaPlayer(new FUPlayerConfig.Builder().setAudioSampleRate(16000).build());// 璁剧疆閲囨牱鐜囦负16k
+
+澶囨敞锛�
+
+鍐呯疆鎾斁鍣ㄦ挱鎶�,蹇呴』瑕佸厛鍒濆鍖栨挱鏀惧櫒锛屾帴涓嬫潵鎵嶈兘寮�濮嬪彛鍨嬬殑鏌ヨ鍜岄┍鍔ㄣ��
+
+
+* **娴佸紡闊抽锛屾棤鏃堕棿鎴�**
+
+ 閽堝娴佸紡杩斿洖鐨勯煶棰戞暟鎹笖鏃犳椂闂存埑鐨勫満鏅痐锛堟湁鏃堕棿鎴宠偗瀹氳閲囩敤鏃堕棿鎴虫柟寮忥紝鍥犱负鏃堕棿鎴虫煡璇㈡晥鐜囬珮锛屽彛鍨嬫洿绮惧噯锛塦锛屾敮鎸侀煶棰戠被鍨嬶細`pcm`锛屾牴鎹煶棰戞暟鎹俊鎭煡璇㈠彛鍨嬬郴鏁帮紝鎾斁闊抽骞堕┍鍔ㄥ搴旂殑鍙e瀷銆�
+ 鏍规嵁鑳戒笉鑳芥彁渚涢煶棰戞暟鎹搴旂殑鏂囨湰`锛堝悗鏂囩粺涓�绉颁箣涓篈lignText锛塦鍒嗕负锛歚Align`鏂瑰紡 涓� `ASR` 鏂瑰紡銆�
+
+ 1銆乣ALIGN` 鏂瑰紡
+
+ `Align`鏂瑰紡鏌ヨ鍙e瀷绯绘暟鏄潬闊抽鏁版嵁鍜屼笌涔嬪搴旂殑AlignText锛屽湪娴佸紡鐨勬煡璇腑锛岄煶棰戞暟鎹槸涓�娈垫杩斿洖锛屼絾鏄疉lignText鏄畬鏁寸殑涓�娈垫枃鏈紝`Align`鏂瑰紡鏌ヨ閫熷害杈僠ASR`鏂瑰紡鏇村揩锛屼篃鍙互鏀寔楂樼骇鐨勫姩浣滆〃鎯呯殑瀹氬埗鍖栵紝浣嗘槸涔熸湁闄愬埗锛屼緥濡侫lignText涓嶆敮鎸佺箒浣撲腑鏂囥��
+
+ **绀轰緥浠g爜锛�**
+
+ // 娴佸紡澶勭悊寮�濮�
+ mFUStaKit.notifyStaProcessStart(); 1銆乣ALIGN` 鏂瑰紡
+
+ `Align`鏂瑰紡鏌ヨ鍙e瀷绯绘暟鏄潬闊抽鏁版嵁鍜屼笌涔嬪搴旂殑AlignText锛屽湪娴佸紡鐨勬煡璇腑锛岄煶棰戞暟鎹槸涓�娈垫杩斿洖锛屼絾鏄疉lignText鏄畬鏁寸殑涓�娈垫枃鏈紝`Align`鏂瑰紡鏌ヨ閫熷害杈僠ASR`鏂瑰紡鏇村揩锛屼篃鍙互鏀寔楂樼骇鐨勫姩浣滆〃鎯呯殑瀹氬埗鍖栵紝浣嗘槸涔熸湁闄愬埗锛屼緥濡侫lignText涓嶆敮鎸佺箒浣撲腑鏂囥��
+
+ **绀轰緥浠g爜锛�**
+
+ // 娴佸紡澶勭悊寮�濮�
+ mFUStaKit.notifyStaProcessStart();
+
+ ...
+ // 鍙e瀷鏌ヨ銆侀煶棰戞挱鏀惧苟椹卞姩瀵瑰簲鍙e瀷锛岃繖娈垫槸澶氭璋冪敤鐨勶紝鍗虫瘡娆℃湁娴佸紡闊抽杩斿洖閮戒細閲嶆柊璁剧疆`FUStaParams`骞惰皟鐢╜staProcess(params)`
+ FUStaParams params = new FUStaParams.Builder()
+ .setStreamMode(1)// 1 娴佸紡妯″紡锛� 0 闈炴祦寮忔ā寮� 榛樿闈炴祦寮�
+ .setAudioData(data)// 闊抽鏁版嵁锛屾祦寮忔煡璇㈣姹傚彧鑳芥槸PCM
+ .setAudioType(FUAudioType.PCM)// 闊抽绫诲瀷 娴佸紡鏌ヨ鍙敮鎸乸cm 榛樿pcm
+ .setAlignText(align)// AlignText 娉ㄦ剰姝ゅ璁剧疆鐨勬槸鏁存鐨勬枃鏈�屼笉鏄笌璇ユ闊抽瀵瑰簲鐨勬枃鏈�
+ .setTimestampType(FUTimestampType.PHONE)// 鏃堕棿鎴崇被鍨嬶紝`ALIGN` 鏂瑰紡璁剧疆涓篳FUTimestampType.PHONE`
+ .build();
+ mFUStaKit.staProcess(params);
+ ...
+
+ // 娴佸紡澶勭悊缁撴潫
+ mFUStaKit.notifyStaProcessFinish();
+
+ 澶囨敞锛�
+
+ 闊抽鏃堕棿鎴虫湁涓ょ绫诲瀷锛氶煶绱犳椂闂存埑鍜屾枃瀛楁椂闂存埑锛屽垎鍒搴� `FUTimestampType.PHONE` 鍜� `FUTimestampType.CHARACTER`锛屾湁鍏抽煶绱犳椂闂存埑鍜屾枃鏈椂闂存埑鐨勫尯鍒彲鍙傝�僠12. FUStaParams 鍙傛暟閰嶇疆绫籤閲岄潰瀵规椂闂存埑鐨勭ず渚嬨��
+
+ 娴佸紡鏃犳椂闂存埑閲囩敤`ALIGN`鏂瑰紡鏌ヨ鍙e瀷绯绘暟锛宻dk鍐呴儴浼氭牴鎹煶棰戞暟鎹拰鐢熸垚鏁存闊抽鐨勬枃鏈绠楀嚭闊崇礌鏃堕棿鎴筹紝鏁卄setTimestampType(FUTimestampType.PHONE)`蹇呴』璁剧疆銆�
+
+ 鍏充簬娴佸紡`ALIGN`鏂瑰紡锛屾瘮娴佸紡`ASR`鏂瑰紡闇�瑕佸璁剧疆鐢熸垚闊抽鏁版嵁鐨勬枃鏈紝娉ㄦ剰姝ゅ璁剧疆鐨勬槸鏁存鐨勬枃鏈�屼笉鏄笌璇ユ闊抽瀵瑰簲鐨勬枃鏈��
+
+ 璇ユ楠ゅ彲鍙傝�冮泦鎴怐emo涓殑绀轰緥浠g爜com.faceunity.fustademo.ui.TtsActivity.DataBakerTtsCallback銆�
+
+
+ 2銆乣ASR`鏂瑰紡
+
+ `ASR`鏂瑰紡鏌ヨ鍙e瀷绯绘暟鏄潬闊抽鏁版嵁锛宍ASR`鏂瑰紡鏌ヨ閫熷害杈冩參锛屽崟浣嶉煶棰戝鐞嗛�熷害绋嶈�楁椂锛屼絾娴佸紡鏌ヨ鍦烘櫙涓嬶紝SDK搴曞眰搴撴煡璇㈠鐞唍绉掔殑闊抽閫熷害杩滆繙澶т簬n绉掗煶棰戞挱鏀炬椂闀匡紝鍥犳鍙拷鐣ユ�ц兘宸紓銆�
+
+ **绀轰緥浠g爜锛�**
+
+ // 娴佸紡澶勭悊寮�濮�
+ mFUStaKit.notifyStaProcessStart();
+
+ ...
+ // 鍙e瀷鏌ヨ銆侀煶棰戞挱鏀惧苟椹卞姩瀵瑰簲鍙e瀷锛岃繖娈垫槸澶氭璋冪敤鐨勶紝鍗虫瘡娆℃湁娴佸紡闊抽杩斿洖閮戒細閲嶆柊璁剧疆`FUStaParams`骞惰皟鐢╜staProcess(params)`
+ FUStaParams params = new FUStaParams.Builder()
+ .setStreamMode(1)// 1 娴佸紡妯″紡锛� 0 闈炴祦寮忔ā寮� 榛樿闈炴祦寮�
+ .setAudioData(data)// 闊抽鏁版嵁锛屾祦寮忔煡璇㈣姹傚彧鑳芥槸PCM
+ .setAudioType(FUAudioType.PCM)// 闊抽绫诲瀷 娴佸紡鏌ヨ鍙敮鎸乸cm 榛樿pcm
+ .setTimestampType(FUTimestampType.PHONE)// 鏃堕棿鎴崇被鍨嬶紝`ASR` 鏂瑰紡璁剧疆涓篳FUTimestampType.PHONE`
+ .build();
+ mFUStaKit.staProcess(params);
+ ...
+
+ // 娴佸紡澶勭悊缁撴潫
+ mFUStaKit.notifyStaProcessFinish();
+
+ 澶囨敞锛�
+
+ 闊抽鏃堕棿鎴虫湁涓ょ绫诲瀷锛氶煶绱犳椂闂存埑鍜屾枃瀛楁椂闂存埑锛屽垎鍒搴� `FUTimestampType.PHONE` 鍜� `FUTimestampType.CHARACTER`锛屾湁鍏抽煶绱犳椂闂存埑鍜屾枃鏈椂闂存埑鐨勫尯鍒彲鍙傝�僠12. FUStaParams 鍙傛暟閰嶇疆绫籤閲岄潰瀵规椂闂存埑鐨勭ず渚嬨��
+
+ 娴佸紡鏃犳椂闂存埑閲囩敤`ASR`鏂瑰紡鏌ヨ鍙e瀷绯绘暟锛宻dk鍐呴儴浼氭牴鎹煶棰戞暟鎹绠楀嚭闊崇礌鏃堕棿鎴筹紝鏁卄setTimestampType(FUTimestampType.PHONE)`蹇呴』璁剧疆銆�
+
+ 璇ユ楠ゅ彲鍙傝�冮泦鎴怐emo涓殑绀轰緥浠g爜com.faceunity.fustademo.ui.TtsActivity.DataBakerTtsCallback銆�
+
+
+* **娴佸紡闊抽锛屾湁鏃堕棿鎴�**
+
+ 閽堝娴佸紡杩斿洖鐨勯煶棰戞暟鎹笖鏈夋椂闂存埑鐨勫満鏅紝鏌ヨ鑰楁椂鏈�灏戯紝鏈夋椂闂存埑鏁版嵁浼樺厛閲囩敤鏃堕棿鎴虫柟寮忋�傛敮鎸侀煶棰戠被鍨嬶細`pcm`锛屾牴鎹煶棰戞暟鎹俊鎭煡璇㈠彛鍨嬬郴鏁帮紝鎾斁闊抽骞堕┍鍔ㄥ搴旂殑鍙e瀷銆�
+
+ **绀轰緥浠g爜锛�**
+
+ // 娴佸紡澶勭悊寮�濮�
+ mFUStaKit.notifyStaProcessStart();
+
+ ...
+ // 鍙e瀷鏌ヨ銆侀煶棰戞挱鏀惧苟椹卞姩瀵瑰簲鍙e瀷锛岃繖娈垫槸澶氭璋冪敤鐨勶紝鍗虫瘡娆℃湁娴佸紡闊抽杩斿洖閮戒細閲嶆柊璁剧疆`FUStaParams`骞惰皟鐢╜staProcess(params)`
+ FUStaParams params = new FUStaParams.Builder()
+ .setStreamMode(1)// 1 娴佸紡妯″紡锛� 0 闈炴祦寮忔ā寮� 榛樿闈炴祦寮�
+ .setAudioData(data)// 闊抽鏁版嵁锛屾祦寮忔煡璇㈣姹傚彧鑳芥槸PCM
+ .setAudioType(FUAudioType.PCM)// 闊抽绫诲瀷 娴佸紡鏌ヨ鍙敮鎸乸cm 榛樿pcm
+ .setTimestamp(timestamp)// 鏃堕棿鎴虫暟鎹�
+ .setTimestampType(FUTimestampType.PHONE)// 鏃堕棿鎴崇被鍨嬶紝鍏蜂綋绫诲瀷瑕佹牴鎹椂闂存埑鐨勭被鍨嬫潵瀹�
+ .build();
+ mFUStaKit.staProcess(params);
+ ...
+
+ // 娴佸紡澶勭悊缁撴潫
+ mFUStaKit.notifyStaProcessFinish();
+
+
+ 澶囨敞锛�
+
+ 闊抽鏃堕棿鎴虫湁涓ょ绫诲瀷锛氶煶绱犳椂闂存埑鍜屾枃瀛楁椂闂存埑锛屽垎鍒搴� `FUTimestampType.PHONE` 鍜� `FUTimestampType.CHARACTER`锛屾湁鍏抽煶绱犳椂闂存埑鍜屾枃鏈椂闂存埑鐨勫尯鍒彲鍙傝�僠12. FUStaParams 鍙傛暟閰嶇疆绫籤閲岄潰瀵规椂闂存埑鐨勭ず渚嬨��
+
+ 璇ユ楠ゅ彲鍙傝�冮泦鎴怐emo涓殑绀轰緥浠g爜com.faceunity.fustademo.ui.TtsActivity.DataBakerTtsCallback銆�
+
+
+* **闈炴祦寮忛煶棰戯紝鏃犳椂闂存埑**
+
+ 閽堝闈炴祦寮忚繑鍥炵殑闊抽鏁版嵁涓旀棤鏃堕棿鎴崇殑鍦烘櫙`锛堟湁鏃堕棿鎴宠偗瀹氳閲囩敤鏃堕棿鎴虫柟寮忥紝鍥犱负鏃堕棿鎴虫煡璇㈡晥鐜囬珮锛屽彛鍨嬫洿绮惧噯锛塦锛屾敮鎸侀煶棰戠被鍨嬶細`pcm\wav`锛屾牴鎹煶棰戞暟鎹俊鎭煡璇㈠彛鍨嬬郴鏁帮紝鎾斁闊抽骞堕┍鍔ㄥ搴旂殑鍙e瀷銆�
+ 鏍规嵁鑳戒笉鑳芥彁渚涢煶棰戞暟鎹搴旂殑鏂囨湰`锛堝悗鏂囩粺涓�绉颁箣涓篈lignText锛塦鍒嗕负锛歚Align`鏂瑰紡 涓� `ASR` 鏂瑰紡銆�
+
+ 1銆乣ALIGN` 鏂瑰紡
+
+ `Align`鏂瑰紡鏌ヨ鍙e瀷绯绘暟鏄潬闊抽鏁版嵁鍜屼笌涔嬪搴旂殑AlignText锛屽湪闈炴祦寮忕殑鏌ヨ涓紝闊抽鏁版嵁鏄竴鏁存杩斿洖锛孉lignText鏄煶棰戝搴旂殑鏂囨湰锛宍Align`鏂瑰紡鏌ヨ閫熷害杈僠ASR`鏂瑰紡鏇村揩锛屼篃鍙互鏀寔楂樼骇鐨勫姩浣滆〃鎯呯殑瀹氬埗鍖栵紝浣嗘槸涔熸湁闄愬埗锛屼緥濡侫lignText涓嶆敮鎸佺箒浣撲腑鏂囥��
+
+ **绀轰緥浠g爜锛�**
+
+ // 鍙e瀷鏌ヨ銆侀煶棰戞挱鏀惧苟椹卞姩瀵瑰簲鍙e瀷锛岃繖娈垫槸鍗曟璋冪敤鐨�
+ FUStaParams params = new FUStaParams.Builder()
+ .setAudioData(data)// 闊抽鏁版嵁锛岄潪娴佸紡鏌ヨ鏀寔PCM鍜學AV
+ .setAudioType(FUAudioType.PCM)// 闊抽绫诲瀷 闈炴祦寮忔煡璇㈡敮鎸乸cm銆亀av 榛樿pcm
+ .setAlignText(align)// AlignText 娉ㄦ剰姝ゅ璁剧疆鐨勬槸鏁存鐨勬枃鏈�屼笉鏄笌璇ユ闊抽瀵瑰簲鐨勬枃鏈�
+ .setTimestampType(FUTimestampType.PHONE)// 鏃堕棿鎴崇被鍨嬶紝`ALIGN` 鏂瑰紡璁剧疆涓篳FUTimestampType.PHONE`
+ .build();
+ mFUStaKit.staProcess(params);
+
+ 澶囨敞锛�
+
+ 闊抽鏃堕棿鎴虫湁涓ょ绫诲瀷锛氶煶绱犳椂闂存埑鍜屾枃瀛楁椂闂存埑锛屽垎鍒搴� `FUTimestampType.PHONE` 鍜� `FUTimestampType.CHARACTER`锛屾湁鍏抽煶绱犳椂闂存埑鍜屾枃鏈椂闂存埑鐨勫尯鍒彲鍙傝�僠12. FUStaParams 鍙傛暟閰嶇疆绫籤閲岄潰瀵规椂闂存埑鐨勭ず渚嬨��
+
+ `setTimestampType(FUTimestampType.PHONE)`锛岄潪娴佸紡鏃犳椂闂存埑閲囩敤`ALIGN`鏂瑰紡鏌ヨ鍙e瀷绯绘暟锛宻dk鍐呴儴浼氭牴鎹煶棰戞暟鎹拰鐢熸垚鏁存闊抽鐨勬枃鏈绠楀嚭闊崇礌鏃堕棿鎴筹紝鏁卄setTimestampType(FUTimestampType.PHONE)`蹇呴』璁剧疆銆�
+
+ 璇ユ楠ゅ彲鍙傝�冮泦鎴怐emo涓殑绀轰緥浠g爜com.faceunity.fustademo.ui.SimpleActivity#sendText銆�
+
+ 2銆乣ASR` 鏂瑰紡
+
+ `ASR`鏂瑰紡鏌ヨ鍙e瀷绯绘暟鏄潬闊抽鏁版嵁锛宍ASR`鏂瑰紡鏌ヨ閫熷害杈冩參锛屽崟浣嶉煶棰戝鐞嗛�熷害绋嶈�楁椂锛� 鍗曚綅闊抽澶勭悊閫熷害涓嶅`ALIGN`鏂瑰紡锛屼絾鍐呴儴瀹炵幇浜嗛煶棰戝垎鍓叉彁楂樻晥鐜囥��
+
+ **绀轰緥浠g爜锛�**
+
+ // 鍙e瀷鏌ヨ銆侀煶棰戞挱鏀惧苟椹卞姩瀵瑰簲鍙e瀷锛岃繖娈垫槸鍗曟璋冪敤鐨�
+ FUStaParams params = new FUStaParams.Builder()
+ .setAudioData(data)// 闊抽鏁版嵁锛岄潪娴佸紡鏌ヨ鏀寔PCM鍜學AV
+ .setAudioType(FUAudioType.PCM)// 闊抽绫诲瀷 闈炴祦寮忔煡璇㈡敮鎸乸cm銆亀av 榛樿pcm
+ .setTimestampType(FUTimestampType.PHONE)// 鏃堕棿鎴崇被鍨嬶紝`ASR` 鏂瑰紡璁剧疆涓篳FUTimestampType.PHONE`
+ .build();
+ mFUStaKit.staProcess(params);
+
+ 澶囨敞锛�
+
+ 闊抽鏃堕棿鎴虫湁涓ょ绫诲瀷锛氶煶绱犳椂闂存埑鍜屾枃瀛楁椂闂存埑锛屽垎鍒搴� `FUTimestampType.PHONE` 鍜� `FUTimestampType.CHARACTER`锛屾湁鍏抽煶绱犳椂闂存埑鍜屾枃鏈椂闂存埑鐨勫尯鍒彲鍙傝�僠12. FUStaParams 鍙傛暟閰嶇疆绫籤閲岄潰瀵规椂闂存埑鐨勭ず渚嬨��
+
+ 闈炴祦寮忔棤鏃堕棿鎴抽噰鐢╜ASR`鏂瑰紡鏌ヨ鍙e瀷绯绘暟锛宻dk鍐呴儴浼氭牴鎹煶棰戞暟鎹绠楀嚭闊崇礌鏃堕棿鎴筹紝鏁卄setTimestampType(FUTimestampType.PHONE)`蹇呴』璁剧疆銆�
+
+ 璇ユ楠ゅ彲鍙傝�冮泦鎴怐emo涓殑绀轰緥浠g爜com.faceunity.fustademo.ui.SimpleActivity#sendText銆�
+
+* **闈炴祦寮忛煶棰戯紝鏈夋椂闂存埑**
+
+ 閽堝闈炴祦寮忚繑鍥炵殑闊抽鏁版嵁涓旀湁鏃堕棿鎴崇殑鍦烘櫙锛屾煡璇㈣�楁椂鏈�灏戯紝鏈夋椂闂存埑鏁版嵁浼樺厛閲囩敤鏃堕棿鎴虫柟寮忋�傛敮鎸侀煶棰戠被鍨嬶細`pcm\wav`锛屾牴鎹煶棰戞暟鎹俊鎭煡璇㈠彛鍨嬬郴鏁帮紝鎾斁闊抽骞堕┍鍔ㄥ搴旂殑鍙e瀷銆�
+
+ **绀轰緥浠g爜锛�**
+
+ // 鍙e瀷鏌ヨ銆侀煶棰戞挱鏀惧苟椹卞姩瀵瑰簲鍙e瀷
+ FUStaParams params = new FUStaParams.Builder()
+ .setAudioData(data)// 闊抽鏁版嵁锛岄潪娴佸紡鏌ヨ鏀寔PCM鍜學AV
+ .setAudioType(FUAudioType.PCM)// 闊抽绫诲瀷 闈炴祦寮忔煡璇㈡敮鎸乸cm銆亀av 榛樿pcm
+ .setTimestamp(timestamp)// 鏃堕棿鎴虫暟鎹�
+ .setTimestampType(FUTimestampType.PHONE)// 鏃堕棿鎴崇被鍨嬶紝`ASR` 鏂瑰紡璁剧疆涓篳FUTimestampType.PHONE`
+ .build();
+ mFUStaKit.staProcess(params);
+
+ 澶囨敞锛�
+
+ 闊抽鏃堕棿鎴虫湁涓ょ绫诲瀷锛氶煶绱犳椂闂存埑鍜屾枃瀛楁椂闂存埑锛屽垎鍒搴� `FUTimestampType.PHONE` 鍜� `FUTimestampType.CHARACTER`锛屾湁鍏抽煶绱犳椂闂存埑鍜屾枃鏈椂闂存埑鐨勫尯鍒彲鍙傝�僠12. FUStaParams 鍙傛暟閰嶇疆绫籤閲岄潰瀵规椂闂存埑鐨勭ず渚嬨��
+
+ 璇ユ楠ゅ彲鍙傝�冮泦鎴怐emo涓殑绀轰緥浠g爜com.faceunity.fustademo.ui.SimpleActivity#sendText銆�
+
+
+* **璁剧疆鍐呴儴鎾斁鍣ㄦ挱鏀剧姸鎬佹帴鍙�**
+
+ 浠ヤ笂鏂瑰紡鍧囬噰鐢ㄥ唴閮ㄦ挱鏀惧櫒鎾斁闊抽锛孲DK鍐呴儴鎾斁鐘舵�佺殑鎺ュ彛涓篳OnStaPlayerListener`;
+
+ 鏂规硶锛歚setStaPlayerListener(OnStaPlayerListener listener)`锛屾柟娉曚紶鍏ュ弬鏁颁富瑕佹槸`OnStaPlayerListener`銆�
+
+ **绀轰緥浠g爜锛�**
+
+ mFUStaKit.setStaPlayerListener(new OnStaPlayerListener() {
+ @Override
+ public void onPrepared() {
+ // 鎾斁寮�濮�
+ }
+
+ @Override
+ public void onCompleted() {
+ // 鎾斁缁撴潫
+ }
+
+ @Override
+ public void onCancel() {
+ // 鎾斁鍙栨秷
+ }
+
+ @Override
+ public void onError(@Nullable String message) {
+ // 鎾斁鍑洪敊
+ }
+ });
+
+ 澶囨敞锛�
+
+ 璇ユ楠ゅ彲鍙傝�冮泦鎴怐emo涓殑绀轰緥浠g爜[AvatarDataFactory.java: Lines 98-105](../app/src/main/java/com/faceunity/fustademo/data/AvatarDataFactory.java#L98-L105)
+
+
+#### 鑷畾涔夋挱鏀惧櫒鎾姤
+
+ 鐢ㄦ埛鑷畾涔夋挱鏀惧櫒鎾姤锛屽厛鏌ヨ鍙e瀷绯绘暟锛屾煡璇㈠畬鎴愭垨鑰呴娈垫煡璇㈠畬鎴愬嵆鍙互寮�濮嬭嚜瀹氫箟鐨勬挱鏀惧櫒鎾斁锛岀劧鍚庨�氳繃`OnExternalPlayerListener`鎺ュ彛鐨刞updateCurrentPosition()`杩斿洖鎾斁杩涘害缁橲DK,
+ SDK鎷垮埌鎾斁杩涘害椹卞姩瀵瑰簲鐨勫彛鍨嬶紝鍏蜂綋姝ラ涓猴細
+
+#### 1銆佽嚜瀹氫箟鎾斁鍣ㄦ煡璇�
+
+ `鑷畾涔夋挱鏀惧櫒鎾姤`鏌ヨ鏂规硶涓巂鍐呯疆鎾斁鍣ㄦ挱鎶涓嶅悓锛屼笉杩嘸FUStaParams`鍙傛暟璁剧疆鏂瑰紡閮戒竴鑷淬�傝繖閲岀畝鍗曞垪涓綻娴佸紡鏃堕棿鎴虫煡璇鍜宍闈炴祦寮忔椂闂存埑鏌ヨ`涓ょ鏂瑰紡銆�
+
+###### 娴佸紡鏃堕棿鎴虫煡璇�
+
+ 閽堝娴佸紡杩斿洖鐨勯煶棰戞暟鎹笖鏈夋椂闂存埑鐨勫満鏅紝鏌ヨ鑰楁椂鏈�灏戯紝鏈夋椂闂存埑鏁版嵁浼樺厛閲囩敤鏃堕棿鎴虫柟寮忋�傛敮鎸侀煶棰戠被鍨嬶細`pcm`锛屾牴鎹煶棰戞暟鎹俊鎭煡璇㈠彛鍨嬬郴鏁帮紝鎾斁闊抽骞堕┍鍔ㄥ搴旂殑鍙e瀷銆�
+
+ **绀轰緥浠g爜锛�**
+
+ // 娴佸紡澶勭悊寮�濮�
+ mFUStaKit.notifyStaProcessStart();
+
+ ...
+ // 鍙e瀷鏌ヨ銆侀煶棰戞挱鏀惧苟椹卞姩瀵瑰簲鍙e瀷锛岃繖娈垫槸澶氭璋冪敤鐨勶紝鍗虫瘡娆℃湁娴佸紡闊抽杩斿洖閮戒細閲嶆柊璁剧疆`FUStaParams`骞惰皟鐢╜staProcess(params)`
+ FUStaParams params = new FUStaParams.Builder()
+ .setStreamMode(1)// 1 娴佸紡妯″紡锛� 0 闈炴祦寮忔ā寮� 榛樿闈炴祦寮�
+ .setAudioType(FUAudioType.PCM)// 闊抽绫诲瀷 娴佸紡鏌ヨ鍙敮鎸乸cm 榛樿pcm
+ .setTimestamp(timestamp)// 鏃堕棿鎴虫暟鎹�
+ .setTimestampType(FUTimestampType.PHONE)// 鏃堕棿鎴崇被鍨嬶紝鍏蜂綋绫诲瀷瑕佹牴鎹椂闂存埑鐨勭被鍨嬫潵瀹�
+ .build();
+ mFUStaKit.staProcessNoPlayer(params);
+ ...
+
+ // 娴佸紡澶勭悊缁撴潫
+ mFUStaKit.notifyStaProcessFinish();
+
+
+ 澶囨敞锛�
+
+ 闊抽鏃堕棿鎴虫湁涓ょ绫诲瀷锛氶煶绱犳椂闂存埑鍜屾枃瀛楁椂闂存埑锛屽垎鍒搴� `FUTimestampType.PHONE` 鍜� `FUTimestampType.CHARACTER`锛屾湁鍏抽煶绱犳椂闂存埑鍜屾枃鏈椂闂存埑鐨勫尯鍒彲鍙傝�僠12. FUStaParams 鍙傛暟閰嶇疆绫籤閲岄潰瀵规椂闂存埑鐨勭ず渚嬨��
+
+
+###### 闈炴祦寮忔椂闂存埑鏌ヨ
+
+ 閽堝闈炴祦寮忚繑鍥炵殑闊抽鏁版嵁涓旀湁鏃堕棿鎴崇殑鍦烘櫙锛屾煡璇㈣�楁椂鏈�灏戯紝鏈夋椂闂存埑鏁版嵁浼樺厛閲囩敤鏃堕棿鎴虫柟寮忋�傛敮鎸侀煶棰戠被鍨嬶細`pcm\wav`锛屾牴鎹煶棰戞暟鎹俊鎭煡璇㈠彛鍨嬬郴鏁帮紝鎾斁闊抽骞堕┍鍔ㄥ搴旂殑鍙e瀷銆�
+
+ **绀轰緥浠g爜锛�**
+
+ // 鍙e瀷鏌ヨ銆侀煶棰戞挱鏀惧苟椹卞姩瀵瑰簲鍙e瀷锛岃繖娈垫槸澶氭璋冪敤鐨勶紝鍗虫瘡娆℃湁娴佸紡闊抽杩斿洖閮戒細閲嶆柊璁剧疆`FUStaParams`骞惰皟鐢╜staProcess(params)`
+ FUStaParams params = new FUStaParams.Builder()
+ .setAudioType(FUAudioType.PCM)// 闊抽绫诲瀷 娴佸紡鏌ヨ鍙敮鎸乸cm 榛樿pcm
+ .setTimestamp(timestamp)// 鏃堕棿鎴虫暟鎹�
+ .setTimestampType(FUTimestampType.PHONE)// 鏃堕棿鎴崇被鍨嬶紝鍏蜂綋绫诲瀷瑕佹牴鎹椂闂存埑鐨勭被鍨嬫潵瀹�
+ .build();
+ mFUStaKit.staProcessNoPlayer(params);
+
+
+ 澶囨敞锛�
+
+ 闊抽鏃堕棿鎴虫湁涓ょ绫诲瀷锛氶煶绱犳椂闂存埑鍜屾枃瀛楁椂闂存埑锛屽垎鍒搴� `FUTimestampType.PHONE` 鍜� `FUTimestampType.CHARACTER`锛屾湁鍏抽煶绱犳椂闂存埑鍜屾枃鏈椂闂存埑鐨勫尯鍒彲鍙傝�僠12. FUStaParams 鍙傛暟閰嶇疆绫籤閲岄潰瀵规椂闂存埑鐨勭ず渚嬨��
+ 璇ユ楠ゅ彲鍙傝�冮泦鎴怐emo涓殑绀轰緥浠g爜锛歝om.faceunity.fustademo.ui.SongActivity.SongSelectedListener#play銆�
+
+
+#### 2銆佽缃甋DK鍙e瀷鏌ヨ鐘舵�佹帴鍙�
+
+ 鍦╜1銆佽嚜瀹氫箟鎾斁鍣ㄦ煡璇涓煡璇㈠彛鍨嬬郴鏁版暟鎹紝鏃犺娴佸紡鏌ヨ杩樻槸闈炴祦寮忔煡璇紝鎴戜滑閮借兘澶熼�氳繃`OnStaProcessListener`鎺ュ彛鑾峰緱鏌ヨ涓�娆″彛鍨嬬郴鏁版暟鎹殑鍥炶皟锛�
+ 鏈変釜杩欎釜鍥炶皟锛屾垜浠彲浠ヨ涓虹幇鍦⊿DK鍐呴儴宸茬粡鏈夊彛鍨嬬郴鏁扮殑缂撳瓨浜嗭紝杩欐椂鍊欏氨鍙互寮�濮嬭嚜瀹氫箟鎾斁鍣ㄧ殑鎾斁銆�
+
+ **绀轰緥浠g爜锛�**
+
+ mFUStaKit.setStaProcessListener(new OnStaProcessListener() {
+ @Override
+ public void onStaProcess(FUAudioProgressType audioProgressType, byte[] date) {
+ // 浼唬鐮�
+ CustomPlayer.startPlay();
+ }
+ });
+
+ 澶囨敞锛�
+
+ 瀵逛簬娴佸紡鏌ヨ锛屾垜浠彲浠ュ湪璇ユ鏌ヨ棣栨`onStaProcess()`鏂规硶鍥炶皟鏃惰皟鐢ㄥ閮ㄦ挱鏀惧櫒鐨勬挱鏀炬柟娉曪紱瀵逛簬闈炴祦寮忔煡璇紝鎴戜滑鍙互鍦╜onStaProcess()`鏂规硶鍥炶皟鏃惰皟鐢ㄥ閮ㄦ挱鏀惧櫒鐨勬挱鏀炬柟娉曘��
+ `onStaProcess()`鏂规硶鍥炶皟鍦ㄩ潪UI绾跨▼銆�
+
+
+#### 3銆佸閮ㄦ挱鏀惧櫒鎾斁鐘舵�佸悓姝�
+
+ 鍦╜2銆佽缃甋DK鍙e瀷鏌ヨ鐘舵�佹帴鍙鎴戜滑閫氳繃`OnStaProcessListener`鎺ュ彛鐭ラ亾浜嗚嚜瀹氫箟鎾斁鍣ㄧ殑鎾斁鏃舵満锛屾帴涓嬫潵杩涜澶栭儴鎾斁鍣ㄥ拰SDK鐨勭姸鎬佸悓姝ユ墠鑳介┍鍔ㄥ彛鍨嬨��
+
+* **鑷畾涔夋挱鏀惧櫒鎾姤鐘舵�佸悓姝�**
+
+ 澶栭儴鎾斁鍣ㄦ挱鏀剧殑鐘舵�乣is playing`闇�瑕佸悜SDK鍚屾锛孲DK鍙湁鎺ユ敹鍒癭playing`淇″彿鎵嶈涓哄閮ㄦ挱鏀惧櫒寮�濮嬫挱鏀撅紝杩涜�屾牴鎹挱鏀捐繘搴﹂┍鍔ㄥ彛鍨嬨��
+
+ CustomPlayer.startPlay() // 澶栭儴鎾斁鍣ㄦ挱鏀撅紙浼唬鐮侊級
+ mFUStaKit.onExternalPlayerStart(); // 鎾斁鍣ㄦ挱鏀撅紝閫氱煡SDK鎾斁鍣ㄧ姸鎬侊細playing
+
+ CustomPlayer.pause(); // 澶栭儴鎾斁鍣ㄦ殏鍋滐紙浼唬鐮侊級
+ mFUStaKit.onExternalPlayerStop(); // 鎾斁鍣ㄦ殏鍋滐紝閫氱煡SDK鎾斁鍣ㄧ姸鎬侊細no playing
+
+ CustomPlayer.resume(); // 澶栭儴鎾斁鍣ㄦ仮澶嶆挱鏀撅紙浼唬鐮侊級
+ mFUStaKit.onExternalPlayerStart(); // 鎾斁鍣ㄥ鎾斁锛岄�氱煡SDK鎾斁鍣ㄧ姸鎬侊細playing
+
+ CustomPlayer.stop(); // 澶栭儴鎾斁鍣ㄥ仠姝㈡挱鏀撅紙浼唬鐮侊級
+ mFUStaKit.onExternalPlayerStop(); // 鎾斁鍣ㄥ仠姝㈡挱鏀撅紝閫氱煡SDK鎾斁鍣ㄧ姸鎬侊細no playing
+
+ 澶囨敞锛�
+
+* **鑷畾涔夋挱鏀惧櫒鎾姤杩涘害鍚屾**
+
+ 澶栭儴鎾斁鍣ㄦ挱鏀剧殑杩涘害閫氳繃`OnExternalPlayerListener`鐨刞updateCurrentPosition()`鍚屾鎾斁杩涘害缁橲DK锛孲DK鎺ユ敹鍒癭playing`淇″彿鏍规嵁鎾斁杩涘害椹卞姩鍙e瀷銆�
+
+ **绀轰緥浠g爜锛�**
+
+ mFUStaKit.setExternalPlayerListener(new OnExternalPlayerListener() {
+ @Override
+ public long updateCurrentPosition() {
+ return position;
+ }
+ });
+
+ 澶囨敞锛氳姝ラ鍙弬鑰冮泦鎴怐emo涓殑绀轰緥浠g爜锛歔AvatarDataFactory.java: Lines 195-202](../app/src/main/java/com/faceunity/fustademo/data/AvatarDataFactory.java#L195-L202)銆�
+
+
+### 7. Align鏂瑰紡TAG鏍囩鍔熻兘
+
+ 楂樼骇鐢ㄦ硶锛岄�氳繃閰嶇疆`鏍囩鏄犲皠琛╜鍜屽湪AlignText涓缃浐瀹氭爣璁颁綅锛屾挱鏀捐繃绋嬩腑鐢ㄦ潵绮剧‘鎺у埗褰㈣薄鍔ㄤ綔琛屼负鐨勮兘鍔涳紝鏀寔娴佸紡鍜岄潪娴佸紡銆�
+
+ 涓昏姝ラ濡備笅锛�
+
+#### 1銆侀厤缃爣绛炬槧灏勮〃
+
+ `鏍囩鏄犲皠琛╜锛屼互JSON琛ㄧず锛孞SON涓瓧娈典笉鍙殢鎰忔洿鏀�
+
+ 鏂规硶锛歚setAlignTagConfig(String tagConfig, String defaultAnimation)`锛�
+ 鏂规硶浼犲叆鍙傛暟涓昏鏄痐tagConfig`锛氭爣绛炬槧灏勮〃锛沗defaultAnimation`锛氭爣绛惧姩浣滄挱鏀惧畬姣曚細鍒囨崲鍒扮殑鍔ㄤ綔璺緞銆�
+
+ **绀轰緥浠g爜锛�**
+
+ JSON:
+ {
+ "tag": "#%娆㈣繋#%",// 瀵瑰簲鏍囩锛屽搴斿�间负鍥哄畾鏍煎紡鐨勫瓧娈碉紝鎴戜滑瑙勫畾鐨勬爣绛炬牸寮忥細`#%瀛楃#%`锛�
+ "emotion": "welcome emotion path",// 瀵瑰簲琛ㄦ儏bs璺緞锛屽姩鎬佸垏鎹㈣〃鎯�
+ "animation": "sta/animation/STA_anim_real_def_chuchu_v3_huanying.bundle"// 瀵瑰簲鍔ㄤ綔璺緞锛屽搴斿�间负鍔ㄤ綔鐨勭粷瀵硅矾寰勩��
+ },
+ {
+ "tag": "#%鍗曟墜寮鸿皟#%",
+ "animation": "sta/animation/STA_anim_real_def_chuchu_v3_danshouqiangdiao.bundle"
+ },
+ {
+ "tag": "#%鎸囧紩璧�#%",
+ "animation": "sta/animation/STA_anim_real_def_chuchu_v3_zhiyinzou.bundle"
+ },
+ {
+ "tag": "#%姣斿績#%",
+ "emotion": "default emotion path",
+ "animation": "sta/animation/STA_anim_real_def_chuchu_v3_bixin.bundle"
+ }
+
+ // 鏇存柊鏍囩閰嶇疆琛�
+ mFUStaKit.setAlignTagConfig(JSON, defaultAnimation);
+
+ 澶囨敞锛�
+
+ `setAlignTagConfig`蹇呴』瑕佷紶鍏defaultAnimation`榛樿鍔ㄧ敾锛屾墽琛屽畬鏍囩鍔ㄤ綔鍚庝細寰幆鎵ц`defaultAnimation`鍔ㄧ敾銆�
+
+
+#### 2銆佽缃瓵lignText
+
+ 閫氳繃璇ユ枃鏈彃鍏鏍囩鏄犲皠琛╜涓厤缃殑鏍囩锛屽悗缁煶棰戦┍鍔ㄦ椂闊抽鎾斁鍒版彃鍏ユ爣绛惧叧閿瓧鏃跺氨浼氬垏鎹㈣鏍囩鍖归厤鐨勫姩浣滃拰琛ㄦ儏銆�
+
+ **绀轰緥浠g爜锛�**
+
+ 闊抽鎾斁鍐呭锛�"澶у濂絶鎴戞槸灏忕帀銆備笅闈㈢敱鎴戞潵浠嬬粛涓�涓嬪叕鍙革細鎴戜滑涓撴敞浜庢櫤鑳藉浘褰㈢殑鍒涙柊涓庡簲鐢紝涓虹Щ鍔ㄤ簰鑱旂綉鎻愪緵3D鍐呭鐢熸垚涓庝簰鍔ㄧ殑琛屼笟瑙e喅鏂规銆傝嚧鍔涗簬灏嗗ソ鑾卞潪鐢靛奖绾х殑鐗规晥鎶�鏈湪娑堣垂绾у簲鐢ㄤ腑鐨勬櫘鍙娿��";
+ AlignText锛�"澶у濂絶鎴戞槸灏忕帀銆備笅闈㈢敱鎴戞潵#%娆㈣繋#%浠嬬粛涓�涓嬪叕鍙革細#%鍗曟墜寮鸿皟#%鎴戜滑涓撴敞浜庢櫤鑳藉浘褰㈢殑鍒涙柊涓庡簲鐢紝#%鎸囧紩璧�#%涓虹Щ鍔ㄤ簰鑱旂綉鎻愪緵3D鍐呭鐢熸垚涓庝簰鍔ㄧ殑琛屼笟瑙e喅鏂规銆�#%姣斿績#%鑷村姏浜庡皢濂借幈鍧炵數褰辩骇鐨勭壒鏁堟妧鏈湪娑堣垂绾у簲鐢ㄤ腑鐨勬櫘鍙娿��";
+
+ FUStaParams params = new FUStaParams.Builder()
+ .setStreamMode(1)// 1 娴佸紡妯″紡锛� 0 闈炴祦寮忔ā寮� 榛樿闈炴祦寮�
+ .setAudioData(data)// 闊抽鏁版嵁锛屾祦寮忔煡璇㈣姹傚彧鑳芥槸PCM
+ .setAudioType(FUAudioType.PCM)// 闊抽绫诲瀷 娴佸紡鏌ヨ鍙敮鎸乸cm 榛樿pcm
+ .setAlignText(align)// AlignText 娉ㄦ剰姝ゅ璁剧疆鐨勬槸鏁存鐨勬枃鏈�屼笉鏄笌璇ユ闊抽瀵瑰簲鐨勬枃鏈�
+ .setTimestampType(FUTimestampType.PHONE)// 鏃堕棿鎴崇被鍨嬶紝`ALIGN` 鏂瑰紡璁剧疆涓篳FUTimestampType.PHONE`
+ .build();
+ mFUStaKit.staProcess(params);
+
+ 澶囨敞锛�
+
+ 涓婅堪绀轰緥涓紝鎾斁鍐呭鏃讹紝浼氬湪鈥滄潵鈥濆叧閿瓧鍒囨崲#%娆㈣繋#%瀵瑰簲鐨勨�淪TA_anim_real_def_chuchu_v3_huanying.bundle鈥濆姩浣滃拰瀵瑰簲琛ㄦ儏銆�
+ 鈥滅浉鈥濆叧閿瓧鍒囨崲#%鍗曟墜寮鸿皟#%瀵瑰簲鐨勨�淪TA_anim_real_def_chuchu_v3_danshouqiangdiao.bundle鈥濆姩浣滃拰瀵瑰簲琛ㄦ儏銆傚悗缁幇璞″潎涓鸿鍒版墍鎻掑叆鏍囩鍏抽敭瀛楁椂鍒囨崲瀵瑰簲鍔ㄤ綔鍜屽搴旇〃鎯呫��
+ 鏈�鍚庢挱鏀锯�滆嚧鍔涗簬鈥濆叧閿瓧涔嬪墠鍒囨崲#%姣斿績#%瀵瑰簲鐨勫姩浣滃拰琛ㄦ儏锛屾鏃堕煶棰戞挱鏀惧畬鎴愬姩浣滆繕娌℃挱鏀惧畬鎴愮殑璇濅篃浼氱户缁挱鏀惧姩浣滐紝绛夊姩浣滄挱鏀惧畬姣曚細鍒囨崲鍒伴粯璁ゅ姩浣溿��
+
+
+### 8. Avatar鍔ㄧ敾鍒囨崲鍔熻兘
+
+ Avatar鍒囨崲骞舵挱鏀惧叾鏀寔鐨勫姩鐢伙紝鏀寔鍗曟鎾斁鍜屽惊鐜挱鏀撅紝鏀寔澶氶亾鍏峰拰澶氶亾鍏峰姩浣滃拰Avatar鍔ㄧ敾鍚屾椂鎵ц銆�
+
+* **寰幆鎾斁鍔ㄧ敾**
+
+ 鏂规硶锛歚playAnimation(String path, String[] prop, String[] propAnimation)`
+
+ 鏂规硶浼犲叆鍙傛暟锛�
+ `path`锛欰vatar瑕佸垏鎹㈢殑鐩爣鍔ㄧ敾鐨勮矾寰勩��
+ `prop`锛欰vatar瑕佸姞杞界殑閬撳叿鐨勮矾寰勬暟缁勶紝缂虹渷鍙傛暟銆�
+ `propAnimation`锛欰vatar瑕佸姞杞界殑閬撳叿鍔ㄤ綔鐨勮矾寰勬暟缁勶紝缂虹渷鍙傛暟锛岀己鐪佸弬鏁般��
+
+ **绀轰緥浠g爜锛�**
+
+ // 鍒囨崲鍔ㄤ綔
+ mFUStaKit.playAnimation(animPath, prop, propAnimation);
+ 鎴�
+ mFUStaKit.playAnimation(animPath);
+
+ 澶囨敞锛�
+
+ 璇ユ楠ゅ彲鍙傝�冮泦鎴怐emo涓殑绀轰緥浠g爜锛歔AvatarDataFactory.java: Lines 290-305](../app/src/main/java/com/faceunity/fustademo/data/AvatarDataFactory.java#L290-L305)銆�
+
+
+* **鎾斁鍗曟鍔ㄧ敾**
+
+ 鏂规硶锛歚playAnimationOnce(String path, String[] prop, String[] propAnimation)`
+
+ 鏂规硶浼犲叆鍙傛暟锛�
+ `path`锛欰vatar瑕佸垏鎹㈢殑鐩爣鍔ㄧ敾鐨勮矾寰勩��
+ `prop`锛欰vatar瑕佸姞杞界殑閬撳叿鐨勮矾寰勬暟缁勶紝缂虹渷鍙傛暟銆�
+ `propAnimation`锛欰vatar瑕佸姞杞界殑閬撳叿鍔ㄤ綔鐨勮矾寰勬暟缁勶紝缂虹渷鍙傛暟锛岀己鐪佸弬鏁般��
+
+ **绀轰緥浠g爜锛�**
+
+ // 鍒囨崲鍔ㄤ綔
+ mFUStaKit.playAnimationOnce(animPath, prop, propAnimation);
+ 鎴�
+ mFUStaKit.playAnimationOnce(animPath);
+
+ 澶囨敞锛�
+
+ 璇ユ楠ゅ彲鍙傝�冮泦鎴怐emo涓殑绀轰緥浠g爜锛歔AvatarDataFactory.java: Lines 290-305](../app/src/main/java/com/faceunity/fustademo/data/AvatarDataFactory.java#L290-L305)銆�
+
+
+### 9. Avatar琛ㄦ儏鍒囨崲鍔熻兘
+
+ Avatar鍒囨崲琛ㄦ儏锛屾敮鎸丼DK鍐呯疆琛ㄦ儏鍜岃嚜瀹氫箟琛ㄦ儏銆�
+
+* **鍒囨崲SDK鍐呯疆琛ㄦ儏**
+
+ 鏂规硶锛歚updateEmotion(FUEmotionType emotionType, int fpsNum)`
+
+ 鏂规硶浼犲叆鍙傛暟锛�
+ `FUEmotionType`锛歋DK鏀寔鐨勫唴缃〃鎯呯殑鏋氫妇銆�
+ `fpsNum`锛氳繃娓″抚锛屽綋鍓嶈〃鎯呭垏鎹㈠埌鐩爣琛ㄦ儏鐨勫抚鏁帮紝榛樿涓�0锛岀己鐪佸弬鏁般��
+
+ **绀轰緥浠g爜锛�**
+
+ // 鍒囨崲鍔ㄤ綔
+ mFUStaKit.updateEmotion(emotionType, 5);
+ 鎴�
+ mFUStaKit.updateEmotion(emotionType);
+
+ 澶囨敞锛�
+
+ `FUEmotionType`璇︾粏浠嬬粛璇峰弬鑰僠13. FUEmotionType SDK鏀寔鐨勫唴缃〃鎯呯殑鏋氫妇`銆�
+
+ 璇ユ楠ゅ彲鍙傝�冮泦鎴怐emo涓殑绀轰緥浠g爜锛歔AvatarDataFactory.java: Lines 392-400](../app/src/main/java/com/faceunity/fustademo/data/AvatarDataFactory.java#L392-L400)銆�
+
+* **鍒囨崲SDK鑷畾涔夎〃鎯�**
+
+ 鏂规硶锛歚updateCustomEmotion(String path, int fpsNum)`
+
+ 鏂规硶浼犲叆鍙傛暟锛�
+ `path`锛氳嚜瀹氫箟琛ㄦ儏bs鏂囦欢璺緞銆�
+ `fpsNum`锛氳繃娓″抚锛屽綋鍓嶈〃鎯呭垏鎹㈠埌鐩爣琛ㄦ儏鐨勫抚鏁帮紝榛樿涓�0锛岀己鐪佸弬鏁般��
+
+ **绀轰緥浠g爜锛�**
+
+ // 鍒囨崲鍔ㄤ綔
+ mFUStaKit.updateCustomEmotion(animPath, 5);
+ 鎴�
+ mFUStaKit.updateCustomEmotion(animPath);
+
+ 澶囨敞锛�
+
+ 璇ユ楠ゅ彲鍙傝�冮泦鎴怐emo涓殑绀轰緥浠g爜锛歔AvatarDataFactory.java: Lines 392-400](../app/src/main/java/com/faceunity/fustademo/data/AvatarDataFactory.java#L392-L400)銆�
+
+
+### 10. 甯哥敤鏂规硶
+
+* **璁剧疆3D鎶楅敮榻块厤缃�**
+
+ 璁剧疆鎶楅敮榻匡紝鍑忓皯娓叉煋鐨勯敮榻挎劅銆�
+
+ **绀轰緥浠g爜锛�**
+
+ mFUStaKit.setMultiSamples(int samples);// samples榛樿涓�4
+
+
+* **璁剧疆娓叉煋甯х巼**
+
+ 璁剧疆娓叉煋甯х巼銆�
+
+ **绀轰緥浠g爜锛�**
+
+ mFUStaKit.setRenderFPS(int renderFPS);// renderFPS榛樿30
+
+
+* **SDK onResume()**
+
+ 涓巗dk onPause()鎴愬鍑虹幇锛屽搴擜ctivity onResume()鍑忓皯涓嶅繀瑕佺殑娓叉煋浠庤�屾彁楂樻�ц兘锛涢潪蹇呴渶璋冪敤锛屽彲涓嶈缃鏂规硶銆�
+
+ **绀轰緥浠g爜锛�**
+
+ mFUStaKit.onResume();
+
+
+* **SDK onPause()**
+
+ 涓巗dk onResume()鎴愬鍑虹幇锛屽搴擜ctivity onPause()鍑忓皯涓嶅繀瑕佺殑娓叉煋浠庤�屾彁楂樻�ц兘锛涢潪蹇呴渶璋冪敤锛屽彲涓嶈缃鏂规硶銆�
+
+ **绀轰緥浠g爜锛�**
+
+ mFUStaKit.onPause();
+
+
+* **SDK onDestroy()**
+
+ Activity onDestroy()璋冪敤銆�
+
+ **绀轰緥浠g爜锛�**
+
+ mFUStaKit.onDestroy();
+
+
+* **Avatar鏇存柊鑳屾櫙**
+
+ 鏀寔鑳屾櫙閬撳叿鏇存柊銆傚弬鏁�: 鑳屾櫙閬撳叿鐨勭粷瀵硅矾寰勩��
+
+ **绀轰緥浠g爜锛�**
+
+ mFUStaKit.setBackground(String background);// 鑳屾櫙鍒囨崲锛屽弬鏁颁负鑳屾櫙閬撳叿璺緞
+
+
+* **Avatar鍏夌収鏇存柊**
+
+ 鏀寔鍏夌収閬撳叿鏇存柊銆傚弬鏁�: 鐏厜閬撳叿鐨勭粷瀵硅矾寰勩��
+
+ **绀轰緥浠g爜锛�**
+
+ mFUStaKit.setLight(String light);// 鏇存柊鍏夌収锛屽弬鏁颁负鐏厜閬撳叿璺緞
+
+
+* **Avatar鐩告満浣嶆洿鏂�**
+
+ 鏀寔鐩告満浣嶉亾鍏锋洿鏂般�傚弬鏁�: 鐩告満浣嶉亾鍏风殑缁濆璺緞銆�
+
+ **绀轰緥浠g爜锛�**
+
+ mFUStaKit.setCamera(String camera);// 鏇存柊鐩告満浣嶏紝鍙傛暟涓虹浉鏈洪亾鍏疯矾寰�
+
+
+* **Avatar寮�鍚槾褰�**
+
+ 鏀寔寮�鍚槾褰便��
+
+ **绀轰緥浠g爜锛�**
+
+ mFUStaKit.enableShadow(String enableShadow);// 鏄惁寮�鍚槾褰�
+
+
+* **Avatar寮�鍚槾褰辨姉閿娇**
+
+ 寮�鍚槾褰辨姉閿娇銆�
+
+ **绀轰緥浠g爜锛�**
+
+ mFUStaKit.setShadowPCFLevel(int level);// 闃村奖閿娇绠楁硶绾у埆
+
+
+* **璁剧疆Avatar浣嶇疆**
+
+ 璁剧疆瑙掕壊鍦ㄤ笁缁寸┖闂寸殑浣嶇疆锛屽弬鏁�:
+ x锛歞ouble X杞村潗鏍� 涓�鑸皟鏁磋寖鍥� -200.0~200.0
+ y锛歞ouble Y杞村潗鏍� 涓�鑸皟鏁磋寖鍥� -600.0~800.0
+ z锛歞ouble Z杞村潗鏍� 涓�鑸皟鏁磋寖鍥� -3000.0~600.0
+
+ **绀轰緥浠g爜锛�**
+
+ mFUStaKit.setPosition(x锛寉, z);
+
+
+* **鏃嬭浆褰㈣薄**
+
+ 鏃嬭浆瑙掕壊锛屽弬鏁�:double 琛ㄧず鏃嬭浆澧為噺锛屼竴鑸皟鏁磋寖鍥� -1.0~1.0锛屾晥鏋滀负鏃嬭浆
+
+ **绀轰緥浠g爜锛�**
+
+ mFUStaKit.setRotDelta(val) // 鏃嬭浆瑙掕壊
+
+
+* **缂╂斁褰㈣薄**
+
+ 缂╂斁瑙掕壊锛屽弬鏁�:double 琛ㄧず缂╂斁澧為噺锛屼竴鑸皟鏁磋寖鍥� -1.0~1.0锛屾晥鏋滀负缂╂斁
+
+ **绀轰緥浠g爜锛�**
+
+ mFUStaKit.setScaleDelta(val) // 缂╂斁瑙掕壊
+
+
+* **涓婁笅绉诲姩褰㈣薄**
+
+ 涓婁笅绉诲姩瑙掕壊锛屽弬鏁�:double 琛ㄧず涓婁笅澧為噺锛屼竴鑸皟鏁磋寖鍥� -1.0~1.0锛屾晥鏋滀负涓婁笅绉诲姩
+
+ **绀轰緥浠g爜锛�**
+
+ mFUStaKit.setTranslateDelta(val) // 涓婁笅绉诲姩瑙掕壊
+
+
+* **璁剧疆鏃嬭浆瑙掑害**
+
+ 璁剧疆鏃嬭浆瑙掑害锛屽弬鏁�:float 琛ㄧず鏃嬭浆瑙掑害锛屾晥鏋滀负鏃嬭浆
+
+ **绀轰緥浠g爜锛�**
+
+ mFUStaKit.setRotate(val) // 璁剧疆鏃嬭浆瑙掑害
+
+
+* **Avatar鍔ㄧ敾鎭㈠鎾斁**
+
+ 鎭㈠鎾斁褰撳墠鍔ㄧ敾
+
+ **绀轰緥浠g爜锛�**
+
+ // 缁х画鎾斁褰撳墠鍔ㄧ敾
+ mFUStaKit.startCurrentAnimation();
+
+
+* **Avatar鍔ㄧ敾鏆傚仠鎾斁**
+
+ 鏆傚仠鎾斁褰撳墠鍔ㄧ敾
+
+ **绀轰緥浠g爜锛�**
+
+ // 鏆傚仠鎾斁褰撳墠鍔ㄧ敾
+ mFUStaKit.pauseCurrentAnimation();
+
+
+* **璁剧疆Avatar鍔ㄧ敾鐨勮繃娓℃椂闂�**
+
+ 鍔ㄧ敾鍒囨崲鏈変竴涓繃娓★紝姝ゆ柟娉曡缃姩浣滃垏鎹㈡椂锛屽師鍔ㄤ綔鍜屽垏鎹㈠姩浣滅殑杩囨浮鏃堕棿銆�
+ 鍙傛暟锛氳繃娓℃椂闂达紝鍗曚綅涓虹锛岄粯璁や负0.5
+
+ **绀轰緥浠g爜锛�**
+
+ // 璁剧疆鍔ㄤ綔鐨勮繃娓℃椂闂�
+ mFUStaKit.setAnimationTransitionTime(time);
+
+
+* **璁剧疆Avatar鍔ㄧ敾鐨勬挱鏀鹃�熷害**
+
+ 鍔ㄧ敾鍒囨崲鏈変竴涓繃娓★紝姝ゆ柟娉曡缃姩浣滄挱鏀剧殑閫熷害銆�
+ 鍙傛暟锛氭挱鏀鹃�熷害鎸′綅锛岃寖鍥�0.2-5.0锛岄粯璁や负1.0
+
+ **绀轰緥浠g爜锛�**
+
+ // 璁剧疆鍔ㄤ綔鐨勬挱鏀鹃�熷害
+ mFUStaKit.setAnimationSpeed(speed);
+
+
+ * **璁剧疆鏃ュ織鏄惁杈撳嚭鍒版枃浠�**
+
+ 璁剧疆SDK杈撳嚭鍒版寚瀹氭湰鍦扮洰褰曘��
+
+ **绀轰緥浠g爜锛�**
+ // 璁剧疆鏃ュ織杈撳嚭鐨勭洰褰曡矾寰�
+ mFUStaKit.setLogOutputDir(logcatDir)
+ // 璁剧疆鏃ュ織鏄惁杈撳嚭鍒版枃浠�
+ mFUStaKit.enableLogOutput(enable);
+
+
+### 11. 閿�姣� FUStaKit 瀹炰緥
+
+鍦ㄩ渶瑕侀攢姣丗UStaKit鏃讹紝閿�姣丼DK锛岄噴鏀惧唴瀛樿祫婧愩��
+
+**绀轰緥浠g爜锛�**
+
+```
+mFUStaKit().release();
+```
+
+### 12. FUStaParams 鍙傛暟閰嶇疆绫�
+
+`streamMode` : 1 娴佸紡妯″紡锛� 0 闈炴祦寮忔ā寮� 榛樿锛�0
+
+`splitSegmentSeconds` : 娴佸紡鍒嗗壊姣忔闂撮殧锛屽崟浣嶇 榛樿锛�2
+
+`audioData` : 闊抽鏁版嵁 绫诲瀷锛氬瓧鑺傛暟缁�
+
+`audioType` : 闊抽绫诲瀷 `FUAudioType.WAV`锛宍FUAudioType.PCM`锛岄粯璁�:`FUAudioType.PCM`
+
+`audioSampleRate` : 閲囨牱鐜� 榛樿锛�16K锛屽繀椤讳笌鍐呴儴鎾斁鍣ㄨ缃殑閲囨牱鐜囦竴鑷�
+
+`audioEncoding` : 閲囨牱绮惧害 榛樿锛�16
+
+`audioChannel` : 澹伴亾鏁� 榛樿锛� 1
+
+`alignText` : 闊抽瀵瑰簲鐨勬枃鏈�
+
+`timestamp` : 鏃堕棿鎴� 绫诲瀷锛歋tring 鐢ㄤ簬瀛樺湪鏃堕棿鎴崇殑鎯呭喌
+```
+鏃堕棿鎴虫牸寮忕ず渚�:
+0.000000 0.070000 sil
+0.070000 0.105000 n
+0.105000 0.165000 i
+0.165000 0.275000 h
+0.275000 0.452000 ao
+0.452000 0.802000 sil
+```
+姣忎釜闊崇礌浠ユ崲琛岀\n鍒嗚锛屾瘡琛屽唴瀹瑰垎鍒负:寮�濮嬫椂闂达紝缁撴潫鏃堕棿锛岄煶绱�
+
+`timestampType` 锛� 鏃堕棿鎴崇被鍨� 闊抽鏁版嵁绫诲瀷瀵瑰簲鐫�闊宠妭鏃堕棿鎴筹紝鏈変袱绉嶇被鍨嬶細闊崇礌銆佹枃瀛楁椂闂存埑鏍煎紡锛屽垎鍒搴� `FUTimestampType.PHONE` 銆� `FUTimestampType.CHARACTER` 榛樿锛欶UTimestampType.CHARACTER
+```
+闊崇礌绫诲瀷锛屾瘮濡傦細
+0.0 0.075 SIL
+0.075 0.185 c
+0.185 0.315 ong
+0.315 0.41 m
+0.41 0.509 ing
+0.509 0.594 t
+0.594 0.779 ian
+0.779 0.98399997 q
+0.98399997 1.189 i
+1.189 1.511 SIL
+
+
+鏂囨湰绫诲瀷锛屾瘮濡傦細
+0.000000 1.871000 SIL
+1.872000 2.056000 鎴�
+2.057000 2.248000 鐨�
+2.249000 2.444000 鐪�
+2.445000 2.993000 鐫�
+2.994000 3.313000 鏈�
+3.314000 3.680000 鍚�
+3.681000 4.130000 绐�
+4.131000 4.767000 澶�
+4.767000 4.967000 SIL
+```
+
+### 13. FUEmotionType SDK鏀寔鐨勫唴缃〃鎯呯殑鏋氫妇
+
+```
+NONE : 鏃犺〃鎯咃紝鐪ㄧ溂锛岃〃鎯呰窡闅忓姩鐢昏〃鎯�
+DYNAMIC_NORMAL : 姝e父琛ㄦ儏
+DYNAMIC_JOY : 鍔ㄦ�佸紑蹇�
+DYNAMIC_ANGER : 鍔ㄦ�佺敓姘�
+DYNAMIC_DISGUST : 鍔ㄦ�佸帉鎭�
+DYNAMIC_SURPRISE : 鍔ㄦ�佹儕璁�
+DYNAMIC_FEAR : 鍔ㄦ�佹亹鎯�
+DYNAMIC_TRUST : 鍔ㄦ�佷俊浠�
+DYNAMIC_SADNESS : 鍔ㄦ�佹偛浼�
+DYNAMIC_DOUBT : 鍔ㄦ�佺枒闂�
+```
+
+### 14. 甯歌闂
+
+* **濡備綍璁╄幏鍙栨棩蹇�**
+
+ 瑙g瓟:
+ 1. 鍦ㄥ垵濮嬪寲鍓嶈缃甡FUStaKit.setStaKitDebug(FUStaLogger.LogLevel.TRACE)`銆�
+ 2. 鍙e瀷闂鍙互鐢╜FUSTA_LOG`杩囨护锛屾覆鏌撻棶棰樺彲浠ョ敤`KIT_SDKController`杩囨护銆�
+
+* **褰㈣薄鍔犺浇澶辫触\鍔犺浇涓嶅嚭鏉�**
+
+ 瑙g瓟:
+ 1. 妫�鏌ヨ瘉涔︽槸鍚﹁繃鏈熴��
+ 2. 妫�鏌ヨ祫婧愭枃浠讹紙bundle锛夎矾寰勶紙缁濆璺緞锛夋槸鍚﹁缃纭��
+ 3. 妫�鏌ュ苟璋冩暣褰㈣薄浣嶇疆澶у皬銆�
+ 4. 妫�鏌UStaSDK鐗堟湰涓庤鍔犺浇鐨勮祫婧愭枃浠剁増鏈槸鍚﹀搴斻��
+
+* **褰㈣薄鏃犳硶椹卞姩鍙e瀷**
+
+ 瑙g瓟锛�
+ 1. 妫�鏌ヨ瘉涔︽槸鍚﹁繃鏈熴��
+ 2. 妫�鏌DK鍒濆鍖栬缃��
+ 3. 妫�鏌ュ舰璞¢┍鍔ㄥ彛鍨嬫柟娉曞弬鏁伴厤缃��
+ 4. 澶栭儴鎾斁鍣ㄦ槸鍚﹁缃簡寮�濮嬫挱鏀炬柟娉曟垨鑰呮湁娌℃湁璁剧疆鎾斁杩涘害銆�
+ 5. 濡傛灉浣跨敤浜哸sr鎴栬�卆lign鏂瑰紡锛屾鏌ユ槸鍚﹀姞杞戒簡鎵╁睍鏁版嵁鍖呫��
+ 6. 妫�鏌ョ洰鏍囨灦鏋勫拰SDK鎵�鏀寔鏋舵瀯鏄惁涓�鑷淬��
+ 7. 妫�鏌ユ槸鍚︽湁绗笁鏂瑰簱涓嶴DK鍐茬獊涓斿紑鍙戝仛浜嗕互涓嬫搷浣滐細鎵撳寘鏃剁Щ闄ら」鐩腑鐨勫簱鏂囦欢鎴栬缃尮閰嶅埌绗竴涓簱鏂囦欢銆�
+
+
+* **鍙e瀷涓嶅噯纭�**
+
+ 瑙g瓟锛�
+ 1. 妫�鏌ュ舰璞¢┍鍔ㄥ彛鍨嬫柟娉曞弬鏁伴厤缃��
+ 2. 澶栭儴鎾斁鍣ㄥ悓姝ュ埌SDK鐨勬挱鏀捐繘搴︿笉鍑嗙‘銆�
+
+* **鑳屾櫙閫忔槑**
+
+ 鏈変簺闇�姹傚満鏅笇鏈涘彲浠ュ疄鐜拌儗鏅�忔槑鐨勯渶姹傦紝鍙弬鑰冧互涓嬫柟寮忋��
+
+ 瑙g瓟锛�
+ 1. GLTextureView.setOpaque(false);
+ 2. mFUStaKit.setBackground(null);
+
+* **妯珫灞忓垏鎹�**
+
+ 瑙g瓟锛�
+ 1. 鍦ˋndroidManifest.xml涓厤缃瓵ctivity android:configChanges="orientation|screenSize"銆�
diff --git "a/STA\346\233\264\346\226\260\346\227\245\345\277\227.md" "b/STA\346\233\264\346\226\260\346\227\245\345\277\227.md"
new file mode 100644
index 0000000..68ca86c
--- /dev/null
+++ "b/STA\346\233\264\346\226\260\346\227\245\345\277\227.md"
@@ -0,0 +1,120 @@
+#### 2019.11.08
+
+**1.1.1**
+
+- 娣诲姞閴存潈鏂瑰紡锛岀洰鍓嶆敮鎸佸湪绾块壌鏉冦�乼ype1銆佺绾块壌鏉僼ype2
+- 浼樺寲sdk鍒濆鍖栨暟鎹寘鏂规硶
+- 鎻愰珮搴曞眰鏌ヨ閫熷害锛岄�傞厤澶氳澶囧舰璞″睍绀�
+- 鏇存柊褰㈣薄鍔ㄤ綔璧勬簮
+
+#### 2019.11.26
+
+**2.1.1**
+
+- 鏇存柊娣诲姞褰㈣薄鍔ㄤ綔璧勬簮
+- 鍒犻櫎鏃lign搴曞眰搴�
+- 娣诲姞褰㈣薄鏀寔鐗瑰畾鍏夌収bundle銆乥sconfigdata锛坆s绯绘暟锛�
+- 鏇存柊sta銆乻ta_lite搴曞眰搴�,鏈�浣庢敮鎸佸畨鍗�4.2鐗堟湰
+
+#### 2019.12.25
+
+**1.0**
+
+- 鍩轰簬2.1.1鏇存柊鐨勭ǔ瀹氱増鏈�
+- 淇娴佸紡鎾斁鍣╞ug
+- 鏇存崲controller銆乶ama銆侀粯璁ゅ厜鐓э紝鍗囩骇鍔ㄧ敾绯荤粺锛宑ontroller鍙鐢紝鏀寔璧勬簮鏁扮粍鍜岀嫭绔媋vatar璧勬簮鍔犺浇
+- 鏇存柊bs绯绘暟锛屾坊鍔燽s铻嶅悎
+- 鏀寔璧勬簮璺緞鍔犺浇鏂瑰紡锛歛ssets\sdcard
+
+#### 2020.01.15
+
+**1.1**
+
+- 淇鎾斁鍣╞ug
+- 鏇存柊搴曞眰搴擄紝sta搴撴敮鎸佹祦寮忔煡璇紝Align鏂瑰紡鏀寔娴佸紡鏌ヨ
+- 鏇挎崲浜嗘祦寮忔椂闂存埑鍜屾祦寮忛煶棰戦┍鍔ㄥ彛鍨嬬畻娉�
+- 鏀寔闀块煶棰戞寜鐓ч潤闊冲抚鍒嗗壊
+- 浼樺寲椹卞姩閫昏緫
+
+#### 2020.04.1
+
+**1.2**
+
+- 澧炲姞sdk鍒濆鍖栧洖璋�
+- 鏇存敼GLSurfaceView涓篏LTextureView,瀹屽叏鏀寔鑳屾櫙閫忔槑鏂规
+- 鏇存柊nama鍜宑ontroller,鏀寔鐗╃悊鍔ㄦ晥
+- 鏇存柊sta鍙e瀷搴撳拰鐩稿叧閰嶇疆鏂囦欢
+- 鎾斁鍣ㄦ柊澧瀋ancle()鍥炶皟
+- 鏂板鍔ㄧ敾鏆傚仠銆佹仮澶嶆挱鏀炬柟娉�
+
+#### 2020.06.9
+
+**1.2.1**
+
+- 鍐呴儴閫昏緫浼樺寲
+- 鏀寔鍔ㄦ�佸垏鎹㈣儗鏅痓undle鍜岃嚜瀹氫箟鑳屾櫙
+
+#### 2020.07.6
+
+**1.3**
+
+- 鏀寔浜咥lign妯″紡鐨勬爣绛惧姛鑳�
+- 鏀寔缁勫悎閬撳叿鍒囨崲
+- 鏀寔鍔ㄦ�侀槾褰遍亾鍏�
+- 鏀寔璁剧疆鍔ㄧ敾杩囨浮鏃堕棿
+
+#### 2020.01.20
+
+**1.4**
+
+- 鏇存柊sta鍙e瀷搴擄紝浼樺寲鍙e瀷
+- 鏇存柊CNama搴擄紝淇娓叉煋鐩稿叧bug
+- 鏂板鍔ㄦ�侀槾褰卞紑鍏�
+- 鏂板妯″瀷鏃嬭浆銆佺缉鏀俱�佷笂涓嬬Щ鍔ㄧ殑鏂规硶
+- 鏂板琛ㄦ儏杩囨浮寮�鍏筹紝鏇存柊琛ㄦ儏bs鏂囦欢
+- 浼樺寲鏃ュ織鍒嗙骇鎵撳嵃鍔熻兘
+- 浼樺寲鑳屾櫙閫忔槑鍜岃儗鏅垏鎹㈡晥鏋�
+- 浼樺寲浠g爜閫昏緫
+
+#### 2021.02.24
+
+**1.4.1**
+
+- 浼樺寲琛ㄦ儏鍒囨崲鍜岃〃鎯呰繃娓″姛鑳�
+- 浼樺寲鍙e瀷鎾姤鏁堟灉
+- 淇鍏朵粬宸茬煡闂
+
+#### 2021.04.23
+
+**1.5**
+
+- 饨�鎸佲緝瀹氫箟甯х巼
+- 饨�鎸佲緝瀹氫箟鍒嗚鲸鐜�
+- 饨�鎸佽繍饩忔椂淇敼鏍囩閰嶇疆琛�
+- 饨�鎸佽緭鍑篟GBABuffer鏁版嵁
+- 浼樺寲閫忔槑鑳屾櫙鎶楅敮饣晥鏋�
+- 浼樺寲澶氶亾鍏风粍鍚堟帴饧�
+- 淇饩冨畾涔夎儗鏅け鏁堢殑闂
+
+#### 2021.09.30
+
+**2.0**
+
+- 鏇存柊sta鍙e瀷搴�
+- 鍩轰簬Render-Kit缁勪欢娓叉煋
+- 鏇存柊閮ㄥ垎鏂规硶瀹氫箟
+- 饨�鎸佸姩鎬佹洿鏂版満浣�
+- 饨�鎸佸姩鎬佹洿鏂板厜鐓�
+
+#### 2022.01.21
+
+**2.1**
+
+- 浼樺寲CPU鎬ц兘浠ュ強鏌ヨ鏁堢巼
+- 鏂板鍔ㄧ敾鎾斁閫熷害鎺у埗鎺ュ彛
+- 鏇存柊BS绯绘暟57-47
+- 淇闈欓煶甯ч棶棰�
+- 饨�鏂板璁剧疆鏃嬭浆瑙掑害
+- 浼樺寲闃村奖閿娇绠楁硶
+- 澧炲姞璇︾粏鏃ュ織鎺ュ彛
+
diff --git a/duan.md b/duan.md
new file mode 100644
index 0000000..600b697
--- /dev/null
+++ b/duan.md
@@ -0,0 +1,54 @@
+ 寮�鍏虫満鐩掑瓙娴嬭瘯鎶ュ憡
+娴嬭瘯绱犳潗锛�
+
+鏃�
+
+娴嬭瘯鐩殑锛�
+
+纭18涓紑鍏虫満鐩掑瓙鏄惁姝e父寮�鍏虫満
+
+娴嬭瘯鏃堕棿锛�
+
+绗笁鎵癸細寮�濮嬫椂闂�2021-12-24
+ 缁撴潫鏃堕棿2021-12-30
+
+缁堢MAC鍦板潃锛�
+
+01锛�0025E1033D53
+02锛�0025E1033CF6
+03锛�0025E1033D00
+04锛�0025E1033D02
+05锛�0025E1033CF3
+06锛�0025E1033D72
+07锛�0025E1033D66
+08锛�0025E1033A8B
+09锛�0025E1033CF2
+10锛�0025E1033D5B
+11锛�0025E1033D6F
+12锛�0025E1033A61
+13锛�0025E1033D4A
+14锛�0025E1033D68
+15锛�0025E1033D67
+16锛�0025E1033CE4
+17锛�0025E1033D47
+18锛�0025E1033DA1
+
+娴嬭瘯杩囩▼锛�
+
+1銆� 灏�18鍙板紑鍏虫満鐩掑瓙鏃堕棿璁剧疆缁熶竴锛岀粺涓�鍕鹃�夊叧鏈烘椂娈靛唴涓婄數淇濇寔寮�鏈�
+鍛ㄤ竴鑷冲懆浜旓細08:15 鈥� 09:00
+ 09:10 鈥� 10:00
+ 10:10 鈥� 12:00
+ 12:10 鈥� 13:00
+ 13:10 鈥� 18:00
+ 鍛ㄥ叚鍏ㄥぉ寮�
+ 鍛ㄦ棩鍏ㄥぉ鍏�
+
+缁撴灉锛�18鍙板紑鍏虫満鐩掑瓙鍦ㄨ瀹氱殑鏃堕棿姝e父寮�鍏虫満
+
+
+
+鎬荤粨
+Mac鍦板潃涓�0025E1033CF2 绾挎帴閿欎簡锛屼互涓嬫槸鍥剧墖锛�
+
+
diff --git a/haha.sh b/haha.sh
new file mode 100644
index 0000000..890d0d6
--- /dev/null
+++ b/haha.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+#妫�鏌ユ槸鍚︿负root璐﹀彿
+if [ $(whoami) != "root" ];then
+ echo "璇蜂娇鐢╮oot鏉冮檺鎵ц"
+ exit 1;
+fi
+
+#妫�鏌ユ槸鍚︿负64浣嶇郴缁�
+is64bit=$(getconf LONG_BIT)
+if [ "${is64bit}" != '64' ];then
+ Red_Error "璇蜂娇鐢�64浣嶇郴缁�";
+fi
+
+#璁惧畾杞欢瀹夎鐩綍涓�/server
+cd /
+mkdir server
+install_path="/server"
+
+#瀹夎JDK骞惰缃幆澧冨彉閲�
+mkdir $install_path/JDK
+rm -rf $install_path/JDK/jdk-18.0.2.1/
+tar -xvf /Tools/jdk-18_linux-x64_bin.tar.gz -C $install_path/JDK
+JAVA_HOME=$install_path/JDK/jdk-18.0.2.1
+echo export JAVA_HOME=$install_path/JDK/jdk-18.0.2.1 >> /etc/profile
+echo export PATH=$JAVA_HOME/bin:$PATH >> /etc/profile
+echo export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar >> /etc/profile
+source /etc/profile
diff --git a/install.sh b/install.sh
new file mode 100644
index 0000000..207b2f5
--- /dev/null
+++ b/install.sh
@@ -0,0 +1,738 @@
+#!/bin/bash
+PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
+export PATH
+LANG=en_US.UTF-8
+
+if [ $(whoami) != "root" ];then
+ echo "璇蜂娇鐢╮oot鏉冮檺鎵ц瀹濆瀹夎鍛戒护锛�"
+ exit 1;
+fi
+
+is64bit=$(getconf LONG_BIT)
+if [ "${is64bit}" != '64' ];then
+ Red_Error "鎶辨瓑, 褰撳墠闈㈡澘鐗堟湰涓嶆敮鎸�32浣嶇郴缁�, 璇蜂娇鐢�64浣嶇郴缁熸垨瀹夎瀹濆5.9!";
+fi
+
+cd ~
+setup_path="/www"
+python_bin=$setup_path/server/panel/pyenv/bin/python
+cpu_cpunt=$(cat /proc/cpuinfo|grep processor|wc -l)
+
+if [ "$1" ];then
+ IDC_CODE=$1
+fi
+
+GetSysInfo(){
+ if [ -s "/etc/redhat-release" ];then
+ SYS_VERSION=$(cat /etc/redhat-release)
+ elif [ -s "/etc/issue" ]; then
+ SYS_VERSION=$(cat /etc/issue)
+ fi
+ SYS_INFO=$(uname -a)
+ SYS_BIT=$(getconf LONG_BIT)
+ MEM_TOTAL=$(free -m|grep Mem|awk '{print $2}')
+ CPU_INFO=$(getconf _NPROCESSORS_ONLN)
+
+ echo -e ${SYS_VERSION}
+ echo -e Bit:${SYS_BIT} Mem:${MEM_TOTAL}M Core:${CPU_INFO}
+ echo -e ${SYS_INFO}
+ echo -e "璇锋埅鍥句互涓婃姤閿欎俊鎭彂甯栬嚦璁哄潧v7.hostcli.com/bbs姹傚姪"
+}
+Red_Error(){
+ echo '=================================================';
+ printf '\033[1;31;40m%b\033[0m\n' "$1";
+ GetSysInfo
+ exit 1;
+}
+Lock_Clear(){
+ if [ -f "/etc/bt_crack.pl" ];then
+ chattr -R -ia /www
+ chattr -ia /etc/init.d/bt
+ \cp -rpa /www/backup/panel/vhost/* /www/server/panel/vhost/
+ mv /www/server/panel/BTPanel/__init__.bak /www/server/panel/BTPanel/__init__.py
+ rm -f /etc/bt_crack.pl
+ fi
+}
+Install_Check(){
+ if [ "${INSTALL_FORCE}" ];then
+ return
+ fi
+ echo -e "----------------------------------------------------"
+ echo -e "妫�鏌ュ凡鏈夊叾浠朩eb/mysql鐜锛屽畨瑁呭疂濉斿彲鑳藉奖鍝嶇幇鏈夌珯鐐瑰強鏁版嵁"
+ echo -e "Web/mysql service is alreday installed,Can't install panel"
+ echo -e "----------------------------------------------------"
+ echo -e "宸茬煡椋庨櫓/Enter yes to force installation"
+ read -p "杈撳叆yes寮哄埗瀹夎: " yes;
+ if [ "$yes" != "yes" ];then
+ echo -e "------------"
+ echo "鍙栨秷瀹夎"
+ exit;
+ fi
+ INSTALL_FORCE="true"
+}
+System_Check(){
+ MYSQLD_CHECK=$(ps -ef |grep mysqld|grep -v grep|grep -v /www/server/mysql)
+ PHP_CHECK=$(ps -ef|grep php-fpm|grep master|grep -v /www/server/php)
+ NGINX_CHECK=$(ps -ef|grep nginx|grep master|grep -v /www/server/nginx)
+ HTTPD_CHECK=$(ps -ef |grep -E 'httpd|apache'|grep -v /www/server/apache|grep -v grep)
+ if [ "${PHP_CHECK}" ] || [ "${MYSQLD_CHECK}" ] || [ "${NGINX_CHECK}" ] || [ "${HTTPD_CHECK}" ];then
+ Install_Check
+ fi
+}
+Get_Pack_Manager(){
+ if [ -f "/usr/bin/yum" ] && [ -d "/etc/yum.repos.d" ]; then
+ PM="yum"
+ elif [ -f "/usr/bin/apt-get" ] && [ -f "/usr/bin/dpkg" ]; then
+ PM="apt-get"
+ fi
+}
+Auto_Swap()
+{
+ swap=$(free |grep Swap|awk '{print $2}')
+ if [ "${swap}" -gt 1 ];then
+ echo "Swap total sizse: $swap";
+ return;
+ fi
+ if [ ! -d /www ];then
+ mkdir /www
+ fi
+ swapFile="/www/swap"
+ dd if=/dev/zero of=$swapFile bs=1M count=1025
+ mkswap -f $swapFile
+ swapon $swapFile
+ echo "$swapFile swap swap defaults 0 0" >> /etc/fstab
+ swap=`free |grep Swap|awk '{print $2}'`
+ if [ $swap -gt 1 ];then
+ echo "Swap total sizse: $swap";
+ return;
+ fi
+
+ sed -i "/\/www\/swap/d" /etc/fstab
+ rm -f $swapFile
+}
+Service_Add(){
+ if [ "${PM}" == "yum" ] || [ "${PM}" == "dnf" ]; then
+ chkconfig --add bt
+ chkconfig --level 2345 bt on
+ elif [ "${PM}" == "apt-get" ]; then
+ update-rc.d bt defaults
+ fi
+}
+
+get_node_url(){
+ if [ ! -f /bin/curl ];then
+ if [ "${PM}" = "yum" ]; then
+ yum install curl -y
+ elif [ "${PM}" = "apt-get" ]; then
+ apt-get install curl -y
+ fi
+ fi
+
+ echo '---------------------------------------------';
+ echo "Selected download node...";
+ download_Url='http://v7.hostcli.com';
+ echo "Download node: $download_Url";
+ echo '---------------------------------------------';
+}
+Remove_Package(){
+ local PackageNmae=$1
+ if [ "${PM}" == "yum" ];then
+ isPackage=$(rpm -q ${PackageNmae}|grep "not installed")
+ if [ -z "${isPackage}" ];then
+ yum remove ${PackageNmae} -y
+ fi
+ elif [ "${PM}" == "apt-get" ];then
+ isPackage=$(dpkg -l|grep ${PackageNmae})
+ if [ "${PackageNmae}" ];then
+ apt-get remove ${PackageNmae} -y
+ fi
+ fi
+}
+Install_RPM_Pack(){
+ yumPath=/etc/yum.conf
+ Centos8Check=$(cat /etc/redhat-release | grep ' 8.' | grep -iE 'centos|Red Hat')
+ isExc=$(cat $yumPath|grep httpd)
+ if [ "$isExc" = "" ];then
+ echo "exclude=httpd nginx php mysql mairadb python-psutil python2-psutil" >> $yumPath
+ fi
+
+ #yumBaseUrl=$(cat /etc/yum.repos.d/CentOS-Base.repo|grep baseurl=http|cut -d '=' -f 2|cut -d '$' -f 1|head -n 1)
+ #[ "${yumBaseUrl}" ] && checkYumRepo=$(curl --connect-timeout 5 --head -s -o /dev/null -w %{http_code} ${yumBaseUrl})
+ #if [ "${checkYumRepo}" != "200" ];then
+ # curl -Ss --connect-timeout 3 -m 60 http://download.bt.cn/install/yumRepo_select.sh|bash
+ #fi
+
+ #灏濊瘯鍚屾鏃堕棿(浠巄t.cn)
+ echo 'Synchronizing system time...'
+ getBtTime=$(curl -sS --connect-timeout 3 -m 60 http://v7.hostcli.com/api/index/get_time)
+ if [ "${getBtTime}" ];then
+ date -s "$(date -d @$getBtTime +"%Y-%m-%d %H:%M:%S")"
+ fi
+
+ if [ -z "${Centos8Check}" ]; then
+ yum install ntp -y
+ rm -rf /etc/localtime
+ ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
+
+ #灏濊瘯鍚屾鍥介檯鏃堕棿(浠巒tp鏈嶅姟鍣�)
+ ntpdate 0.asia.pool.ntp.org
+ setenforce 0
+ fi
+
+ startTime=`date +%s`
+
+ sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
+ #yum remove -y python-requests python3-requests python-greenlet python3-greenlet
+ yumPacks="libcurl-devel wget tar gcc make zip unzip openssl openssl-devel gcc libxml2 libxml2-devel libxslt* zlib zlib-devel libjpeg-devel libpng-devel libwebp libwebp-devel freetype freetype-devel lsof pcre pcre-devel vixie-cron crontabs icu libicu-devel c-ares libffi-devel bzip2-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel"
+ yum install -y ${yumPacks}
+
+ for yumPack in ${yumPacks}
+ do
+ rpmPack=$(rpm -q ${yumPack})
+ packCheck=$(echo ${rpmPack}|grep not)
+ if [ "${packCheck}" ]; then
+ yum install ${yumPack} -y
+ fi
+ done
+ if [ -f "/usr/bin/dnf" ]; then
+ dnf install -y redhat-rpm-config
+ fi
+
+ ALI_OS=$(cat /etc/redhat-release |grep "Alibaba Cloud Linux release 3")
+ if [ -z "${ALI_OS}" ];then
+ yum install epel-release -y
+ fi
+}
+Install_Deb_Pack(){
+ ln -sf bash /bin/sh
+ apt-get update -y
+ apt-get install ruby -y
+ apt-get install lsb-release -y
+ #apt-get install ntp ntpdate -y
+ #/etc/init.d/ntp stop
+ #update-rc.d ntp remove
+ #cat >>~/.profile<<EOF
+ #TZ='Asia/Shanghai'; export TZ
+ #EOF
+ #rm -rf /etc/localtime
+ #cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
+ #echo 'Synchronizing system time...'
+ #ntpdate 0.asia.pool.ntp.org
+ #apt-get upgrade -y
+ debPacks="wget curl libcurl4-openssl-dev gcc make zip unzip tar openssl libssl-dev gcc libxml2 libxml2-dev zlib1g zlib1g-dev libjpeg-dev libpng-dev lsof libpcre3 libpcre3-dev cron net-tools swig build-essential libffi-dev libbz2-dev libncurses-dev libsqlite3-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libdb++-dev libpcap-dev xz-utils git";
+ apt-get install -y $debPacks --force-yes
+
+ for debPack in ${debPacks}
+ do
+ packCheck=$(dpkg -l ${debPack})
+ if [ "$?" -ne "0" ] ;then
+ apt-get install -y debPack
+ fi
+ done
+
+ if [ ! -d '/etc/letsencrypt' ];then
+ mkdir -p /etc/letsencryp
+ mkdir -p /var/spool/cron
+ if [ ! -f '/var/spool/cron/crontabs/root' ];then
+ echo '' > /var/spool/cron/crontabs/root
+ chmod 600 /var/spool/cron/crontabs/root
+ fi
+ fi
+}
+Install_Bt(){
+ panelPort="8888"
+ if [ -f ${setup_path}/server/panel/data/port.pl ];then
+ panelPort=$(cat ${setup_path}/server/panel/data/port.pl)
+ fi
+ mkdir -p ${setup_path}/server/panel/logs
+ mkdir -p ${setup_path}/server/panel/vhost/apache
+ mkdir -p ${setup_path}/server/panel/vhost/nginx
+ mkdir -p ${setup_path}/server/panel/vhost/rewrite
+ mkdir -p ${setup_path}/server/panel/install
+ mkdir -p /www/server
+ mkdir -p /www/wwwroot
+ mkdir -p /www/wwwlogs
+ mkdir -p /www/backup/database
+ mkdir -p /www/backup/site
+
+ if [ ! -f "/usr/bin/unzip" ]; then
+ if [ "${PM}" = "yum" ]; then
+ yum install unzip -y
+ elif [ "${PM}" = "apt-get" ]; then
+ apt-get install unzip -y
+ fi
+ fi
+
+ if [ -f "/etc/init.d/bt" ]; then
+ /etc/init.d/bt stop
+ sleep 1
+ fi
+
+ wget -O panel.zip ${download_Url}/install/src/panel_new.zip -T 10
+ wget -O /etc/init.d/bt ${download_Url}/install/src/bt6.init -T 10
+ wget -O /www/server/panel/install/public.sh ${download_Url}/install/public.sh -T 10
+
+ if [ -f "${setup_path}/server/panel/data/default.db" ];then
+ if [ -d "/${setup_path}/server/panel/old_data" ];then
+ rm -rf ${setup_path}/server/panel/old_data
+ fi
+ mkdir -p ${setup_path}/server/panel/old_data
+ d_format=$(date +"%Y%m%d_%H%M%S")
+ \cp -arf ${setup_path}/server/panel/data/default.db ${setup_path}/server/panel/data/default_backup_${d_format}.db
+ mv -f ${setup_path}/server/panel/data/default.db ${setup_path}/server/panel/old_data/default.db
+ mv -f ${setup_path}/server/panel/data/system.db ${setup_path}/server/panel/old_data/system.db
+ mv -f ${setup_path}/server/panel/data/port.pl ${setup_path}/server/panel/old_data/port.pl
+ mv -f ${setup_path}/server/panel/data/admin_path.pl ${setup_path}/server/panel/old_data/admin_path.pl
+ fi
+
+ unzip -o panel.zip -d ${setup_path}/server/ > /dev/null
+
+ if [ -d "${setup_path}/server/panel/old_data" ];then
+ mv -f ${setup_path}/server/panel/old_data/default.db ${setup_path}/server/panel/data/default.db
+ mv -f ${setup_path}/server/panel/old_data/system.db ${setup_path}/server/panel/data/system.db
+ mv -f ${setup_path}/server/panel/old_data/port.pl ${setup_path}/server/panel/data/port.pl
+ mv -f ${setup_path}/server/panel/old_data/admin_path.pl ${setup_path}/server/panel/data/admin_path.pl
+ if [ -d "/${setup_path}/server/panel/old_data" ];then
+ rm -rf ${setup_path}/server/panel/old_data
+ fi
+ fi
+
+ rm -f panel.zip
+
+ if [ ! -f ${setup_path}/server/panel/tools.py ];then
+ Red_Error "ERROR: Failed to download, please try install again!"
+ fi
+
+ rm -f ${setup_path}/server/panel/class/*.pyc
+ rm -f ${setup_path}/server/panel/*.pyc
+
+ chmod +x /etc/init.d/bt
+ chmod -R 600 ${setup_path}/server/panel
+ chmod -R +x ${setup_path}/server/panel/script
+ ln -sf /etc/init.d/bt /usr/bin/bt
+ echo "${panelPort}" > ${setup_path}/server/panel/data/port.pl
+ wget -O /etc/init.d/bt ${download_Url}/install/src/bt7.init -T 10
+ wget -O /www/server/panel/init.sh ${download_Url}/install/src/bt7.init -T 10
+}
+Install_Python_Lib(){
+ curl -Ss --connect-timeout 3 -m 60 $download_Url/install/pip_select.sh|bash
+ pyenv_path="/www/server/panel"
+ if [ -f $pyenv_path/pyenv/bin/python ];then
+ is_err=$($pyenv_path/pyenv/bin/python3.7 -V 2>&1|grep 'Could not find platform')
+ if [ "$is_err" = "" ];then
+ chmod -R 700 $pyenv_path/pyenv/bin
+ is_package=$($python_bin -m psutil 2>&1|grep package)
+ if [ "$is_package" = "" ];then
+ wget -O $pyenv_path/pyenv/pip.txt $download_Url/install/pyenv/pip.txt -T 5
+ $pyenv_path/pyenv/bin/pip install -U pip
+ $pyenv_path/pyenv/bin/pip install -U setuptools
+ $pyenv_path/pyenv/bin/pip install -r $pyenv_path/pyenv/pip.txt
+ fi
+ source $pyenv_path/pyenv/bin/activate
+ return
+ else
+ rm -rf $pyenv_path/pyenv
+ fi
+ fi
+ py_version="3.7.8"
+ mkdir -p $pyenv_path
+ os_type='el'
+ os_version='7'
+ is_export_openssl=0
+ Get_Versions
+ Centos6_Openssl
+ Other_Openssl
+ echo "OS: $os_type - $os_version"
+ is_aarch64=$(uname -a|grep aarch64)
+ if [ "$is_aarch64" != "" ];then
+ os_version="aarch64"
+ fi
+
+ if [ -f "/www/server/panel/pymake.pl" ];then
+ os_version=""
+ rm -f /www/server/panel/pymake.pl
+ fi
+
+ if [ "${os_version}" != "" ];then
+ pyenv_file="/www/pyenv.tar.gz"
+ wget -O $pyenv_file $download_Url/install/pyenv/pyenv-${os_type}${os_version}-x${is64bit}.tar.gz -T 10
+ tmp_size=$(du -b $pyenv_file|awk '{print $1}')
+ if [ $tmp_size -lt 703460 ];then
+ rm -f $pyenv_file
+ echo "ERROR: Download python env fielded."
+ else
+ echo "Install python env..."
+ tar zxvf $pyenv_file -C $pyenv_path/ > /dev/null
+ chmod -R 700 $pyenv_path/pyenv/bin
+ if [ ! -f $pyenv_path/pyenv/bin/python ];then
+ rm -f $pyenv_file
+ Red_Error "ERROR: Install python env fielded."
+ fi
+ is_err=$($pyenv_path/pyenv/bin/python3.7 -V 2>&1|grep 'Could not find platform')
+ if [ "$is_err" = "" ];then
+ rm -f $pyenv_file
+ ln -sf $pyenv_path/pyenv/bin/pip3.7 /usr/bin/btpip
+ ln -sf $pyenv_path/pyenv/bin/python3.7 /usr/bin/btpython
+ source $pyenv_path/pyenv/bin/activate
+ return
+ else
+ rm -f $pyenv_file
+ rm -rf $pyenv_path/pyenv
+ fi
+ fi
+
+ fi
+ if [ -f /usr/local/openssl/lib/libssl.so ];then
+ export LDFLAGS="-L/usr/local/openssl/lib"
+ export CPPFLAGS="-I/usr/local/openssl/include"
+ export PKG_CONFIG_PATH="/usr/local/openssl/lib/pkgconfig"
+ echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/openssl/lib" >> /etc/profile
+ source /etc/profile
+ fi
+ cd /www
+ python_src='/www/python_src.tar.xz'
+ python_src_path="/www/Python-${py_version}"
+ wget -O $python_src $download_Url/src/Python-${py_version}.tar.xz -T 5
+ tmp_size=$(du -b $python_src|awk '{print $1}')
+ if [ $tmp_size -lt 10703460 ];then
+ rm -f $python_src
+ Red_Error "ERROR: Download python source code fielded."
+ fi
+ tar xvf $python_src
+ rm -f $python_src
+ cd $python_src_path
+ ./configure --prefix=$pyenv_path/pyenv
+ make -j$cpu_cpunt
+ make install
+ if [ ! -f $pyenv_path/pyenv/bin/python3.7 ];then
+ rm -rf $python_src_path
+ Red_Error "ERROR: Make python env fielded."
+ fi
+ cd ~
+ rm -rf $python_src_path
+ wget -O $pyenv_path/pyenv/bin/activate $download_Url/install/pyenv/activate.panel -T 5
+ wget -O $pyenv_path/pyenv/pip.txt $download_Url/install/pyenv/pip-3.7.8.txt -T 5
+ ln -sf $pyenv_path/pyenv/bin/pip3.7 $pyenv_path/pyenv/bin/pip
+ ln -sf $pyenv_path/pyenv/bin/python3.7 $pyenv_path/pyenv/bin/python
+ ln -sf $pyenv_path/pyenv/bin/pip3.7 /usr/bin/btpip
+ ln -sf $pyenv_path/pyenv/bin/python3.7 /usr/bin/btpython
+ chmod -R 700 $pyenv_path/pyenv/bin
+ $pyenv_path/pyenv/bin/pip install -U pip
+ $pyenv_path/pyenv/bin/pip install -U setuptools
+ $pyenv_path/pyenv/bin/pip install -U wheel==0.34.2
+ $pyenv_path/pyenv/bin/pip install -r $pyenv_path/pyenv/pip.txt
+ source $pyenv_path/pyenv/bin/activate
+}
+Other_Openssl(){
+ openssl_version=$(openssl version|grep -Eo '[0-9]\.[0-9]\.[0-9]')
+ if [ "$openssl_version" = '1.0.1' ] || [ "$openssl_version" = '1.0.0' ];then
+ opensslVersion="1.0.2r"
+ if [ ! -f "/usr/local/openssl/lib/libssl.so" ];then
+ cd /www
+ openssl_src_file=/www/openssl.tar.gz
+ wget -O $openssl_src_file ${download_Url}/src/openssl-${opensslVersion}.tar.gz
+ tmp_size=$(du -b $openssl_src_file|awk '{print $1}')
+ if [ $tmp_size -lt 703460 ];then
+ rm -f $openssl_src_file
+ Red_Error "ERROR: Download openssl-1.0.2 source code fielded."
+ fi
+ tar -zxf $openssl_src_file
+ rm -f $openssl_src_file
+ cd openssl-${opensslVersion}
+ #zlib-dynamic shared
+ ./config --openssldir=/usr/local/openssl zlib-dynamic shared
+ make -j${cpuCore}
+ make install
+ echo "/usr/local/openssl/lib" > /etc/ld.so.conf.d/zopenssl.conf
+ ldconfig
+ cd ..
+ rm -rf openssl-${opensslVersion}
+ is_export_openssl=1
+ cd ~
+ fi
+ fi
+}
+Insatll_Libressl(){
+ openssl_version=$(openssl version|grep -Eo '[0-9]\.[0-9]\.[0-9]')
+ if [ "$openssl_version" = '1.0.1' ] || [ "$openssl_version" = '1.0.0' ];then
+ opensslVersion="3.0.2"
+ cd /www
+ openssl_src_file=/www/openssl.tar.gz
+ wget -O $openssl_src_file ${download_Url}/install/pyenv/libressl-${opensslVersion}.tar.gz
+ tmp_size=$(du -b $openssl_src_file|awk '{print $1}')
+ if [ $tmp_size -lt 703460 ];then
+ rm -f $openssl_src_file
+ Red_Error "ERROR: Download libressl-$opensslVersion source code fielded."
+ fi
+ tar -zxf $openssl_src_file
+ rm -f $openssl_src_file
+ cd libressl-${opensslVersion}
+ ./config 鈥損refix=/usr/local/lib
+ make -j${cpuCore}
+ make install
+ ldconfig
+ ldconfig -v
+ cd ..
+ rm -rf libressl-${opensslVersion}
+ is_export_openssl=1
+ cd ~
+ fi
+}
+Centos6_Openssl(){
+ if [ "$os_type" != 'el' ];then
+ return
+ fi
+ if [ "$os_version" != '6' ];then
+ return
+ fi
+ echo 'Centos6 install openssl-1.0.2...'
+ openssl_rpm_file="/www/openssl.rpm"
+ wget -O $openssl_rpm_file $download_Url/rpm/centos6/${is64bit}/bt-openssl102.rpm -T 10
+ tmp_size=$(du -b $openssl_rpm_file|awk '{print $1}')
+ if [ $tmp_size -lt 102400 ];then
+ rm -f $openssl_rpm_file
+ Red_Error "ERROR: Download python env fielded."
+ fi
+ rpm -ivh $openssl_rpm_file
+ rm -f $openssl_rpm_file
+ is_export_openssl=1
+}
+Get_Versions(){
+ redhat_version_file="/etc/redhat-release"
+ deb_version_file="/etc/issue"
+ if [ -f $redhat_version_file ];then
+ os_type='el'
+ is_aliyunos=$(cat $redhat_version_file|grep Aliyun)
+ if [ "$is_aliyunos" != "" ];then
+ return
+ fi
+ os_version=$(cat $redhat_version_file|grep CentOS|grep -Eo '([0-9]+\.)+[0-9]+'|grep -Eo '^[0-9]')
+ if [ "${os_version}" = "5" ];then
+ os_version=""
+ fi
+ else
+ os_type='ubuntu'
+ os_version=$(cat $deb_version_file|grep Ubuntu|grep -Eo '([0-9]+\.)+[0-9]+'|grep -Eo '^[0-9]+')
+ if [ "${os_version}" = "" ];then
+ os_type='debian'
+ os_version=$(cat $deb_version_file|grep Debian|grep -Eo '([0-9]+\.)+[0-9]+'|grep -Eo '[0-9]+')
+ if [ "${os_version}" = "" ];then
+ os_version=$(cat $deb_version_file|grep Debian|grep -Eo '[0-9]+')
+ fi
+ if [ "${os_version}" = "8" ];then
+ os_version=""
+ fi
+ if [ "${is64bit}" = '32' ];then
+ os_version=""
+ fi
+ else
+ if [ "$os_version" = "14" ];then
+ os_version=""
+ fi
+ if [ "$os_version" = "12" ];then
+ os_version=""
+ fi
+ if [ "$os_version" = "19" ];then
+ os_version=""
+ fi
+
+ fi
+ fi
+}
+Set_Bt_Panel(){
+ password=$(cat /dev/urandom | head -n 16 | md5sum | head -c 8)
+ sleep 1
+ admin_auth="/www/server/panel/data/admin_path.pl"
+ if [ ! -f ${admin_auth} ];then
+ auth_path=$(cat /dev/urandom | head -n 16 | md5sum | head -c 8)
+ echo "/${auth_path}" > ${admin_auth}
+ fi
+ auth_path=$(cat ${admin_auth})
+ cd ${setup_path}/server/panel/
+ /etc/init.d/bt start
+ $python_bin -m py_compile tools.py
+ $python_bin tools.py username
+ username=$($python_bin tools.py panel ${password})
+ cd ~
+ echo "${password}" > ${setup_path}/server/panel/default.pl
+ chmod 600 ${setup_path}/server/panel/default.pl
+ sleep 3
+ /etc/init.d/bt restart
+ sleep 3
+ isStart=$(ps aux |grep 'BT-Panel'|grep -v grep|awk '{print $2}')
+ LOCAL_CURL=$(curl 127.0.0.1:8888/login 2>&1 |grep -i html)
+ if [ -z "${isStart}" ] && [ -z "${LOCAL_CURL}" ];then
+ /etc/init.d/bt 22
+ cd /www/server/panel/pyenv/bin
+ touch t.pl
+ ls -al python3.7 python
+ lsattr python3.7 python
+ Red_Error "ERROR: The BT-Panel service startup failed."
+ fi
+}
+Set_Firewall(){
+ sshPort=$(cat /etc/ssh/sshd_config | grep 'Port '|awk '{print $2}')
+ if [ "${PM}" = "apt-get" ]; then
+ apt-get install -y ufw
+ if [ -f "/usr/sbin/ufw" ];then
+ ufw allow 20/tcp
+ ufw allow 21/tcp
+ ufw allow 22/tcp
+ ufw allow 80/tcp
+ ufw allow 888/tcp
+ ufw allow ${panelPort}/tcp
+ ufw allow ${sshPort}/tcp
+ ufw allow 39000:40000/tcp
+ ufw_status=`ufw status`
+ echo y|ufw enable
+ ufw default deny
+ ufw reload
+ fi
+ else
+ if [ -f "/etc/init.d/iptables" ];then
+ iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 20 -j ACCEPT
+ iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
+ iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
+ iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
+ iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport ${panelPort} -j ACCEPT
+ iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport ${sshPort} -j ACCEPT
+ iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 39000:40000 -j ACCEPT
+ #iptables -I INPUT -p tcp -m state --state NEW -m udp --dport 39000:40000 -j ACCEPT
+ iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
+ iptables -A INPUT -s localhost -d localhost -j ACCEPT
+ iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
+ iptables -P INPUT DROP
+ service iptables save
+ sed -i "s#IPTABLES_MODULES=\"\"#IPTABLES_MODULES=\"ip_conntrack_netbios_ns ip_conntrack_ftp ip_nat_ftp\"#" /etc/sysconfig/iptables-config
+ iptables_status=$(service iptables status | grep 'not running')
+ if [ "${iptables_status}" == '' ];then
+ service iptables restart
+ fi
+ else
+ AliyunCheck=$(cat /etc/redhat-release|grep "Aliyun Linux")
+ [ "${AliyunCheck}" ] && return
+ yum install firewalld -y
+ [ "${Centos8Check}" ] && yum reinstall python3-six -y
+ systemctl enable firewalld
+ systemctl start firewalld
+ firewall-cmd --set-default-zone=public > /dev/null 2>&1
+ firewall-cmd --permanent --zone=public --add-port=20/tcp > /dev/null 2>&1
+ firewall-cmd --permanent --zone=public --add-port=21/tcp > /dev/null 2>&1
+ firewall-cmd --permanent --zone=public --add-port=22/tcp > /dev/null 2>&1
+ firewall-cmd --permanent --zone=public --add-port=80/tcp > /dev/null 2>&1
+ firewall-cmd --permanent --zone=public --add-port=${panelPort}/tcp > /dev/null 2>&1
+ firewall-cmd --permanent --zone=public --add-port=${sshPort}/tcp > /dev/null 2>&1
+ firewall-cmd --permanent --zone=public --add-port=39000-40000/tcp > /dev/null 2>&1
+ #firewall-cmd --permanent --zone=public --add-port=39000-40000/udp > /dev/null 2>&1
+ firewall-cmd --reload
+ fi
+ fi
+}
+Get_Ip_Address(){
+ getIpAddress=""
+ getIpAddress=$(curl -sS --connect-timeout 10 -m 60 https://v7.hostcli.com/Api/getIpAddress)
+ if [ -z "${getIpAddress}" ] || [ "${getIpAddress}" = "0.0.0.0" ]; then
+ isHosts=$(cat /etc/hosts|grep 'v7.hostcli.com')
+ if [ -z "${isHosts}" ];then
+ #echo "" >> /etc/hosts
+ #echo "103.224.251.67 v7.hostcli.com" >> /etc/hosts
+ getIpAddress=$(curl -sS --connect-timeout 10 -m 60 https://v7.hostcli.com/Api/getIpAddress)
+ if [ -z "${getIpAddress}" ];then
+ sed -i "/v7.hostcli.com/d" /etc/hosts
+ fi
+ fi
+ fi
+
+ ipv4Check=$($python_bin -c "import re; print(re.match('^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$','${getIpAddress}'))")
+ if [ "${ipv4Check}" == "None" ];then
+ ipv6Address=$(echo ${getIpAddress}|tr -d "[]")
+ ipv6Check=$($python_bin -c "import re; print(re.match('^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}$','${ipv6Address}'))")
+ if [ "${ipv6Check}" == "None" ]; then
+ getIpAddress="SERVER_IP"
+ else
+ echo "True" > ${setup_path}/server/panel/data/ipv6.pl
+ sleep 1
+ /etc/init.d/bt restart
+ fi
+ fi
+
+ if [ "${getIpAddress}" != "SERVER_IP" ];then
+ echo "${getIpAddress}" > ${setup_path}/server/panel/data/iplist.txt
+ fi
+ LOCAL_IP=$(ip addr | grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -E -v "^127\.|^255\.|^0\." | head -n 1)
+}
+Setup_Count(){
+ curl -sS --connect-timeout 10 -m 60 https://v7.hostcli.com/Api/SetupCount?type=Linux\&o=$1 > /dev/null 2>&1
+ if [ "$1" != "" ];then
+ echo $1 > /www/server/panel/data/o.pl
+ cd /www/server/panel
+ $python_bin tools.py o
+ fi
+ echo /www > /var/bt_setupPath.conf
+}
+Install_Main(){
+ startTime=`date +%s`
+ Lock_Clear
+ System_Check
+ Get_Pack_Manager
+ get_node_url
+
+ MEM_TOTAL=$(free -g|grep Mem|awk '{print $2}')
+ if [ "${MEM_TOTAL}" -le "1" ];then
+ Auto_Swap
+ fi
+
+ if [ "${PM}" = "yum" ]; then
+ Install_RPM_Pack
+ elif [ "${PM}" = "apt-get" ]; then
+ Install_Deb_Pack
+ fi
+
+ Install_Python_Lib
+ Install_Bt
+
+
+ Set_Bt_Panel
+ Service_Add
+ Set_Firewall
+
+ Get_Ip_Address
+ Setup_Count ${IDC_CODE}
+}
+
+echo "
++----------------------------------------------------------------------
+| hostcli.com FOR CentOS/Ubuntu/Debian
++----------------------------------------------------------------------
+| Copyright 漏 2015-2099 HostCli(http://v7.hostcli.com) All rights reserved.
++----------------------------------------------------------------------
+| The WebPanel URL will be http://SERVER_IP:8888 when installed.
++----------------------------------------------------------------------
+"
+while [ "$go" != 'y' ] && [ "$go" != 'n' ]
+do
+ read -p "Do you want to install Bt-Panel to the $setup_path directory now?(y/n): " go;
+done
+
+if [ "$go" == 'n' ];then
+ exit;
+fi
+
+Install_Main
+echo > /www/server/panel/data/bind.pl
+echo -e "=================================================================="
+echo -e "\033[32mCongratulations! Installed successfully!\033[0m"
+echo -e "=================================================================="
+echo "澶栫綉闈㈡澘鍦板潃: http://${getIpAddress}:${panelPort}${auth_path}"
+echo "鍐呯綉闈㈡澘鍦板潃: http://${LOCAL_IP}:${panelPort}${auth_path}"
+echo -e "username: $username"
+echo -e "password: $password"
+echo -e "\033[33mIf you cannot access the panel,\033[0m"
+echo -e "\033[33mrelease the following panel port [${panelPort}] in the security group\033[0m"
+echo -e "\033[33m鑻ユ棤娉曡闂潰鏉匡紝璇锋鏌ラ槻鐏/瀹夊叏缁勬槸鍚︽湁鏀捐闈㈡澘[${panelPort}]绔彛\033[0m"
+echo -e "=================================================================="
+
+endTime=`date +%s`
+((outTime=($endTime-$startTime)/60))
+echo -e "Time consumed:\033[32m $outTime \033[0mMinute!"
+
diff --git a/java_gaga.com.conf b/java_gaga.com.conf
new file mode 100644
index 0000000..846d4e8
--- /dev/null
+++ b/java_gaga.com.conf
@@ -0,0 +1,57 @@
+server
+{
+ listen 80;
+ server_name gaga.com aa.com bb.com;
+ index index.html index.htm default.htm default.html;
+ root /www/wwwroot/gaga.com;
+
+ #SSL-START SSL鐩稿叧閰嶇疆
+ #error_page 404/404.html;
+
+ #SSL-END
+
+ #ERROR-PAGE-START 閿欒椤电浉鍏抽厤缃�
+ #error_page 404 /404.html;
+ #error_page 502 /502.html;
+ #ERROR-PAGE-END
+
+
+ #REWRITE-START 浼潤鎬佺浉鍏抽厤缃�
+ include /www/server/panel/vhost/rewrite/java_gaga.com.conf;
+ #REWRITE-END
+
+ #绂佹璁块棶鐨勬枃浠舵垨鐩綍
+ location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md|package.json|package-lock.json|\.env|node_modules) {
+ return 404;
+ }
+
+ #涓�閿敵璇稴SL璇佷功楠岃瘉鐩綍鐩稿叧璁剧疆
+ location /.well-known/ {
+ root /www/wwwroot/java_node_ssl;
+ }
+
+ # HTTP鍙嶅悜浠g悊鐩稿叧閰嶇疆寮�濮� >>>
+ location ~ /purge(/.*) {
+ proxy_cache_purge cache_one gaga.com$request_uri$is_args$args;
+ }
+
+ location / {
+ proxy_pass http://127.0.0.1:8231;
+ proxy_set_header Host gaga.com:$server_port;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header REMOTE-HOST $remote_addr;
+ add_header X-Cache $upstream_cache_status;
+
+ proxy_connect_timeout 30s;
+ proxy_read_timeout 86400s;
+ proxy_send_timeout 30s;
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+ }
+ # HTTP鍙嶅悜浠g悊鐩稿叧閰嶇疆缁撴潫 <<<
+
+ access_log /www/wwwlogs/gaga.com.log;
+ error_log /www/wwwlogs/gaga.com.error.log;
+}
\ No newline at end of file
diff --git a/java_wa.cn.conf b/java_wa.cn.conf
new file mode 100644
index 0000000..fc06b29
--- /dev/null
+++ b/java_wa.cn.conf
@@ -0,0 +1,57 @@
+server
+{
+ listen 80;
+ server_name wa.cn;
+ index index.html index.htm default.htm default.html;
+ root /www/wwwroot/wa.cn;
+
+ #SSL-START SSL鐩稿叧閰嶇疆
+ #error_page 404/404.html;
+
+ #SSL-END
+
+ #ERROR-PAGE-START 閿欒椤电浉鍏抽厤缃�
+ #error_page 404 /404.html;
+ #error_page 502 /502.html;
+ #ERROR-PAGE-END
+
+
+ #REWRITE-START 浼潤鎬佺浉鍏抽厤缃�
+ include /www/server/panel/vhost/rewrite/java_wa.cn.conf;
+ #REWRITE-END
+
+ #绂佹璁块棶鐨勬枃浠舵垨鐩綍
+ location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md|package.json|package-lock.json|\.env|node_modules) {
+ return 404;
+ }
+
+ #涓�閿敵璇稴SL璇佷功楠岃瘉鐩綍鐩稿叧璁剧疆
+ location /.well-known/ {
+ root /www/wwwroot/java_node_ssl;
+ }
+
+ # HTTP鍙嶅悜浠g悊鐩稿叧閰嶇疆寮�濮� >>>
+ location ~ /purge(/.*) {
+ proxy_cache_purge cache_one wa.cn$request_uri$is_args$args;
+ }
+
+ location / {
+ proxy_pass http://127.0.0.1:99;
+ proxy_set_header Host wa.cn:$server_port;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header REMOTE-HOST $remote_addr;
+ add_header X-Cache $upstream_cache_status;
+
+ proxy_connect_timeout 30s;
+ proxy_read_timeout 86400s;
+ proxy_send_timeout 30s;
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+ }
+ # HTTP鍙嶅悜浠g悊鐩稿叧閰嶇疆缁撴潫 <<<
+
+ access_log /www/wwwlogs/wa.cn.log;
+ error_log /www/wwwlogs/wa.cn.error.log;
+}
\ No newline at end of file
diff --git a/manager.xml b/manager.xml
new file mode 100644
index 0000000..48ac6f8
--- /dev/null
+++ b/manager.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!--
+
+ Context configuration file for the Tomcat Manager Web App
+
+-->
+<Context docBase="${catalina.home}/webapps/manager"
+ privileged="true" antiResourceLocking="false" antiJARLocking="false">
+ <Valve className="org.apache.catalina.valves.RemoteAddrValve"
+ allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
+ <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
+</Context>
diff --git a/nginx.conf b/nginx.conf
new file mode 100644
index 0000000..91c7bd4
--- /dev/null
+++ b/nginx.conf
@@ -0,0 +1,164 @@
+
+#user nobody;
+worker_processes 1;
+
+#error_log logs/error.log;
+#error_log logs/error.log notice;
+#error_log logs/error.log info;
+
+#pid logs/nginx.pid;
+
+
+events {
+ worker_connections 1024;
+}
+
+
+http {
+ include mime.types;
+ default_type application/octet-stream;
+
+ server_tokens off;
+ sendfile on;
+ #tcp_nopush on;
+ client_max_body_size 5m;
+
+ #keepalive_timeout 0;
+ keepalive_timeout 65;
+
+ #gzip on;
+
+server {
+ listen 80 default_server;
+ listen 8888 default_server;
+ server_name _;
+ return 444;
+ }
+
+ server {
+ listen 8888;
+ server_name oa.shiyi.tv oa.brawin.cn;
+ #寮哄埗杞琀TTPS
+ #rewrite ^(.*)$ https://$host$1 permanent;
+
+ #寮哄埗鍩熷悕璁块棶
+# if ($host != oa.shiyi.tv) {
+# return 403;
+# }
+
+ #charset koi8-r;
+
+ #access_log logs/host.access.log main;
+
+ #绂佹Scrapy绛夌埇铏伐鍏风殑鎶撳彇,濡傛灉鐢ㄥ埌鐧惧害鏀跺綍锛岃繖閲屽氨瑕佹敞閲婃帀
+ if ($http_user_agent ~* "Scrapy|Sogou web spider|Baiduspider") {
+ return 403;
+ }
+
+ #绂佹鎸囧畾UA鍙奤A涓虹┖鐨勮闂�
+ if ($http_user_agent ~ "FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|LinkpadBot|Ezooms|^$"){
+ return 403;
+ }
+
+ #绂佹闈濭ET|HEAD|POST鏂瑰紡鐨勬姄鍙�,姝ゅ鍙兘浼氬鑷寸綉椤垫墦涓嶅紑
+ #if ($request_method !~ A(GET|HEAD|POST)$) {
+ # return 403;
+ # }
+
+ #閽堝鐗规畩鐨剈ser_agent鐨勮闂�
+ if ($http_user_agent ~ "Mozilla/4.0\ \(compatible;\ MSIE\ 6.;\ Windows\ NT\ 5.1;\ SV1;\ .NET\ CLR\ 1.1.4322;\ .NET\ CLR\ 2.0.50727\)") {
+ return 404;
+ }
+
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ #proxy_set_header Host $host;
+ proxy_set_header Upgrade-Insecure-Requests 1;
+ proxy_set_header X-Forwarded-Proto https;
+ proxy_read_timeout 300;
+
+ location / {
+ root html;
+ index index.html index.htm;
+ proxy_pass http://192.168.1.91:80;
+ proxy_redirect off;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+
+ }
+
+ error_page 500 502 503 504 /50x.html;
+ location = /50x.html {
+ root html;
+ }
+
+ }
+
+ server {
+ listen 80;
+ server_name oa.shiyi.tv oa.brawin.cn;
+ #寮哄埗杞琀TTPS
+ #rewrite ^(.*)$ https://$host$1 permanent;
+
+ #寮哄埗鍩熷悕璁块棶
+# if ($host != oa.shiyi.tv) {
+# return 403;
+# }
+
+ #charset koi8-r;
+
+ #access_log logs/host.access.log main;
+
+ #绂佹Scrapy绛夌埇铏伐鍏风殑鎶撳彇,濡傛灉鐢ㄥ埌鐧惧害鏀跺綍锛岃繖閲屽氨瑕佹敞閲婃帀
+ if ($http_user_agent ~* "Scrapy|Sogou web spider|Baiduspider") {
+ return 403;
+ }
+
+ #绂佹鎸囧畾UA鍙奤A涓虹┖鐨勮闂�
+ if ($http_user_agent ~ "FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|LinkpadBot|Ezooms|^$"){
+ return 403;
+ }
+
+ #绂佹闈濭ET|HEAD|POST鏂瑰紡鐨勬姄鍙�,姝ゅ鍙兘浼氬鑷寸綉椤垫墦涓嶅紑
+ #if ($request_method !~ A(GET|HEAD|POST)$) {
+ # return 403;
+ # }
+
+ #閽堝鐗规畩鐨剈ser_agent鐨勮闂�
+ if ($http_user_agent ~ "Mozilla/4.0\ \(compatible;\ MSIE\ 6.;\ Windows\ NT\ 5.1;\ SV1;\ .NET\ CLR\ 1.1.4322;\ .NET\ CLR\ 2.0.50727\)") {
+ return 404;
+ }
+
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ #proxy_set_header Host $host;
+ proxy_set_header Upgrade-Insecure-Requests 1;
+ proxy_set_header X-Forwarded-Proto https;
+ proxy_read_timeout 300;
+
+ location / {
+ root html;
+ index index.html index.htm;
+ proxy_pass http://192.168.1.91:80;
+ proxy_redirect off;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+
+ }
+
+ error_page 500 502 503 504 /50x.html;
+ location = /50x.html {
+ root html;
+ }
+
+ }
+
+}
diff --git a/nn.cn.conf b/nn.cn.conf
new file mode 100644
index 0000000..a7369d4
--- /dev/null
+++ b/nn.cn.conf
@@ -0,0 +1,51 @@
+server
+{
+ listen 80;
+ server_name nn.cn 192.168.1.233;
+ index index.php index.html index.htm default.php default.htm default.html;
+ root /www/wwwroot/nn.cn;
+
+ #SSL-START SSL鐩稿叧閰嶇疆锛岃鍕垮垹闄ゆ垨淇敼涓嬩竴琛屽甫娉ㄩ噴鐨�404瑙勫垯
+ #error_page 404/404.html;
+ #SSL-END
+
+ #ERROR-PAGE-START 閿欒椤甸厤缃紝鍙互娉ㄩ噴銆佸垹闄ゆ垨淇敼
+ #error_page 404 /404.html;
+ #error_page 502 /502.html;
+ #ERROR-PAGE-END
+
+ #PHP-INFO-START PHP寮曠敤閰嶇疆锛屽彲浠ユ敞閲婃垨淇敼
+ include enable-php-00.conf;
+ #PHP-INFO-END
+
+ #REWRITE-START URL閲嶅啓瑙勫垯寮曠敤,淇敼鍚庡皢瀵艰嚧闈㈡澘璁剧疆鐨勪吉闈欐�佽鍒欏け鏁�
+ include /www/server/panel/vhost/rewrite/nn.cn.conf;
+ #REWRITE-END
+
+ #绂佹璁块棶鐨勬枃浠舵垨鐩綍
+ location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
+ {
+ return 404;
+ }
+
+ #涓�閿敵璇稴SL璇佷功楠岃瘉鐩綍鐩稿叧璁剧疆
+ location ~ \.well-known{
+ allow all;
+ }
+
+ location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
+ {
+ expires 30d;
+ error_log /dev/null;
+ access_log /dev/null;
+ }
+
+ location ~ .*\.(js|css)?$
+ {
+ expires 12h;
+ error_log /dev/null;
+ access_log /dev/null;
+ }
+ access_log /www/wwwlogs/nn.cn.log;
+ error_log /www/wwwlogs/nn.cn.error.log;
+}
\ No newline at end of file
diff --git a/phpfpm_status.conf b/phpfpm_status.conf
new file mode 100644
index 0000000..fb87473
--- /dev/null
+++ b/phpfpm_status.conf
@@ -0,0 +1,69 @@
+server {
+ listen 80;
+ server_name 127.0.0.1;
+ allow 127.0.0.1;
+ location /nginx_status {
+ stub_status on;
+ access_log off;
+ }
+ location /phpfpm_52_status {
+ fastcgi_pass unix:/tmp/php-cgi-52.sock;
+ include fastcgi_params;
+ fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
+ }
+ location /phpfpm_53_status {
+ fastcgi_pass unix:/tmp/php-cgi-53.sock;
+ include fastcgi_params;
+ fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
+ }
+ location /phpfpm_54_status {
+ fastcgi_pass unix:/tmp/php-cgi-54.sock;
+ include fastcgi_params;
+ fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
+ }
+ location /phpfpm_55_status {
+ fastcgi_pass unix:/tmp/php-cgi-55.sock;
+ include fastcgi_params;
+ fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
+ }
+ location /phpfpm_56_status {
+ fastcgi_pass unix:/tmp/php-cgi-56.sock;
+ include fastcgi_params;
+ fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
+ }
+ location /phpfpm_70_status {
+ fastcgi_pass unix:/tmp/php-cgi-70.sock;
+ include fastcgi_params;
+ fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
+ }
+ location /phpfpm_71_status {
+ fastcgi_pass unix:/tmp/php-cgi-71.sock;
+ include fastcgi_params;
+ fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
+ }
+ location /phpfpm_72_status {
+ fastcgi_pass unix:/tmp/php-cgi-72.sock;
+ include fastcgi_params;
+ fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
+ }
+ location /phpfpm_73_status {
+ fastcgi_pass unix:/tmp/php-cgi-73.sock;
+ include fastcgi_params;
+ fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
+ }
+ location /phpfpm_74_status {
+ fastcgi_pass unix:/tmp/php-cgi-74.sock;
+ include fastcgi_params;
+ fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
+ }
+ location /phpfpm_80_status {
+ fastcgi_pass unix:/tmp/php-cgi-80.sock;
+ include fastcgi_params;
+ fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
+ }
+ location /phpfpm_81_status {
+ fastcgi_pass unix:/tmp/php-cgi-81.sock;
+ include fastcgi_params;
+ fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
+ }
+}
diff --git a/server.xml b/server.xml
new file mode 100644
index 0000000..4d42c3c
--- /dev/null
+++ b/server.xml
@@ -0,0 +1,24 @@
+<Server port="5712" shutdown="SHUTDOWN">
+ <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
+<Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener" />
+<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
+<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
+<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
+<GlobalNamingResources>
+ <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase" />
+ </GlobalNamingResources>
+<Service name="Catalina">
+ <Connector connectionTimeout="20000" port="99" protocol="HTTP/1.1" redirectPort="8490" />
+ <Engine defaultHost="localhost" name="Catalina">
+ <Realm className="org.apache.catalina.realm.LockOutRealm">
+ <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" />
+ </Realm>
+ <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
+ <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt" />
+ </Host>
+ <Host autoDeploy="true" name="wa.cn" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">
+ <Context crossContext="true" docBase="/www/wwwroot/wa.cn" path="" reloadable="true" />
+ </Host>
+ </Engine>
+ </Service>
+</Server>
\ No newline at end of file
diff --git a/web.xml b/web.xml
new file mode 100644
index 0000000..30107ae
--- /dev/null
+++ b/web.xml
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<web-app xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
+ http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+ version="3.0"
+ metadata-complete="true">
+
+ <display-name>Tomcat Host Manager Application</display-name>
+ <description>
+ A scriptable host management web application for the Tomcat Web Server;
+ Manager lets you view, create and remove virtual hosts.
+ </description>
+
+ <servlet>
+ <servlet-name>HostManager</servlet-name>
+ <servlet-class>org.apache.catalina.manager.host.HostManagerServlet</servlet-class>
+ <init-param>
+ <param-name>debug</param-name>
+ <param-value>2</param-value>
+ </init-param>
+ </servlet>
+ <servlet>
+ <servlet-name>HTMLHostManager</servlet-name>
+ <servlet-class>org.apache.catalina.manager.host.HTMLHostManagerServlet</servlet-class>
+ <init-param>
+ <param-name>debug</param-name>
+ <param-value>2</param-value>
+ </init-param>
+ </servlet>
+
+ <filter>
+ <filter-name>SetCharacterEncoding</filter-name>
+ <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
+ <init-param>
+ <param-name>encoding</param-name>
+ <param-value>UTF-8</param-value>
+ </init-param>
+ </filter>
+
+ <filter-mapping>
+ <filter-name>SetCharacterEncoding</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+ <filter>
+ <filter-name>CSRF</filter-name>
+ <filter-class>org.apache.catalina.filters.CsrfPreventionFilter</filter-class>
+ <init-param>
+ <param-name>entryPoints</param-name>
+ <param-value>/html,/html/,/html/list,/index.jsp</param-value>
+ </init-param>
+ </filter>
+
+ <!-- Configured to set X-FRAME-OPTIONS. Disable HSTS in case it interferes -->
+ <!-- with an existing setting. Keep X-Content-Type-Options and -->
+ <!-- X-XSS-Protection as they are page specific. -->
+ <filter>
+ <filter-name>HTTP header security filter</filter-name>
+ <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
+ <init-param>
+ <param-name>hstsEnabled</param-name>
+ <param-value>false</param-value>
+ </init-param>
+ </filter>
+
+ <filter-mapping>
+ <filter-name>CSRF</filter-name>
+ <servlet-name>HTMLHostManager</servlet-name>
+ </filter-mapping>
+
+ <filter-mapping>
+ <filter-name>HTTP header security filter</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+ <!-- Define the Manager Servlet Mapping -->
+ <servlet-mapping>
+ <servlet-name>HostManager</servlet-name>
+ <url-pattern>/text/*</url-pattern>
+ </servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>HTMLHostManager</servlet-name>
+ <url-pattern>/html/*</url-pattern>
+ </servlet-mapping>
+
+ <!-- Define a Security Constraint on this Application -->
+ <security-constraint>
+ <web-resource-collection>
+ <web-resource-name>HostManager commands</web-resource-name>
+ <url-pattern>/text/*</url-pattern>
+ </web-resource-collection>
+ <auth-constraint>
+ <!-- NOTE: This role is not present in the default users file -->
+ <role-name>admin-script</role-name>
+ </auth-constraint>
+ </security-constraint>
+ <security-constraint>
+ <web-resource-collection>
+ <web-resource-name>HTMLHostManager commands</web-resource-name>
+ <url-pattern>/html/*</url-pattern>
+ </web-resource-collection>
+ <auth-constraint>
+ <!-- NOTE: This role is not present in the default users file -->
+ <role-name>admin-gui</role-name>
+ </auth-constraint>
+ </security-constraint>
+
+ <!-- Define the Login Configuration for this Application -->
+ <login-config>
+ <auth-method>BASIC</auth-method>
+ <realm-name>Tomcat Host Manager Application</realm-name>
+ </login-config>
+
+ <!-- Security roles referenced by this web application -->
+ <security-role>
+ <description>
+ The role that is required to log in to the Host Manager Application HTML
+ interface
+ </description>
+ <role-name>admin-gui</role-name>
+ </security-role>
+ <security-role>
+ <description>
+ The role that is required to log in to the Host Manager Application text
+ interface
+ </description>
+ <role-name>admin-script</role-name>
+ </security-role>
+
+ <error-page>
+ <error-code>401</error-code>
+ <location>/WEB-INF/jsp/401.jsp</location>
+ </error-page>
+ <error-page>
+ <error-code>403</error-code>
+ <location>/WEB-INF/jsp/403.jsp</location>
+ </error-page>
+ <error-page>
+ <error-code>404</error-code>
+ <location>/WEB-INF/jsp/404.jsp</location>
+ </error-page>
+
+</web-app>
diff --git "a/\345\274\200\345\205\263\346\234\272\347\233\222\345\255\220\346\265\213\350\257\225\346\212\245\345\221\212.md" "b/\345\274\200\345\205\263\346\234\272\347\233\222\345\255\220\346\265\213\350\257\225\346\212\245\345\221\212.md"
new file mode 100644
index 0000000..73af396
--- /dev/null
+++ "b/\345\274\200\345\205\263\346\234\272\347\233\222\345\255\220\346\265\213\350\257\225\346\212\245\345\221\212.md"
@@ -0,0 +1,47 @@
+# 寮�鍏虫満鐩掑瓙娴嬭瘯鎶ュ憡
+## 娴嬭瘯绱犳潗
+鏃�
+
+## 娴嬭瘯鐩殑
+纭18涓紑鍏虫満鐩掑瓙鏄惁姝e父寮�鍏虫満
+
+## 娴嬭瘯鏃堕棿
+绗笁鎵癸細2021.12.24 - 2021.12.30
+
+## 缁堢MAC鍦板潃
+01锛�0025E1033D53
+02锛�0025E1033CF6
+03锛�0025E1033D00
+04锛�0025E1033D02
+05锛�0025E1033CF3
+06锛�0025E1033D72
+07锛�0025E1033D66
+08锛�0025E1033A8B
+09锛�0025E1033CF2
+10锛�0025E1033D5B
+11锛�0025E1033D6F
+12锛�0025E1033A61
+13锛�0025E1033D4A
+14锛�0025E1033D68
+15锛�0025E1033D67
+16锛�0025E1033CE4
+17锛�0025E1033D47
+18锛�0025E1033DA1
+
+## 娴嬭瘯渚�
+灏�18鍙板紑鍏虫満鐩掑瓙鏃堕棿璁剧疆缁熶竴锛岀粺涓�鍕鹃�夊叧鏈烘椂娈靛唴涓婄數淇濇寔寮�鏈�
+鍛ㄤ竴鑷冲懆浜旓細
+08:15 鈥� 09:00
+09:10 鈥� 10:00
+10:10 鈥� 12:00
+12:10 鈥� 13:00
+13:10 鈥� 18:00
+鍛ㄥ叚锛氬叏澶╁紑
+鍛ㄦ棩锛氬叏澶╁叧
+
+## 娴嬭瘯缁撴灉
+17鍙板紑鍏虫満鐩掑瓙鍦ㄨ瀹氱殑鏃堕棿姝e父寮�鍏虫満
+1鍙颁笉鑹�
+
+## 涓嶈壇鍘熷洜鍒嗘瀽
+Mac鍦板潃涓�0025E1033CF2 绾挎帴閿欎簡锛屼互涓嬫槸鍥剧墖锛�
\ No newline at end of file
diff --git "a/\351\273\221\345\256\235\345\241\224install_6.0.sh" "b/\351\273\221\345\256\235\345\241\224install_6.0.sh"
new file mode 100644
index 0000000..207b2f5
--- /dev/null
+++ "b/\351\273\221\345\256\235\345\241\224install_6.0.sh"
@@ -0,0 +1,738 @@
+#!/bin/bash
+PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
+export PATH
+LANG=en_US.UTF-8
+
+if [ $(whoami) != "root" ];then
+ echo "璇蜂娇鐢╮oot鏉冮檺鎵ц瀹濆瀹夎鍛戒护锛�"
+ exit 1;
+fi
+
+is64bit=$(getconf LONG_BIT)
+if [ "${is64bit}" != '64' ];then
+ Red_Error "鎶辨瓑, 褰撳墠闈㈡澘鐗堟湰涓嶆敮鎸�32浣嶇郴缁�, 璇蜂娇鐢�64浣嶇郴缁熸垨瀹夎瀹濆5.9!";
+fi
+
+cd ~
+setup_path="/www"
+python_bin=$setup_path/server/panel/pyenv/bin/python
+cpu_cpunt=$(cat /proc/cpuinfo|grep processor|wc -l)
+
+if [ "$1" ];then
+ IDC_CODE=$1
+fi
+
+GetSysInfo(){
+ if [ -s "/etc/redhat-release" ];then
+ SYS_VERSION=$(cat /etc/redhat-release)
+ elif [ -s "/etc/issue" ]; then
+ SYS_VERSION=$(cat /etc/issue)
+ fi
+ SYS_INFO=$(uname -a)
+ SYS_BIT=$(getconf LONG_BIT)
+ MEM_TOTAL=$(free -m|grep Mem|awk '{print $2}')
+ CPU_INFO=$(getconf _NPROCESSORS_ONLN)
+
+ echo -e ${SYS_VERSION}
+ echo -e Bit:${SYS_BIT} Mem:${MEM_TOTAL}M Core:${CPU_INFO}
+ echo -e ${SYS_INFO}
+ echo -e "璇锋埅鍥句互涓婃姤閿欎俊鎭彂甯栬嚦璁哄潧v7.hostcli.com/bbs姹傚姪"
+}
+Red_Error(){
+ echo '=================================================';
+ printf '\033[1;31;40m%b\033[0m\n' "$1";
+ GetSysInfo
+ exit 1;
+}
+Lock_Clear(){
+ if [ -f "/etc/bt_crack.pl" ];then
+ chattr -R -ia /www
+ chattr -ia /etc/init.d/bt
+ \cp -rpa /www/backup/panel/vhost/* /www/server/panel/vhost/
+ mv /www/server/panel/BTPanel/__init__.bak /www/server/panel/BTPanel/__init__.py
+ rm -f /etc/bt_crack.pl
+ fi
+}
+Install_Check(){
+ if [ "${INSTALL_FORCE}" ];then
+ return
+ fi
+ echo -e "----------------------------------------------------"
+ echo -e "妫�鏌ュ凡鏈夊叾浠朩eb/mysql鐜锛屽畨瑁呭疂濉斿彲鑳藉奖鍝嶇幇鏈夌珯鐐瑰強鏁版嵁"
+ echo -e "Web/mysql service is alreday installed,Can't install panel"
+ echo -e "----------------------------------------------------"
+ echo -e "宸茬煡椋庨櫓/Enter yes to force installation"
+ read -p "杈撳叆yes寮哄埗瀹夎: " yes;
+ if [ "$yes" != "yes" ];then
+ echo -e "------------"
+ echo "鍙栨秷瀹夎"
+ exit;
+ fi
+ INSTALL_FORCE="true"
+}
+System_Check(){
+ MYSQLD_CHECK=$(ps -ef |grep mysqld|grep -v grep|grep -v /www/server/mysql)
+ PHP_CHECK=$(ps -ef|grep php-fpm|grep master|grep -v /www/server/php)
+ NGINX_CHECK=$(ps -ef|grep nginx|grep master|grep -v /www/server/nginx)
+ HTTPD_CHECK=$(ps -ef |grep -E 'httpd|apache'|grep -v /www/server/apache|grep -v grep)
+ if [ "${PHP_CHECK}" ] || [ "${MYSQLD_CHECK}" ] || [ "${NGINX_CHECK}" ] || [ "${HTTPD_CHECK}" ];then
+ Install_Check
+ fi
+}
+Get_Pack_Manager(){
+ if [ -f "/usr/bin/yum" ] && [ -d "/etc/yum.repos.d" ]; then
+ PM="yum"
+ elif [ -f "/usr/bin/apt-get" ] && [ -f "/usr/bin/dpkg" ]; then
+ PM="apt-get"
+ fi
+}
+Auto_Swap()
+{
+ swap=$(free |grep Swap|awk '{print $2}')
+ if [ "${swap}" -gt 1 ];then
+ echo "Swap total sizse: $swap";
+ return;
+ fi
+ if [ ! -d /www ];then
+ mkdir /www
+ fi
+ swapFile="/www/swap"
+ dd if=/dev/zero of=$swapFile bs=1M count=1025
+ mkswap -f $swapFile
+ swapon $swapFile
+ echo "$swapFile swap swap defaults 0 0" >> /etc/fstab
+ swap=`free |grep Swap|awk '{print $2}'`
+ if [ $swap -gt 1 ];then
+ echo "Swap total sizse: $swap";
+ return;
+ fi
+
+ sed -i "/\/www\/swap/d" /etc/fstab
+ rm -f $swapFile
+}
+Service_Add(){
+ if [ "${PM}" == "yum" ] || [ "${PM}" == "dnf" ]; then
+ chkconfig --add bt
+ chkconfig --level 2345 bt on
+ elif [ "${PM}" == "apt-get" ]; then
+ update-rc.d bt defaults
+ fi
+}
+
+get_node_url(){
+ if [ ! -f /bin/curl ];then
+ if [ "${PM}" = "yum" ]; then
+ yum install curl -y
+ elif [ "${PM}" = "apt-get" ]; then
+ apt-get install curl -y
+ fi
+ fi
+
+ echo '---------------------------------------------';
+ echo "Selected download node...";
+ download_Url='http://v7.hostcli.com';
+ echo "Download node: $download_Url";
+ echo '---------------------------------------------';
+}
+Remove_Package(){
+ local PackageNmae=$1
+ if [ "${PM}" == "yum" ];then
+ isPackage=$(rpm -q ${PackageNmae}|grep "not installed")
+ if [ -z "${isPackage}" ];then
+ yum remove ${PackageNmae} -y
+ fi
+ elif [ "${PM}" == "apt-get" ];then
+ isPackage=$(dpkg -l|grep ${PackageNmae})
+ if [ "${PackageNmae}" ];then
+ apt-get remove ${PackageNmae} -y
+ fi
+ fi
+}
+Install_RPM_Pack(){
+ yumPath=/etc/yum.conf
+ Centos8Check=$(cat /etc/redhat-release | grep ' 8.' | grep -iE 'centos|Red Hat')
+ isExc=$(cat $yumPath|grep httpd)
+ if [ "$isExc" = "" ];then
+ echo "exclude=httpd nginx php mysql mairadb python-psutil python2-psutil" >> $yumPath
+ fi
+
+ #yumBaseUrl=$(cat /etc/yum.repos.d/CentOS-Base.repo|grep baseurl=http|cut -d '=' -f 2|cut -d '$' -f 1|head -n 1)
+ #[ "${yumBaseUrl}" ] && checkYumRepo=$(curl --connect-timeout 5 --head -s -o /dev/null -w %{http_code} ${yumBaseUrl})
+ #if [ "${checkYumRepo}" != "200" ];then
+ # curl -Ss --connect-timeout 3 -m 60 http://download.bt.cn/install/yumRepo_select.sh|bash
+ #fi
+
+ #灏濊瘯鍚屾鏃堕棿(浠巄t.cn)
+ echo 'Synchronizing system time...'
+ getBtTime=$(curl -sS --connect-timeout 3 -m 60 http://v7.hostcli.com/api/index/get_time)
+ if [ "${getBtTime}" ];then
+ date -s "$(date -d @$getBtTime +"%Y-%m-%d %H:%M:%S")"
+ fi
+
+ if [ -z "${Centos8Check}" ]; then
+ yum install ntp -y
+ rm -rf /etc/localtime
+ ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
+
+ #灏濊瘯鍚屾鍥介檯鏃堕棿(浠巒tp鏈嶅姟鍣�)
+ ntpdate 0.asia.pool.ntp.org
+ setenforce 0
+ fi
+
+ startTime=`date +%s`
+
+ sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
+ #yum remove -y python-requests python3-requests python-greenlet python3-greenlet
+ yumPacks="libcurl-devel wget tar gcc make zip unzip openssl openssl-devel gcc libxml2 libxml2-devel libxslt* zlib zlib-devel libjpeg-devel libpng-devel libwebp libwebp-devel freetype freetype-devel lsof pcre pcre-devel vixie-cron crontabs icu libicu-devel c-ares libffi-devel bzip2-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel"
+ yum install -y ${yumPacks}
+
+ for yumPack in ${yumPacks}
+ do
+ rpmPack=$(rpm -q ${yumPack})
+ packCheck=$(echo ${rpmPack}|grep not)
+ if [ "${packCheck}" ]; then
+ yum install ${yumPack} -y
+ fi
+ done
+ if [ -f "/usr/bin/dnf" ]; then
+ dnf install -y redhat-rpm-config
+ fi
+
+ ALI_OS=$(cat /etc/redhat-release |grep "Alibaba Cloud Linux release 3")
+ if [ -z "${ALI_OS}" ];then
+ yum install epel-release -y
+ fi
+}
+Install_Deb_Pack(){
+ ln -sf bash /bin/sh
+ apt-get update -y
+ apt-get install ruby -y
+ apt-get install lsb-release -y
+ #apt-get install ntp ntpdate -y
+ #/etc/init.d/ntp stop
+ #update-rc.d ntp remove
+ #cat >>~/.profile<<EOF
+ #TZ='Asia/Shanghai'; export TZ
+ #EOF
+ #rm -rf /etc/localtime
+ #cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
+ #echo 'Synchronizing system time...'
+ #ntpdate 0.asia.pool.ntp.org
+ #apt-get upgrade -y
+ debPacks="wget curl libcurl4-openssl-dev gcc make zip unzip tar openssl libssl-dev gcc libxml2 libxml2-dev zlib1g zlib1g-dev libjpeg-dev libpng-dev lsof libpcre3 libpcre3-dev cron net-tools swig build-essential libffi-dev libbz2-dev libncurses-dev libsqlite3-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libdb++-dev libpcap-dev xz-utils git";
+ apt-get install -y $debPacks --force-yes
+
+ for debPack in ${debPacks}
+ do
+ packCheck=$(dpkg -l ${debPack})
+ if [ "$?" -ne "0" ] ;then
+ apt-get install -y debPack
+ fi
+ done
+
+ if [ ! -d '/etc/letsencrypt' ];then
+ mkdir -p /etc/letsencryp
+ mkdir -p /var/spool/cron
+ if [ ! -f '/var/spool/cron/crontabs/root' ];then
+ echo '' > /var/spool/cron/crontabs/root
+ chmod 600 /var/spool/cron/crontabs/root
+ fi
+ fi
+}
+Install_Bt(){
+ panelPort="8888"
+ if [ -f ${setup_path}/server/panel/data/port.pl ];then
+ panelPort=$(cat ${setup_path}/server/panel/data/port.pl)
+ fi
+ mkdir -p ${setup_path}/server/panel/logs
+ mkdir -p ${setup_path}/server/panel/vhost/apache
+ mkdir -p ${setup_path}/server/panel/vhost/nginx
+ mkdir -p ${setup_path}/server/panel/vhost/rewrite
+ mkdir -p ${setup_path}/server/panel/install
+ mkdir -p /www/server
+ mkdir -p /www/wwwroot
+ mkdir -p /www/wwwlogs
+ mkdir -p /www/backup/database
+ mkdir -p /www/backup/site
+
+ if [ ! -f "/usr/bin/unzip" ]; then
+ if [ "${PM}" = "yum" ]; then
+ yum install unzip -y
+ elif [ "${PM}" = "apt-get" ]; then
+ apt-get install unzip -y
+ fi
+ fi
+
+ if [ -f "/etc/init.d/bt" ]; then
+ /etc/init.d/bt stop
+ sleep 1
+ fi
+
+ wget -O panel.zip ${download_Url}/install/src/panel_new.zip -T 10
+ wget -O /etc/init.d/bt ${download_Url}/install/src/bt6.init -T 10
+ wget -O /www/server/panel/install/public.sh ${download_Url}/install/public.sh -T 10
+
+ if [ -f "${setup_path}/server/panel/data/default.db" ];then
+ if [ -d "/${setup_path}/server/panel/old_data" ];then
+ rm -rf ${setup_path}/server/panel/old_data
+ fi
+ mkdir -p ${setup_path}/server/panel/old_data
+ d_format=$(date +"%Y%m%d_%H%M%S")
+ \cp -arf ${setup_path}/server/panel/data/default.db ${setup_path}/server/panel/data/default_backup_${d_format}.db
+ mv -f ${setup_path}/server/panel/data/default.db ${setup_path}/server/panel/old_data/default.db
+ mv -f ${setup_path}/server/panel/data/system.db ${setup_path}/server/panel/old_data/system.db
+ mv -f ${setup_path}/server/panel/data/port.pl ${setup_path}/server/panel/old_data/port.pl
+ mv -f ${setup_path}/server/panel/data/admin_path.pl ${setup_path}/server/panel/old_data/admin_path.pl
+ fi
+
+ unzip -o panel.zip -d ${setup_path}/server/ > /dev/null
+
+ if [ -d "${setup_path}/server/panel/old_data" ];then
+ mv -f ${setup_path}/server/panel/old_data/default.db ${setup_path}/server/panel/data/default.db
+ mv -f ${setup_path}/server/panel/old_data/system.db ${setup_path}/server/panel/data/system.db
+ mv -f ${setup_path}/server/panel/old_data/port.pl ${setup_path}/server/panel/data/port.pl
+ mv -f ${setup_path}/server/panel/old_data/admin_path.pl ${setup_path}/server/panel/data/admin_path.pl
+ if [ -d "/${setup_path}/server/panel/old_data" ];then
+ rm -rf ${setup_path}/server/panel/old_data
+ fi
+ fi
+
+ rm -f panel.zip
+
+ if [ ! -f ${setup_path}/server/panel/tools.py ];then
+ Red_Error "ERROR: Failed to download, please try install again!"
+ fi
+
+ rm -f ${setup_path}/server/panel/class/*.pyc
+ rm -f ${setup_path}/server/panel/*.pyc
+
+ chmod +x /etc/init.d/bt
+ chmod -R 600 ${setup_path}/server/panel
+ chmod -R +x ${setup_path}/server/panel/script
+ ln -sf /etc/init.d/bt /usr/bin/bt
+ echo "${panelPort}" > ${setup_path}/server/panel/data/port.pl
+ wget -O /etc/init.d/bt ${download_Url}/install/src/bt7.init -T 10
+ wget -O /www/server/panel/init.sh ${download_Url}/install/src/bt7.init -T 10
+}
+Install_Python_Lib(){
+ curl -Ss --connect-timeout 3 -m 60 $download_Url/install/pip_select.sh|bash
+ pyenv_path="/www/server/panel"
+ if [ -f $pyenv_path/pyenv/bin/python ];then
+ is_err=$($pyenv_path/pyenv/bin/python3.7 -V 2>&1|grep 'Could not find platform')
+ if [ "$is_err" = "" ];then
+ chmod -R 700 $pyenv_path/pyenv/bin
+ is_package=$($python_bin -m psutil 2>&1|grep package)
+ if [ "$is_package" = "" ];then
+ wget -O $pyenv_path/pyenv/pip.txt $download_Url/install/pyenv/pip.txt -T 5
+ $pyenv_path/pyenv/bin/pip install -U pip
+ $pyenv_path/pyenv/bin/pip install -U setuptools
+ $pyenv_path/pyenv/bin/pip install -r $pyenv_path/pyenv/pip.txt
+ fi
+ source $pyenv_path/pyenv/bin/activate
+ return
+ else
+ rm -rf $pyenv_path/pyenv
+ fi
+ fi
+ py_version="3.7.8"
+ mkdir -p $pyenv_path
+ os_type='el'
+ os_version='7'
+ is_export_openssl=0
+ Get_Versions
+ Centos6_Openssl
+ Other_Openssl
+ echo "OS: $os_type - $os_version"
+ is_aarch64=$(uname -a|grep aarch64)
+ if [ "$is_aarch64" != "" ];then
+ os_version="aarch64"
+ fi
+
+ if [ -f "/www/server/panel/pymake.pl" ];then
+ os_version=""
+ rm -f /www/server/panel/pymake.pl
+ fi
+
+ if [ "${os_version}" != "" ];then
+ pyenv_file="/www/pyenv.tar.gz"
+ wget -O $pyenv_file $download_Url/install/pyenv/pyenv-${os_type}${os_version}-x${is64bit}.tar.gz -T 10
+ tmp_size=$(du -b $pyenv_file|awk '{print $1}')
+ if [ $tmp_size -lt 703460 ];then
+ rm -f $pyenv_file
+ echo "ERROR: Download python env fielded."
+ else
+ echo "Install python env..."
+ tar zxvf $pyenv_file -C $pyenv_path/ > /dev/null
+ chmod -R 700 $pyenv_path/pyenv/bin
+ if [ ! -f $pyenv_path/pyenv/bin/python ];then
+ rm -f $pyenv_file
+ Red_Error "ERROR: Install python env fielded."
+ fi
+ is_err=$($pyenv_path/pyenv/bin/python3.7 -V 2>&1|grep 'Could not find platform')
+ if [ "$is_err" = "" ];then
+ rm -f $pyenv_file
+ ln -sf $pyenv_path/pyenv/bin/pip3.7 /usr/bin/btpip
+ ln -sf $pyenv_path/pyenv/bin/python3.7 /usr/bin/btpython
+ source $pyenv_path/pyenv/bin/activate
+ return
+ else
+ rm -f $pyenv_file
+ rm -rf $pyenv_path/pyenv
+ fi
+ fi
+
+ fi
+ if [ -f /usr/local/openssl/lib/libssl.so ];then
+ export LDFLAGS="-L/usr/local/openssl/lib"
+ export CPPFLAGS="-I/usr/local/openssl/include"
+ export PKG_CONFIG_PATH="/usr/local/openssl/lib/pkgconfig"
+ echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/openssl/lib" >> /etc/profile
+ source /etc/profile
+ fi
+ cd /www
+ python_src='/www/python_src.tar.xz'
+ python_src_path="/www/Python-${py_version}"
+ wget -O $python_src $download_Url/src/Python-${py_version}.tar.xz -T 5
+ tmp_size=$(du -b $python_src|awk '{print $1}')
+ if [ $tmp_size -lt 10703460 ];then
+ rm -f $python_src
+ Red_Error "ERROR: Download python source code fielded."
+ fi
+ tar xvf $python_src
+ rm -f $python_src
+ cd $python_src_path
+ ./configure --prefix=$pyenv_path/pyenv
+ make -j$cpu_cpunt
+ make install
+ if [ ! -f $pyenv_path/pyenv/bin/python3.7 ];then
+ rm -rf $python_src_path
+ Red_Error "ERROR: Make python env fielded."
+ fi
+ cd ~
+ rm -rf $python_src_path
+ wget -O $pyenv_path/pyenv/bin/activate $download_Url/install/pyenv/activate.panel -T 5
+ wget -O $pyenv_path/pyenv/pip.txt $download_Url/install/pyenv/pip-3.7.8.txt -T 5
+ ln -sf $pyenv_path/pyenv/bin/pip3.7 $pyenv_path/pyenv/bin/pip
+ ln -sf $pyenv_path/pyenv/bin/python3.7 $pyenv_path/pyenv/bin/python
+ ln -sf $pyenv_path/pyenv/bin/pip3.7 /usr/bin/btpip
+ ln -sf $pyenv_path/pyenv/bin/python3.7 /usr/bin/btpython
+ chmod -R 700 $pyenv_path/pyenv/bin
+ $pyenv_path/pyenv/bin/pip install -U pip
+ $pyenv_path/pyenv/bin/pip install -U setuptools
+ $pyenv_path/pyenv/bin/pip install -U wheel==0.34.2
+ $pyenv_path/pyenv/bin/pip install -r $pyenv_path/pyenv/pip.txt
+ source $pyenv_path/pyenv/bin/activate
+}
+Other_Openssl(){
+ openssl_version=$(openssl version|grep -Eo '[0-9]\.[0-9]\.[0-9]')
+ if [ "$openssl_version" = '1.0.1' ] || [ "$openssl_version" = '1.0.0' ];then
+ opensslVersion="1.0.2r"
+ if [ ! -f "/usr/local/openssl/lib/libssl.so" ];then
+ cd /www
+ openssl_src_file=/www/openssl.tar.gz
+ wget -O $openssl_src_file ${download_Url}/src/openssl-${opensslVersion}.tar.gz
+ tmp_size=$(du -b $openssl_src_file|awk '{print $1}')
+ if [ $tmp_size -lt 703460 ];then
+ rm -f $openssl_src_file
+ Red_Error "ERROR: Download openssl-1.0.2 source code fielded."
+ fi
+ tar -zxf $openssl_src_file
+ rm -f $openssl_src_file
+ cd openssl-${opensslVersion}
+ #zlib-dynamic shared
+ ./config --openssldir=/usr/local/openssl zlib-dynamic shared
+ make -j${cpuCore}
+ make install
+ echo "/usr/local/openssl/lib" > /etc/ld.so.conf.d/zopenssl.conf
+ ldconfig
+ cd ..
+ rm -rf openssl-${opensslVersion}
+ is_export_openssl=1
+ cd ~
+ fi
+ fi
+}
+Insatll_Libressl(){
+ openssl_version=$(openssl version|grep -Eo '[0-9]\.[0-9]\.[0-9]')
+ if [ "$openssl_version" = '1.0.1' ] || [ "$openssl_version" = '1.0.0' ];then
+ opensslVersion="3.0.2"
+ cd /www
+ openssl_src_file=/www/openssl.tar.gz
+ wget -O $openssl_src_file ${download_Url}/install/pyenv/libressl-${opensslVersion}.tar.gz
+ tmp_size=$(du -b $openssl_src_file|awk '{print $1}')
+ if [ $tmp_size -lt 703460 ];then
+ rm -f $openssl_src_file
+ Red_Error "ERROR: Download libressl-$opensslVersion source code fielded."
+ fi
+ tar -zxf $openssl_src_file
+ rm -f $openssl_src_file
+ cd libressl-${opensslVersion}
+ ./config 鈥損refix=/usr/local/lib
+ make -j${cpuCore}
+ make install
+ ldconfig
+ ldconfig -v
+ cd ..
+ rm -rf libressl-${opensslVersion}
+ is_export_openssl=1
+ cd ~
+ fi
+}
+Centos6_Openssl(){
+ if [ "$os_type" != 'el' ];then
+ return
+ fi
+ if [ "$os_version" != '6' ];then
+ return
+ fi
+ echo 'Centos6 install openssl-1.0.2...'
+ openssl_rpm_file="/www/openssl.rpm"
+ wget -O $openssl_rpm_file $download_Url/rpm/centos6/${is64bit}/bt-openssl102.rpm -T 10
+ tmp_size=$(du -b $openssl_rpm_file|awk '{print $1}')
+ if [ $tmp_size -lt 102400 ];then
+ rm -f $openssl_rpm_file
+ Red_Error "ERROR: Download python env fielded."
+ fi
+ rpm -ivh $openssl_rpm_file
+ rm -f $openssl_rpm_file
+ is_export_openssl=1
+}
+Get_Versions(){
+ redhat_version_file="/etc/redhat-release"
+ deb_version_file="/etc/issue"
+ if [ -f $redhat_version_file ];then
+ os_type='el'
+ is_aliyunos=$(cat $redhat_version_file|grep Aliyun)
+ if [ "$is_aliyunos" != "" ];then
+ return
+ fi
+ os_version=$(cat $redhat_version_file|grep CentOS|grep -Eo '([0-9]+\.)+[0-9]+'|grep -Eo '^[0-9]')
+ if [ "${os_version}" = "5" ];then
+ os_version=""
+ fi
+ else
+ os_type='ubuntu'
+ os_version=$(cat $deb_version_file|grep Ubuntu|grep -Eo '([0-9]+\.)+[0-9]+'|grep -Eo '^[0-9]+')
+ if [ "${os_version}" = "" ];then
+ os_type='debian'
+ os_version=$(cat $deb_version_file|grep Debian|grep -Eo '([0-9]+\.)+[0-9]+'|grep -Eo '[0-9]+')
+ if [ "${os_version}" = "" ];then
+ os_version=$(cat $deb_version_file|grep Debian|grep -Eo '[0-9]+')
+ fi
+ if [ "${os_version}" = "8" ];then
+ os_version=""
+ fi
+ if [ "${is64bit}" = '32' ];then
+ os_version=""
+ fi
+ else
+ if [ "$os_version" = "14" ];then
+ os_version=""
+ fi
+ if [ "$os_version" = "12" ];then
+ os_version=""
+ fi
+ if [ "$os_version" = "19" ];then
+ os_version=""
+ fi
+
+ fi
+ fi
+}
+Set_Bt_Panel(){
+ password=$(cat /dev/urandom | head -n 16 | md5sum | head -c 8)
+ sleep 1
+ admin_auth="/www/server/panel/data/admin_path.pl"
+ if [ ! -f ${admin_auth} ];then
+ auth_path=$(cat /dev/urandom | head -n 16 | md5sum | head -c 8)
+ echo "/${auth_path}" > ${admin_auth}
+ fi
+ auth_path=$(cat ${admin_auth})
+ cd ${setup_path}/server/panel/
+ /etc/init.d/bt start
+ $python_bin -m py_compile tools.py
+ $python_bin tools.py username
+ username=$($python_bin tools.py panel ${password})
+ cd ~
+ echo "${password}" > ${setup_path}/server/panel/default.pl
+ chmod 600 ${setup_path}/server/panel/default.pl
+ sleep 3
+ /etc/init.d/bt restart
+ sleep 3
+ isStart=$(ps aux |grep 'BT-Panel'|grep -v grep|awk '{print $2}')
+ LOCAL_CURL=$(curl 127.0.0.1:8888/login 2>&1 |grep -i html)
+ if [ -z "${isStart}" ] && [ -z "${LOCAL_CURL}" ];then
+ /etc/init.d/bt 22
+ cd /www/server/panel/pyenv/bin
+ touch t.pl
+ ls -al python3.7 python
+ lsattr python3.7 python
+ Red_Error "ERROR: The BT-Panel service startup failed."
+ fi
+}
+Set_Firewall(){
+ sshPort=$(cat /etc/ssh/sshd_config | grep 'Port '|awk '{print $2}')
+ if [ "${PM}" = "apt-get" ]; then
+ apt-get install -y ufw
+ if [ -f "/usr/sbin/ufw" ];then
+ ufw allow 20/tcp
+ ufw allow 21/tcp
+ ufw allow 22/tcp
+ ufw allow 80/tcp
+ ufw allow 888/tcp
+ ufw allow ${panelPort}/tcp
+ ufw allow ${sshPort}/tcp
+ ufw allow 39000:40000/tcp
+ ufw_status=`ufw status`
+ echo y|ufw enable
+ ufw default deny
+ ufw reload
+ fi
+ else
+ if [ -f "/etc/init.d/iptables" ];then
+ iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 20 -j ACCEPT
+ iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
+ iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
+ iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
+ iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport ${panelPort} -j ACCEPT
+ iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport ${sshPort} -j ACCEPT
+ iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 39000:40000 -j ACCEPT
+ #iptables -I INPUT -p tcp -m state --state NEW -m udp --dport 39000:40000 -j ACCEPT
+ iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
+ iptables -A INPUT -s localhost -d localhost -j ACCEPT
+ iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
+ iptables -P INPUT DROP
+ service iptables save
+ sed -i "s#IPTABLES_MODULES=\"\"#IPTABLES_MODULES=\"ip_conntrack_netbios_ns ip_conntrack_ftp ip_nat_ftp\"#" /etc/sysconfig/iptables-config
+ iptables_status=$(service iptables status | grep 'not running')
+ if [ "${iptables_status}" == '' ];then
+ service iptables restart
+ fi
+ else
+ AliyunCheck=$(cat /etc/redhat-release|grep "Aliyun Linux")
+ [ "${AliyunCheck}" ] && return
+ yum install firewalld -y
+ [ "${Centos8Check}" ] && yum reinstall python3-six -y
+ systemctl enable firewalld
+ systemctl start firewalld
+ firewall-cmd --set-default-zone=public > /dev/null 2>&1
+ firewall-cmd --permanent --zone=public --add-port=20/tcp > /dev/null 2>&1
+ firewall-cmd --permanent --zone=public --add-port=21/tcp > /dev/null 2>&1
+ firewall-cmd --permanent --zone=public --add-port=22/tcp > /dev/null 2>&1
+ firewall-cmd --permanent --zone=public --add-port=80/tcp > /dev/null 2>&1
+ firewall-cmd --permanent --zone=public --add-port=${panelPort}/tcp > /dev/null 2>&1
+ firewall-cmd --permanent --zone=public --add-port=${sshPort}/tcp > /dev/null 2>&1
+ firewall-cmd --permanent --zone=public --add-port=39000-40000/tcp > /dev/null 2>&1
+ #firewall-cmd --permanent --zone=public --add-port=39000-40000/udp > /dev/null 2>&1
+ firewall-cmd --reload
+ fi
+ fi
+}
+Get_Ip_Address(){
+ getIpAddress=""
+ getIpAddress=$(curl -sS --connect-timeout 10 -m 60 https://v7.hostcli.com/Api/getIpAddress)
+ if [ -z "${getIpAddress}" ] || [ "${getIpAddress}" = "0.0.0.0" ]; then
+ isHosts=$(cat /etc/hosts|grep 'v7.hostcli.com')
+ if [ -z "${isHosts}" ];then
+ #echo "" >> /etc/hosts
+ #echo "103.224.251.67 v7.hostcli.com" >> /etc/hosts
+ getIpAddress=$(curl -sS --connect-timeout 10 -m 60 https://v7.hostcli.com/Api/getIpAddress)
+ if [ -z "${getIpAddress}" ];then
+ sed -i "/v7.hostcli.com/d" /etc/hosts
+ fi
+ fi
+ fi
+
+ ipv4Check=$($python_bin -c "import re; print(re.match('^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$','${getIpAddress}'))")
+ if [ "${ipv4Check}" == "None" ];then
+ ipv6Address=$(echo ${getIpAddress}|tr -d "[]")
+ ipv6Check=$($python_bin -c "import re; print(re.match('^([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}$','${ipv6Address}'))")
+ if [ "${ipv6Check}" == "None" ]; then
+ getIpAddress="SERVER_IP"
+ else
+ echo "True" > ${setup_path}/server/panel/data/ipv6.pl
+ sleep 1
+ /etc/init.d/bt restart
+ fi
+ fi
+
+ if [ "${getIpAddress}" != "SERVER_IP" ];then
+ echo "${getIpAddress}" > ${setup_path}/server/panel/data/iplist.txt
+ fi
+ LOCAL_IP=$(ip addr | grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -E -v "^127\.|^255\.|^0\." | head -n 1)
+}
+Setup_Count(){
+ curl -sS --connect-timeout 10 -m 60 https://v7.hostcli.com/Api/SetupCount?type=Linux\&o=$1 > /dev/null 2>&1
+ if [ "$1" != "" ];then
+ echo $1 > /www/server/panel/data/o.pl
+ cd /www/server/panel
+ $python_bin tools.py o
+ fi
+ echo /www > /var/bt_setupPath.conf
+}
+Install_Main(){
+ startTime=`date +%s`
+ Lock_Clear
+ System_Check
+ Get_Pack_Manager
+ get_node_url
+
+ MEM_TOTAL=$(free -g|grep Mem|awk '{print $2}')
+ if [ "${MEM_TOTAL}" -le "1" ];then
+ Auto_Swap
+ fi
+
+ if [ "${PM}" = "yum" ]; then
+ Install_RPM_Pack
+ elif [ "${PM}" = "apt-get" ]; then
+ Install_Deb_Pack
+ fi
+
+ Install_Python_Lib
+ Install_Bt
+
+
+ Set_Bt_Panel
+ Service_Add
+ Set_Firewall
+
+ Get_Ip_Address
+ Setup_Count ${IDC_CODE}
+}
+
+echo "
++----------------------------------------------------------------------
+| hostcli.com FOR CentOS/Ubuntu/Debian
++----------------------------------------------------------------------
+| Copyright 漏 2015-2099 HostCli(http://v7.hostcli.com) All rights reserved.
++----------------------------------------------------------------------
+| The WebPanel URL will be http://SERVER_IP:8888 when installed.
++----------------------------------------------------------------------
+"
+while [ "$go" != 'y' ] && [ "$go" != 'n' ]
+do
+ read -p "Do you want to install Bt-Panel to the $setup_path directory now?(y/n): " go;
+done
+
+if [ "$go" == 'n' ];then
+ exit;
+fi
+
+Install_Main
+echo > /www/server/panel/data/bind.pl
+echo -e "=================================================================="
+echo -e "\033[32mCongratulations! Installed successfully!\033[0m"
+echo -e "=================================================================="
+echo "澶栫綉闈㈡澘鍦板潃: http://${getIpAddress}:${panelPort}${auth_path}"
+echo "鍐呯綉闈㈡澘鍦板潃: http://${LOCAL_IP}:${panelPort}${auth_path}"
+echo -e "username: $username"
+echo -e "password: $password"
+echo -e "\033[33mIf you cannot access the panel,\033[0m"
+echo -e "\033[33mrelease the following panel port [${panelPort}] in the security group\033[0m"
+echo -e "\033[33m鑻ユ棤娉曡闂潰鏉匡紝璇锋鏌ラ槻鐏/瀹夊叏缁勬槸鍚︽湁鏀捐闈㈡澘[${panelPort}]绔彛\033[0m"
+echo -e "=================================================================="
+
+endTime=`date +%s`
+((outTime=($endTime-$startTime)/60))
+echo -e "Time consumed:\033[32m $outTime \033[0mMinute!"
+
--
Gitblit v1.10.0