diff --git a/doc/lucky1.png b/doc/lucky1.png
deleted file mode 100644
index a5b41b6e..00000000
Binary files a/doc/lucky1.png and /dev/null differ
diff --git a/doc/lucky2.png b/doc/lucky2.png
deleted file mode 100644
index ba4c026f..00000000
Binary files a/doc/lucky2.png and /dev/null differ
diff --git a/doc/lucky3.png b/doc/lucky3.png
deleted file mode 100644
index 6fa7982f..00000000
Binary files a/doc/lucky3.png and /dev/null differ
diff --git a/doc/taskplan1.png b/doc/taskplan1.png
new file mode 100644
index 00000000..1f8db7be
Binary files /dev/null and b/doc/taskplan1.png differ
diff --git a/doc/taskplan2.png b/doc/taskplan2.png
new file mode 100644
index 00000000..edb45d6d
Binary files /dev/null and b/doc/taskplan2.png differ
diff --git a/doc/taskplan3.png b/doc/taskplan3.png
new file mode 100644
index 00000000..d4794702
Binary files /dev/null and b/doc/taskplan3.png differ
diff --git a/doc/view.png b/doc/view.png
new file mode 100644
index 00000000..169e112f
Binary files /dev/null and b/doc/view.png differ
diff --git a/doc/view2.png b/doc/view2.png
new file mode 100644
index 00000000..9058c632
Binary files /dev/null and b/doc/view2.png differ
diff --git a/gn/Makefile b/gn/Makefile
index 5d39a28d..766d76aa 100644
--- a/gn/Makefile
+++ b/gn/Makefile
@@ -9,9 +9,9 @@ PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://gn.googlesource.com/gn.git
-PKG_SOURCE_DATE:=2026-09-11
-PKG_SOURCE_VERSION:=cfcd774b98f3433e18b722f9a7ff06119825b8eb
-PKG_MIRROR_HASH:=d8bea9ac89f9e87f36874601588f0d8d32221bf1ad8488f2fd9775abcddf4860
+PKG_SOURCE_DATE:=2026-09-17
+PKG_SOURCE_VERSION:=127dd2a6d582528d6d61c4d838dc17385ef31abd
+PKG_MIRROR_HASH:=932ef98a571d8bef6b26aca792154d989863a5746e4ceded2d37c9190793d1a0
PKG_LICENSE:=BSD 3-Clause
PKG_LICENSE_FILES:=LICENSE
diff --git a/gn/src/out/last_commit_position.h b/gn/src/out/last_commit_position.h
index e0a3a55e..3f4c4158 100644
--- a/gn/src/out/last_commit_position.h
+++ b/gn/src/out/last_commit_position.h
@@ -3,7 +3,7 @@
#ifndef OUT_LAST_COMMIT_POSITION_H_
#define OUT_LAST_COMMIT_POSITION_H_
-#define LAST_COMMIT_POSITION_NUM 2563
-#define LAST_COMMIT_POSITION "2563 (cfcd774b98f3)"
+#define LAST_COMMIT_POSITION_NUM 2575
+#define LAST_COMMIT_POSITION "2575 (127dd2a6d582)"
#endif // OUT_LAST_COMMIT_POSITION_H_
diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/server/type/1_sing-box.lua b/luci-app-passwall/luasrc/model/cbi/passwall/server/type/1_sing-box.lua
index 3cafc9a3..65e69f99 100644
--- a/luci-app-passwall/luasrc/model/cbi/passwall/server/type/1_sing-box.lua
+++ b/luci-app-passwall/luasrc/model/cbi/passwall/server/type/1_sing-box.lua
@@ -83,21 +83,6 @@ o = s:option(DynamicList, "users", translate("User"))
for i, v in ipairs(user_list) do
o:value(v[".name"], v.username)
end
-o.validate = function(self, value, t)
- if type(value) == "string" then value = {value} end
- if type(value) == "table" then
- for _, u in ipairs(value) do
- local found = false
- for _, v in ipairs(user_list) do
- if u == v[".name"] then found = true; break end
- end
- if not found then
- return nil, translate("Please configure user info on the User Management page.")
- end
- end
- end
- return value
-end
o:depends({ protocol = "mixed" })
o:depends({ protocol = "socks" })
o:depends({ protocol = "http" })
diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/server/type/2_xray.lua b/luci-app-passwall/luasrc/model/cbi/passwall/server/type/2_xray.lua
index 3374b1af..b126f021 100644
--- a/luci-app-passwall/luasrc/model/cbi/passwall/server/type/2_xray.lua
+++ b/luci-app-passwall/luasrc/model/cbi/passwall/server/type/2_xray.lua
@@ -76,21 +76,6 @@ o = s:option(DynamicList, "users", translate("User"))
for i, v in ipairs(user_list) do
o:value(v[".name"], v.username)
end
-o.validate = function(self, value, t)
- if type(value) == "string" then value = {value} end
- if type(value) == "table" then
- for _, u in ipairs(value) do
- local found = false
- for _, v in ipairs(user_list) do
- if u == v[".name"] then found = true; break end
- end
- if not found then
- return nil, translate("Please configure user info on the User Management page.")
- end
- end
- end
- return value
-end
o:depends({ protocol = "http" })
o:depends({ protocol = "socks" })
o:depends({ protocol = "shadowsocks" })
diff --git a/luci-app-passwall/luasrc/model/cbi/passwall/server/type/5_hysteria2.lua b/luci-app-passwall/luasrc/model/cbi/passwall/server/type/5_hysteria2.lua
index 474415a0..b526498b 100644
--- a/luci-app-passwall/luasrc/model/cbi/passwall/server/type/5_hysteria2.lua
+++ b/luci-app-passwall/luasrc/model/cbi/passwall/server/type/5_hysteria2.lua
@@ -50,21 +50,6 @@ for i, v in ipairs(user_list) do
o:value(v[".name"], v.username)
end
o:depends({ custom = false })
-o.validate = function(self, value, t)
- if type(value) == "string" then value = {value} end
- if type(value) == "table" then
- for _, u in ipairs(value) do
- local found = false
- for _, v in ipairs(user_list) do
- if u == v[".name"] then found = true; break end
- end
- if not found then
- return nil, translate("Please configure user info on the User Management page.")
- end
- end
- end
- return value
-end
o = s:option(Flag, "realms", translate("Realms"))
o.default = "0"
diff --git a/luci-app-passwall/luasrc/view/passwall/server/config_header.htm b/luci-app-passwall/luasrc/view/passwall/server/config_header.htm
index 97be8a2c..742b7151 100644
--- a/luci-app-passwall/luasrc/view/passwall/server/config_header.htm
+++ b/luci-app-passwall/luasrc/view/passwall/server/config_header.htm
@@ -3,13 +3,6 @@ local map = self.map
local api = map.api
local section = self.section
-%>
-