luci-app-clash: update

This commit is contained in:
CN_SZTL 2019-07-27 18:40:29 +08:00
parent 7607bc0485
commit 69e9aa18ef
No known key found for this signature in database
GPG Key ID: 6850B6345C862176
78 changed files with 9033 additions and 12505 deletions

View File

@ -1,14 +1,39 @@
#
# Copyright (C) 2015-2016 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v3.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=clash
PKG_VERSION:=0.14.0
PKG_VERSION:=0.15.0
PKG_RELEASE:=1
PKG_MAINTAINER:=frainzy1477
ifeq ($(ARCH),mipsel)
PKG_ARCH:=mipsle
endif
ifeq ($(ARCH),mips)
PKG_ARCH:=mips64
endif
ifeq ($(ARCH),i386)
PKG_ARCH:=386
endif
ifeq ($(ARCH),x86_64)
PKG_ARCH:=amd64
endif
ifeq ($(ARCH),arm)
PKG_ARCH:=armv6
ifneq ($(BOARD),bcm53xx)
PKG_ARCH:=armv7
endif
ifeq ($(BOARD),kirkwood)
PKG_ARCH:=armv5
endif
endif
ifeq ($(ARCH),aarch64)
PKG_ARCH:=armv8
endif
PKG_SOURCE:=clash-linux-$(PKG_ARCH)-v$(PKG_VERSION).gz
PKG_SOURCE_URL:=https://github.com/Dreamacro/clash/releases/download/v$(PKG_VERSION)/
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_HASH:=skip
include $(INCLUDE_DIR)/package.mk
@ -21,48 +46,20 @@ define Package/$(PKG_NAME)
endef
define Package/$(PKG_NAME)/description
clash is a cross-platform proxy software
clash is a cross-platform proxy software
endef
ifeq ($(ARCH),x86_64)
PKG_ARCH_CLASH:=linux-amd64
endif
ifeq ($(ARCH),i386)
PKG_ARCH_CLASH:=linux-386
endif
ifeq ($(ARCH),mipsel)
PKG_ARCH_CLASH:=linux-mipsle
endif
ifeq ($(ARCH),mips)
PKG_ARCH_CLASH:=linux-mips-hardfloat
endif
ifeq ($(ARCH),arm)
PKG_ARCH_CLASH:=linux-armv6
endif
ifeq ($(ARCH),aarch64)
PKG_ARCH_CLASH:=linux-armv8
endif
define Build/Prepare
#[ ! -f $(PKG_BUILD_DIR)/clash-v$(PKG_VERSION)-$(PKG_ARCH_CLASH).tar.gz ] && wget https://github.com/Dreamacro/clash/releases/download/v$(PKG_VERSION)/clash-$(PKG_ARCH_CLASH).tar.gz -O $(PKG_BUILD_DIR)/clash-v$(PKG_VERSION)-$(PKG_ARCH_CLASH).tar.gz
#tar -xzvf $(PKG_BUILD_DIR)/clash-v$(PKG_VERSION)-$(PKG_ARCH_CLASH).tar.gz -C $(PKG_BUILD_DIR)
[ ! -f $(PKG_BUILD_DIR)/clash-$(PKG_ARCH_CLASH).gz ] && wget https://github.com/Dreamacro/clash/releases/download/v$(PKG_VERSION)/clash-$(PKG_ARCH_CLASH)-v$(PKG_VERSION).gz -O $(PKG_BUILD_DIR)/clash-$(PKG_ARCH_CLASH).gz
gunzip $(PKG_BUILD_DIR)/clash-$(PKG_ARCH_CLASH).gz
endef
define Build/Configure
gzip -dc "$(DL_DIR)/$(PKG_SOURCE)" > $(PKG_BUILD_DIR)/clash-linux-$(PKG_ARCH)
endef
define Build/Compile
#chmod +x $(PKG_BUILD_DIR)/clash-v$(PKG_VERSION)-$(PKG_ARCH_CLASH) && upx --ultra-brute $(PKG_BUILD_DIR)/clash-v$(PKG_VERSION)-$(PKG_ARCH_CLASH)
#echo "$(PKG_VERSION)" > $(PKG_BUILD_DIR)/clash_version
endef
define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/etc/clash
$(INSTALL_BIN) $(PKG_BUILD_DIR)/clash-$(PKG_ARCH_CLASH) $(1)/etc/clash/clash
#$(INSTALL_DIR) $(1)/usr/share/clash
#$(INSTALL_DATA) $(PKG_BUILD_DIR)/clash_version $(1)/usr/share/clash/clash_version
$(INSTALL_BIN) $(PKG_BUILD_DIR)/clash-linux-$(PKG_ARCH) $(1)/etc/clash/clash
endef
$(eval $(call BuildPackage,$(PKG_NAME)))

96
package/jsda/luci-app-clash/Makefile Executable file → Normal file
View File

@ -1,14 +1,90 @@
# Copyright (C) 2016 Openwrt.org
#
# This is free software, licensed under the Apache License, Version 2.0 .
#
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI Support for clash
LUCI_DEPENDS:=+clash +pdnsd-alt
PKG_VERSION:=0.14.2
PKG_NAME:=luci-app-clash
PKG_VERSION:=0.30.0
PKG_RELEASE:=1
PKG_MAINTAINER:=frainzy1477
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
include $(INCLUDE_DIR)/package.mk
define Package/luci-app-clash
SECTION:=luci
CATEGORY:=LuCI
SUBMENU:=2. Services
TITLE:=LuCI app for clash
DEPENDS:=+bash +coreutils-nohup +wget
PKGARCH:=all
MAINTAINER:=frainzy1477
endef
define Package/luci-app-clash/description
LuCI configuration for clash.
endef
define Package/$(PKG_NAME)/postinst
#!/bin/sh
rm -rf /tmp/luci*
endef
define Build/Prepare
${CURDIR}/tools/po2lmo/src/po2lmo ${CURDIR}/po/zh-cn/clash.po ${CURDIR}/po/zh-cn/clash.zh-cn.lmo
endef
define Build/Configure
endef
define Build/Compile
endef
define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi/clash
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/view/clash
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_DIR) $(1)/etc/clash
$(INSTALL_DIR) $(1)/www
$(INSTALL_DIR) $(1)/usr/share/clash
$(INSTALL_DIR) $(1)/usr/share/clash/web
$(INSTALL_DIR) $(1)/usr/share/clash/dashboard
$(INSTALL_DIR) $(1)/usr/share/clash/dashboard/img
$(INSTALL_DIR) $(1)/usr/share/clash/dashboard/js
$(INSTALL_BIN) ./root/etc/init.d/clash $(1)/etc/init.d/clash
$(INSTALL_CONF) ./root/etc/config/clash $(1)/etc/config/clash
$(INSTALL_CONF) ./root/etc/clash/* $(1)/etc/clash/
$(INSTALL_BIN) ./root/usr/share/clash/clash-watchdog.sh $(1)/usr/share/clash/
$(INSTALL_BIN) ./root/usr/share/clash/clash.sh $(1)/usr/share/clash/
$(INSTALL_BIN) ./root/usr/share/clash/ipdb.sh $(1)/usr/share/clash/
$(INSTALL_BIN) ./root/usr/share/clash/dns.yaml $(1)/usr/share/clash/
$(INSTALL_BIN) ./root/usr/share/clash/rule.yaml $(1)/usr/share/clash/
$(INSTALL_BIN) ./root/usr/share/clash/clash_version $(1)/usr/share/clash/
$(INSTALL_BIN) ./root/usr/share/clash/check_version.sh $(1)/usr/share/clash/
$(INSTALL_BIN) ./root/usr/share/clash/web/* $(1)/usr/share/clash/web
$(INSTALL_BIN) ./root/usr/share/clash/dashboard/index.html $(1)/usr/share/clash/dashboard/
$(INSTALL_BIN) ./root/usr/share/clash/dashboard/main.d32d2df9dcc55f57282d.css $(1)/usr/share/clash/dashboard/
$(INSTALL_BIN) ./root/usr/share/clash/dashboard/img/33343e6117c37aaef8886179007ba6b5.png $(1)/usr/share/clash/dashboard/img/
$(INSTALL_BIN) ./root/usr/share/clash/dashboard/img/logo.png $(1)/www/
$(INSTALL_BIN) ./root/usr/share/clash/dashboard/js/1.bundle.d32d2df9dcc55f57282d.min.js $(1)/usr/share/clash/dashboard/js/
$(INSTALL_BIN) ./root/usr/share/clash/dashboard/js/bundle.d32d2df9dcc55f57282d.min.js $(1)/usr/share/clash/dashboard/js/
$(INSTALL_DATA) ./luasrc/controller/*.lua $(1)/usr/lib/lua/luci/controller/
$(INSTALL_DATA) ./luasrc/model/cbi/clash/*.lua $(1)/usr/lib/lua/luci/model/cbi/clash/
$(INSTALL_DATA) ./luasrc/view/clash/* $(1)/usr/lib/lua/luci/view/clash/
$(INSTALL_DATA) ./po/zh-cn/clash.zh-cn.lmo $(1)/usr/lib/lua/luci/i18n/
endef
$(eval $(call BuildPackage,luci-app-clash))

58
package/jsda/luci-app-clash/luasrc/controller/clash.lua Executable file → Normal file
View File

@ -1,21 +1,32 @@
module("luci.controller.clash", package.seeall)
function index()
if not nixio.fs.access("/etc/config/clash") then
return
end
entry({"admin", "services", "clash"},alias("admin", "services", "clash", "client"), _("Clash"), 60).dependent = true
entry({"admin", "services", "clash", "client"},cbi("clash/client"),_("Clash Client"), 10).leaf = true
entry({"admin", "services", "clash", "dns"},cbi("clash/dns"),_("DNS Settings"), 20).leaf = true
entry({"admin", "services", "clash", "config"},cbi("clash/config"),_("Server Config"), 30).leaf = true
entry({"admin", "services", "clash"},alias("admin", "services", "clash", "overview"), _("Clash"), 60).dependent = false
entry({"admin", "services", "clash", "overview"},cbi("clash/overview"),_("Overview"), 10).leaf = true
entry({"admin", "services", "clash", "client"},cbi("clash/client"),_("Client"), 20).leaf = true
entry({"admin", "services", "clash", "settings"}, firstchild(),_("Settings"), 100)
entry({"admin", "services", "clash", "settings", "port"},cbi("clash/port"),_("Proxy Ports"), 100).leaf = true
entry({"admin", "services", "clash", "settings", "dns"},cbi("clash/dns"),_("DNS Settings"), 120).leaf = true
entry({"admin", "services", "clash", "settings", "access"},cbi("clash/access"),_("Access Control"), 130).leaf = true
entry({"admin", "services", "clash", "config"},cbi("clash/config"),_("Config"), 140).leaf = true
entry({"admin","services","clash","status"},call("action_status")).leaf=true
entry({"admin", "services", "clash", "log"},cbi("clash/log"),_("Logs"), 40).leaf = true
entry({"admin", "services", "clash", "log"},cbi("clash/log"),_("Logs"), 150).leaf = true
entry({"admin","services","clash","check_status"},call("check_status")).leaf=true
end
local function dash_port()
return luci.sys.exec("uci get clash.config.dash_port 2>/dev/null")
end
local function dash_pass()
return luci.sys.exec("uci get clash.config.dash_pass 2>/dev/null")
end
local function is_running()
return luci.sys.call("pidof clash >/dev/null") == 0
@ -25,25 +36,42 @@ local function is_web()
return luci.sys.call("pidof clash >/dev/null") == 0
end
local function is_bbr()
return luci.sys.call("[ `cat /proc/sys/net/ipv4/tcp_congestion_control 2>/dev/null` = bbr ] 2>/dev/null") == 0
local function localip()
return luci.sys.exec("uci get network.lan.ipaddr")
end
local function is_pdn()
return luci.sys.call("pgrep dnscache >/dev/null") == 0
local function check_version()
return luci.sys.exec("sh /usr/share/clash/check_version.sh")
end
local function is_dns()
return luci.sys.call("pgrep pdnsd >/dev/null") == 0
local function current_version()
return luci.sys.exec("sed -n 1p /usr/share/clash/clash_version")
end
local function new_version()
return luci.sys.exec("sed -n 1p /usr/share/clash/new_version")
end
function check_status()
luci.http.prepare_content("application/json")
luci.http.write_json({
check_version = check_version(),
current_version = current_version(),
new_version = new_version()
})
end
function action_status()
luci.http.prepare_content("application/json")
luci.http.write_json({
web = is_web(),
clash = is_running(),
bbr = is_bbr(),
pdnsd = is_pdn(),
dnscache = is_dns()
localip = localip(),
dash_port = dash_port(),
current_version = current_version(),
new_version = new_version(),
dash_pass = dash_pass()
})
end

View File

@ -0,0 +1,65 @@
local NXFS = require "nixio.fs"
local SYS = require "luci.sys"
local HTTP = require "luci.http"
local DISP = require "luci.dispatcher"
local UTIL = require "luci.util"
m = Map("clash")
s = m:section(TypedSection, "clash")
s.anonymous = true
s.addremove=false
md = s:option(Flag, "proxylan", translate("Proxy Lan IP"))
md.default = 1
md.rmempty = false
md.description = translate("Only selected IPs will be proxied if enabled")
md:depends("rejectlan", 0)
o = s:option(DynamicList, "lan_ac_ips", translate("Proxy Lan List"))
o.datatype = "ipaddr"
o.description = translate("Only selected IPs will be proxied")
luci.ip.neighbors({ family = 4 }, function(entry)
if entry.reachable then
o:value(entry.dest:string())
end
end)
o:depends("proxylan", 1)
update_time = SYS.exec("ls -l --full-time /etc/clash/Country.mmdb|awk '{print $6,$7;}'")
o = s:option(Button,"update",translate("Update GEOIP Database"))
o.title = translate("GEOIP Database")
o.inputtitle = translate("Update GEOIP Database")
o.description = update_time
o.inputstyle = "reload"
o.write = function()
SYS.call("bash /usr/share/clash/ipdb.sh >>/tmp/clash.log 2>&1 &")
HTTP.redirect(DISP.build_url("admin", "services", "clash","settings", "access"))
end
md = s:option(Flag, "rejectlan", translate("Bypass Lan IP"))
md.default = 1
md.rmempty = false
md.description = translate("Selected IPs will not be proxied if enabled")
md:depends("proxylan", 0)
o = s:option(DynamicList, "lan_ips", translate("Bypass Lan List"))
o.datatype = "ipaddr"
o.description = translate("Selected IPs will not be proxied")
luci.ip.neighbors({ family = 4 }, function(entry)
if entry.reachable then
o:value(entry.dest:string())
end
end)
o:depends("rejectlan", 1)
return m

View File

@ -1,4 +1,3 @@
local NXFS = require "nixio.fs"
local SYS = require "luci.sys"
local HTTP = require "luci.http"
@ -6,39 +5,18 @@ local DISP = require "luci.dispatcher"
local UTIL = require "luci.util"
m = Map("clash", translate("Clash Client"))
m:section(SimpleSection).template = "clash/status"
m = Map("clash")
s = m:section(TypedSection, "clash")
s.anonymous = true
o = s:option( Flag, "enable")
o.title = translate("Enable Clash")
o.title = translate("Enable")
o.default = 0
o.rmempty = false
o.description = translate("After clash start running, wait a moment for servers to resolve,enjoy")
o.description = translate("Enable Client")
o = s:option(Value, "proxy_port")
o.title = translate("* Clash Redir Port")
o.default = 7892
o.datatype = "port"
o.rmempty = false
o.description = translate("Clash config redir-port")
o = s:option(Value, "cn_port")
o.title = translate("Dashboard Port")
o.default = 9090
o.datatype = "port"
o.rmempty = false
o.description = translate("Dashboard hostname is Your router local address. eg, 192.168.1.1")
o = s:option(Value, "dashboard_password")
o.title = translate("Dashboard Secret")
o.default = 123456
o.rmempty = false
o.description = translate("Dashboard Secret")
o = s:option(Flag, "auto_update", translate("Auto Update"))
o.rmempty = false
o.description = translate("Auto Update Server subscription")
@ -50,6 +28,15 @@ o:value(t, t..":00")
end
o.default=0
o.rmempty = false
o.description = translate("Daily Server subscription update time")
o = s:option(ListValue, "subcri", translate("Subcription Type"))
o.default = clash
o:value("clash", translate("clash"))
o:value("v2rayn2clash", translate("v2rayn2clash"))
o:value("surge2clash", translate("surge2clash"))
o.description = translate("Select Subcription Type, enter only your subcription url without https://tgbot.lbyczf.com/*?")
o = s:option(Value, "subscribe_url")
o.title = translate("Subcription Url")
@ -58,24 +45,21 @@ o.rmempty = true
o = s:option(Button,"update")
o.title = translate("Update Subcription")
o.inputtitle = translate("Update Configuration")
o.inputtitle = translate("Update")
o.inputstyle = "reload"
o.write = function()
os.execute("mv /etc/clash/config.yml /etc/clash/config.bak")
os.execute("mv /etc/clash/config.yaml /etc/clash/config.bak")
os.execute("rm -rf /tmp/clash.log")
SYS.call("bash /usr/share/clash/clash.sh >>/tmp/clash.log 2>&1 &")
HTTP.redirect(DISP.build_url("admin", "services", "clash"))
HTTP.redirect(DISP.build_url("admin", "services", "clash", "client"))
end
local apply = luci.http.formvalue("cbi.apply")
if apply then
os.execute("/etc/init.d/clash restart >/dev/null 2>&1 &")
SYS.call("/etc/init.d/clash restart >/dev/null 2>&1 &")
end
return m

View File

@ -8,15 +8,15 @@ local UTIL = require "luci.util"
local http = luci.http
ful = SimpleForm("upload", translate("Server Configuration"), nil)
ful = Form("upload", nil)
ful.reset = false
ful.submit = false
sul =ful:section(SimpleSection, "", translate(""))
o = sul:option(FileUpload, "")
o.title = translate("Upload Clash Configuration")
o.title = translate("Upload Config")
o.template = "clash/clash_upload"
o.description = translate("NB: Rename your config file to config.yml before upload. file will save to /etc/clash")
o.description = translate("NB: Rename your config file to config.yaml before upload. file will save to /etc/clash")
um = sul:option(DummyValue, "", nil)
um.template = "clash/clash_dvalue"
@ -41,6 +41,7 @@ http.setfilehandler(
fd:close()
fd = nil
um.value = translate("File saved to") .. ' "/etc/clash/' .. meta.file .. '"'
os.execute("/etc/init.d/clash restart >/dev/null 2>&1 &")
end
end
)
@ -61,10 +62,12 @@ s.anonymous = true
s.addremove=false
local conf = "/etc/clash/config.yml"
local conf = "/etc/clash/config.yaml"
sev = s:option(TextValue, "conf")
sev.readonly=true
sev.description = translate("Changes to config file must be made from source")
--update_time = SYS.exec("ls -l --full-time /etc/clash/config.yaml|awk '{print $6,$7;}'")
--sev.description = update_time
--sev.description = translate("Changes to config file must be made from source")
sev.rows = 20
sev.wrap = "off"
sev.cfgvalue = function(self, section)
@ -74,5 +77,11 @@ sev.write = function(self, section, value)
end
o = s:option(Button,"configrm")
o.inputtitle = translate("Delete Config")
o.write = function()
os.execute("rm -rf /etc/clash/config.yaml")
end
return ful , m

View File

@ -1,96 +1,43 @@
--
local NXFS = require "nixio.fs"
local SYS = require "luci.sys"
local HTTP = require "luci.http"
local DISP = require "luci.dispatcher"
local UTIL = require "luci.util"
local fs = require "nixio.fs"
m = Map("clash", translate("DNS Acceleration & Forwarder"))
m = Map("clash")
s = m:section(TypedSection, "clash")
s.anonymous = true
s.addremove=false
dns = s:option(Flag, "dns", translate("Enable DNS"))
dns.default = 1
dns.rmempty = false
dns.description = translate("Enable DNS Cache Acceleration and anti ISP DNS pollution")
o = s:option(ListValue, "dnsmodel", translate("Choose DNS Resolve Model"))
o.description = translate("Choose DNS Resolve With White or Black List Model")
o:value("gfw", translate("GFW List Mode"))
o:value("oversea", translate("Oversea Mode"))
o:depends("dns", 1)
o = s:option(Value, "dnsserver", translate("Domestic DNS Server"))
o.description = translate("DNS Servers located in China")
o:value("119.29.29.29", translate("烟台帝思普网络BPG DNS (119.29.29.29)"))
o:value("101.132.183.99", translate("无污染PdoMo-DNS (101.132.183.99)"))
o:value("193.112.15.186", translate("无污染PdoMo-DNS (193.112.15.186)"))
o:value("114.114.115.115", translate("南京信风网络GreatbitDNS (114.114.115.115)"))
o:value("223.6.6.6", translate("阿里云AliDNS (223.6.6.6)"))
o:value("223.5.5.5", translate("阿里云AliDNS (223.5.5.5)"))
o:value("1.2.4.8", translate("中国互联网络SecureDNS (1.2.4.8)"))
o:depends("dns", 1)
o = s:option(Value, "dnsserver_d", translate("Global DNS Server"))
o.description = translate("DNS Servers located Overseas")
o:value("208.67.222.222", translate("OpenDNS (208.67.222.222)"))
o:value("208.67.220.220", translate("OpenDNS (208.67.220.220)"))
o:value("8.8.4.4", translate("Google Public DNS (8.8.4.4)"))
o:value("8.8.8.8", translate("Google Public DNS (8.8.8.8)"))
o:value("209.244.0.3", translate("Level 3 Public DNS (209.244.0.3)"))
o:value("209.244.0.4", translate("Level 3 Public DNS (209.244.0.4)"))
o:value("4.2.2.1", translate("Level 3 Public DNS (4.2.2.1)"))
o:value("4.2.2.2", translate("Level 3 Public DNS (4.2.2.2)"))
o:value("4.2.2.3", translate("Level 3 Public DNS (4.2.2.3)"))
o:value("4.2.2.4", translate("Level 3 Public DNS (4.2.2.4)"))
o:value("1.1.1.1", translate("Cloudflare DNS (1.1.1.1)"))
o:depends("dns", 1)
y = s:option(ListValue, "dnsforwader", translate("DNS Forwarding"))
y.default = 1
y:value("0", translate("disabled"))
y:value("1", translate("enabled"))
y.description = translate("Set custom DNS forwarder in DHCP and DNS Settings")
gfw_list = s:option(Value, "gfw_list", translate("Self Defined GFW_List"), translate("Please modify the file here."))
gfw_list.template = "cbi/tvalue"
gfw_list.rows = 13
gfw_list.wrap = "off"
gfw_list:depends("dnsmodel", "gfw")
function gfw_list.cfgvalue(self, section)
return fs.readfile("/etc/config/clash_gfw.list") or ""
md = s:option(Flag, "mode", translate("Custom DNS"))
md.default = 1
md.rmempty = false
md.description = translate("Enabling Custom DNS will Overwrite your config.yaml dns section")
local dns = "/usr/share/clash/dns.yaml"
o = s:option(TextValue, "dns",translate("Modify yaml DNS"))
o.template = "clash/tvalue"
o.rows = 25
o.wrap = "off"
o.cfgvalue = function(self, section)
return NXFS.readfile(dns) or ""
end
function gfw_list.write(self, section, value)
if value then
value = value:gsub("\r\n", "\n")
fs.writefile("/etc/config/clash_gfw.list", value)
end
o.write = function(self, section, value)
NXFS.writefile(dns, value:gsub("\r\n", "\n"))
end
o = s:option(Button,"update")
o.title = translate("Apply Modify List")
o.inputtitle = translate("Apply Modify List")
o.inputstyle = "reload"
o:depends("dnsmodel", "gfw")
o.write = function()
SYS.call("bash /usr/share/clash/gfw2ipset.sh && /etc/init.d/dnsmasq restart >/dev/null 2>&1 &")
end
o = s:option(Button,"update_gfw")
o.title = translate("Update GFW List")
o.inputtitle = translate("Update GFW List")
o.inputstyle = "reload"
o:depends("dnsmodel", "gfw")
o.write = function()
SYS.call("bash /usr/share/clash/update.sh && /etc/init.d/dnsmasq restart >/dev/null 2>&1")
end
local apply = luci.http.formvalue("cbi.apply")
if apply then
os.execute("/etc/init.d/clash restart >/dev/null 2>&1 &")
end
o.description = translate("NB: press ENTER to create a blank line at the end of input.")
o:depends("mode", 1)
return m

View File

@ -1,18 +1,20 @@
--
local NXFS = require "nixio.fs"
local SYS = require "luci.sys"
local HTTP = require "luci.http"
local DISP = require "luci.dispatcher"
local UTIL = require "luci.util"
ful = Form("upload", nil)
ful.reset = false
ful.submit = false
m = Map("clash", translate("Server logs"))
m = Map("clash")
s = m:section(TypedSection, "clash")
s.anonymous = true
s.addremove=false
local clog = "/tmp/clash.log"
log = s:option(TextValue, "clog")
log.readonly=true
@ -26,4 +28,11 @@ log.write = function(self, section, value)
NXFS.writefile(clog, value:gsub("\r\n", "\n"))
end
return m
o = s:option(Button,"log")
o.inputtitle = translate("Clear Logs")
o.write = function()
SYS.call('echo "" > /tmp/clash.log')
HTTP.redirect(DISP.build_url("admin", "services", "clash", "log"))
end
return m, ful

View File

@ -0,0 +1,16 @@
local m
local sys = require "luci.sys"
local uci = luci.model.uci.cursor()
ful = Form("upload", nil)
ful.reset = false
ful.submit = false
m = Map("clash")
m:section(SimpleSection).template = "clash/status"
return m, ful

View File

@ -0,0 +1,54 @@
local NXFS = require "nixio.fs"
local SYS = require "luci.sys"
local HTTP = require "luci.http"
local DISP = require "luci.dispatcher"
local UTIL = require "luci.util"
m = Map("clash")
s = m:section(TypedSection, "clash")
s.anonymous = true
o = s:option(Value, "http_port")
o.title = translate("Http Port")
o.default = 7890
o.datatype = "port"
o.rmempty = false
o.description = translate("Http Port")
o = s:option(Value, "socks_port")
o.title = translate("Socks Port")
o.default = 7891
o.datatype = "port"
o.rmempty = false
o.description = translate("Socks Port")
o = s:option(Value, "redir_port")
o.title = translate("Redir Port")
o.default = 7892
o.datatype = "port"
o.rmempty = false
o.description = translate("Redir Port")
o = s:option(Value, "dash_port")
o.title = translate("Dashboard Port")
o.default = 9191
o.datatype = "port"
o.rmempty = false
o.description = translate("Dashboard Port")
o = s:option(Value, "dash_pass")
o.title = translate("Dashboard Secret")
o.default = 123456
o.rmempty = false
o.description = translate("Dashboard Secret")
o = s:option(ListValue, "level", translate("Log level"))
o.description = translate("Choose Log Level")
o:value("info", "info")
o:value("silent", "silent")
o:value("warning", "warning")
o:value("error", "error")
o:value("debug", "debug")
return m

View File

View File

214
package/jsda/luci-app-clash/luasrc/view/clash/status.htm Executable file → Normal file
View File

@ -1,29 +1,215 @@
<fieldset class="cbi-section">
<p width="100%" align="center" id="_logo"></p>
<p width="100%" align="center"><%:Rule-based Custom Proxy Client%></p>
<p width="100%" align="center"><font color="green"><b id="_version"></b></font></p>
</fieldset>
<fieldset class="cbi-section">
<table width="100%" cellspacing="10">
<tr><td id="_web"><em> <%:Collecting data...%> </em></td></tr>
<tr><td width="33%"> Clash 客户端 </td><td id="_clash"><em><%:Collecting data...%></em></td></tr>
<tr><td width="33%"> BBR 加速 </td><td id="_bbr"><em><%:Collecting data...%></em></td></tr>
<tr><td width="33%"> 国外DNS加速</td><td id="_pdnsd"><em><%:Collecting data...%></em></td></tr>
<tr><td width="33%"> 国内DNS加速</td><td id="_dnscache"><em><%:Collecting data...%></em></td></tr>
<tr><td width="50%"><span><%:Clash Client%></span></td><td id="_clash"><em><%:Collecting data...%></em></td> </tr>
<tr><td width="50%"><span><%:Clash Dashboard%></span></td><td id="_web"><em> <%:Collecting data...%> </em></td> </tr>
<tr><td width="50%"><span><%:Yacd Dashboard%></span></td><td id="_webb"><em> <%:Collecting data...%> </em></td> </tr>
</table>
</fieldset>
<fieldset class="cbi-section">
<table width="100%" cellspacing="10">
<tr><td width="50%"> <%:Dashboard Host%></td><td id="_ip"><em><%:Collecting data...%></em></td></tr>
<tr><td width="50%"> <%:Dashboard Port%></td><td id="_port"><em><%:Collecting data...%></em></td></tr>
<tr><td width="50%"> <%:Dashboard Secret%></td> <td id="_secret"><em><%:Collecting data...%></em></td></tr>
</table>
</fieldset>
<fieldset class="cbi-section">
<table width="100%" cellspacing="10">
<tr><td class="align-left" width="50%"><span><%:Global IP%> </span>&nbsp;:&nbsp;<span id="ip-gb"></span> <span id="ip-geo"></span></td> <td class="align-right" width="25%"> <span><%:Google%></span>&nbsp;:&nbsp;<span id="_google"><em><%:Collecting data...%></em></span></td><td class="align-right"><%:Youtube%> </span>&nbsp;:&nbsp;<span id="_youtube"><em><%:Collecting data...%></em></span></td></tr>
<tr><td class="align-left" width="50%"><span><%:Domestic IP%> </span>&nbsp;:&nbsp;<span id="d-ip"></span></td> <td class="align-right" width="25%"> <span><%:Baidu%></span>&nbsp;:&nbsp;<span id="_baidu"><em><%:Collecting data...%></em></span></td> <td class="align-right"><%:Taobao%> </span>&nbsp;:&nbsp;<span id="_taobao"><em><%:Collecting data...%></em></span></td></tr>
</table>
</fieldset>
<script type="text/javascript">//<![CDATA[
let random = parseInt(Math.random() * 100000000);
let IP = {
get: (url, type) =>
fetch(url, { method: 'GET' }).then((resp) => {
if (type === 'text')
return Promise.all([resp.ok, resp.status, resp.text(), resp.headers]);
else {
return Promise.all([resp.ok, resp.status, resp.json(), resp.headers]);
}
}).then(([ok, status, data, headers]) => {
if (ok) {
let json = {
ok,
status,
data,
headers
}
return json;
} else {
throw new Error(JSON.stringify(json.error));
}
}).catch(error => {
throw error;
}),
getIpipnetIP: () => {
IP.get(`https://myip.ipip.net/?z=${random}`, 'text')
.then((resp) => {
let data = resp.data.replace('当前 IP', '').split(' 来自于:');
document.getElementById('d-ip').innerHTML = `${data[0]} ${data[1]}`;
});
},
getIpsbIP: (data) => {
document.getElementById('ip-gb').innerHTML = data.address;
document.getElementById('ip-geo').innerHTML = `${data.country} ${data.province} ${data.city} ${data.isp.name}`
},
}
IP.getIpipnetIP();
var HTTP = {
checker: (domain, cbElID) => {
let img = new Image;
let timeout = setTimeout(() => {
img.onerror = img.onload = null;
img = null;
document.getElementById(cbElID).innerHTML = '<b><font color=red><%:NO ACCESS%></font></b>'
}, 1000);
img.onerror = () => {
clearTimeout(timeout);
document.getElementById(cbElID).innerHTML = '<b><font color=red><%:TIMEOUT%></font></b>'
}
img.onload = () => {
clearTimeout(timeout);
document.getElementById(cbElID).innerHTML = '<b><font color=green><%:CONNECT OK%></font></b>'
}
img.src = `https://${domain}/favicon.ico?${+(new Date)}`
}
}
var web = document.getElementById('_web');
var webb = document.getElementById('_webb');
var clash = document.getElementById('_clash');
var bbr = document.getElementById('_bbr');
var pdnsd = document.getElementById('_pdnsd');
var dnscache = document.getElementById('_dnscache');
XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "services", "clash", "status")%>', null, function(x, status) {
var ip = document.getElementById('_ip');
var port = document.getElementById('_port');
var secret = document.getElementById('_secret');
var version = document.getElementById('_version');
var logo = document.getElementById('_logo');
XHR.poll(1, '<%=luci.dispatcher.build_url("admin", "services", "clash", "status")%>', null, function(x, status) {
if ( x && x.status == 200 ) {
web.innerHTML = status.web ? '<em><b><a type="button" class="btn" style="background-color:black;color:white;padding: 5px;" href="http://'+window.location.hostname+'/clash" target="_blank"/> 打开本地管理页面 </a><a type="button" class="btn" style="background-color:black;color:white;padding: 5px;" href="http://yacd.haishan.me" target="_blank"/> 打开在线管理页面 </a></b></em>' : '<em><b><font color=red></font></b></em>';
clash.innerHTML = status.clash ? '<em><b><font color=green><%:RUNNING%></font> </b></em>' : '<em><b><font color=red><%:NOT RUNNING%></font></b></em>';
bbr.innerHTML = status.bbr ? '<em><b><font color=green><%:RUNNING%></font></b></em>' : '<em><b><font color=red><%:NOT RUNNING%></font></b></em>';
pdnsd.innerHTML = status.pdnsd ? '<em><b><font color=green><%:RUNNING%></font></b></em>' : '<em><b><font color=red><%:NOT RUNNING%></font></b></em>';
dnscache.innerHTML = status.dnscache ? '<em><b><font color=green><%:RUNNING%></font></b></em>' : '<em><b><font color=red><%:NOT RUNNING%></font></b></em>';
web.innerHTML = status.web ? '<a type="button" class="btn" style="background-color:black;padding: 5px;" href="http://'+window.location.hostname+':'+status.dash_port+'/ui" target="_blank"/><b><font color=green><%:OPEN DASHBOARD%></font></b></a>' : '<em><b><font color=red><%:NOT RUNNING%></font></b></em>';
webb.innerHTML = status.web ? '<a type="button" class="btn" style="background-color:black;padding: 5px;" href="http://'+window.location.hostname+'/clash" target="_blank"/><b><font color=green><%:OPEN DASHBOARD%></font></b></a>' : '<em><b><font color=red><%:NOT RUNNING%></font></b></em>';
clash.innerHTML = status.clash ? '<b><font color=green><%:RUNNING%></font> </b>' : '<em><b><font color=red><%:NOT RUNNING%></font></b></em>';
ip.innerHTML = status.localip ? '<b><font color=green>'+status.localip+'</font> </b>' : '<em><b><font color=red><%:NOT SET%></font></b></em>';
logo.innerHTML = status.localip ? '<img id="logo" src="http://'+window.location.hostname+'/logo.png" width="150" onclick="return homepage()">' : '<em><b><font color=red><%:NOT SET%></font></b></em>';
port.innerHTML = status.dash_port ? '<b><font color=green>'+status.dash_port+'</font> </b>' : '<em><b><font color=red><%:NOT SET%></font></b></em>';
secret.innerHTML = status.dash_pass ? '<b><font color=green>'+status.dash_pass+'</font> </b>' : '<em><b><font color=red><%:NOT SET%></font></b></em>';
HTTP.checker('www.baidu.com', '_baidu');
HTTP.checker('www.google.com', '_google');
HTTP.checker('www.youtube.com', '_youtube');
HTTP.checker('www.taobao.com', '_taobao');
}
});
XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "services", "clash", "status")%>', null, function(x, status) {
if ( x && x.status == 200 ) {
IP.getIpipnetIP();
getip();
}
});
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "clash", "status")%>', status.current_version, function(x, status) {
if ( x && x.status == 200 ) {
version.innerHTML = status.current_version ? '<b><font color=green><%:Current Version%>'+'&nbsp;:&nbsp;v'+status.current_version+'</font> </b><br><center><input type="button" class="cbi-button cbi-button-reload" value="<%:Check Update%>" onclick="return version_check(this)"/></center>' : '<em><b><font color=red>NOT SET</font></b></em>';
}
});
function version_check(btn)
{
btn.disabled = true;
btn.value = '<%:Checking...%>';
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "clash", "check_status")%>', null, function(x, status) {
if(status.new_version > status.current_version)
{
version.innerHTML ='<font color="green"><b>'+'<%:New Version%>'+'&nbsp;:&nbsp;v'+status.new_version+'</b></font><br><center>' + '<input type="button" class="cbi-button cbi-button-apply" value="<%:Download%>" onclick="return download_update(this)"/>' + '&nbsp;&nbsp;&nbsp;' + '<input type="button" class="cbi-button cbi-button-reset" value="<%:Return Check%>" onclick="return check_return(this)"/></center>';
}
else if(status.new_version==0)
{
version.innerHTML ='<font color="red"><b>'+'<%:Check Error!%>'+'</b></font>'+'<br><center><input type="button" class="cbi-button cbi-button-reset" value="<%:Return Check%>" onclick="return check_return(this)"/></center>';
}
else if(status.current_version >= status.new_version)
{
version.innerHTML ='<font color="green"><b>'+'<%:No New Version%>'+'</b></font>'+'<br><center><input type="button" class="cbi-button cbi-button-reset" value="<%:Return Check%>" onclick="return check_return(this)"/></center>';
}
return false;
});
}
function download_update(btn)
{
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "clash", "check_status")%>', null, function(x, status) {
btn.disabled = true;
btn.value = '<%:Download%>';
url='https://github.com/frainzy1477/luci-app-clash/releases/download/v'+status.new_version+'/luci-app-clash_'+status.new_version+'-1_all.ipk';
window.open(url);
btn.disabled = false;
return false;
});
}
function check_return(btn)
{
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "clash", "status")%>', status.current_version, function(x, status) {
btn.disabled = true;
btn.value = '<%:Return Check%>';
version.innerHTML = '<b><font color="green">'+'<%:Current Version%>'+'&nbsp;:&nbsp;v'+status.current_version+'</font></b>'+'<br><center><input type="button" class="cbi-button cbi-button-reload" value="<%:Check Update%>" onclick="return version_check(this)"/></center>';
});
}
//]]></script>
<script src="https://ipv4.ip.sb/addrinfo?callback=IP.getIpsbIP"></script>
<script type="application/javascript">
function getip() {
$.getJSON("https://ipv4.ip.sb/addrinfo?callback=?",
function(json) {
console.log(json)
document.getElementById('ip-gb').innerHTML = json.address;
document.getElementById('ip-geo').innerHTML = `${json.country} ${json.province} ${json.city} ${json.isp.name}`
}
);
}
</script>

View File

@ -0,0 +1,5 @@
<%+cbi/valueheader%>
<textarea class="cbi-input-textarea" <% if not self.size then %> style="width: 280px"<% else %> cols="<%=self.size%>"<% end %> data-update="change"<%= attr("name", cbid) .. attr("id", cbid) .. ifattr(self.rows, "rows") .. ifattr(self.wrap, "wrap") .. ifattr(self.readonly, "readonly") %>>
<%-=pcdata(self:cfgvalue(section))-%>
</textarea>
<%+cbi/valuefooter%>

334
package/jsda/luci-app-clash/po/zh-cn/clash.po Executable file → Normal file
View File

@ -1,87 +1,183 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8\n"
msgid "enabled"
msgstr "启用"
msgid "Subcription Type"
msgstr "服务器订阅类型"
msgid "Select Subcription Type, enter only your subcription url without https://tgbot.lbyczf.com/*?"
msgstr "选择服务器订阅类型,输入服务器订阅不要带https://tgbot.lbyczf.com/*?"
msgid "disabled"
msgstr "停用"
msgid "Access Control"
msgstr "访问控制"
msgid "Proxy Ports"
msgstr "代理端口设置"
msgid "DNS Settings"
msgstr "DNS设置"
msgid "Http Port"
msgstr "http代理端口"
msgid "Socks Port"
msgstr "socks代理端口"
msgid "Redir Port"
msgstr "redir代理端口"
msgid "No New Version"
msgstr "已安装最新本"
msgid "Log level"
msgstr "日志级别"
msgid "Choose Log Level"
msgstr "选择日志级别"
msgid "Overview"
msgstr "概览"
msgid "Download"
msgstr "下载新版本"
msgid "Checking..."
msgstr "正在检查..."
msgid "Rule-based Custom Proxy Client"
msgstr "基于规则的自定义代理客户端"
msgid "Check Error!"
msgstr "检查错误"
msgid "New Version"
msgstr "最新版本"
msgid "Current Version"
msgstr "当前版本"
msgid "Return Check"
msgstr "返回检查"
msgid "Check Update"
msgstr "检查更新"
msgid "DNS Forwarding"
msgstr "DNS转发"
msgid "Set custom DNS forwarder in DHCP and DNS Settings"
msgstr "在DHCP和DNS设置自定义DNS转发"
msgid "Proxy Lan IP"
msgstr "走代理的局域网IP"
msgid "Only selected IPs will be proxied if enabled"
msgstr "如果启用仅选择IP只走代理"
msgid "Proxy Lan List"
msgstr "走代理的IP列表"
msgid "Only selected IPs will be proxied"
msgstr "选择IP只走代理"
msgid "Bypass Lan IP"
msgstr "不走代理的局域网IP"
msgid "Selected IPs will not be proxied if enabled"
msgstr "如果启用仅选择IP只不走代理"
msgid "Bypass Lan List"
msgstr "不走代理的IP列表"
msgid "Selected IPs will not be proxied"
msgstr "选择LAN IP只不走代理"
msgid "Enabling Custom DNS will Overwrite your config.yaml dns section"
msgstr "启用自定义DNS会覆盖config.yaml dns"
msgid "Dashboard Host"
msgstr "外部控制Host"
msgid "Dashboard Port"
msgstr "外部控制端口"
msgid "Clear Logs"
msgstr "清理日志"
msgid "Dashboard Secret"
msgstr "外部控制密钥"
msgid "Google"
msgstr "谷歌网"
msgid "Youtube"
msgstr "Youtube网"
msgid "Baidu"
msgstr "百度网"
msgid "Taobao"
msgstr "淘宝网"
msgid "CONNECT OK"
msgstr "连接正常"
msgid "TIMEOUT"
msgstr "连接超时"
msgid "NOT SET"
msgstr "未设置"
msgid "NO ACCESS"
msgstr "无法访问"
msgid "Domestic IP"
msgstr "国内网IP"
msgid "Global IP"
msgstr "国外网IP"
msgid "clash"
msgstr "clash"
msgid "Clash Client"
msgstr "Clash 客户端"
msgid "OPEN DASHBOARD"
msgstr "打开外部控制"
msgid "Server Configuration"
msgid "Clash Dashboard"
msgstr "Clash外部控制"
msgid "Yacd Dashboard"
msgstr "Yacd外部控制"
msgid "Client"
msgstr "客户端"
msgid "Clash Client"
msgstr "客户端"
msgid "Configuration"
msgstr "配置文件"
msgid "Server logs"
msgstr "服务器日志"
msgid "logs"
msgstr "日志"
msgid "Custom DNS"
msgstr "自定义DNS"
msgid "Modify yaml DNS"
msgstr "修改 DNS"
msgid "Logs"
msgstr "服务器日志"
msgstr "日志"
msgid "Enable"
msgstr "启用"
msgid "Enable Clash"
msgstr "启用 Clash"
msgid "DNS Server 1"
msgstr "上游 DNS 服务器(国内)"
msgid "DNS Server 2"
msgstr "上游 DNS 服务器(国际)"
msgid "Enable BBR"
msgstr "启用 BBR"
msgid "Bottleneck Bandwidth and Round-trip propagation time (BBR)"
msgstr ""
"BBR拥塞控制算法可以加强TCP应用表现但会降低路由器本机上的WIFI吞吐性能"
msgid "Enable DNS"
msgstr "启用 DNS 加速"
msgid "DNS Acceleration & Forwarder"
msgstr "DNS 加速 & 代理"
msgid "DNS Settings"
msgstr "DNS 设置"
msgid "Server Config"
msgstr "服务器配置"
msgid "Upload Clash Configuration"
msgstr "上传 Clash 配置"
msgid ""
"NB: Rename your config file to config.yml before upload. file will save to /"
"etc/clash"
msgstr ""
"注意上传之前请将配置文件重命名为config.yml。文件将保存到 /etc/clash"
msgid "Enable DNS Cache Acceleration and anti ISP DNS pollution"
msgstr "启用DNS多线程查询、缓存并防止ISP的DNS广告和域名劫持"
msgid "Domestic DNS Server"
msgstr "国内上游DNS服务器"
msgid "Global DNS Server"
msgstr "国外上游DNS服务器"
msgid "* Clash Redir Port"
msgstr "* 转发端口"
msgid "* Domestic DNS Fowarder"
msgstr "* 国内代理DNS服务器"
msgid "* Global DNS Fowarder"
msgstr "* 国外代理DNS服务器"
msgid "Subcription Url"
msgstr "订阅URL"
msgid "Update Subcription"
msgstr "更新订阅配置"
msgid "Update Configuration"
msgstr "更新配置文件"
msgid "Settings"
msgstr "设置"
msgid "Update time (every day)"
msgstr "更新时间 (每天)"
@ -89,68 +185,50 @@ msgstr "更新时间 (每天)"
msgid "Auto Update"
msgstr "自动更新"
msgid "After clash start running, wait a moment for servers to resolve,enjoy"
msgstr "运行后,等待服务器传播"
msgid "Clash config redir-port"
msgstr "转发端口"
msgid "Domestic DNS Server Fowarder"
msgstr "国内DNS代理服务器地址"
msgid "Global DNS Server Fowarder"
msgstr "国外DNS代理服务器地址"
msgid "Server Subscription Address"
msgstr "服务器订阅地址"
msgid "Auto Update Server subscription"
msgstr "自动更新服务器订阅"
msgid "Daily Server subscription update time"
msgstr "每日服务器订阅更新时间"
msgid "Under Server Config you can manually upload configuration from pc"
msgstr "在服务器配置可以选择手动上载配置"
msgid "Enable"
msgstr "启用"
msgid "Delete Config"
msgstr "删除配置"
msgid "Config"
msgstr "配置"
msgid "NB: press ENTER to create a blank line at the end of input."
msgstr "填写时请按照模板格式, 按Enter键在输入结束时创建一行空行"
msgid "GEOIP Database"
msgstr "GEOIP数据库"
msgid "Update GEOIP Database"
msgstr "更新GEOIP数据库"
msgid "Upload Config"
msgstr "上传配置"
msgid "NB: Rename your config file to config.yaml before upload. file will save to /etc/clash"
msgstr "注意上传之前请将配置文件重命名为config.yaml。文件将保存到 /etc/clash"
msgid "Subcription Url"
msgstr "订阅URL"
msgid "Update Subcription"
msgstr "更新订阅配置"
msgid "Update"
msgstr "更新"
msgid "Enable Client"
msgstr "启用客户端"
msgid "Server Subscription Address"
msgstr "服务器订阅地址"
msgid "Changes to config file must be made from source"
msgstr "必须从源文件更改配置文件"
msgid "DNS Servers located in China"
msgstr "选择国内上游DNS服务器"
msgid "DNS Servers located Overseas"
msgstr "选择国外上游DNS服务器"
msgid "Dashboard Secret"
msgstr "管理页面秘密"
msgid "Dashboard hostname is Your router local address. eg, 192.168.1.1"
msgstr "管理页面主机名是您的路由器本地地址。例如192.168.1.1"
msgid "Dashboard Port"
msgstr "管理页面端口"
msgid "Self Defined GFW_List"
msgstr "添加自定义GFW地址"
msgid "GFW List Mode"
msgstr "GFW列表模式"
msgid "Oversea Mode"
msgstr "海外用户回国模式"
msgid "Please modify the file here."
msgstr "填写时请按照模板格式"
msgid "Apply Modify List"
msgstr "应用自定义GFW列表"
msgid "Choose DNS Resolve Model"
msgstr "运行模式"
msgid "Choose DNS Resolve With White or Black List Model"
msgstr "选择DNS解析模式"
msgid "Update GFW List"
msgstr "更新GFW列表"
msgstr "必须从源文件更改配置文件"

BIN
package/jsda/luci-app-clash/root/etc/clash/Country.mmdb Executable file → Normal file

Binary file not shown.

View File

@ -1,618 +0,0 @@
# 2019-03-10 18:17:37
#---------------------------------------------------#
## 配置文件需要放置在 $HOME/.config/clash/config.yml
##
## 如果您不知道如何操作,请参阅 SS-Rule-Snippet 的 Wiki https://github.com/Hackl0us/SS-Rule-Snippet/wiki/clash(X)
#---------------------------------------------------#
# HTTP 代理端口
port: 7890
# SOCKS5 代理端口
socks-port: 7891
# Linux 和 macOS 的 redir 代理端口 (如需使用此功能,请取消注释)
# redir-port: 7892
# 允许局域网的连接(可用来共享代理)
allow-lan: false
# 规则模式Rule规则 / Global全局代理/ Direct全局直连
mode: Rule
# 设置日志输出级别 (默认级别silent即不输出任何内容以避免因日志内容过大而导致程序内存溢出
# 5 个级别silent / info / warning / error / debug。级别越高日志输出量越大越倾向于调试若需要请自行开启。
log-level: silent
# clash 的 RESTful API
external-controller: 127.0.0.1:9090
# 您可以将静态网页资源(如 clash-dashboard放置在一个目录中clash 将会服务于 `${API}/ui`
# 参数应填写配置目录的相对路径或绝对路径。
# external-ui: folder
# RESTful API 的口令 (可选)
secret: ""
dns:
enable: true
ipv6: false
# listen: 0.0.0.0:53
# enhanced-mode: redir-host
nameserver:
- 1.2.4.8
- 114.114.114.114
- 223.5.5.5
- tls://dns.rubyfish.cn:853
fallback: # 与 nameserver 内的服务器列表同时发起请求,当规则符合 GEOIP 在 CN 以外时fallback 列表内的域名服务器生效。
- tls://dns.rubyfish.cn:853
- tls://dns.google
# clash DNS 请求逻辑:
# (1) 当访问一个域名时, nameserver 与 fallback 列表内的所有服务器并发请求,得到域名对应的 IP 地址。
# (2) clash 将选取 nameserver 列表内,解析最快的结果。
# (3) 若解析结果中IP 地址属于 国外,那么 clash 将选择 fallback 列表内,解析最快的结果。
#
# 因此,我在 nameserver 和 fallback 内都放置了无污染、解析速度较快的国内 DNS 服务器,以达到最快的解析速度。
# 但是 fallback 列表内服务器会用在解析境外网站,为了结果绝对无污染,我仅保留了支持 DoT/DoH 的两个服务器。
#
# 注意:
# (1) 如果您为了确保 DNS 解析结果无污染,请仅保留列表内以 tls:// 开头的 DNS 服务器,但是通常对于国内没有太大必要。
# (2) 如果您不在乎可能解析到污染的结果,更加追求速度。请将 nameserver 列表的服务器插入至 fallback 列表内,并移除重复项。
Proxy:
# shadowsocks
# 所支持的加密方式与 go-shadowsocks2 保持一致
# 支持加密方式: AEAD_AES_128_GCM AEAD_AES_192_GCM AEAD_AES_256_GCM AEAD_CHACHA20_POLY1305 AES-128-CTR AES-192-CTR AES-256-CTR AES-128-CFB AES-192-CFB AES-256-CFB CHACHA20-IETF XCHACHA20
# clash 额外支持 chacha20 rc4-md5 xchacha20-ietf-poly1305 加密方式
- name: "ss1"
type: ss
server: server
port: 443
cipher: AEAD_CHACHA20_POLY1305
password: "password"
plugin: obfs
plugin-opts:
mode: tls # 混淆模式,可以选择 http 或 tls
host: bing.com # 混淆域名,需要和服务器配置保持一致
- name: "ss2"
type: ss
server: server
port: 443
cipher: AEAD_CHACHA20_POLY1305
password: "password"
plugin: v2ray-plugin
plugin-opts:
mode: websocket # 暂时不支持 QUIC 协议
# tls: true # wss
# skip-cert-verify: true
# host: bing.com
# path: "/"
# vmess
# 支持加密方式auto / aes-128-gcm / chacha20-poly1305 / none
- { name: "vmess", type: vmess, server: server, port: 443, uuid: uuid, alterId: 32, cipher: auto }
# tls
- { name: "vmess", type: vmess, server: server, port: 443, uuid: uuid, alterId: 32, cipher: auto, tls: true }
# tls (skip-cert-verify)
- { name: "vmess", type: vmess, server: server, port: 443, uuid: uuid, alterId: 32, cipher: auto, tls: true, skip-cert-verify: true }
# ws-path + ws-headers
- { name: "vmess", type: vmess, server: server, port: 443, uuid: uuid, alterId: 32, cipher: auto, network: ws, ws-path: /path, ws-headers: { Host: v2ray.com } }
# ws + tls
- { name: "vmess", type: vmess, server: server, port: 443, uuid: uuid, alterId: 32, cipher: auto, network: ws, ws-path: /path, tls: true }
# socks5
- { name: "socks", type: socks5, server: server, port: 443 }
# socks5 with authentication
- { name: "socks", type: socks5, server: server, port: 443, username: "username", password: "password" }
# tls
- { name: "socks", type: socks5, server: server, port: 443, tls: true }
# tls (skip-cert-verify)
- { name: "socks", type: socks5, server: server, port: 443, tls: true, skip-cert-verify: true }
# http
- { name: "http", type: http, server: server, port: 443 }
# http with authentication
- { name: "http", type: http, server: server, port: 443, username: "username", password: "password" }
# tls (https)
- { name: "http", type: http, server: server, port: 443, tls: true }
# tls (https) (skip-cert-verify)
- { name: "http", type: http, server: server, port: 443, tls: true, skip-cert-verify: true }
Proxy Group:
# url-test 可以自动选择与指定 URL 测速后,延迟最短的服务器
- { name: "auto", type: url-test, proxies: ["ss1", "ss2", "vmess1"], url: "https://www.bing.com", interval: 300 }
# fallback 可以尽量按照用户书写的服务器顺序,在确保服务器可用的情况下,自动选择服务器
- { name: "fallback-auto", type: fallback, proxies: ["ss1", "ss2", "vmess1"], url: "https://www.bing.com", interval: 300 }
# load-balance 可以使相同 eTLD 请求在同一条代理线路上
- { name: "load-balance", type: load-balance, proxies: ["ss1", "ss2", "vmess1"] }
# select 用来允许用户手动选择 代理服务器 或 服务器组
# 您也可以使用 RESTful API 去切换服务器,这种方式推荐在 GUI 中使用
- { name: "Proxy", type: select, proxies: ["ss1", "ss2", "vmess1", "auto"] }
Rule:
# Apple
- DOMAIN,hls.itunes.apple.com,Proxy
- DOMAIN,itunes.apple.com,Proxy
- DOMAIN-SUFFIX,digicert.com,DIRECT
- DOMAIN-SUFFIX,icloud.com,DIRECT
- DOMAIN-SUFFIX,icloud-content.com,DIRECT
- DOMAIN-SUFFIX,mzstatic.com,DIRECT
- DOMAIN-SUFFIX,akadns.net,DIRECT
- DOMAIN-SUFFIX,aaplimg.com,DIRECT
- DOMAIN-SUFFIX,cdn-apple.com,DIRECT
- DOMAIN-SUFFIX,apple.com,DIRECT
#- DOMAIN,e.crashlytics.com,REJECT //注释此选项有助于大多数App开发者分析崩溃信息如果您拒绝一切崩溃数据统计、搜集请取消 # 注释。
# 自定义规则
## 您可以在此处插入您补充的自定义规则
# 国内网站
- DOMAIN-SUFFIX,cn,DIRECT
- DOMAIN-KEYWORD,-cn,DIRECT
- DOMAIN-SUFFIX,126.com,DIRECT
- DOMAIN-SUFFIX,126.net,DIRECT
- DOMAIN-SUFFIX,127.net,DIRECT
- DOMAIN-SUFFIX,163.com,DIRECT
- DOMAIN-SUFFIX,360buyimg.com,DIRECT
- DOMAIN-SUFFIX,36kr.com,DIRECT
- DOMAIN-SUFFIX,acfun.tv,DIRECT
- DOMAIN-SUFFIX,air-matters.com,DIRECT
- DOMAIN-SUFFIX,aixifan.com,DIRECT
- DOMAIN-SUFFIX,akamaized.net,DIRECT
- DOMAIN-KEYWORD,alicdn,DIRECT
- DOMAIN-KEYWORD,alipay,DIRECT
- DOMAIN-KEYWORD,taobao,DIRECT
- DOMAIN-SUFFIX,amap.com,DIRECT
- DOMAIN-SUFFIX,autonavi.com,DIRECT
- DOMAIN-KEYWORD,baidu,DIRECT
- DOMAIN-SUFFIX,bdimg.com,DIRECT
- DOMAIN-SUFFIX,bdstatic.com,DIRECT
- DOMAIN-SUFFIX,bilibili.com,DIRECT
- DOMAIN-SUFFIX,caiyunapp.com,DIRECT
- DOMAIN-SUFFIX,clouddn.com,DIRECT
- DOMAIN-SUFFIX,cnbeta.com,DIRECT
- DOMAIN-SUFFIX,cnbetacdn.com,DIRECT
- DOMAIN-SUFFIX,cootekservice.com,DIRECT
- DOMAIN-SUFFIX,csdn.net,DIRECT
- DOMAIN-SUFFIX,ctrip.com,DIRECT
- DOMAIN-SUFFIX,dgtle.com,DIRECT
- DOMAIN-SUFFIX,dianping.com,DIRECT
- DOMAIN-SUFFIX,douban.com,DIRECT
- DOMAIN-SUFFIX,doubanio.com,DIRECT
- DOMAIN-SUFFIX,duokan.com,DIRECT
- DOMAIN-SUFFIX,easou.com,DIRECT
- DOMAIN-SUFFIX,ele.me,DIRECT
- DOMAIN-SUFFIX,feng.com,DIRECT
- DOMAIN-SUFFIX,fir.im,DIRECT
- DOMAIN-SUFFIX,frdic.com,DIRECT
- DOMAIN-SUFFIX,g-cores.com,DIRECT
- DOMAIN-SUFFIX,godic.net,DIRECT
- DOMAIN-SUFFIX,gtimg.com,DIRECT
- DOMAIN,cdn.hockeyapp.net,DIRECT
- DOMAIN-SUFFIX,hongxiu.com,DIRECT
- DOMAIN-SUFFIX,hxcdn.net,DIRECT
- DOMAIN-SUFFIX,iciba.com,DIRECT
- DOMAIN-SUFFIX,ifeng.com,DIRECT
- DOMAIN-SUFFIX,ifengimg.com,DIRECT
- DOMAIN-SUFFIX,ipip.net,DIRECT
- DOMAIN-SUFFIX,iqiyi.com,DIRECT
- DOMAIN-SUFFIX,jd.com,DIRECT
- DOMAIN-SUFFIX,jianshu.com,DIRECT
- DOMAIN-SUFFIX,knewone.com,DIRECT
- DOMAIN-SUFFIX,le.com,DIRECT
- DOMAIN-SUFFIX,lecloud.com,DIRECT
- DOMAIN-SUFFIX,lemicp.com,DIRECT
- DOMAIN-SUFFIX,licdn.com,DIRECT
- DOMAIN-SUFFIX,linkedin.com,DIRECT
- DOMAIN-SUFFIX,luoo.net,DIRECT
- DOMAIN-SUFFIX,meituan.com,DIRECT
- DOMAIN-SUFFIX,meituan.net,DIRECT
- DOMAIN-SUFFIX,mi.com,DIRECT
- DOMAIN-SUFFIX,miaopai.com,DIRECT
- DOMAIN-SUFFIX,microsoft.com,DIRECT
- DOMAIN-SUFFIX,microsoftonline.com,DIRECT
- DOMAIN-SUFFIX,miui.com,DIRECT
- DOMAIN-SUFFIX,miwifi.com,DIRECT
- DOMAIN-SUFFIX,mob.com,DIRECT
- DOMAIN-SUFFIX,netease.com,DIRECT
- DOMAIN-SUFFIX,office.com,DIRECT
- DOMAIN-SUFFIX,office365.com,DIRECT
- DOMAIN-KEYWORD,officecdn,DIRECT
- DOMAIN-SUFFIX,oschina.net,DIRECT
- DOMAIN-SUFFIX,ppsimg.com,DIRECT
- DOMAIN-SUFFIX,pstatp.com,DIRECT
- DOMAIN-SUFFIX,qcloud.com,DIRECT
- DOMAIN-SUFFIX,qdaily.com,DIRECT
- DOMAIN-SUFFIX,qdmm.com,DIRECT
- DOMAIN-SUFFIX,qhimg.com,DIRECT
- DOMAIN-SUFFIX,qhres.com,DIRECT
- DOMAIN-SUFFIX,qidian.com,DIRECT
- DOMAIN-SUFFIX,qihucdn.com,DIRECT
- DOMAIN-SUFFIX,qiniu.com,DIRECT
- DOMAIN-SUFFIX,qiniucdn.com,DIRECT
- DOMAIN-SUFFIX,qiyipic.com,DIRECT
- DOMAIN-SUFFIX,qq.com,DIRECT
- DOMAIN-SUFFIX,qqurl.com,DIRECT
- DOMAIN-SUFFIX,tencent.com,DIRECT
- DOMAIN-SUFFIX,rarbg.to,DIRECT
- DOMAIN-SUFFIX,ruguoapp.com,DIRECT
- DOMAIN-SUFFIX,segmentfault.com,DIRECT
- DOMAIN-SUFFIX,sinaapp.com,DIRECT
- DOMAIN-SUFFIX,smzdm.com,DIRECT
- DOMAIN-SUFFIX,sogou.com,DIRECT
- DOMAIN-SUFFIX,sogoucdn.com,DIRECT
- DOMAIN-SUFFIX,sohu.com,DIRECT
- DOMAIN-SUFFIX,soku.com,DIRECT
- DOMAIN-SUFFIX,speedtest.net,DIRECT
- DOMAIN-SUFFIX,sspai.com,DIRECT
- DOMAIN-SUFFIX,suning.com,DIRECT
- DOMAIN-SUFFIX,taobao.com,DIRECT
- DOMAIN-SUFFIX,tenpay.com,DIRECT
- DOMAIN-SUFFIX,tmall.com,DIRECT
- DOMAIN-SUFFIX,tudou.com,DIRECT
- DOMAIN-SUFFIX,umetrip.com,DIRECT
- DOMAIN-SUFFIX,upaiyun.com,DIRECT
- DOMAIN-SUFFIX,upyun.com,DIRECT
- DOMAIN-SUFFIX,v2ex.com,DIRECT
- DOMAIN-SUFFIX,veryzhun.com,DIRECT
- DOMAIN-SUFFIX,weather.com,DIRECT
- DOMAIN-SUFFIX,weibo.com,DIRECT
- DOMAIN-SUFFIX,xiami.com,DIRECT
- DOMAIN-SUFFIX,xiami.net,DIRECT
- DOMAIN-SUFFIX,xiaomicp.com,DIRECT
- DOMAIN-SUFFIX,ximalaya.com,DIRECT
- DOMAIN-SUFFIX,xmcdn.com,DIRECT
- DOMAIN-SUFFIX,xunlei.com,DIRECT
- DOMAIN-SUFFIX,yhd.com,DIRECT
- DOMAIN-SUFFIX,yihaodianimg.com,DIRECT
- DOMAIN-SUFFIX,yinxiang.com,DIRECT
- DOMAIN-SUFFIX,ykimg.com,DIRECT
- DOMAIN-SUFFIX,youdao.com,DIRECT
- DOMAIN-SUFFIX,youku.com,DIRECT
- DOMAIN-SUFFIX,zealer.com,DIRECT
- DOMAIN-SUFFIX,zhihu.com,DIRECT
- DOMAIN-SUFFIX,zhimg.com,DIRECT
- DOMAIN-SUFFIX,zimuzu.tv,DIRECT
# 抗 DNS 污染
- DOMAIN-KEYWORD,amazon,Proxy
- DOMAIN-KEYWORD,google,Proxy
- DOMAIN-KEYWORD,gmail,Proxy
- DOMAIN-KEYWORD,youtube,Proxy
- DOMAIN-KEYWORD,facebook,Proxy
- DOMAIN-SUFFIX,fb.me,Proxy
- DOMAIN-SUFFIX,fbcdn.net,Proxy
- DOMAIN-KEYWORD,twitter,Proxy
- DOMAIN-KEYWORD,instagram,Proxy
- DOMAIN-KEYWORD,dropbox,Proxy
- DOMAIN-SUFFIX,twimg.com,Proxy
- DOMAIN-KEYWORD,blogspot,Proxy
- DOMAIN-SUFFIX,youtu.be,Proxy
- DOMAIN-KEYWORD,whatsapp,Proxy
# 常见广告域名屏蔽
- DOMAIN-KEYWORD,admarvel,REJECT
- DOMAIN-KEYWORD,admaster,REJECT
- DOMAIN-KEYWORD,adsage,REJECT
- DOMAIN-KEYWORD,adsmogo,REJECT
- DOMAIN-KEYWORD,adsrvmedia,REJECT
- DOMAIN-KEYWORD,adwords,REJECT
- DOMAIN-KEYWORD,adservice,REJECT
- DOMAIN-KEYWORD,domob,REJECT
- DOMAIN-KEYWORD,duomeng,REJECT
- DOMAIN-KEYWORD,dwtrack,REJECT
- DOMAIN-KEYWORD,guanggao,REJECT
- DOMAIN-KEYWORD,lianmeng,REJECT
- DOMAIN-KEYWORD,omgmta,REJECT
- DOMAIN-KEYWORD,openx,REJECT
- DOMAIN-KEYWORD,partnerad,REJECT
- DOMAIN-KEYWORD,pingfore,REJECT
- DOMAIN-KEYWORD,supersonicads,REJECT
- DOMAIN-KEYWORD,tracking,REJECT
- DOMAIN-KEYWORD,uedas,REJECT
- DOMAIN-KEYWORD,umeng,REJECT
- DOMAIN-KEYWORD,usage,REJECT
- DOMAIN-KEYWORD,wlmonitor,REJECT
- DOMAIN-KEYWORD,zjtoolbar,REJECT
# 国外网站
- DOMAIN-SUFFIX,9to5mac.com,Proxy
- DOMAIN-SUFFIX,abpchina.org,Proxy
- DOMAIN-SUFFIX,adblockplus.org,Proxy
- DOMAIN-SUFFIX,adobe.com,Proxy
- DOMAIN-SUFFIX,alfredapp.com,Proxy
- DOMAIN-SUFFIX,amplitude.com,Proxy
- DOMAIN-SUFFIX,ampproject.org,Proxy
- DOMAIN-SUFFIX,android.com,Proxy
- DOMAIN-SUFFIX,angularjs.org,Proxy
- DOMAIN-SUFFIX,aolcdn.com,Proxy
- DOMAIN-SUFFIX,apkpure.com,Proxy
- DOMAIN-SUFFIX,appledaily.com,Proxy
- DOMAIN-SUFFIX,appshopper.com,Proxy
- DOMAIN-SUFFIX,appspot.com,Proxy
- DOMAIN-SUFFIX,arcgis.com,Proxy
- DOMAIN-SUFFIX,archive.org,Proxy
- DOMAIN-SUFFIX,armorgames.com,Proxy
- DOMAIN-SUFFIX,aspnetcdn.com,Proxy
- DOMAIN-SUFFIX,att.com,Proxy
- DOMAIN-SUFFIX,awsstatic.com,Proxy
- DOMAIN-SUFFIX,azureedge.net,Proxy
- DOMAIN-SUFFIX,azurewebsites.net,Proxy
- DOMAIN-SUFFIX,bing.com,Proxy
- DOMAIN-SUFFIX,bintray.com,Proxy
- DOMAIN-SUFFIX,bit.com,Proxy
- DOMAIN-SUFFIX,bit.ly,Proxy
- DOMAIN-SUFFIX,bitbucket.org,Proxy
- DOMAIN-SUFFIX,bjango.com,Proxy
- DOMAIN-SUFFIX,bkrtx.com,Proxy
- DOMAIN-SUFFIX,blog.com,Proxy
- DOMAIN-SUFFIX,blogcdn.com,Proxy
- DOMAIN-SUFFIX,blogger.com,Proxy
- DOMAIN-SUFFIX,blogsmithmedia.com,Proxy
- DOMAIN-SUFFIX,blogspot.com,Proxy
- DOMAIN-SUFFIX,blogspot.hk,Proxy
- DOMAIN-SUFFIX,bloomberg.com,Proxy
- DOMAIN-SUFFIX,box.com,Proxy
- DOMAIN-SUFFIX,box.net,Proxy
- DOMAIN-SUFFIX,cachefly.net,Proxy
- DOMAIN-SUFFIX,chromium.org,Proxy
- DOMAIN-SUFFIX,cl.ly,Proxy
- DOMAIN-SUFFIX,cloudflare.com,Proxy
- DOMAIN-SUFFIX,cloudfront.net,Proxy
- DOMAIN-SUFFIX,cloudmagic.com,Proxy
- DOMAIN-SUFFIX,cmail19.com,Proxy
- DOMAIN-SUFFIX,cnet.com,Proxy
- DOMAIN-SUFFIX,cocoapods.org,Proxy
- DOMAIN-SUFFIX,comodoca.com,Proxy
- DOMAIN-SUFFIX,crashlytics.com,Proxy
- DOMAIN-SUFFIX,culturedcode.com,Proxy
- DOMAIN-SUFFIX,d.pr,Proxy
- DOMAIN-SUFFIX,danilo.to,Proxy
- DOMAIN-SUFFIX,dayone.me,Proxy
- DOMAIN-SUFFIX,db.tt,Proxy
- DOMAIN-SUFFIX,deskconnect.com,Proxy
- DOMAIN-SUFFIX,disq.us,Proxy
- DOMAIN-SUFFIX,disqus.com,Proxy
- DOMAIN-SUFFIX,disquscdn.com,Proxy
- DOMAIN-SUFFIX,dnsimple.com,Proxy
- DOMAIN-SUFFIX,docker.com,Proxy
- DOMAIN-SUFFIX,dribbble.com,Proxy
- DOMAIN-SUFFIX,droplr.com,Proxy
- DOMAIN-SUFFIX,duckduckgo.com,Proxy
- DOMAIN-SUFFIX,dueapp.com,Proxy
- DOMAIN-SUFFIX,dytt8.net,Proxy
- DOMAIN-SUFFIX,edgecastcdn.net,Proxy
- DOMAIN-SUFFIX,edgekey.net,Proxy
- DOMAIN-SUFFIX,edgesuite.net,Proxy
- DOMAIN-SUFFIX,engadget.com,Proxy
- DOMAIN-SUFFIX,entrust.net,Proxy
- DOMAIN-SUFFIX,eurekavpt.com,Proxy
- DOMAIN-SUFFIX,evernote.com,Proxy
- DOMAIN-SUFFIX,fabric.io,Proxy
- DOMAIN-SUFFIX,fast.com,Proxy
- DOMAIN-SUFFIX,fastly.net,Proxy
- DOMAIN-SUFFIX,fc2.com,Proxy
- DOMAIN-SUFFIX,feedburner.com,Proxy
- DOMAIN-SUFFIX,feedly.com,Proxy
- DOMAIN-SUFFIX,feedsportal.com,Proxy
- DOMAIN-SUFFIX,fiftythree.com,Proxy
- DOMAIN-SUFFIX,firebaseio.com,Proxy
- DOMAIN-SUFFIX,flexibits.com,Proxy
- DOMAIN-SUFFIX,flickr.com,Proxy
- DOMAIN-SUFFIX,flipboard.com,Proxy
- DOMAIN-SUFFIX,g.co,Proxy
- DOMAIN-SUFFIX,gabia.net,Proxy
- DOMAIN-SUFFIX,geni.us,Proxy
- DOMAIN-SUFFIX,gfx.ms,Proxy
- DOMAIN-SUFFIX,ggpht.com,Proxy
- DOMAIN-SUFFIX,ghostnoteapp.com,Proxy
- DOMAIN-SUFFIX,git.io,Proxy
- DOMAIN-KEYWORD,github,Proxy
- DOMAIN-SUFFIX,globalsign.com,Proxy
- DOMAIN-SUFFIX,gmodules.com,Proxy
- DOMAIN-SUFFIX,godaddy.com,Proxy
- DOMAIN-SUFFIX,golang.org,Proxy
- DOMAIN-SUFFIX,gongm.in,Proxy
- DOMAIN-SUFFIX,goo.gl,Proxy
- DOMAIN-SUFFIX,goodreaders.com,Proxy
- DOMAIN-SUFFIX,goodreads.com,Proxy
- DOMAIN-SUFFIX,gravatar.com,Proxy
- DOMAIN-SUFFIX,gstatic.com,Proxy
- DOMAIN-SUFFIX,gvt0.com,Proxy
- DOMAIN-SUFFIX,hockeyapp.net,Proxy
- DOMAIN-SUFFIX,hotmail.com,Proxy
- DOMAIN-SUFFIX,icons8.com,Proxy
- DOMAIN-SUFFIX,ift.tt,Proxy
- DOMAIN-SUFFIX,ifttt.com,Proxy
- DOMAIN-SUFFIX,iherb.com,Proxy
- DOMAIN-SUFFIX,imageshack.us,Proxy
- DOMAIN-SUFFIX,img.ly,Proxy
- DOMAIN-SUFFIX,imgur.com,Proxy
- DOMAIN-SUFFIX,imore.com,Proxy
- DOMAIN-SUFFIX,instapaper.com,Proxy
- DOMAIN-SUFFIX,ipn.li,Proxy
- DOMAIN-SUFFIX,is.gd,Proxy
- DOMAIN-SUFFIX,issuu.com,Proxy
- DOMAIN-SUFFIX,itgonglun.com,Proxy
- DOMAIN-SUFFIX,itun.es,Proxy
- DOMAIN-SUFFIX,ixquick.com,Proxy
- DOMAIN-SUFFIX,j.mp,Proxy
- DOMAIN-SUFFIX,js.revsci.net,Proxy
- DOMAIN-SUFFIX,jshint.com,Proxy
- DOMAIN-SUFFIX,jtvnw.net,Proxy
- DOMAIN-SUFFIX,justgetflux.com,Proxy
- DOMAIN-SUFFIX,kat.cr,Proxy
- DOMAIN-SUFFIX,klip.me,Proxy
- DOMAIN-SUFFIX,libsyn.com,Proxy
- DOMAIN-SUFFIX,linode.com,Proxy
- DOMAIN-SUFFIX,lithium.com,Proxy
- DOMAIN-SUFFIX,littlehj.com,Proxy
- DOMAIN-SUFFIX,live.com,Proxy
- DOMAIN-SUFFIX,live.net,Proxy
- DOMAIN-SUFFIX,livefilestore.com,Proxy
- DOMAIN-SUFFIX,llnwd.net,Proxy
- DOMAIN-SUFFIX,macid.co,Proxy
- DOMAIN-SUFFIX,macromedia.com,Proxy
- DOMAIN-SUFFIX,macrumors.com,Proxy
- DOMAIN-SUFFIX,mashable.com,Proxy
- DOMAIN-SUFFIX,mathjax.org,Proxy
- DOMAIN-SUFFIX,medium.com,Proxy
- DOMAIN-SUFFIX,mega.co.nz,Proxy
- DOMAIN-SUFFIX,mega.nz,Proxy
- DOMAIN-SUFFIX,megaupload.com,Proxy
- DOMAIN-SUFFIX,microsofttranslator.com,Proxy
- DOMAIN-SUFFIX,mindnode.com,Proxy
- DOMAIN-SUFFIX,mobile01.com,Proxy
- DOMAIN-SUFFIX,modmyi.com,Proxy
- DOMAIN-SUFFIX,msedge.net,Proxy
- DOMAIN-SUFFIX,myfontastic.com,Proxy
- DOMAIN-SUFFIX,name.com,Proxy
- DOMAIN-SUFFIX,nextmedia.com,Proxy
- DOMAIN-SUFFIX,nsstatic.net,Proxy
- DOMAIN-SUFFIX,nssurge.com,Proxy
- DOMAIN-SUFFIX,nyt.com,Proxy
- DOMAIN-SUFFIX,nytimes.com,Proxy
- DOMAIN-SUFFIX,omnigroup.com,Proxy
- DOMAIN-SUFFIX,onedrive.com,Proxy
- DOMAIN-SUFFIX,onenote.com,Proxy
- DOMAIN-SUFFIX,ooyala.com,Proxy
- DOMAIN-SUFFIX,openvpn.net,Proxy
- DOMAIN-SUFFIX,openwrt.org,Proxy
- DOMAIN-SUFFIX,orkut.com,Proxy
- DOMAIN-SUFFIX,osxdaily.com,Proxy
- DOMAIN-SUFFIX,outlook.com,Proxy
- DOMAIN-SUFFIX,ow.ly,Proxy
- DOMAIN-SUFFIX,paddleapi.com,Proxy
- DOMAIN-SUFFIX,parallels.com,Proxy
- DOMAIN-SUFFIX,parse.com,Proxy
- DOMAIN-SUFFIX,pdfexpert.com,Proxy
- DOMAIN-SUFFIX,periscope.tv,Proxy
- DOMAIN-SUFFIX,pinboard.in,Proxy
- DOMAIN-SUFFIX,pinterest.com,Proxy
- DOMAIN-SUFFIX,pixelmator.com,Proxy
- DOMAIN-SUFFIX,pixiv.net,Proxy
- DOMAIN-SUFFIX,playpcesor.com,Proxy
- DOMAIN-SUFFIX,playstation.com,Proxy
- DOMAIN-SUFFIX,playstation.com.hk,Proxy
- DOMAIN-SUFFIX,playstation.net,Proxy
- DOMAIN-SUFFIX,playstationnetwork.com,Proxy
- DOMAIN-SUFFIX,pushwoosh.com,Proxy
- DOMAIN-SUFFIX,rime.im,Proxy
- DOMAIN-SUFFIX,servebom.com,Proxy
- DOMAIN-SUFFIX,sfx.ms,Proxy
- DOMAIN-SUFFIX,shadowsocks.org,Proxy
- DOMAIN-SUFFIX,sharethis.com,Proxy
- DOMAIN-SUFFIX,shazam.com,Proxy
- DOMAIN-SUFFIX,skype.com,Proxy
- DOMAIN-SUFFIX,smartdnsProxy.com,Proxy
- DOMAIN-SUFFIX,smartmailcloud.com,Proxy
- DOMAIN-SUFFIX,sndcdn.com,Proxy
- DOMAIN-SUFFIX,sony.com,Proxy
- DOMAIN-SUFFIX,soundcloud.com,Proxy
- DOMAIN-SUFFIX,sourceforge.net,Proxy
- DOMAIN-SUFFIX,spotify.com,Proxy
- DOMAIN-SUFFIX,squarespace.com,Proxy
- DOMAIN-SUFFIX,sstatic.net,Proxy
- DOMAIN-SUFFIX,st.luluku.pw,Proxy
- DOMAIN-SUFFIX,stackoverflow.com,Proxy
- DOMAIN-SUFFIX,startpage.com,Proxy
- DOMAIN-SUFFIX,staticflickr.com,Proxy
- DOMAIN-SUFFIX,steamcommunity.com,Proxy
- DOMAIN-SUFFIX,symauth.com,Proxy
- DOMAIN-SUFFIX,symcb.com,Proxy
- DOMAIN-SUFFIX,symcd.com,Proxy
- DOMAIN-SUFFIX,tapbots.com,Proxy
- DOMAIN-SUFFIX,tapbots.net,Proxy
- DOMAIN-SUFFIX,tdesktop.com,Proxy
- DOMAIN-SUFFIX,techcrunch.com,Proxy
- DOMAIN-SUFFIX,techsmith.com,Proxy
- DOMAIN-SUFFIX,thepiratebay.org,Proxy
- DOMAIN-SUFFIX,theverge.com,Proxy
- DOMAIN-SUFFIX,time.com,Proxy
- DOMAIN-SUFFIX,timeinc.net,Proxy
- DOMAIN-SUFFIX,tiny.cc,Proxy
- DOMAIN-SUFFIX,tinypic.com,Proxy
- DOMAIN-SUFFIX,tmblr.co,Proxy
- DOMAIN-SUFFIX,todoist.com,Proxy
- DOMAIN-SUFFIX,trello.com,Proxy
- DOMAIN-SUFFIX,trustasiassl.com,Proxy
- DOMAIN-SUFFIX,tumblr.co,Proxy
- DOMAIN-SUFFIX,tumblr.com,Proxy
- DOMAIN-SUFFIX,tweetdeck.com,Proxy
- DOMAIN-SUFFIX,tweetmarker.net,Proxy
- DOMAIN-SUFFIX,twitch.tv,Proxy
- DOMAIN-SUFFIX,txmblr.com,Proxy
- DOMAIN-SUFFIX,typekit.net,Proxy
- DOMAIN-SUFFIX,ubertags.com,Proxy
- DOMAIN-SUFFIX,ublock.org,Proxy
- DOMAIN-SUFFIX,ubnt.com,Proxy
- DOMAIN-SUFFIX,ulyssesapp.com,Proxy
- DOMAIN-SUFFIX,urchin.com,Proxy
- DOMAIN-SUFFIX,usertrust.com,Proxy
- DOMAIN-SUFFIX,v.gd,Proxy
- DOMAIN-SUFFIX,vimeo.com,Proxy
- DOMAIN-SUFFIX,vimeocdn.com,Proxy
- DOMAIN-SUFFIX,vine.co,Proxy
- DOMAIN-SUFFIX,vivaldi.com,Proxy
- DOMAIN-SUFFIX,vox-cdn.com,Proxy
- DOMAIN-SUFFIX,vsco.co,Proxy
- DOMAIN-SUFFIX,vultr.com,Proxy
- DOMAIN-SUFFIX,w.org,Proxy
- DOMAIN-SUFFIX,w3schools.com,Proxy
- DOMAIN-SUFFIX,webtype.com,Proxy
- DOMAIN-SUFFIX,wikiwand.com,Proxy
- DOMAIN-SUFFIX,wikileaks.org,Proxy
- DOMAIN-SUFFIX,wikimedia.org,Proxy
- DOMAIN-SUFFIX,wikipedia.com,Proxy
- DOMAIN-SUFFIX,wikipedia.org,Proxy
- DOMAIN-SUFFIX,windows.com,Proxy
- DOMAIN-SUFFIX,windows.net,Proxy
- DOMAIN-SUFFIX,wire.com,Proxy
- DOMAIN-SUFFIX,wordpress.com,Proxy
- DOMAIN-SUFFIX,workflowy.com,Proxy
- DOMAIN-SUFFIX,wp.com,Proxy
- DOMAIN-SUFFIX,wsj.com,Proxy
- DOMAIN-SUFFIX,wsj.net,Proxy
- DOMAIN-SUFFIX,xda-developers.com,Proxy
- DOMAIN-SUFFIX,xeeno.com,Proxy
- DOMAIN-SUFFIX,xiti.com,Proxy
- DOMAIN-SUFFIX,yahoo.com,Proxy
- DOMAIN-SUFFIX,yimg.com,Proxy
- DOMAIN-SUFFIX,ying.com,Proxy
- DOMAIN-SUFFIX,yoyo.org,Proxy
- DOMAIN-SUFFIX,ytimg.com,Proxy
# Telegram
- DOMAIN-SUFFIX,telegra.ph,Proxy
- DOMAIN-SUFFIX,telegram.org,Proxy
- IP-CIDR,91.108.56.0/22,Proxy
- IP-CIDR,91.108.4.0/22,Proxy
- IP-CIDR,91.108.8.0/22,Proxy
- IP-CIDR,109.239.140.0/24,Proxy
- IP-CIDR,149.154.160.0/20,Proxy
- IP-CIDR,149.154.164.0/22,Proxy
# LAN
- DOMAIN-SUFFIX,local,DIRECT
- IP-CIDR,127.0.0.0/8,DIRECT
- IP-CIDR,172.16.0.0/12,DIRECT
- IP-CIDR,192.168.0.0/16,DIRECT
- IP-CIDR,10.0.0.0/8,DIRECT
- IP-CIDR,17.0.0.0/8,DIRECT
- IP-CIDR,100.64.0.0/10,DIRECT
# 最终规则
- GEOIP,CN,DIRECT
- MATCH,Proxy

View File

@ -1,110 +0,0 @@
ipset=/.91smartyun.pt/gfwlist
ipset=/.adobe.com/gfwlist
ipset=/.amazonaws.com/gfwlist
ipset=/.ampproject.org/gfwlist
ipset=/.apple.news/gfwlist
ipset=/.aws.amazon.com/gfwlist
ipset=/.azureedge.net/gfwlist
ipset=/.github.com/gfwlist
ipset=/.backpackers.com.tw/gfwlist
ipset=/.bitfinex.com/gfwlist
ipset=/.buzzfeed.com/gfwlist
ipset=/.clockwise.ee/gfwlist
ipset=/.cloudfront.net/gfwlist
ipset=/.coindesk.com/gfwlist
ipset=/.coinsquare.io/gfwlist
ipset=/.cryptocompare.com/gfwlist
ipset=/.dropboxstatic.com/gfwlist
ipset=/.eurecom.fr/gfwlist
ipset=/.gdax.com/gfwlist
ipset=/.isnssdk.com/gfwlist
ipset=/.kknews.cc/gfwlist
ipset=/.nutaq.com/gfwlist
ipset=/.openairinterface.org/gfwlist
ipset=/.skype.com/gfwlist
ipset=/.snssdk.com/gfwlist
ipset=/.sublimetext.com/gfwlist
ipset=/.textnow.com/gfwlist
ipset=/.textnow.me/gfwlist
ipset=/.trouter.io/gfwlist
ipset=/.uploaded.net/gfwlist
ipset=/.whatsapp.com/gfwlist
ipset=/.whatsapp.net/gfwlist
ipset=/.wsj.net/gfwlist
ipset=/.google.com/gfwlist
ipset=/.google.com.hk/gfwlist
ipset=/.gstatic.com/gfwlist
ipset=/.googleusercontent.com/gfwlist
ipset=/.googlepages.com/gfwlist
ipset=/.googlevideo.com/gfwlist
ipset=/.googlecode.com/gfwlist
ipset=/.googleapis.com/gfwlist
ipset=/.googlesource.com/gfwlist
ipset=/.googledrive.com/gfwlist
ipset=/.ggpht.com/gfwlist
ipset=/.youtube.com/gfwlist
ipset=/.youtu.be/gfwlist
ipset=/.ytimg.com/gfwlist
ipset=/.twitter.com/gfwlist
ipset=/.facebook.com/gfwlist
ipset=/.fastly.net/gfwlist
ipset=/.akamai.net/gfwlist
ipset=/.akamaiedge.net/gfwlist
ipset=/.akamaihd.net/gfwlist
ipset=/.edgesuite.net/gfwlist
ipset=/.edgekey.net/gfwlist
server=/.91smartyun.pt/127.0.0.1#5353
server=/.adobe.com/127.0.0.1#5353
server=/.amazonaws.com/127.0.0.1#5353
server=/.ampproject.org/127.0.0.1#5353
server=/.apple.news/127.0.0.1#5353
server=/.aws.amazon.com/127.0.0.1#5353
server=/.azureedge.net/127.0.0.1#5353
server=/.github.com/127.0.0.1#5353
server=/.backpackers.com.tw/127.0.0.1#5353
server=/.bitfinex.com/127.0.0.1#5353
server=/.buzzfeed.com/127.0.0.1#5353
server=/.clockwise.ee/127.0.0.1#5353
server=/.cloudfront.net/127.0.0.1#5353
server=/.coindesk.com/127.0.0.1#5353
server=/.coinsquare.io/127.0.0.1#5353
server=/.cryptocompare.com/127.0.0.1#5353
server=/.dropboxstatic.com/127.0.0.1#5353
server=/.eurecom.fr/127.0.0.1#5353
server=/.gdax.com/127.0.0.1#5353
server=/.isnssdk.com/127.0.0.1#5353
server=/.kknews.cc/127.0.0.1#5353
server=/.nutaq.com/127.0.0.1#5353
server=/.openairinterface.org/127.0.0.1#5353
server=/.skype.com/127.0.0.1#5353
server=/.snssdk.com/127.0.0.1#5353
server=/.sublimetext.com/127.0.0.1#5353
server=/.textnow.com/127.0.0.1#5353
server=/.textnow.me/127.0.0.1#5353
server=/.trouter.io/127.0.0.1#5353
server=/.uploaded.net/127.0.0.1#5353
server=/.whatsapp.com/127.0.0.1#5353
server=/.whatsapp.net/127.0.0.1#5353
server=/.wsj.net/127.0.0.1#5353
server=/.google.com/127.0.0.1#5353
server=/.google.com.hk/127.0.0.1#5353
server=/.gstatic.com/127.0.0.1#5353
server=/.googleusercontent.com/127.0.0.1#5353
server=/.googlepages.com/127.0.0.1#5353
server=/.googlevideo.com/127.0.0.1#5353
server=/.googlecode.com/127.0.0.1#5353
server=/.googleapis.com/127.0.0.1#5353
server=/.googlesource.com/127.0.0.1#5353
server=/.googledrive.com/127.0.0.1#5353
server=/.ggpht.com/127.0.0.1#5353
server=/.youtube.com/127.0.0.1#5353
server=/.youtu.be/127.0.0.1#5353
server=/.ytimg.com/127.0.0.1#5353
server=/.twitter.com/127.0.0.1#5353
server=/.facebook.com/127.0.0.1#5353
server=/.fastly.net/127.0.0.1#5353
server=/.akamai.net/127.0.0.1#5353
server=/.akamaiedge.net/127.0.0.1#5353
server=/.akamaihd.net/127.0.0.1#5353
server=/.edgesuite.net/127.0.0.1#5353
server=/.edgekey.net/127.0.0.1#5353

File diff suppressed because it is too large Load Diff

View File

@ -1,192 +0,0 @@
server=/v.youku.com/127.0.0.1#5333
server=/api.youku.com/127.0.0.1#5333
server=/v2.tudou.com/127.0.0.1#5333
server=/www.tudou.com/127.0.0.1#5333
server=/s.plcloud.music.qq.com/127.0.0.1#5333
server=/i.y.qq.com/127.0.0.1#5333
server=/hot.vrs.sohu.com/127.0.0.1#5333
server=/live.tv.sohu.com/127.0.0.1#5333
server=/pad.tv.sohu.com/127.0.0.1#5333
server=/my.tv.sohu.com/127.0.0.1#5333
server=/hot.vrs.letv.com/127.0.0.1#5333
server=/data.video.qiyi.com/127.0.0.1#5333
server=/cache.video.qiyi.com/127.0.0.1#5333
server=/cache.vip.qiyi.com/127.0.0.1#5333
server=/vv.video.qq.com/127.0.0.1#5333
server=/tt.video.qq.com/127.0.0.1#5333
server=/ice.video.qq.com/127.0.0.1#5333
server=/tjsa.video.qq.com/127.0.0.1#5333
server=/a10.video.qq.com/127.0.0.1#5333
server=/xyy.video.qq.com/127.0.0.1#5333
server=/vcq.video.qq.com/127.0.0.1#5333
server=/vsh.video.qq.com/127.0.0.1#5333
server=/vbj.video.qq.com/127.0.0.1#5333
server=/bobo.video.qq.com/127.0.0.1#5333
server=/flvs.video.qq.com/127.0.0.1#5333
server=/bkvv.video.qq.com/127.0.0.1#5333
server=/info.zb.qq.com/127.0.0.1#5333
server=/geo.js.kankan.xunlei.com/127.0.0.1#5333
server=/web-play.pptv.com/127.0.0.1#5333
server=/web-play.pplive.cn/127.0.0.1#5333
server=/dyn.ugc.pps.tv/127.0.0.1#5333
server=/v.pps.tv/127.0.0.1#5333
server=/inner.kandian.com/127.0.0.1#5333
server=/ipservice.163.com/127.0.0.1#5333
server=/so.open.163.com/127.0.0.1#5333
server=/zb.s.qq.com/127.0.0.1#5333
server=/ip.kankan.xunlei.com/127.0.0.1#5333
server=/vxml.56.com/127.0.0.1#5333
server=/music.sina.com.cn/127.0.0.1#5333
server=/play.baidu.com/127.0.0.1#5333
server=/v.iask.com/127.0.0.1#5333
server=/tv.weibo.com/127.0.0.1#5333
server=/wtv.v.iask.com/127.0.0.1#5333
server=/video.sina.com.cn/127.0.0.1#5333
server=/www.yinyuetai.com/127.0.0.1#5333
server=/api.letv.com/127.0.0.1#5333
server=/live.gslb.letv.com/127.0.0.1#5333
server=/static.itv.letv.com/127.0.0.1#5333
server=/ip.apps.cntv.cn/127.0.0.1#5333
server=/vdn.apps.cntv.cn/127.0.0.1#5333
server=/vdn.live.cntv.cn/127.0.0.1#5333
server=/vip.sports.cntv.cn/127.0.0.1#5333
server=/a.play.api.3g.youku.com/127.0.0.1#5333
server=/i.play.api.3g.youku.com/127.0.0.1#5333
server=/api.3g.youku.com/127.0.0.1#5333
server=/tv.api.3g.youku.com/127.0.0.1#5333
server=/play.api.3g.youku.com/127.0.0.1#5333
server=/play.api.3g.tudou.com/127.0.0.1#5333
server=/tv.api.3g.tudou.com/127.0.0.1#5333
server=/api.3g.tudou.com/127.0.0.1#5333
server=/api.tv.sohu.com/127.0.0.1#5333
server=/access.tv.sohu.com/127.0.0.1#5333
server=/iface.iqiyi.com/127.0.0.1#5333
server=/iface2.iqiyi.com/127.0.0.1#5333
server=/cache.m.iqiyi.com/127.0.0.1#5333
server=/dynamic.app.m.letv.com/127.0.0.1#5333
server=/dynamic.meizi.app.m.letv.com/127.0.0.1#5333
server=/dynamic.search.app.m.letv.com/127.0.0.1#5333
server=/dynamic.live.app.m.letv.com/127.0.0.1#5333
server=/listso.m.areainfo.ppstream.com/127.0.0.1#5333
server=/epg.api.pptv.com/127.0.0.1#5333
server=/play.api.pptv.com/127.0.0.1#5333
server=/m.letv.com/127.0.0.1#5333
server=/interface.bilibili.com/127.0.0.1#5333
server=/3g.music.qq.com/127.0.0.1#5333
server=/mqqplayer.3g.qq.com/127.0.0.1#5333
server=/proxy.music.qq.com/127.0.0.1#5333
server=/proxymc.qq.com/127.0.0.1#5333
server=/ip2.kugou.com/127.0.0.1#5333
server=/ip.kugou.com/127.0.0.1#5333
server=/client.api.ttpod.com/127.0.0.1#5333
server=/mobi.kuwo.cn/127.0.0.1#5333
server=/mobilefeedback.kugou.com/127.0.0.1#5333
server=/tingapi.ting.baidu.com/127.0.0.1#5333
server=/music.baidu.com/127.0.0.1#5333
server=/serviceinfo.sdk.duomi.com/127.0.0.1#5333
server=/music.163.com/127.0.0.1#5333
server=/www.xiami.com/127.0.0.1#5333
server=/spark.api.xiami.com/127.0.0.1#5333
server=/iplocation.geo.qiyi.com/127.0.0.1#5333
server=/sns.video.qq.com/127.0.0.1#5333
server=/v5.pc.duomi.com/127.0.0.1#5333
server=/tms.is.ysten.com/127.0.0.1#5333
server=/internal.check.duokanbox.com/127.0.0.1#5333
server=/openapi.youku.com/127.0.0.1#5333
server=/y.qq.com/127.0.0.1#5333
ipset=/v.youku.com/oversea
ipset=/api.youku.com/oversea
ipset=/v2.tudou.com/oversea
ipset=/www.tudou.com/oversea
ipset=/s.plcloud.music.qq.com/oversea
ipset=/i.y.qq.com/oversea
ipset=/hot.vrs.sohu.com/oversea
ipset=/live.tv.sohu.com/oversea
ipset=/pad.tv.sohu.com/oversea
ipset=/my.tv.sohu.com/oversea
ipset=/hot.vrs.letv.com/oversea
ipset=/data.video.qiyi.com/oversea
ipset=/cache.video.qiyi.com/oversea
ipset=/cache.vip.qiyi.com/oversea
ipset=/vv.video.qq.com/oversea
ipset=/tt.video.qq.com/oversea
ipset=/ice.video.qq.com/oversea
ipset=/tjsa.video.qq.com/oversea
ipset=/a10.video.qq.com/oversea
ipset=/xyy.video.qq.com/oversea
ipset=/vcq.video.qq.com/oversea
ipset=/vsh.video.qq.com/oversea
ipset=/vbj.video.qq.com/oversea
ipset=/bobo.video.qq.com/oversea
ipset=/flvs.video.qq.com/oversea
ipset=/bkvv.video.qq.com/oversea
ipset=/info.zb.qq.com/oversea
ipset=/geo.js.kankan.xunlei.com/oversea
ipset=/web-play.pptv.com/oversea
ipset=/web-play.pplive.cn/oversea
ipset=/dyn.ugc.pps.tv/oversea
ipset=/v.pps.tv/oversea
ipset=/inner.kandian.com/oversea
ipset=/ipservice.163.com/oversea
ipset=/so.open.163.com/oversea
ipset=/zb.s.qq.com/oversea
ipset=/ip.kankan.xunlei.com/oversea
ipset=/vxml.56.com/oversea
ipset=/music.sina.com.cn/oversea
ipset=/play.baidu.com/oversea
ipset=/v.iask.com/oversea
ipset=/tv.weibo.com/oversea
ipset=/wtv.v.iask.com/oversea
ipset=/video.sina.com.cn/oversea
ipset=/www.yinyuetai.com/oversea
ipset=/api.letv.com/oversea
ipset=/live.gslb.letv.com/oversea
ipset=/static.itv.letv.com/oversea
ipset=/ip.apps.cntv.cn/oversea
ipset=/vdn.apps.cntv.cn/oversea
ipset=/vdn.live.cntv.cn/oversea
ipset=/vip.sports.cntv.cn/oversea
ipset=/a.play.api.3g.youku.com/oversea
ipset=/i.play.api.3g.youku.com/oversea
ipset=/api.3g.youku.com/oversea
ipset=/tv.api.3g.youku.com/oversea
ipset=/play.api.3g.youku.com/oversea
ipset=/play.api.3g.tudou.com/oversea
ipset=/tv.api.3g.tudou.com/oversea
ipset=/api.3g.tudou.com/oversea
ipset=/api.tv.sohu.com/oversea
ipset=/access.tv.sohu.com/oversea
ipset=/iface.iqiyi.com/oversea
ipset=/iface2.iqiyi.com/oversea
ipset=/cache.m.iqiyi.com/oversea
ipset=/dynamic.app.m.letv.com/oversea
ipset=/dynamic.meizi.app.m.letv.com/oversea
ipset=/dynamic.search.app.m.letv.com/oversea
ipset=/dynamic.live.app.m.letv.com/oversea
ipset=/listso.m.areainfo.ppstream.com/oversea
ipset=/epg.api.pptv.com/oversea
ipset=/play.api.pptv.com/oversea
ipset=/m.letv.com/oversea
ipset=/interface.bilibili.com/oversea
ipset=/3g.music.qq.com/oversea
ipset=/mqqplayer.3g.qq.com/oversea
ipset=/proxy.music.qq.com/oversea
ipset=/proxymc.qq.com/oversea
ipset=/ip2.kugou.com/oversea
ipset=/ip.kugou.com/oversea
ipset=/client.api.ttpod.com/oversea
ipset=/mobi.kuwo.cn/oversea
ipset=/mobilefeedback.kugou.com/oversea
ipset=/tingapi.ting.baidu.com/oversea
ipset=/music.baidu.com/oversea
ipset=/serviceinfo.sdk.duomi.com/oversea
ipset=/music.163.com/oversea
ipset=/www.xiami.com/oversea
ipset=/spark.api.xiami.com/oversea
ipset=/iplocation.geo.qiyi.com/oversea
ipset=/sns.video.qq.com/oversea
ipset=/v5.pc.duomi.com/oversea
ipset=/tms.is.ysten.com/oversea
ipset=/internal.check.duokanbox.com/oversea
ipset=/openapi.youku.com/oversea
ipset=/y.qq.com/oversea

20
package/jsda/luci-app-clash/root/etc/config/clash Executable file → Normal file
View File

@ -1,11 +1,17 @@
config clash 'config'
option proxy_port '7892'
option redir_port '7892'
option http_port '7890'
option socks_port '7891'
option enable '0'
option dns '0'
option mode '0'
option dash_port '9191'
option dash_pass '123456'
option auto_update '0'
option auto_update_time '0'
option cn_port '9090'
option dnsserver '101.132.183.99'
option dnsserver_d '208.67.222.222'
option dnsmodel 'gfw'
option level 'info'
option proxylan '0'
option rejectlan '0'
option dnsforwader '0'
option v2ray 'https://tgbot.lbyczf.com/v2rayn2clash?url='
option surge 'https://tgbot.lbyczf.com/surge2clash?url='
option subcri 'clash'

View File

@ -1,54 +0,0 @@
91smartyun.pt
adobe.com
amazonaws.com
ampproject.org
apple.news
aws.amazon.com
azureedge.net
backpackers.com.tw
bitfinex.com
buzzfeed.com
clockwise.ee
cloudfront.net
coindesk.com
coinsquare.io
cryptocompare.com
dropboxstatic.com
eurecom.fr
gdax.com
isnssdk.com
kknews.cc
nutaq.com
openairinterface.org
skype.com
snssdk.com
sublimetext.com
textnow.com
textnow.me
trouter.io
uploaded.net
whatsapp.com
whatsapp.net
wsj.net
google.com
google.com.hk
gstatic.com
googleusercontent.com
googlepages.com
googlevideo.com
googlecode.com
googleapis.com
googlesource.com
googledrive.com
ggpht.com
youtube.com
youtu.be
ytimg.com
twitter.com
facebook.com
fastly.net
akamai.net
akamaiedge.net
akamaihd.net
edgesuite.net
edgekey.net

View File

@ -1,494 +1,331 @@
#!/bin/sh /etc/rc.common
# Copyright (c) 2011-2015 OpenWrt.org
START=99
STOP=15
CLASH="/etc/clash/clash"
CLASH_CONFIG="/etc/clash"
CRON_FILE="/etc/crontabs/root"
USE_PROCD=1
PDNSD_BIN="/var/sbin/dnscache"
pdnsd_genconfig() {
DNS_SERVER=$(uci get clash.config.dnsserver 2>/dev/null)
dnsserver_d=$(uci get clash.config.dnsserver_d 2>/dev/null)
pdnsd_port="5353"
dnscachee="5333"
[ -d /var/etc ] || mkdir -p /var/etc
if [ ! -f /var/dnscache/pdnsd.cache ]; then
mkdir -p /var/dnscache
echo -ne "pd13\000\000\000\000" > /var/dnscache/pdnsd.cache
chown -R nobody.nogroup /var/dnscache
fi
cat > /var/etc/dnscache.conf <<EOF
global {
perm_cache=1024;
cache_dir="/var/dnscache";
pid_file = /var/run/dnscache.pid;
server_ip = 0.0.0.0;
server_port=$dnscachee;
status_ctl = on;
paranoid=on;
query_method=udp_only;
neg_domain_pol = off;
par_queries = 400;
min_ttl = 1h;
max_ttl = 1w;
timeout = 10;
}
server {
label = "routine";
ip = $DNS_SERVER;
timeout = 20;
reject = 74.125.127.102,
74.125.155.102,
74.125.39.102,
74.125.39.113,
209.85.229.138,
128.121.126.139,
159.106.121.75,
169.132.13.103,
192.67.198.6,
202.106.1.2,
202.181.7.85,
203.161.230.171,
203.98.7.65,
207.12.88.98,
208.56.31.43,
209.145.54.50,
209.220.30.174,
209.36.73.33,
211.94.66.147,
213.169.251.35,
216.221.188.182,
216.234.179.13,
243.185.187.39,
37.61.54.158,
4.36.66.178,
46.82.174.68,
59.24.3.173,
64.33.88.161,
64.33.99.47,
64.66.163.251,
65.104.202.252,
65.160.219.113,
66.45.252.237,
69.55.52.253,
72.14.205.104,
72.14.205.99,
78.16.49.15,
8.7.198.45,
93.46.8.89,
37.61.54.158,
243.185.187.39,
190.93.247.4,
190.93.246.4,
190.93.245.4,
190.93.244.4,
65.49.2.178,
189.163.17.5,
23.89.5.60,
49.2.123.56,
54.76.135.1,
77.4.7.92,
118.5.49.6,
159.24.3.173,
188.5.4.96,
197.4.4.12,
220.250.64.24,
243.185.187.30,
249.129.46.48,
253.157.14.165;
reject_policy = fail;
}
server {
label = "special";
ip = $dnsserver_d;
port = $pdnsd_port;
proxy_only = on;
timeout = 20;
}
source {
owner=localhost;
// serve_aliases=on;
file="/etc/hosts";
}
rr {
name=localhost;
reverse=on;
a=127.0.0.1;
owner=localhost;
soa=localhost,root.localhost,42,86400,900,86400,86400;
}
EOF
[ -d /var/sbin ] || mkdir -p /var/sbin
[ -f /var/sbin/dnscache ] || cp -a /usr/sbin/pdnsd /var/sbin/dnscache
}
start_pdnsd() {
pdnsd_port="5353"
dnsserver_d=$(uci get clash.config.dnsserver_d 2>/dev/null)
local usr_dns="$1"
local usr_port="$2"
[ -z "$usr_dns" ] && usr_dns="8.8.8.8"
[ -z "$usr_port" ] && usr_port="53"
[ -d /var/etc ] || mkdir -p /var/etc
if [ ! -d /var/pdnsd ];then
mkdir -p /var/pdnsd
echo -ne "pd13\000\000\000\000" >/var/pdnsd/pdnsd.cache
chown -R nobody:nogroup /var/pdnsd
fi
cat > /var/etc/pdnsd.conf <<EOF
global {
perm_cache=1024;
cache_dir="/var/pdnsd";
pid_file = /var/run/pdnsd.pid;
run_as="nobody";
server_ip = 0.0.0.0;
server_port = $pdnsd_port;
status_ctl = on;
query_method = tcp_only;
min_ttl=1h;
max_ttl=1w;
timeout=20;
neg_domain_pol=on;
proc_limit=2;
procq_limit=8;
}
server {
label= "v2-usrdns";
ip = $usr_dns;
port = $usr_port;
timeout=20;
uptest=none;
interval=10m;
purge_cache=off;
}
server {
label= "v2-pdnsd";
ip = $dnsserver_d;
port = $pdnsd_port;
timeout=20;
uptest=none;
interval=10m;
purge_cache=off;
}
EOF
/usr/sbin/pdnsd -c /var/etc/pdnsd.conf -d
}
change_dns() {
dns=$(uci get clash.config.dns 2>/dev/null)
if [ $dns -eq 1 ]; then
pdnsd_port="5353"
dnscachee="5333"
clash_port="7874"
dns_serve1=$(uci get dhcp.@dnsmasq[0].server 2>/dev/null)
if [ $dns_serve1 ]; then
uci del dhcp.@dnsmasq[-1].server
fi
uci add_list dhcp.@dnsmasq[0].server=127.0.0.1#$clash_port
uci add_list dhcp.@dnsmasq[0].server=127.0.0.1#$pdnsd_port
uci add_list dhcp.@dnsmasq[0].server=127.0.0.1#$dnscachee
uci delete dhcp.@dnsmasq[0].resolvfile
uci set dhcp.@dnsmasq[0].noresolv=1
uci commit dhcp
fi
}
revert_dns() {
uci del dhcp.@dnsmasq[-1].server
#===========================================================================================================================
dns_serve1=$(uci get dhcp.@dnsmasq[0].server 2>/dev/null)
if [ $dns_serve1 ]; then
uci del dhcp.@dnsmasq[-1].server
fi
uci set dhcp.@dnsmasq[0].resolvfile=/tmp/resolv.conf.auto
uci set dhcp.@dnsmasq[0].noresolv=0
uci commit dhcp
#===========================================================================================================================
}
add_cron(){
#===========================================================================================================================
sed -i '/clash.log/d' $CRON_FILE
echo '0 0 * * 0 echo "" > /tmp/clash.log' >> $CRON_FILE
[ -n "$(grep -w "/usr/share/clash/clash.sh" $CRON_FILE)" ] && sed -i '/\/usr\/share\/clash\/clash.sh/d' $CRON_FILE
auto=$(uci get clash.config.auto_update 2>/dev/null)
if [ $auto -eq 1 ]; then
[ -z "$(grep -w "/usr/share/clash/clash.sh" $CRON_FILE)" ] && echo "0 $(uci get clash.config.auto_update_time 2>/dev/null) * * * /usr/share/clash/clash.sh" >> $CRON_FILE
[ -z "$(grep -w "/etc/init.d/clash" $CRON_FILE)" ] && echo "05 0 * * * /etc/init.d/clash restart" >> $CRON_FILE
fi
[ -z "$(grep -w "/usr/share/clash/update.sh" $CRON_FILE)" ] && echo "0 0 * * 0 /usr/share/clash/update.sh" >> $CRON_FILE
crontab $CRON_FILE
#===========================================================================================================================
}
del_cron()
{
del_cron(){
#===========================================================================================================================
sed -i '/clash/d' $CRON_FILE
sed -i '/clash.log/d' $CRON_FILE
/etc/init.d/cron restart
}
get_dnsmasq() {
local pid=$(pidof dnsmasq)
[ $? -ne 0 ] && echo "/tmp/dnsmasq.d"
local conf_dir=$(cat /etc/dnsmasq.conf | grep conf-dir= | sed 's/.*=//')
local conf_tmp=$(cat /proc/$pid/cmdline | grep dnsmasq.conf)
local conf_dir_tmp=$(cat $conf_tmp | grep conf-dir= | sed 's/.*=//')
if [ -n "$conf_dir" ]; then
echo $conf_dir
elif [ -n "$conf_dir_tmp" ];then
echo $conf_dir_tmp
else
echo "/tmp/dnsmasq.d"
fi
}
dns_poisoning() {
dns_model=$(uci get clash.config.dnsmodel 2>/dev/null)
local gfw_list=/etc/clash/dnsmasq_gfwlist.conf
local gfw_list_tmp=$dnsmasq_confdir/dnsmasq_gfwlist.conf
local custom_forward_list=/etc/clash/custom_forward.conf
local custom_forward_list_tmp=$dnsmasq_confdir/custom_forward.conf
local oversea_list=/etc/clash/oversea_list.conf
local oversea_list_tmp=$dnsmasq_confdir/oversea_list.conf
if [ "$(uci get clash.config.dns 2>/dev/null)" = "1" ] ;then
local dnsstr=$(uci get clash.config.dnsserver)
local dnsport="53"
if [ "$dns_model" == "gfw" ]; then
ipset add gfwlist $dnsstr 2>/dev/null
elif [ "$dns_model" == "oversea" ]; then
ipset add oversea $dnsstr 2>/dev/null
fi
start_pdnsd $dnsstr $dnsport
pdnsd_enable_flag=1
fi
#start_pdnsd
pdnsd_port="5353"
dnscachee="5333"
if [ "$dns_model" == "gfw" ]; then
gfw_list_port=`grep google.co.jp /etc/clash/dnsmasq_gfwlist.conf |awk -F '#' '{print $2}'`
if [ "$pdnsd_port" != "$gfw_list_port" ]; then
sed -i "s/#${gfw_list_port}/#${pdnsd_port}/g" /etc/clash/dnsmasq_gfwlist.conf
fi
[ ! -f $gfw_list_tmp ] && {
ln -s $gfw_list $gfw_list_tmp
ln -s $custom_forward_list $custom_forward_list_tmp
}
else
oversea_list_port=`grep v.youku.com /etc/clash/oversea_list.conf |awk -F '#' '{print $2}'`
if [ "$dnscachee" != "$oversea_list_port" ]; then
sed -i "s/#${oversea_list_port}/#${dnscachee}/g" /etc/clash/oversea_list.conf
fi
[ ! -f $oversea_list_tmp ] && {
ln -s $oversea_list $oversea_list_tmp
}
fi
#===========================================================================================================================
}
yml_change(){
#===========================================================================================================================
mode=$(uci get clash.config.mode 2>/dev/null)
da_password=$(uci get clash.config.dash_pass 2>/dev/null)
redir_port=$(uci get clash.config.redir_port 2>/dev/null)
http_port=$(uci get clash.config.http_port 2>/dev/null)
socks_port=$(uci get clash.config.socks_port 2>/dev/null)
dash_port=$(uci get clash.config.dash_port 2>/dev/null)
log_level=$(uci get clash.config.level 2>/dev/null)
subtype=$(uci get clash.config.subcri 2>/dev/null)
if [ $mode -eq 1 ]; then
sed -i "/Proxy:/i\#clash-openwrt" /etc/clash/config.yaml
sed -i "/#clash-openwrt/a\#=============" /etc/clash/config.yaml
sed -i "/#=============/a\ " /etc/clash/config.yaml
sed -i '1,/#clash-openwrt/d' /etc/clash/config.yaml
mv /etc/clash/config.yaml /etc/clash/dns.yaml
cat /usr/share/clash/dns.yaml /etc/clash/dns.yaml > /etc/clash/config.yaml
rm -rf /etc/clash/dns.yaml
sed -i "1i\port: ${http_port}" /etc/clash/config.yaml
sed -i "2i\socks-port: ${socks_port}" /etc/clash/config.yaml
sed -i "3i\redir-port: ${redir_port}" /etc/clash/config.yaml
sed -i "4i\allow-lan: true" /etc/clash/config.yaml
sed -i "5i\mode: Rule" /etc/clash/config.yaml
sed -i "6i\log-level: ${log_level}" /etc/clash/config.yaml
sed -i "7i\external-controller: 0.0.0.0:${dash_port}" /etc/clash/config.yaml
sed -i "8i\secret: '${da_password}'" /etc/clash/config.yaml
sed -i "9i\external-ui: "/usr/share/clash/dashboard"" /etc/clash/config.yaml
sed -i "10i\ " /etc/clash/config.yaml
sed -i "11i\ " /etc/clash/config.yaml
sed -i '/#=============/ d' /etc/clash/config.yaml
else
if [ $subtype=="v2rayn2clash" ] || [ $subtype=="surge2clash" ];then
sed -i "/Proxy:/i\#clash-openwrt" /etc/clash/config.yaml
sed -i "/#clash-openwrt/a\#=============" /etc/clash/config.yaml
sed -i "/#=============/a\ " /etc/clash/config.yaml
sed -i '1,/#clash-openwrt/d' /etc/clash/config.yaml
mv /etc/clash/config.yaml /etc/clash/dns.yaml
cat /usr/share/clash/dns.yaml /etc/clash/dns.yaml > /etc/clash/config.yaml
rm -rf /etc/clash/dns.yaml
else
sed -i "/dns:/i\#clash-openwrt" /etc/clash/config.yaml
sed -i "/#clash-openwrt/a\#=============" /etc/clash/config.yaml
sed -i '1,/#clash-openwrt/d' /etc/clash/config.yaml
fi
sed -i "1i\port: ${http_port}" /etc/clash/config.yaml
sed -i "2i\socks-port: ${socks_port}" /etc/clash/config.yaml
sed -i "3i\redir-port: ${redir_port}" /etc/clash/config.yaml
sed -i "4i\allow-lan: true" /etc/clash/config.yaml
sed -i "5i\mode: Rule" /etc/clash/config.yaml
sed -i "6i\log-level: ${log_level}" /etc/clash/config.yaml
sed -i "7i\external-controller: 0.0.0.0:${dash_port}" /etc/clash/config.yaml
sed -i "8i\secret: '${da_password}'" /etc/clash/config.yaml
sed -i "9i\external-ui: "/usr/share/clash/dashboard"" /etc/clash/config.yaml
sed -i "10i\ " /etc/clash/config.yaml
sed -i "11i\ " /etc/clash/config.yaml
sed -i '/#=============/ d' /etc/clash/config.yaml
sed -i '/redir-port:/ d' /etc/clash/config.yml 2>/dev/null
sed -i "2i\redir-port: ${proxy_port}" /etc/clash/config.yml
sed -i '/log-level:/ d' /etc/clash/config.yml 2>/dev/null
sed -i "4i\log-level: info" /etc/clash/config.yml
sed -i '/fallback:/ d' /etc/clash/config.yml 2>/dev/null
da_password=$(uci get clash.config.dashboard_password 2>/dev/null)
sed -i '/secret:/ d' /etc/clash/config.yml 2>/dev/null
sed -i "/dns:/i\secret: '${da_password}'" /etc/clash/config.yml
cn_port=$(uci get clash.config.cn_port 2>/dev/null)
sed -i '/external-controller:/ d' /etc/clash/config.yml 2>/dev/null
sed -i "/secret:/i\external-controller: 0.0.0.0:$cn_port" /etc/clash/config.yml
grep dns: /etc/clash/config.yml >/dev/null 2>&1
if [ "$?" -ne "0" ]; then
sed -i "/Proxy:/i\dns:" /etc/clash/config.yml
sed -i "/dns:/a\ enable: true" /etc/clash/config.yml
sed -i "/enable: true/a\ ipv6: false" /etc/clash/config.yml
sed -i "/ipv6: false/a\ listen: 0.0.0.0:7874" /etc/clash/config.yml
sed -i "/listen: 0.0.0.0:7874/a\ enhanced-mode: redir-host" /etc/clash/config.yml
sed -i "/enhanced-mode: redir-host/a\ nameserver:" /etc/clash/config.yml
sed -i "/nameserver:/a\ - 114.114.114.114" /etc/clash/config.yml
sed -i "/114.114.114.114/a\ - 119.29.29.29" /etc/clash/config.yml
sed -i "/119.29.29.29/a\ - 223.5.5.5" /etc/clash/config.yml
sed -i "/223.5.5.5/a\ fallback:" /etc/clash/config.yml
sed -i "/fallback:/a\ - tls://dns.rubyfish.cn:853" /etc/clash/config.yml
sed -i "/dns.rubyfish.cn:853/a\ - tls://1.1.1.1:853" /etc/clash/config.yml
sed -i "/1.1.1.1:853/a\ - tcp://208.67.222.222:443" /etc/clash/config.yml
sed -i "/208.67.222.222:443/a\ - tls://dns.google" /etc/clash/config.yml
fi
allow_lan=`grep allow-lan: /etc/clash/config.yml |awk -F ' ' '{print $2}'`
allow_lan_r=$(echo $allow_lan |tr [a-z] [A-Z])
if [ $allow_lan_r == "FALSE" ]; then
sed -i '/allow-lan:/ d' /etc/clash/config.yml
sed -i "4i\allow-lan: true" /etc/clash/config.yml
fi
fi
#===========================================================================================================================
}
yml_dns_change(){
dns=$(uci get clash.config.dns 2>/dev/null)
if [ $dns -eq 1 ]; then
dns_port=`grep listen: /etc/clash/config.yml |awk -F ':' '{print $3}' |tr -cd "[0-9]"`
if [ $dns_port -ne 7874 ]; then
sed -i '/listen:/ d' /etc/clash/config.yml
sed -i "/nameserver:/i\ listen: 0.0.0.0:7874" /etc/clash/config.yml
fi
fi
yml_dns_change(){
#===========================================================================================================================
dns_port=$(grep listen: /etc/clash/config.yaml |awk -F ':' '{print $3}' |tr -cd "[0-9]")
dnsforwader=$(uci get clash.config.dnsforwader 2>/dev/null)
if [ $dns -ne 1 ]; then
dns_port=`grep listen: /etc/clash/config.yml |awk -F ':' '{print $3}' |tr -cd "[0-9]"`
if [ $dns_port -eq 53 ]; then
sed -i '/listen:/ d' /etc/clash/config.yaml
sed -i "/nameserver:/i\ listen: 0.0.0.0:5300" /etc/clash/config.yaml
fi
if [ $dnsforwader -eq 1 ]; then
if [ $dns_port -eq 53 ]; then
sed -i '/-127.0.0.1:/ d' /etc/clash/config.yml
sed -i '/listen:/ d' /etc/clash/config.yml
sed -i "/nameserver:/i\ listen: 0.0.0.0:7874" /etc/clash/config.yml
clash_port="7874"
dns_serve1=$(uci get dhcp.@dnsmasq[0].server 2>/dev/null)
if [ $dns_serve1 ]; then
uci del dhcp.@dnsmasq[-1].server
fi
uci add_list dhcp.@dnsmasq[0].server=127.0.0.1#$clash_port
uci delete dhcp.@dnsmasq[0].resolvfile
uci set dhcp.@dnsmasq[0].noresolv=1
uci commit dhcp
uci add_list dhcp.@dnsmasq[0].server=127.0.0.1#5300 >/dev/null 2>&1
uci delete dhcp.@dnsmasq[0].resolvfile
uci set dhcp.@dnsmasq[0].noresolv=1
uci commit dhcp
else
dns_serve1=$(uci get dhcp.@dnsmasq[0].server 2>/dev/null)
if [ $dns_serve1 ]; then
uci del dhcp.@dnsmasq[-1].server
fi
uci add_list dhcp.@dnsmasq[0].server=127.0.0.1#$dns_port
uci delete dhcp.@dnsmasq[0].resolvfile
uci set dhcp.@dnsmasq[0].noresolv=1
uci commit dhcp
uci add_list dhcp.@dnsmasq[0].server=127.0.0.1#$dns_port >/dev/null 2>&1
uci delete dhcp.@dnsmasq[0].resolvfile
uci set dhcp.@dnsmasq[0].noresolv=1
uci commit dhcp
fi
fi
fi
#===========================================================================================================================
}
start_service(){
access() {
#===========================================================================================================================
lan_ac_ips=$(uci get clash.config.lan_ac_ips)
ipset -! -R <<-EOF
create clash_lan_ac hash:net
$(for ip in $lan_ac_ips; do echo "add clash_lan_ac $ip"; done)
EOF
#===========================================================================================================================
}
reject_access() {
#===========================================================================================================================
lan_ac=$(uci get clash.config.lan_ips)
ipset -! -R <<-EOF
create clash_lan hash:net
$(for ip in $lan_ac; do echo "add clash_lan $ip"; done)
EOF
#===========================================================================================================================
}
rules(){
#===========================================================================================================================
lan_ip=$(uci get network.lan.ipaddr 2>/dev/null)
lanac=$(uci get clash.config.rejectlan 2>/dev/null)
lan=$(uci get clash.config.proxylan 2>/dev/null)
dns_port=$(grep listen: /etc/clash/config.yaml |awk -F ':' '{print $3}' |tr -cd "[0-9]")
redir_port=$(uci get clash.config.redir_port 2>/dev/null)
iptables -t nat -N clash_tcp
iptables -t nat -N clash_udp
iptables -t nat -A clash_tcp -d 0.0.0.0/8 -j RETURN
iptables -t nat -A clash_tcp -d 10.0.0.0/8 -j RETURN
iptables -t nat -A clash_tcp -d 127.0.0.0/8 -j RETURN
iptables -t nat -A clash_tcp -d 169.254.0.0/16 -j RETURN
iptables -t nat -A clash_tcp -d 172.16.0.0/12 -j RETURN
iptables -t nat -A clash_tcp -d 192.168.0.0/16 -j RETURN
iptables -t nat -A clash_tcp -d 224.0.0.0/4 -j RETURN
iptables -t nat -A clash_tcp -d 240.0.0.0/4 -j RETURN
iptables -t nat -A clash_tcp -d $lan_ip -j RETURN
iptables -t nat -A clash_tcp -p tcp --dport 22 -j ACCEPT
iptables -t nat -A clash_udp -p udp -j REDIRECT --to-ports $dns_port
if [ $lanac -eq 1 ]; then
iptables -t nat -A clash_tcp -p tcp -m set --match-set clash_lan src -j RETURN
iptables -t nat -A clash_tcp -p tcp -j REDIRECT --to-ports $redir_port
elif [ $lan -eq 1 ]; then
iptables -t nat -A clash_tcp -p tcp -m set --match-set clash_lan_ac src -j REDIRECT --to-ports $redir_port
else
iptables -t nat -A clash_tcp -p tcp -j REDIRECT --to-ports $redir_port
fi
iptables -t nat -I PREROUTING 1 -p udp --dport 53 -j clash_udp
iptables -t nat -A PREROUTING -p tcp -j clash_tcp
#===========================================================================================================================
}
yml_yaml(){
#===========================================================================================================================
subscribe_url=$(uci get clash.config.subscribe_url 2>/dev/null)
size=$(ls -l /etc/clash/config.yaml|awk '{print $5}')
if [ -f /etc/clash/config.yml ] && [ ! -f /etc/clash/config.yaml ] || [ -f /etc/clash/config.yml ] && [ -f /etc/clash/config.yaml ] && [ $size -eq 0 ];then
mv /etc/clash/config.yml /etc/clash/config.yaml
elif [ ! -f /etc/clash/config.yaml ] && [ $subscribe_url ];then
sh /usr/share/clash/clash.sh >>/tmp/clash.log >/dev/null 2>&1
fi
#===========================================================================================================================
}
start(){
#===========================================================================================================================
if pidof clash >/dev/null; then
kill $(pidof clash) >/dev/null 2>&1 || kill -9 $(ps | grep clash | grep -v grep | awk '{print $1}') >/dev/null 2>&1
fi
enable=$(uci get clash.config.enable 2>/dev/null)
yml_yaml
size=$(ls -l /etc/clash/config.yaml|awk '{print $5}')
lan=$(uci get clash.config.proxylan 2>/dev/null)
lanac=$(uci get clash.config.rejectlan 2>/dev/null)
if [ $enable -eq 1 ]; then
proxy_port=$(uci get clash.config.proxy_port 2>/dev/null)
yml_dns_change
yml_change
nohup $CLASH -d "$CLASH_CONFIG" > /tmp/clash.log 2>&1 &
ln -s /usr/share/clash/web /www/clash
dns=$(uci get clash.config.dns 2>/dev/null)
bbr=$(uci get clash.config.bbr 2>/dev/null)
if [ $size -ne 0 ]; then
if [ $lan ]; then
access >/dev/null 2>&1
fi
if [ $lanac ]; then
reject_access >/dev/null 2>&1
fi
yml_change
yml_dns_change
nohup $CLASH -d "$CLASH_CONFIG" > /tmp/clash.log 2>&1 &
if [ $dns -eq 1 ]; then
pdnsd_genconfig
procd_open_instance
procd_set_param command "$PDNSD_BIN" -c /var/etc/dnscache.conf
procd_set_param respawn
procd_set_param stderr 1
procd_close_instance
dnsmasq_confdir=$(get_dnsmasq)
dns_poisoning
change_dns
fi
ln -s /usr/share/clash/web /www/clash
uci set firewall.@defaults[0].flow_offloading=1
uci commit firewall
/etc/init.d/firewall restart >/dev/null 2>&1
rules >/dev/null 2>&1
iptables -t nat -N clash
iptables -t nat -A clash -d 0.0.0.0/8 -j RETURN
iptables -t nat -A clash -d 10.0.0.0/8 -j RETURN
iptables -t nat -A clash -d 127.0.0.0/8 -j RETURN
iptables -t nat -A clash -d 169.254.0.0/16 -j RETURN
iptables -t nat -A clash -d 172.16.0.0/12 -j RETURN
iptables -t nat -A clash -d 192.168.0.0/16 -j RETURN
iptables -t nat -A clash -d 224.0.0.0/4 -j RETURN
iptables -t nat -A clash -d 240.0.0.0/4 -j RETURN
killall -1 dnsmasq
iptables -t nat -A clash -p tcp -j REDIRECT --to-ports $proxy_port
iptables -t nat -A clash -p udp -j REDIRECT --to-ports $proxy_port
iptables -t nat -A PREROUTING -p tcp -j clash
iptables -t nat -A PREROUTING -p udp -j clash
/etc/init.d/dnsmasq restart >/dev/null 2>&1
if pidof clash >/dev/null; then
add_cron
echo "CLASH STARTED SUCCESSFULLY"
else
echo "CANNOT START"
fi
nohup /usr/share/clash/clash-watchdog.sh >/dev/null 2>&1
fi
else
echo "===============================$(date "+%Y-%m-%d %H:%M:%S") problem with config.yaml, config.yaml is either empty or not found =====================================" >> /tmp/clash.log
fi
else
echo "===============================$(date "+%Y-%m-%d %H:%M:%S") CLIENT IS DISABLED =====================================" >> /tmp/clash.log
fi
#===========================================================================================================================
}
stop_service(){
stop(){
#===========================================================================================================================
iptables -t nat -F clash_tcp >/dev/null 2>&1
iptables -t nat -X clash_tcp >/dev/null 2>&1
iptables -t nat -F clash_udp >/dev/null 2>&1
iptables -t nat -X clash_udp >/dev/null 2>&1
iptables -t nat -D PREROUTING -p tcp -j clash_tcp >/dev/null 2>&1
iptables -t nat -D PREROUTING -p udp -j clash_udp >/dev/null 2>&1
srulecount=`iptables -L|grep clash|wc -l`
if [ $srulecount -gt 0 ] ;then
iptables -t nat -F clash
iptables -t nat -D PREROUTING -p tcp -j clash
iptables -t nat -X clash
fi
ipset -! flush clash_lan_ac >/dev/null 2>&1
ipset -! flush clash_lan >/dev/null 2>&1
kill -9 $(ps | grep pdnsd | grep -v grep | awk '{print $1}') >/dev/null 2>&1
kill -9 $(ps | grep clash-watchdog.sh | grep -v grep | awk '{print $1}') >/dev/null 2>&1
kill -9 `pidof clash|sed "s/$//g"` 2>/dev/null
kill -9 `pidof clash|sed "s/$//g"` 2>/dev/null
revert_dns
uci set firewall.@defaults[0].flow_offloading=1
uci commit firewall
/etc/init.d/firewall restart >/dev/null 2>&1
/etc/init.d/dnsmasq restart >/dev/null 2>&1
kill $(pidof dnscache) >/dev/null 2>&1 || kill -9 $(ps | grep dnscache | grep -v grep | awk '{print $1}') >/dev/null 2>&1
rm -rf /www/clash 2> /dev/null
revert_dns
dnsmasq_confdir=$(get_dnsmasq)
rm -rf $dnsmasq_confdir/dnsmasq_gfwlist.conf >/dev/null 2>&1
rm -rf $dnsmasq_confdir/custom_forward.conf >/dev/null 2>&1
rm -rf $dnsmasq_confdir/oversea_list.conf >/dev/null 2>&1
del_cron
/etc/init.d/dnsmasq restart >/dev/null 2>&1
rm -rf /www/clash 2> /dev/null
rm -rf /tmp/clash.log
del_cron
echo "CLASH STOP"
#===========================================================================================================================
}
restart(){
stop
sleep 3
start
#===========================================================================================================================
if pidof clash >/dev/null; then
stop
sleep 2
start
else
start
fi
#===========================================================================================================================
}

View File

@ -1,11 +0,0 @@
#!/bin/sh
uci -q batch <<-EOF >/dev/null
delete ucitrack.@clash[-1]
add ucitrack clash
set ucitrack.@clash[-1].init=clash
commit ucitrack
EOF
chmod 777 /etc/init.d/clash
rm -f /tmp/luci-indexcache
exit 0

View File

@ -0,0 +1,10 @@
#!/bin/sh
if [ -f /usr/share/clash/new_version ];then
rm -rf /usr/share/clash/new_version
fi
new_version=`wget -qO- "https://github.com/frainzy1477/luci-app-clash/tags"| grep "/frainzy1477/luci-app-clash/releases/tag/"| head -n 1| awk -F "/tag/v" '{print $2}'| sed 's/\">//'`
if [ $new_version ]; then
echo $new_version > /usr/share/clash/new_version 2>&1 & >/dev/null
elif [ $new_version =="" ]; then
echo 0 > /usr/share/clash/new_version 2>&1 & >/dev/null
fi

View File

@ -0,0 +1,35 @@
#!/bin/sh
sleeptime=300
logfile="/tmp/clash.log"
CLASH="/etc/clash/clash"
CLASH_CONFIG="/etc/clash"
enable=$(uci get clash.config.enable 2>/dev/null)
clean_log(){
logrow=$(grep -c "" ${logfile})
logrow1=$(grep -c "" ${logfile1})
if [ $logrow -ge 1000 ];then
cat /dev/null > ${logfile}
echo "$curtime Logs exceeded limitcleaning logs now.." >> ${logfile}
fi
}
while [ $enable -eq 1 ];
do
curtime=`date "+%H:%M:%S"`
if pidof clash>/dev/null; then
clean_log
fi
if ! pidof clash>/dev/null; then
nohup $CLASH -d $CLASH_CONFIG > /tmp/clash.log 2>&1 &
echo "$curtime Clash Is Restarting" >> ${logfile}
fi
sleep ${sleeptime}
continue
done

View File

@ -1,6 +1,30 @@
#!/bin/bash
subscribe_url=$(uci get clash.config.subscribe_url 2>/dev/null)
subtype=$(uci get clash.config.subcri 2>/dev/null)
urlv2ray=$(uci get clash.config.v2ray 2>/dev/null)
urlsurge=$(uci get clash.config.surge 2>/dev/null)
enable=$(uci get clash.config.enable 2>/dev/null)
if pidof clash >/dev/null; then
/etc/init.d/clash stop 2>/dev/null
fi
rm -rf /etc/clash/config.bak 2> /dev/null
wget-ssl --user-agent="User-Agent: Mozilla" $subscribe_url -O 2>&1 >1 /etc/clash/config.yml
[ "$?" -ne "0" ] && wget-ssl -O 2>&1 >1 /etc/clash/config.yml "$subscribe_url"
if [ $subtype == "clash" ];then
wget-ssl --user-agent="User-Agent: Mozilla" $subscribe_url -O 2>&1 >1 /etc/clash/config.yaml
elif [ $subtype == "v2rayn2clash" ];then
wget-ssl --user-agent="User-Agent: Mozilla" $urlv2ray.$subscribe_url -O 2>&1 >1 /etc/clash/server.yaml
if [ -f /etc/clash/server.yaml ];then
sed -i '/Rule:/,$d' /etc/clash/server.yaml
cat /etc/clash/server.yaml /usr/share/clash/rule.yaml > /etc/clash/config.yaml
fi
elif [ $subtype == "surge2clash" ];then
wget-ssl --user-agent="User-Agent: Mozilla" $urlsurge.$subscribe_url -O 2>&1 >1 /etc/clash/server.yaml
if [ -f /etc/clash/server.yaml ];then
sed -i '/Rule:/,$d' /etc/clash/server.yaml
cat /etc/clash/server.yaml /usr/share/clash/rule.yaml > /etc/clash/config.yaml
fi
fi
rm -rf /etc/clash/server.yaml 2> /dev/null
if [ $enable -eq 1 ]; then
[ "$?" -eq "0" ] && /etc/init.d/clash restart 2>/dev/null
fi

View File

@ -0,0 +1 @@
0.30.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -0,0 +1,11 @@
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>CLASH -DASHBOARD</title>
<link href="main.d32d2df9dcc55f57282d.css" rel="stylesheet"></head>
<body>
<div id="root"></div>
<script type="text/javascript" src="js/1.bundle.d32d2df9dcc55f57282d.min.js"></script><script type="text/javascript" src="js/bundle.d32d2df9dcc55f57282d.min.js"></script></body>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,24 @@
#experimental:
# ignore-resolve-fail: true
#local SOCKS5/HTTP(S) server
#authentication:
# - "user1:pass1"
# - "user2:pass2"
dns:
enable: true
# ipv6: false
listen: 0.0.0.0:5300
enhanced-mode: fake-ip
#fake-ip-range: 198.18.0.1/16
nameserver:
- 101.132.183.99
- 119.29.29.29
- 114.114.114.114
- 114.114.115.115
- tls://dns.rubyfish.cn:853
- https://1.1.1.1/dns-query
# fallback:
# - tls://1.1.1.1:853

View File

@ -1,6 +0,0 @@
#!/bin/sh
pdnsd_port="5353"
awk '!/^$/&&!/^#/{printf("ipset=/.%s/'"gfwlist"'\n",$0)}' /etc/config/clash_gfw.list > /etc/clash/custom_forward.conf
awk '!/^$/&&!/^#/{printf("server=/.%s/'"127.0.0.1#$pdnsd_port"'\n",$0)}' /etc/config/clash_gfw.list >> /etc/clash/custom_forward.conf

View File

@ -0,0 +1,8 @@
#!/bin/sh
wget-ssl --no-check-certificate --user-agent="User-Agent: Mozilla" https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.tar.gz -O /tmp/ipdb.tar.gz
if [ "$?" -eq "0" ]; then
tar zxvf /tmp/ipdb.tar.gz -C /tmp\
&& rm -rf /tmp/ipdb.tar.gz >/dev/null 2>&1\
&& mv /tmp/GeoLite2-Country_*/GeoLite2-Country.mmdb /etc/clash/Country.mmdb\
&& rm -rf /tmp/GeoLite2-Country_* >/dev/null 2>&1
fi

File diff suppressed because it is too large Load Diff

View File

@ -1,39 +0,0 @@
#!/bin/sh
wget-ssl --no-check-certificate https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt -O /tmp/gfw.b64
generate_china_banned()
{
cat $1 | base64 -d > /tmp/gfwlist.txt
rm -f $1
sed -i '/^@@|/d' /tmp/gfwlist.txt
cat /tmp/gfwlist.txt | sort -u |
sed 's#!.\+##; s#|##g; s#@##g; s#http:\/\/##; s#https:\/\/##;' |
sed '/\*/d; /apple\.com/d; /sina\.cn/d; /sina\.com\.cn/d; /baidu\.com/d; /byr\.cn/d; /jlike\.com/d; /weibo\.com/d; /zhongsou\.com/d; /youdao\.com/d; /sogou\.com/d; /so\.com/d; /soso\.com/d; /aliyun\.com/d; /taobao\.com/d; /jd\.com/d; /qq\.com/d' |
sed '/^[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+$/d' |
grep '^[0-9a-zA-Z\.-]\+$' | grep '\.' | sed 's#^\.\+##' | sort -u |
awk '
BEGIN { prev = "________"; } {
cur = $0;
if (index(cur, prev) == 1 && substr(cur, 1 + length(prev) ,1) == ".") {
} else {
print cur;
prev = cur;
}
}' | sort -u
}
generate_china_banned /tmp/gfw.b64 > /tmp/gfw.txt
rm -f /tmp/gfwlist.txt
sed '/.*/s/.*/server=\/\.&\/127.0.0.1#5335\nipset=\/\.&\/gfwlist/' /tmp/gfw.txt >/tmp/gfwnew.txt
rm -f /tmp/gfw.txt
if [ -s "/tmp/gfwnew.txt" ];then
if ( ! cmp -s /tmp/gfwnew.txt /etc/clash/dnsmasq_gfwlist.conf );then
mv /tmp/gfwnew.txt /etc/clash/dnsmasq_gfwlist.conf
rm -f /tmp/gfwnew.txt
fi
fi

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
yacd.haishan.me

View File

@ -1,19 +0,0 @@
.C8qYV83bFf{width:100%;height:100%;display:flex;justify-content:center;align-items:center}._3ZgNvq3EI4{width:40px;height:40px;margin:10px;background-color:#ddd;border-radius:100%;-webkit-animation:_1TUw6u7qIP 1s ease-in-out infinite;animation:_1TUw6u7qIP 1s ease-in-out infinite}@-webkit-keyframes _1TUw6u7qIP{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@keyframes _1TUw6u7qIP{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1);opacity:0}}
._1vi9X6zp__{position:fixed;top:0;bottom:0;left:0;right:0;overflow:hidden;padding:20px;background:var(--color-background);color:var(--color-text);text-align:center}._3a-vmAlkFb{color:#2a477a;opacity:.6;display:flex;justify-content:center;align-items:center;padding:40px}.PdRbGY12nx{color:var(--color-text-secondary)}.PdRbGY12nx:active,.PdRbGY12nx:hover{color:#387cec}
._2kIwVmZrIm{background:var(--color-bg-sidebar);position:relative}.fD4vFw6Suh{display:block}._3MSOuOjw1N{display:flex;align-items:center;justify-content:center;padding:25px 0 15px;color:#2a477a;transition:color .3s ease-in-out}@media (max-width:768px){._3MSOuOjw1N{padding:0}}._3MSOuOjw1N:hover{-webkit-animation:_1_NWwXY6R9 .3s ease-in-out 0s infinite alternate;animation:_1_NWwXY6R9 .3s ease-in-out 0s infinite alternate}._3MSOuOjw1N img{width:80px;height:80px}@-webkit-keyframes _1_NWwXY6R9{0%{color:#2a477a}to{color:#1f52ac}}@keyframes _1_NWwXY6R9{0%{color:#2a477a}to{color:#1f52ac}}@media (max-width:768px){.ARkuP2UF9U{display:flex;justify-content:space-between;overflow:scroll}}._3s-CY8UZIW{color:var(--color-text);text-decoration:none;display:flex;align-items:center;padding:8px 20px}@media (max-width:768px){._3s-CY8UZIW{flex-direction:column}}._3s-CY8UZIW svg{color:var(--color-icon)}.z0TS5nXW6e{background:var(--color-sb-active-row-bg)}@media (max-width:768px){.z0TS5nXW6e{background:none;border-bottom:2px solid #387cec}}._9C_umw6HLy{padding-left:14px}@media (max-width:768px){._9C_umw6HLy{padding-left:0;padding-top:5px}}.akNaLv2foe{position:absolute;bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);width:50px;height:50px;padding:20px 0;display:flex;justify-content:center;align-items:center}@media (max-width:768px){.akNaLv2foe{display:none}}.akNaLv2foe svg{display:block;color:var(--color-icon)}
._3KeIuWaGkq{height:76px;display:flex;align-items:center}.dzHwHz5D1B{padding:0 40px;text-align:left;margin:0}
._3uGf10f84P{color:var(--color-text);display:flex;align-items:center}._30JMM9GgkW,._1wybRgv0kl{padding-top:10px;padding-bottom:10px;width:200px}._30JMM9GgkW div:first-child,._1wybRgv0kl div:first-child{color:var(--color-text-secondary)}._30JMM9GgkW div:nth-child(2),._1wybRgv0kl div:nth-child(2){padding:10px 0 0;font-size:2em}._1wybRgv0kl{padding-right:20px}._30JMM9GgkW{padding-left:20px}
._3oXtG6fVlC{padding:10px 40px}
.wO91liFQQU{padding:0 40px 5px}.KerXKV44-V{position:relative;height:40px}._1eCIOxLbbw{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:0;width:100%}._15uzlTthxn{-webkit-appearance:none;background-color:var(--color-input-bg);background-image:none;border-radius:20px;border:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 15px 0 35px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._2YC46TUu3I{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:10px}
._2NcK3n4XfS{display:flex;align-items:center;flex-wrap:wrap;font-size:.9em;padding:10px}._1VGUXJPYcC{color:#eee;flex-shrink:0;text-align:center;width:66px;background:green;border-radius:5px;padding:3px 5px;margin:0 8px}.gCXzfg0oD0{flex-shrink:0;color:#999;font-size:14px}._2xrBv_irGt{flex-shrink:0;display:flex;font-family:Roboto Mono,Menlo,monospace;align-items:center;padding:8px 0;width:100%;white-space:pre;overflow:auto}._3DQv5_YG6N{margin:0;padding:0;color:var(--color-text)}._3DQv5_YG6N li,._3DQv5_YG6N li.even{background:var(--color-background)}._33sOhzRCb3{padding:10px 40px}._2vDkW41OaJ{display:flex;flex-direction:column;align-items:center;justify-content:center;color:#2d2d30}._2vDkW41OaJ div:nth-child(2){color:var(--color-text-secondary);font-size:1.4em;opacity:.6}.-N8zaF3LNs{opacity:.3}
input._1HMH3rGR_r[type=checkbox]{-webkit-appearance:none;-moz-appearance:none;appearance:none;outline:none;background-color:#fafafa;border:1px solid #d3d3d3;border-radius:26px;box-shadow:inset 0 0 0 1px #d3d3d3;cursor:pointer;height:28px;position:relative;transition:border .25s .15s,box-shadow .25s .3s,padding .25s;width:44px;vertical-align:top}input._1HMH3rGR_r[type=checkbox]:after{background-color:#fff;border:1px solid #d3d3d3;border-radius:24px;box-shadow:inset 0 -3px 3px rgba(0,0,0,.025),0 1px 4px rgba(0,0,0,.15),0 4px 4px rgba(0,0,0,.1);content:"";display:block;height:26px;left:0;position:absolute;right:16px;top:0;transition:border .25s .15s,left .25s .1s,right .15s .175s}input._1HMH3rGR_r[type=checkbox]:checked{border-color:#047aff;box-shadow:inset 0 0 0 13px #047aff;padding-left:18px;transition:border .25s,box-shadow .25s,padding .25s .15s}input._1HMH3rGR_r[type=checkbox]:checked:after{border-color:#047aff;left:16px;right:0;transition:border .25s,left .15s .25s,right .25s .175s}
._1hOXHPZoyT{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid #525252;color:var(--color-text);background:var(--color-toggle-bg);display:flex;position:relative}._1hOXHPZoyT input{position:absolute;left:0;opacity:0}._1hOXHPZoyT label{flex:1;z-index:2;display:flex;align-items:center;justify-content:center;padding:10px 0;cursor:pointer}._2NWH7f7uzO{z-index:1;position:absolute;display:block;left:0;height:100%;transition:left .2s ease-out;background:var(--color-toggle-selected)}
._3rwuJToU6r{-webkit-appearance:none;background-color:var(--color-input-bg);background-image:none;border-radius:4px;border:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 15px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._3rwuJToU6r:focus{border-color:var(--color-focus-blue)}input::-webkit-inner-spin-button,input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}
._3WDSAUufkz{padding:10px 40px 40px}._3WDSAUufkz>div{width:360px}._1su0iUCppI{padding:16px 0}
._1aZG3SnwLf{position:fixed;top:0;right:0;left:0;bottom:0;background:#444}._2LHk9jeQDw{outline:none;position:absolute;color:#ddd;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background:#444;padding:20px;border-radius:10px}
._2kZ6EP0GvK{position:relative;padding:10px 0}._2kZ6EP0GvK input{-webkit-appearance:none;background-color:transparent;background-image:none;border:none;border-radius:0;border-bottom:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 8px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._2kZ6EP0GvK input:focus{border-color:var(--color-focus-blue)}._2kZ6EP0GvK label{position:absolute;left:8px;bottom:22px;transition:-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out;transition:transform .15s ease-in-out,-webkit-transform .15s ease-in-out;-webkit-transform-origin:0 0;transform-origin:0 0}._2kZ6EP0GvK input:focus+label,._2kZ6EP0GvK label._3w9bv5tyrV{-webkit-transform:scale(.75) translateY(-25px);transform:scale(.75) translateY(-25px)}._2kZ6EP0GvK input:focus+label{color:var(--color-focus-blue)}
._3RK6Pn_rfX{-webkit-appearance:none;outline:none;color:var(--color-btn-fg);background:var(--color-btn-bg);border:1px solid #555;border-radius:100px;padding:6px 12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}._3RK6Pn_rfX:focus{border-color:var(--color-focus-blue)}._3RK6Pn_rfX:hover{background:#387cec;border:1px solid #387cec;color:#fff}._3RK6Pn_rfX:active{-webkit-transform:scale(.97);transform:scale(.97)}
._3tUhhoh39M:focus{outline:none}._1jIFhvdOto{display:flex;justify-content:center;align-items:center}._1jIFhvdOto ._2AZET42BFX{color:#2d2d30;opacity:.4;transition:opacity .4s}._1jIFhvdOto ._2AZET42BFX:hover{opacity:.7}._3z12O_CR-o{padding:30px 0 10px}._2bUexeGz9_{display:flex}._2bUexeGz9_ div{flex:1 1 auto}._2bUexeGz9_ div:nth-child(2){flex-grow:0;flex-basis:120px;margin-left:10px}._2QbR27nKyF{padding:30px 0 10px;display:flex;justify-content:flex-end;align-items:center}
._38eRjlSxqU{background:none;position:fixed;top:0;bottom:0;left:0;right:0;-webkit-transform:none;transform:none;padding:0;border-radius:0}._2laj9XLU4e{position:absolute;top:10%;left:50%;-webkit-transform:translate(-50%);transform:translate(-50%);max-width:376px;margin:0 auto}._2cugp_ojFQ{background:#222}
@font-face{font-family:Roboto Mono;font-style:normal;font-weight:400;src:local("Roboto Mono"),local("RobotoMono-Regular"),url(https://cdn.jsdelivr.net/npm/@hsjs/fonts@0.0.1/robotomono/v5/L0x5DF4xlVMF-BfR8bXMIjhLq3-cXbKD.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}.border-bottom,.border-left,.border-top{position:relative}.border-bottom:after,.border-top:before{position:absolute;content:"";height:1px;width:100%;-webkit-transform:scaleY(.5) translateZ(0);transform:scaleY(.5) translateZ(0);left:0;right:0;background:#555}.border-left:before{position:absolute;content:"";height:100%;width:1px;-webkit-transform:scaleX(.5) translateZ(0);transform:scaleX(.5) translateZ(0);top:0;bottom:0;background:#555}.border-top:before{top:0}.border-bottom:after{bottom:0}.border-left:before{left:0}*,:after,:before{box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,PingFang SC,Microsoft YaHei,;margin:0;padding:0;--color-focus-blue:#1a73e8}body,body.dark{--color-background:#202020;--color-text:#ddd;--color-text-secondary:#ccc;--color-bg-sidebar:#2d2d30;--color-sb-active-row-bg:#494b4e;--color-input-bg:#2d2d30;--color-input-border:#3f3f3f;--color-toggle-bg:#353535;--color-toggle-selected:#181818;--color-icon:#c7c7c7;--color-btn-bg:#232323;--color-btn-fg:#bebebe}body.light{--color-background:#fbfbfb;--color-text:#222;--color-text-secondary:#646464;--color-bg-sidebar:#e7e7e7;--color-sb-active-row-bg:#d0d0d0;--color-input-bg:#fff;--color-input-border:silver;--color-toggle-bg:#fff;--color-toggle-selected:#d7d7d7;--color-icon:#5b5b5b;--color-btn-bg:#f4f4f4;--color-btn-fg:#101010}
._1zCe_vGIjz{display:flex;background:var(--color-background);color:var(--color-text);min-height:300px;height:100vh}@media (max-width:768px){._1zCe_vGIjz{flex-direction:column}}._2hH5WcxSWh{flex-grow:1;overflow:auto}

File diff suppressed because one or more lines are too long

View File

@ -1,19 +0,0 @@
.C8qYV83bFf{width:100%;height:100%;display:flex;justify-content:center;align-items:center}._3ZgNvq3EI4{width:40px;height:40px;margin:10px;background-color:#ddd;border-radius:100%;-webkit-animation:_1TUw6u7qIP 1s ease-in-out infinite;animation:_1TUw6u7qIP 1s ease-in-out infinite}@-webkit-keyframes _1TUw6u7qIP{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@keyframes _1TUw6u7qIP{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1);opacity:0}}
._1vi9X6zp__{position:fixed;top:0;bottom:0;left:0;right:0;overflow:hidden;padding:20px;background:var(--color-background);color:var(--color-text);text-align:center}._3a-vmAlkFb{color:#2a477a;opacity:.6;display:flex;justify-content:center;align-items:center;padding:40px}.PdRbGY12nx{color:var(--color-text-secondary)}.PdRbGY12nx:active,.PdRbGY12nx:hover{color:#387cec}
._2kIwVmZrIm{background:var(--color-bg-sidebar);position:relative}.fD4vFw6Suh{display:block}._3MSOuOjw1N{display:flex;align-items:center;justify-content:center;padding:25px 0 15px;color:#2a477a;transition:color .3s ease-in-out}@media (max-width:768px){._3MSOuOjw1N{padding:0}}._3MSOuOjw1N:hover{-webkit-animation:_1_NWwXY6R9 .3s ease-in-out 0s infinite alternate;animation:_1_NWwXY6R9 .3s ease-in-out 0s infinite alternate}._3MSOuOjw1N img{width:80px;height:80px}@-webkit-keyframes _1_NWwXY6R9{0%{color:#2a477a}to{color:#1f52ac}}@keyframes _1_NWwXY6R9{0%{color:#2a477a}to{color:#1f52ac}}@media (max-width:768px){.ARkuP2UF9U{display:flex;justify-content:space-between;overflow:scroll}}._3s-CY8UZIW{color:var(--color-text);text-decoration:none;display:flex;align-items:center;padding:8px 20px}@media (max-width:768px){._3s-CY8UZIW{flex-direction:column}}._3s-CY8UZIW svg{color:var(--color-icon)}.z0TS5nXW6e{background:var(--color-sb-active-row-bg)}@media (max-width:768px){.z0TS5nXW6e{background:none;border-bottom:2px solid #387cec}}._9C_umw6HLy{padding-left:14px}@media (max-width:768px){._9C_umw6HLy{padding-left:0;padding-top:5px}}.akNaLv2foe{position:absolute;bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);width:50px;height:50px;padding:20px 0;display:flex;justify-content:center;align-items:center}@media (max-width:768px){.akNaLv2foe{display:none}}.akNaLv2foe svg{display:block;color:var(--color-icon)}
._3KeIuWaGkq{height:76px;display:flex;align-items:center}.dzHwHz5D1B{padding:0 40px;text-align:left;margin:0}
._3uGf10f84P{color:var(--color-text);display:flex;align-items:center}._30JMM9GgkW,._1wybRgv0kl{padding-top:10px;padding-bottom:10px;width:200px}._30JMM9GgkW div:first-child,._1wybRgv0kl div:first-child{color:var(--color-text-secondary)}._30JMM9GgkW div:nth-child(2),._1wybRgv0kl div:nth-child(2){padding:10px 0 0;font-size:2em}._1wybRgv0kl{padding-right:20px}._30JMM9GgkW{padding-left:20px}
._3oXtG6fVlC{padding:10px 40px}
.wO91liFQQU{padding:0 40px 5px}.KerXKV44-V{position:relative;height:40px}._1eCIOxLbbw{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:0;width:100%}._15uzlTthxn{-webkit-appearance:none;background-color:var(--color-input-bg);background-image:none;border-radius:20px;border:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 15px 0 35px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._2YC46TUu3I{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:10px}
._2NcK3n4XfS{display:flex;align-items:center;flex-wrap:wrap;font-size:.9em;padding:10px}._1VGUXJPYcC{color:#eee;flex-shrink:0;text-align:center;width:66px;background:green;border-radius:5px;padding:3px 5px;margin:0 8px}.gCXzfg0oD0{flex-shrink:0;color:#999;font-size:14px}._2xrBv_irGt{flex-shrink:0;display:flex;font-family:Roboto Mono,Menlo,monospace;align-items:center;padding:8px 0;width:100%;white-space:pre;overflow:auto}._3DQv5_YG6N{margin:0;padding:0;color:var(--color-text)}._3DQv5_YG6N li,._3DQv5_YG6N li.even{background:var(--color-background)}._33sOhzRCb3{padding:10px 40px}._2vDkW41OaJ{display:flex;flex-direction:column;align-items:center;justify-content:center;color:#2d2d30}._2vDkW41OaJ div:nth-child(2){color:var(--color-text-secondary);font-size:1.4em;opacity:.6}.-N8zaF3LNs{opacity:.3}
input._1HMH3rGR_r[type=checkbox]{-webkit-appearance:none;-moz-appearance:none;appearance:none;outline:none;background-color:#fafafa;border:1px solid #d3d3d3;border-radius:26px;box-shadow:inset 0 0 0 1px #d3d3d3;cursor:pointer;height:28px;position:relative;transition:border .25s .15s,box-shadow .25s .3s,padding .25s;width:44px;vertical-align:top}input._1HMH3rGR_r[type=checkbox]:after{background-color:#fff;border:1px solid #d3d3d3;border-radius:24px;box-shadow:inset 0 -3px 3px rgba(0,0,0,.025),0 1px 4px rgba(0,0,0,.15),0 4px 4px rgba(0,0,0,.1);content:"";display:block;height:26px;left:0;position:absolute;right:16px;top:0;transition:border .25s .15s,left .25s .1s,right .15s .175s}input._1HMH3rGR_r[type=checkbox]:checked{border-color:#047aff;box-shadow:inset 0 0 0 13px #047aff;padding-left:18px;transition:border .25s,box-shadow .25s,padding .25s .15s}input._1HMH3rGR_r[type=checkbox]:checked:after{border-color:#047aff;left:16px;right:0;transition:border .25s,left .15s .25s,right .25s .175s}
._1hOXHPZoyT{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid #525252;color:var(--color-text);background:var(--color-toggle-bg);display:flex;position:relative}._1hOXHPZoyT input{position:absolute;left:0;opacity:0}._1hOXHPZoyT label{flex:1;z-index:2;display:flex;align-items:center;justify-content:center;padding:10px 0;cursor:pointer}._2NWH7f7uzO{z-index:1;position:absolute;display:block;left:0;height:100%;transition:left .2s ease-out;background:var(--color-toggle-selected)}
._3rwuJToU6r{-webkit-appearance:none;background-color:var(--color-input-bg);background-image:none;border-radius:4px;border:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 15px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._3rwuJToU6r:focus{border-color:var(--color-focus-blue)}input::-webkit-inner-spin-button,input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}
._3WDSAUufkz{padding:10px 40px 40px}._3WDSAUufkz>div{width:360px}._1su0iUCppI{padding:16px 0}
._1aZG3SnwLf{position:fixed;top:0;right:0;left:0;bottom:0;background:#444}._2LHk9jeQDw{outline:none;position:absolute;color:#ddd;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background:#444;padding:20px;border-radius:10px}
._2kZ6EP0GvK{position:relative;padding:10px 0}._2kZ6EP0GvK input{-webkit-appearance:none;background-color:transparent;background-image:none;border:none;border-radius:0;border-bottom:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 8px;transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._2kZ6EP0GvK input:focus{border-color:var(--color-focus-blue)}._2kZ6EP0GvK label{position:absolute;left:8px;bottom:22px;transition:-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out;transition:transform .15s ease-in-out,-webkit-transform .15s ease-in-out;-webkit-transform-origin:0 0;transform-origin:0 0}._2kZ6EP0GvK input:focus+label,._2kZ6EP0GvK label._3w9bv5tyrV{-webkit-transform:scale(.75) translateY(-25px);transform:scale(.75) translateY(-25px)}._2kZ6EP0GvK input:focus+label{color:var(--color-focus-blue)}
._3RK6Pn_rfX{-webkit-appearance:none;outline:none;color:var(--color-btn-fg);background:var(--color-btn-bg);border:1px solid #555;border-radius:100px;padding:6px 12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}._3RK6Pn_rfX:focus{border-color:var(--color-focus-blue)}._3RK6Pn_rfX:hover{background:#387cec;border:1px solid #387cec;color:#fff}._3RK6Pn_rfX:active{-webkit-transform:scale(.97);transform:scale(.97)}
._3tUhhoh39M:focus{outline:none}._1jIFhvdOto{display:flex;justify-content:center;align-items:center}._1jIFhvdOto ._2AZET42BFX{color:#2d2d30;opacity:.4;transition:opacity .4s}._1jIFhvdOto ._2AZET42BFX:hover{opacity:.7}._3z12O_CR-o{padding:30px 0 10px}._2bUexeGz9_{display:flex}._2bUexeGz9_ div{flex:1 1 auto}._2bUexeGz9_ div:nth-child(2){flex-grow:0;flex-basis:120px;margin-left:10px}._2QbR27nKyF{padding:30px 0 10px;display:flex;justify-content:flex-end;align-items:center}
._38eRjlSxqU{background:none;position:fixed;top:0;bottom:0;left:0;right:0;-webkit-transform:none;transform:none;padding:0;border-radius:0}._2laj9XLU4e{position:absolute;top:10%;left:50%;-webkit-transform:translate(-50%);transform:translate(-50%);max-width:376px;margin:0 auto}._2cugp_ojFQ{background:#222}
@font-face{font-family:Roboto Mono;font-style:normal;font-weight:400;src:local("Roboto Mono"),local("RobotoMono-Regular"),url(https://cdn.jsdelivr.net/npm/@hsjs/fonts@0.0.1/robotomono/v5/L0x5DF4xlVMF-BfR8bXMIjhLq3-cXbKD.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}.border-bottom,.border-left,.border-top{position:relative}.border-bottom:after,.border-top:before{position:absolute;content:"";height:1px;width:100%;-webkit-transform:scaleY(.5) translateZ(0);transform:scaleY(.5) translateZ(0);left:0;right:0;background:#555}.border-left:before{position:absolute;content:"";height:100%;width:1px;-webkit-transform:scaleX(.5) translateZ(0);transform:scaleX(.5) translateZ(0);top:0;bottom:0;background:#555}.border-top:before{top:0}.border-bottom:after{bottom:0}.border-left:before{left:0}*,:after,:before{box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,PingFang SC,Microsoft YaHei,;margin:0;padding:0;--color-focus-blue:#1a73e8}body,body.dark{--color-background:#202020;--color-text:#ddd;--color-text-secondary:#ccc;--color-bg-sidebar:#2d2d30;--color-sb-active-row-bg:#494b4e;--color-input-bg:#2d2d30;--color-input-border:#3f3f3f;--color-toggle-bg:#353535;--color-toggle-selected:#181818;--color-icon:#c7c7c7;--color-btn-bg:#232323;--color-btn-fg:#bebebe}body.light{--color-background:#fbfbfb;--color-text:#222;--color-text-secondary:#646464;--color-bg-sidebar:#e7e7e7;--color-sb-active-row-bg:#d0d0d0;--color-input-bg:#fff;--color-input-border:silver;--color-toggle-bg:#fff;--color-toggle-selected:#d7d7d7;--color-icon:#5b5b5b;--color-btn-bg:#f4f4f4;--color-btn-fg:#101010}
._1zCe_vGIjz{display:flex;background:var(--color-background);color:var(--color-text);min-height:300px;height:100vh}@media (max-width:768px){._1zCe_vGIjz{flex-direction:column}}._2hH5WcxSWh{flex-grow:1;overflow:auto}

View File

@ -0,0 +1,21 @@
/*! modern-normalize | MIT License | https://github.com/sindresorhus/modern-normalize */html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}:root{-moz-tab-size:4;tab-size:4}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}hr{height:0}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{padding:0}progress{vertical-align:initial}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}
._1EnK5MMInH{width:100%;height:100%;display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center}._39z9L5I2ao{--color1:#ddd;--size:40px;width:var(--size);height:var(--size);margin:10px;background-color:var(--color1);border-radius:100%;-webkit-animation:_1DSWK2a-pe 1s ease-in-out infinite;animation:_1DSWK2a-pe 1s ease-in-out infinite}@-webkit-keyframes _1DSWK2a-pe{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@keyframes _1DSWK2a-pe{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1);opacity:0}}
._1rJPiLWN4s{position:fixed;top:0;bottom:0;left:0;right:0;overflow:hidden;padding:20px;background:var(--color-background);color:var(--color-text);text-align:center}._3h_IywJG1l{color:#2a477a;opacity:.6;display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;padding:40px}.aXXDDfyTjE,._3h_IywJG1l{-webkit-box-align:center;align-items:center}.aXXDDfyTjE{display:-webkit-inline-box;display:inline-flex;color:var(--color-text-secondary)}.aXXDDfyTjE:active,.aXXDDfyTjE:hover{color:#387cec}.aXXDDfyTjE svg{margin-right:5px}
._30oJwXNik9{background:var(--color-bg-sidebar);position:relative}._1SsCcpJvxN{display:block}._2r8EkOI78X{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;padding:25px 0 15px;color:#2a477a;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out}@media (max-width:768px){._2r8EkOI78X{display:none}}._2r8EkOI78X:hover{-webkit-animation:_2KRqAfqV8c .3s ease-in-out 0s infinite alternate;animation:_2KRqAfqV8c .3s ease-in-out 0s infinite alternate}._2r8EkOI78X img{width:80px;height:80px}@-webkit-keyframes _2KRqAfqV8c{0%{color:#2a477a}to{color:#1f52ac}}@keyframes _2KRqAfqV8c{0%{color:#2a477a}to{color:#1f52ac}}@media (max-width:768px){._2vUQ0Hs_C5{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between;overflow:scroll}}._8mEn9Wlw1n{color:var(--color-text);text-decoration:none;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;padding:8px 20px}@media (max-width:768px){._8mEn9Wlw1n{-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}}._8mEn9Wlw1n svg{color:var(--color-icon)}._1WyHmd6t6y{background:var(--color-sb-active-row-bg)}@media (max-width:768px){._1WyHmd6t6y{background:none;border-bottom:2px solid #387cec}}._2eMIYGbP9O{padding-left:14px}@media (max-width:768px){._2eMIYGbP9O{padding-left:0;padding-top:5px}}.nURY8qkFLS{--sz:50px;position:absolute;bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);width:var(--sz);height:var(--sz);padding:20px 0;display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center}@media (max-width:768px){.nURY8qkFLS{display:none}}.nURY8qkFLS svg{display:block;color:var(--color-icon)}
.SNYKRrv_2I{height:76px;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center}.VG1cD2OYvg{padding:0 40px;text-align:left;margin:0}
._37kQcxVR4T{color:var(--color-text);display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center}._1U3kUwas7v,.-Hr5Z5iYfF{padding-top:10px;padding-bottom:10px;width:200px}._1U3kUwas7v div:first-child,.-Hr5Z5iYfF div:first-child{color:var(--color-text-secondary)}._1U3kUwas7v div:nth-child(2),.-Hr5Z5iYfF div:nth-child(2){padding:10px 0 0;font-size:2em}.-Hr5Z5iYfF{padding-right:20px}._1U3kUwas7v{padding-left:20px}
._2rN7aLQPCl{padding:10px 40px}
._1u5AP7XMF9{padding:0 40px 5px}._2zeyKJDdFH{position:relative;height:40px}._3DQ7SXxKRA{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:0;width:100%}._1f-XUgRxH1{-webkit-appearance:none;background-color:var(--color-input-bg);background-image:none;border-radius:20px;border:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 15px 0 35px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._3PLtWxZwrd{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:10px}
._2tpN_G7FeO{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;flex-wrap:wrap;font-size:.9em;padding:10px}._3wuPHKqO5W{color:#eee;flex-shrink:0;text-align:center;width:66px;background:green;border-radius:5px;padding:3px 5px;margin:0 8px}.IwiVCclCSC{flex-shrink:0;color:#999;font-size:14px}._3I1beKAMFt{flex-shrink:0;display:-webkit-box;display:flex;font-family:Roboto Mono,Menlo,monospace;-webkit-box-align:center;align-items:center;padding:8px 0;width:100%;white-space:pre;overflow:auto}._2MDNI6JESq{margin:0;padding:0;color:var(--color-text)}._2MDNI6JESq li,._2MDNI6JESq li.even{background:var(--color-background)}._3KX1sKJ1QD{padding:10px 40px}._19_8g6kTIV{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;color:#2d2d30}._19_8g6kTIV div:nth-child(2){color:var(--color-text-secondary);font-size:1.4em;opacity:.6}._3ljFcrWmBC{opacity:.3}
input.nJQwngxVo8[type=checkbox]{--white:#fff;--grey:#d3d3d3;--color-theme:#047aff;-webkit-appearance:none;-moz-appearance:none;appearance:none;outline:none;background-color:darken(var(--white),2%);border:1px solid var(--grey);border-radius:26px;box-shadow:inset 0 0 0 1px var(--grey);cursor:pointer;height:28px;position:relative;-webkit-transition:border .25s .15s,box-shadow .25s .3s,padding .25s;transition:border .25s .15s,box-shadow .25s .3s,padding .25s;width:44px;vertical-align:top}input.nJQwngxVo8[type=checkbox]:after{background-color:var(--white);border:1px solid var(--grey);border-radius:24px;box-shadow:inset 0 -3px 3px rgba(0,0,0,.025),0 1px 4px rgba(0,0,0,.15),0 4px 4px rgba(0,0,0,.1);content:"";display:block;height:26px;left:0;position:absolute;right:16px;top:0;-webkit-transition:border .25s .15s,left .25s .1s,right .15s .175s;transition:border .25s .15s,left .25s .1s,right .15s .175s}input.nJQwngxVo8[type=checkbox]:checked{border-color:var(--color-theme);box-shadow:inset 0 0 0 13px var(--color-theme);padding-left:18px;-webkit-transition:border .25s,box-shadow .25s,padding .25s .15s;transition:border .25s,box-shadow .25s,padding .25s .15s}input.nJQwngxVo8[type=checkbox]:checked:after{border-color:var(--color-theme);left:16px;right:0;-webkit-transition:border .25s,left .15s .25s,right .25s .175s;transition:border .25s,left .15s .25s,right .25s .175s}
._3evbv-Ui87{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid #525252;color:var(--color-text);background:var(--color-toggle-bg);display:-webkit-box;display:flex;position:relative}._3evbv-Ui87 input{position:absolute;left:0;opacity:0}._3evbv-Ui87 label{-webkit-box-flex:1;flex:1;z-index:2;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;-webkit-box-pack:center;justify-content:center;padding:10px 0;cursor:pointer}._1ok8KIb1RH{z-index:1;position:absolute;display:block;left:0;height:100%;-webkit-transition:left .2s ease-out;transition:left .2s ease-out;background:var(--color-toggle-selected)}
._2S85tjFa1n{-webkit-appearance:none;background-color:var(--color-input-bg);background-image:none;border-radius:4px;border:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 15px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._2S85tjFa1n:focus{border-color:var(--color-focus-blue)}input::-webkit-inner-spin-button,input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}
._2A0HoxnDqc{-webkit-appearance:none;outline:none;color:var(--color-btn-fg);background:var(--color-btn-bg);border:1px solid #555;border-radius:100px;padding:6px 12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}._2A0HoxnDqc:focus{border-color:var(--color-focus-blue)}._2A0HoxnDqc:hover{background:#387cec;border:1px solid #387cec;color:#fff}._2A0HoxnDqc:active{-webkit-transform:scale(.97);transform:scale(.97)}
._2id19fefQX{display:-webkit-box;display:flex;flex-wrap:wrap}._2QQQyNTKoG{-webkit-box-flex:0;flex-grow:0;margin-right:10px;margin-bottom:10px;cursor:pointer;border:2px solid transparent}.XJkW0wZSAx{border-color:#387cec}
._2OZZRrEL0J{padding:10px 40px 40px}._2OZZRrEL0J>div{width:360px}.lF_ZoyIdZN{padding:10px 40px 40px}.VduFBb2hWX{padding:0 40px}.VduFBb2hWX>div{border-top:1px dashed #373737}._2NQoBOQcGA{padding:16px 0}
.ctrHyq7uir{position:fixed;top:0;right:0;left:0;bottom:0;background:#444;z-index:1024}._17mHpKiOUD{outline:none;position:absolute;color:#ddd;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);background:#444;padding:20px;border-radius:10px}
._1r-KsYFNaj{position:relative;padding:10px 0}._1r-KsYFNaj input{-webkit-appearance:none;background-color:initial;background-image:none;border:none;border-radius:0;border-bottom:1px solid var(--color-input-border);box-sizing:border-box;color:#c1c1c1;display:inline-block;font-size:inherit;height:40px;outline:none;padding:0 8px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1);width:100%}._1r-KsYFNaj input:focus{border-color:var(--color-focus-blue)}._1r-KsYFNaj label{position:absolute;left:8px;bottom:22px;-webkit-transition:-webkit-transform .15s ease-in-out;transition:-webkit-transform .15s ease-in-out;transition:transform .15s ease-in-out;transition:transform .15s ease-in-out,-webkit-transform .15s ease-in-out;-webkit-transform-origin:0 0;transform-origin:0 0}._1r-KsYFNaj input:focus+label,._1r-KsYFNaj label.Hn6h5kxOg7{-webkit-transform:scale(.75) translateY(-25px);transform:scale(.75) translateY(-25px)}._1r-KsYFNaj input:focus+label{color:var(--color-focus-blue)}
._3hz7LVhvUv:focus{outline:none}._3HF-KB9mgO{display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center}._3HF-KB9mgO ._3HzgPICn91{color:#2d2d30;opacity:.4;-webkit-transition:opacity .4s;transition:opacity .4s}._3HF-KB9mgO ._3HzgPICn91:hover{opacity:.7}._1wpZuvoD5I{padding:30px 0 10px}.L7jTy-EFJ2{display:-webkit-box;display:flex}.L7jTy-EFJ2 div{-webkit-box-flex:1;flex:1 1 auto}.L7jTy-EFJ2 div:nth-child(2){-webkit-box-flex:0;flex-grow:0;flex-basis:120px;margin-left:10px}._2fehqRU9GV{padding:30px 0 10px;display:-webkit-box;display:flex;-webkit-box-pack:end;justify-content:flex-end;-webkit-box-align:center;align-items:center}
._3D3ZNp4oBz{background:none;position:fixed;top:0;bottom:0;left:0;right:0;-webkit-transform:none;transform:none;padding:0;border-radius:0}.tgH3yv-xGR{position:absolute;top:10%;left:50%;-webkit-transform:translate(-50%);transform:translate(-50%);max-width:376px;margin:0 auto}._3MMuzHtwZL{background:#222}
@font-face{font-family:Roboto Mono;font-style:normal;font-weight:400;src:local("Roboto Mono"),local("RobotoMono-Regular"),url(https://cdn.jsdelivr.net/npm/@hsjs/fonts@0.0.1/robotomono/v5/L0x5DF4xlVMF-BfR8bXMIjhLq3-cXbKD.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}.border-bottom,.border-left,.border-top{position:relative}.border-top:before{top:0}.border-bottom:after,.border-top:before{position:absolute;content:"";height:1px;width:100%;-webkit-transform:scaleY(.5) translateZ(0);transform:scaleY(.5) translateZ(0);left:0;right:0;background:#555}.border-bottom:after{bottom:0}.border-left:before{position:absolute;content:"";height:100%;width:1px;-webkit-transform:scaleX(.5) translateZ(0);transform:scaleX(.5) translateZ(0);top:0;bottom:0;background:#555;left:0}*,:after,:before{box-sizing:border-box}:root{--font-mono:"Roboto Mono",Menlo,monospace;--color-focus-blue:#1a73e8}body{font-family:Merriweather Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,PingFang SC,Microsoft YaHei,;margin:0;padding:0}body,body.dark{--color-background:#202020;--color-text:#ddd;--color-text-secondary:#ccc;--color-bg-sidebar:#2d2d30;--color-sb-active-row-bg:#494b4e;--color-input-bg:#2d2d30;--color-input-border:#3f3f3f;--color-toggle-bg:#353535;--color-toggle-selected:#181818;--color-icon:#c7c7c7;--color-btn-bg:#232323;--color-btn-fg:#bebebe;--color-bg-proxy-selected:#303030}body.light{--color-background:#fbfbfb;--color-text:#222;--color-text-secondary:#646464;--color-bg-sidebar:#e7e7e7;--color-sb-active-row-bg:#d0d0d0;--color-input-bg:#fff;--color-input-border:silver;--color-toggle-bg:#fff;--color-toggle-selected:#d7d7d7;--color-icon:#5b5b5b;--color-btn-bg:#f4f4f4;--color-btn-fg:#101010;--color-bg-proxy-selected:#cfcfcf}
._35EMVy62Je{display:-webkit-box;display:flex;background:var(--color-background);color:var(--color-text);min-height:300px;height:100vh}@media (max-width:768px){._35EMVy62Je{-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}}.AwL8oIubvP{-webkit-box-flex:1;flex-grow:1;overflow:auto}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{RnhZ:function(s,j,a){var e={"./af":"K/tc","./af.js":"K/tc","./ar":"jnO4","./ar-dz":"o1bE","./ar-dz.js":"o1bE","./ar-kw":"Qj4J","./ar-kw.js":"Qj4J","./ar-ly":"HP3h","./ar-ly.js":"HP3h","./ar-ma":"CoRJ","./ar-ma.js":"CoRJ","./ar-sa":"gjCT","./ar-sa.js":"gjCT","./ar-tn":"bYM6","./ar-tn.js":"bYM6","./ar.js":"jnO4","./az":"SFxW","./az.js":"SFxW","./be":"H8ED","./be.js":"H8ED","./bg":"hKrs","./bg.js":"hKrs","./bm":"p/rL","./bm.js":"p/rL","./bn":"kEOa","./bn.js":"kEOa","./bo":"0mo+","./bo.js":"0mo+","./br":"aIdf","./br.js":"aIdf","./bs":"JVSJ","./bs.js":"JVSJ","./ca":"1xZ4","./ca.js":"1xZ4","./cs":"PA2r","./cs.js":"PA2r","./cv":"A+xa","./cv.js":"A+xa","./cy":"l5ep","./cy.js":"l5ep","./da":"DxQv","./da.js":"DxQv","./de":"tGlX","./de-at":"s+uk","./de-at.js":"s+uk","./de-ch":"u3GI","./de-ch.js":"u3GI","./de.js":"tGlX","./dv":"WYrj","./dv.js":"WYrj","./el":"jUeY","./el.js":"jUeY","./en-SG":"zavE","./en-SG.js":"zavE","./en-au":"Dmvi","./en-au.js":"Dmvi","./en-ca":"OIYi","./en-ca.js":"OIYi","./en-gb":"Oaa7","./en-gb.js":"Oaa7","./en-ie":"4dOw","./en-ie.js":"4dOw","./en-il":"czMo","./en-il.js":"czMo","./en-nz":"b1Dy","./en-nz.js":"b1Dy","./eo":"Zduo","./eo.js":"Zduo","./es":"iYuL","./es-do":"CjzT","./es-do.js":"CjzT","./es-us":"Vclq","./es-us.js":"Vclq","./es.js":"iYuL","./et":"7BjC","./et.js":"7BjC","./eu":"D/JM","./eu.js":"D/JM","./fa":"jfSC","./fa.js":"jfSC","./fi":"gekB","./fi.js":"gekB","./fo":"ByF4","./fo.js":"ByF4","./fr":"nyYc","./fr-ca":"2fjn","./fr-ca.js":"2fjn","./fr-ch":"Dkky","./fr-ch.js":"Dkky","./fr.js":"nyYc","./fy":"cRix","./fy.js":"cRix","./ga":"USCx","./ga.js":"USCx","./gd":"9rRi","./gd.js":"9rRi","./gl":"iEDd","./gl.js":"iEDd","./gom-latn":"DKr+","./gom-latn.js":"DKr+","./gu":"4MV3","./gu.js":"4MV3","./he":"x6pH","./he.js":"x6pH","./hi":"3E1r","./hi.js":"3E1r","./hr":"S6ln","./hr.js":"S6ln","./hu":"WxRl","./hu.js":"WxRl","./hy-am":"1rYy","./hy-am.js":"1rYy","./id":"UDhR","./id.js":"UDhR","./is":"BVg3","./is.js":"BVg3","./it":"bpih","./it-ch":"bxKX","./it-ch.js":"bxKX","./it.js":"bpih","./ja":"B55N","./ja.js":"B55N","./jv":"tUCv","./jv.js":"tUCv","./ka":"IBtZ","./ka.js":"IBtZ","./kk":"bXm7","./kk.js":"bXm7","./km":"6B0Y","./km.js":"6B0Y","./kn":"PpIw","./kn.js":"PpIw","./ko":"Ivi+","./ko.js":"Ivi+","./ku":"JCF/","./ku.js":"JCF/","./ky":"lgnt","./ky.js":"lgnt","./lb":"RAwQ","./lb.js":"RAwQ","./lo":"sp3z","./lo.js":"sp3z","./lt":"JvlW","./lt.js":"JvlW","./lv":"uXwI","./lv.js":"uXwI","./me":"KTz0","./me.js":"KTz0","./mi":"aIsn","./mi.js":"aIsn","./mk":"aQkU","./mk.js":"aQkU","./ml":"AvvY","./ml.js":"AvvY","./mn":"lYtQ","./mn.js":"lYtQ","./mr":"Ob0Z","./mr.js":"Ob0Z","./ms":"6+QB","./ms-my":"ZAMP","./ms-my.js":"ZAMP","./ms.js":"6+QB","./mt":"G0Uy","./mt.js":"G0Uy","./my":"honF","./my.js":"honF","./nb":"bOMt","./nb.js":"bOMt","./ne":"OjkT","./ne.js":"OjkT","./nl":"+s0g","./nl-be":"2ykv","./nl-be.js":"2ykv","./nl.js":"+s0g","./nn":"uEye","./nn.js":"uEye","./pa-in":"8/+R","./pa-in.js":"8/+R","./pl":"jVdC","./pl.js":"jVdC","./pt":"8mBD","./pt-br":"0tRk","./pt-br.js":"0tRk","./pt.js":"8mBD","./ro":"lyxo","./ro.js":"lyxo","./ru":"lXzo","./ru.js":"lXzo","./sd":"Z4QM","./sd.js":"Z4QM","./se":"//9w","./se.js":"//9w","./si":"7aV9","./si.js":"7aV9","./sk":"e+ae","./sk.js":"e+ae","./sl":"gVVK","./sl.js":"gVVK","./sq":"yPMs","./sq.js":"yPMs","./sr":"zx6S","./sr-cyrl":"E+lV","./sr-cyrl.js":"E+lV","./sr.js":"zx6S","./ss":"Ur1D","./ss.js":"Ur1D","./sv":"X709","./sv.js":"X709","./sw":"dNwA","./sw.js":"dNwA","./ta":"PeUW","./ta.js":"PeUW","./te":"XLvN","./te.js":"XLvN","./tet":"V2x9","./tet.js":"V2x9","./tg":"Oxv6","./tg.js":"Oxv6","./th":"EOgW","./th.js":"EOgW","./tl-ph":"Dzi0","./tl-ph.js":"Dzi0","./tlh":"z3Vd","./tlh.js":"z3Vd","./tr":"DoHr","./tr.js":"DoHr","./tzl":"z1FC","./tzl.js":"z1FC","./tzm":"wQk9","./tzm-latn":"tT3J","./tzm-latn.js":"tT3J","./tzm.js":"wQk9","./ug-cn":"YRex","./ug-cn.js":"YRex","./uk":"raLr","./uk.js":"raLr","./ur":"UpQW","./ur.js":"UpQW","./uz":"Loxo","./uz-latn":"AQ68","./uz-latn.js":"AQ68","./uz.js":"Loxo","./vi":"KSF8","./vi.js":"KSF8","./x-pseudo":"/X5v","./x-pseudo.js":"/X5v","./yo":"fzPg","./yo.js":"fzPg","./zh-cn":"XDpg","./zh-cn.js":"XDpg","./zh-hk":"SatO","./zh-hk.js":"SatO","./zh-tw":"kOpN","./zh-tw.js":"kOpN"};function n(s){var j=r(s);return a(j)}function r(s){if(!a.o(e,s)){var j=new Error("Cannot find module '"+s+"'");throw j.code="MODULE_NOT_FOUND",j}return e[s]}n.keys=function(){return Object.keys(e)},n.resolve=r,s.exports=n,n.id="RnhZ"}}]);

File diff suppressed because one or more lines are too long

View File

@ -7,34 +7,29 @@
<link rel="icon" type="image/png" sizes="128x128" href="yacd-128.png">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name=viewport content="width=device-width, initial-scale=1">
<meta name="application-name" content="yacd">
<meta name="description" content="Yet Another Clash Dashboard">
<meta name="theme-color" content="#202020">
<title>Clash Dashboard</title>
<meta name="application-name" content="YACD">
<meta name="description" content="YACD">
<meta name="theme-color" content="#fff000">
<title>YAC - DASHBOARD</title>
<link rel="prefetch" href="https://cdn.jsdelivr.net/npm/@hsjs/fonts@0.0.1/robotomono/v5/L0x5DF4xlVMF-BfR8bXMIjhLq3-cXbKD.woff2">
<meta property="og:image" content="https://user-images.githubusercontent.com/1166872/47304841-536f3d80-d65a-11e8-8908-1917127dafc5.png">
<meta property="og:site_name" content="yacd">
<meta property="og:type" content="object">
<meta property="og:title" content="yacd">
<meta property="og:description" content="Yet Another Clash Dashboard">
<link rel="prefetch" href="https://fonts.loli.net/css?family=Merriweather+Sans:400,700&display=swap" rel="stylesheet">
<link href="vendors~app.cda11fd699c21032bf33.css" rel="stylesheet">
<link href="app.0cf7eee065d397bd5720.css" rel="stylesheet">
<link href="app.5a1265735d78e67da9fe.css" rel="stylesheet">
<body>
<div id="app"></div>
<script src="runtime~app.13adcd71fa0e99de437e.js" type="text/javascript"></script>
<script src="runtime~app.dc7b6d94c7fe054b4bce.js" type="text/javascript"></script>
<script src="react~app.74ee4d30468cbf4a5d2c.js" type="text/javascript"></script>
<script src="core-js~app.b0e192aa2040bbc66d02.js" type="text/javascript"></script>
<script src="vendors~app.1bf29b22ff4581af4265.js" type="text/javascript"></script>
<script src="react~app.6097406f382313d294e3.js" type="text/javascript"></script>
<script src="app.7d03376b2a8f5f8f7dd3.js" type="text/javascript"></script>
<script src="app.6cc7f04cc66718dd2c90.js" type="text/javascript"></script>
</body>

File diff suppressed because one or more lines are too long

View File

@ -1,4 +0,0 @@
._1T7fQAsbpR{border-radius:20px;margin:10px 0;padding:3px 0;color:#eee}
._2vOEjYlEyC{position:relative;height:90px}._3mJtqp4Lr3{position:absolute;bottom:0;left:20%;display:flex;align-items:center;justify-content:center}._3dXrm7UHsc{position:absolute;top:0;left:0;width:100%;height:100%}._2j1gEiL0Iq{width:100%;padding-right:20px;overflow:hidden;text-overflow:ellipsis;margin:10px 0;font-size:1.1em}
._1dDKqDiB1I>h2{margin-top:0}._1dDKqDiB1I>h2 span:nth-child(2){font-size:12px;color:#777;font-weight:400;margin:0 .3em}._3aqhlBsrD_{display:flex;flex-wrap:wrap}._2r-ecUmPW9{width:300px;padding:10px 5px;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}._2r-ecUmPW9._1tU2opfYtb{cursor:pointer}._2r-ecUmPW9._1tU2opfYtb:hover{-webkit-transform:scale(1.1);transform:scale(1.1)}
._10FuALZoAk{padding:10px 40px}.tZaEoW-_A6{position:fixed;right:20px;bottom:20px}

View File

@ -0,0 +1,4 @@
._2V-RqIAl7n{border-radius:20px;padding:3px 0;color:#eee}
.NpfXwxWAxo{position:relative;padding:10px;border-radius:10px;background-color:var(--color-bg-proxy-selected)}.NpfXwxWAxo._2zD7drviYH{background-color:var(--color-focus-blue);color:#ddd}._1rVl-Kdmss{font-family:var(--font-mono)}._3kdi5nima5{width:100%;overflow:hidden;text-overflow:ellipsis;margin-bottom:5px;font-size:1.1em}._12JM32OJa5{height:30px;display:-webkit-box;display:flex;-webkit-box-align:end;align-items:flex-end}
._3PCSxT0l14>h2{margin-top:0}._3PCSxT0l14>h2 span:nth-child(2){font-size:12px;color:#777;font-weight:400;margin:0 .3em}._1yYRIyvlRd{display:-webkit-box;display:flex;flex-wrap:wrap}._1OcDlvlM5R{max-width:280px;min-width:150px;margin:10px;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}._1OcDlvlM5R._3oAxPKtZFv{cursor:pointer}._1OcDlvlM5R._3oAxPKtZFv:hover{-webkit-transform:translateY(-2px);transform:translateY(-2px)}
.pWc1mov26e{padding-bottom:50px}._1myfcMimT9{padding:10px 40px}._1khaX45NQe{position:fixed;z-index:1;right:20px;bottom:20px}

View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{D46e:function(e,a,t){e.exports={header:"_3PCSxT0l14",list:"_1yYRIyvlRd",proxy:"_1OcDlvlM5R",proxySelectable:"_3oAxPKtZFv"}},FWZb:function(e,a,t){e.exports={proxy:"NpfXwxWAxo",now:"_2zD7drviYH",proxyType:"_1rVl-Kdmss",proxyName:"_3kdi5nima5",proxyLatencyWrap:"_12JM32OJa5"}},L5YO:function(e,a,t){e.exports={body:"pWc1mov26e",group:"_1myfcMimT9",fabgrp:"_1khaX45NQe"}},RbL9:function(e,a,t){e.exports={proxyLatency:"_2V-RqIAl7n"}},wyCT:function(e,a,t){"use strict";t.r(a);var n=t("o0o1"),r=t.n(n),c=t("HaE+"),o=t("q1tI"),l=t.n(o),s=t("u4Dv"),p=t("DKqX"),m=t("rePB"),i=t("17x9"),u=t.n(i),y=t("TSYQ"),b=t.n(y),x=t("RbL9"),d=t.n(x),f={good:"#67C23A",normal:"#E6A23C",bad:"#F56C6C",na:"#909399"};function v(e){var a=e.latency,t=a.number,n=a.error,r=Object(o.useMemo)(function(){return function(e,a){return""!==a?f.na:e<200?f.good:e<400?f.normal:f.bad}(t,n)},[t,n]);return l.a.createElement("span",{className:d.a.proxyLatency,style:{color:r}},""!==n?l.a.createElement("span",null,n):l.a.createElement("span",null,t," ms"))}v.propTypes={latency:u.a.shape({number:u.a.number,error:u.a.string})};var E=t("FWZb"),O=t.n(E),w=t("EQlU"),N=function(e){return{proxies:Object(w.d)(e),delay:Object(w.c)(e)}};function j(e){var a=e.now,t=e.name,n=Object(s.c)(N),r=n.proxies,c=n.delay[t],o=r[t];return l.a.createElement("div",{className:b()(O.a.proxy,Object(m.a)({},O.a.now,a))},l.a.createElement("div",{className:O.a.proxyName},t),l.a.createElement("div",{className:O.a.proxyType,style:{opacity:a?.6:.2}},o.type),l.a.createElement("div",{className:O.a.proxyLatencyWrap},c?l.a.createElement(v,{latency:c}):null))}j.propTypes={now:u.a.bool,name:u.a.string};var g=j,h=t("D46e"),_=t.n(h),T=function(e){return{proxies:Object(w.d)(e)}};function k(e){var a=e.name,t=Object(s.c)(T).proxies,n=Object(s.b)({switchProxy:w.g}),r=t[a],c=r.all;return l.a.createElement("div",{className:_.a.group},l.a.createElement("div",{className:_.a.header},l.a.createElement("h2",null,l.a.createElement("span",null,a),l.a.createElement("span",null,r.type))),l.a.createElement("div",{className:_.a.list},c.map(function(e){var t="Selector"===r.type,c=b()(_.a.proxy,Object(m.a)({},_.a.proxySelectable,t));return l.a.createElement("div",{className:c,key:e,onClick:function(){t&&n.switchProxy(a,e)}},l.a.createElement(g,{isSelectable:t,name:e,now:e===r.now}))})))}k.propTypes={name:u.a.string};var L=t("5Wrh"),C=t("L5YO"),D=t.n(C);t.d(a,"default",function(){return W});var P=function(e){return{proxies:Object(w.d)(e),groupNames:Object(w.e)(e)}},A={fetchProxies:w.b,requestDelayAll:w.f};function W(){var e=Object(s.b)(A),a=e.fetchProxies,t=e.requestDelayAll;Object(o.useEffect)(function(){Object(c.a)(r.a.mark(function e(){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,a();case 2:case"end":return e.stop()}},e)}))()},[a,t]);var n=Object(s.c)(P).groupNames;return l.a.createElement(l.a.Fragment,null,l.a.createElement(p.a,{title:"Proxies"}),l.a.createElement("div",{className:D.a.body},l.a.createElement("div",{className:D.a.fabgrp},l.a.createElement(L.a,{label:"Test Latency",onClick:t})),n.map(function(e){return l.a.createElement("div",{className:D.a.group,key:e},l.a.createElement(k,{name:e}))})))}}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
._3eSLieOhVX{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;padding:10px 40px}._2n1pW09UvV{width:40px;padding-right:15px;color:var(--color-text-secondary);opacity:.4}.t1XJIwvW7A{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;font-size:12px;opacity:.8}._1fNf8kj0HA{padding:10px 0;font-family:Roboto Mono,Menlo,monospace;font-size:19px}._3yJmN0tON0{width:110px}
._2Tux7NhweE{position:fixed;right:20px;bottom:20px}

View File

@ -1,2 +0,0 @@
.UMp7OzQg3G{display:flex;align-items:center;padding:10px 40px}._1Eb-khMrK9{width:40px;padding-right:15px;color:var(--color-text-secondary);opacity:.4}._3gMUZClReX{display:flex;align-items:center;font-size:12px;opacity:.8}._1rY_DqaLoo{padding:10px 0;font-family:Roboto Mono,Menlo,monospace;font-size:19px}.xiFCTEaRmD{width:110px}
._1NnlpS7hAZ{position:fixed;right:20px;bottom:20px}

View File

@ -1 +0,0 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{BVyM:function(e,t,a){"use strict";a.r(t);var n=a("ODXe"),r=a("q1tI"),c=a.n(r),l=a("u4Dv"),i=a("5Wrh"),u=a("iR1w"),s=a("DKqX"),o=a("17x9"),m=a.n(o),f=a("fSNl"),d=a.n(f),p={_default:"#59caf9",DIRECT:"#f5bc41",REJECT:"#cb3166"};function b(e){var t=e.type,a=e.payload,n=e.proxy,r=e.id,l=function(e){var t=e.proxy,a=p._default;return p[t]&&(a=p[t]),{color:a}}({proxy:n});return c.a.createElement("div",{className:d.a.rule},c.a.createElement("div",{className:d.a.left},r),c.a.createElement("div",null,c.a.createElement("div",{className:d.a.b},a),c.a.createElement("div",{className:d.a.a},c.a.createElement("div",{className:d.a.type},t),c.a.createElement("div",{className:d.a.proxy,style:l},n))))}b.propTypes={id:m.a.number,type:m.a.string,payload:m.a.string,proxy:m.a.string};var v=b,E=a("II4a"),y=a("Tvb5"),h={updateSearchText:y.f},O=Object(E.a)({mapStateToProps:function(e){return{searchText:Object(y.e)(e)}},actions:h}),x=a("Kv4h"),R=a("Jo2d"),g=a.n(R);a.d(t,"default",function(){return _});var N=30,j=function(e){return{rules:Object(y.d)(e)}},w={fetchRules:y.b,fetchRulesOnce:y.c};function T(e,t){return t[e].id}var D=Object(r.memo)(function(e){var t=e.index,a=e.style,n=e.data[t];return c.a.createElement("div",{style:a},c.a.createElement(v,n))},u.b);function _(){var e=Object(l.b)(w),t=e.fetchRulesOnce,a=e.fetchRules,o=Object(l.c)(j).rules;Object(r.useEffect)(function(){t()},[]);var m=Object(x.a)(),f=Object(n.a)(m,2),d=f[0],p=f[1];return c.a.createElement("div",null,c.a.createElement(s.a,{title:"Rules"}),c.a.createElement(O,null),c.a.createElement("div",{ref:d,style:{paddingBottom:N}},c.a.createElement(u.a,{height:p-N,width:"100%",itemCount:o.length,itemSize:80,itemData:o,itemKey:T},D)),c.a.createElement("div",{className:g.a.fabgrp},c.a.createElement(i.a,{label:"Refresh",onClick:a})))}},Jo2d:function(e,t,a){e.exports={fabgrp:"_1NnlpS7hAZ"}},fSNl:function(e,t,a){e.exports={rule:"UMp7OzQg3G",left:"_1Eb-khMrK9",a:"_3gMUZClReX",b:"_1rY_DqaLoo",type:"xiFCTEaRmD"}}}]);

View File

@ -0,0 +1 @@
(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{BVyM:function(e,t,a){"use strict";a.r(t);var n=a("ODXe"),r=a("q1tI"),c=a.n(r),l=a("u4Dv"),i=a("5Wrh"),u=a("iR1w"),s=a("DKqX"),o=a("17x9"),m=a.n(o),f=a("xrux"),d=a.n(f),p={_default:"#59caf9",DIRECT:"#f5bc41",REJECT:"#cb3166"};function v(e){var t=e.type,a=e.payload,n=e.proxy,r=e.id,l=function(e){var t=e.proxy,a=p._default;return p[t]&&(a=p[t]),{color:a}}({proxy:n});return c.a.createElement("div",{className:d.a.rule},c.a.createElement("div",{className:d.a.left},r),c.a.createElement("div",null,c.a.createElement("div",{className:d.a.b},a),c.a.createElement("div",{className:d.a.a},c.a.createElement("div",{className:d.a.type},t),c.a.createElement("div",{style:l},n))))}v.propTypes={id:m.a.number,type:m.a.string,payload:m.a.string,proxy:m.a.string};var b=v,E=a("II4a"),h=a("Tvb5"),y={updateSearchText:h.f},x=Object(E.a)({mapStateToProps:function(e){return{searchText:Object(h.e)(e)}},actions:y}),O=a("Kv4h"),j=a("mlDh"),w=a.n(j);a.d(t,"default",function(){return _});var N=30,R=function(e){return{rules:Object(h.d)(e)}},g={fetchRules:h.b,fetchRulesOnce:h.c};function T(e,t){return t[e].id}var D=Object(r.memo)(function(e){var t=e.index,a=e.style,n=e.data[t];return c.a.createElement("div",{style:a},c.a.createElement(b,n))},u.b);function _(){var e=Object(l.b)(g),t=e.fetchRulesOnce,a=e.fetchRules,o=Object(l.c)(R).rules;Object(r.useEffect)(function(){t()},[t]);var m=Object(O.a)(),f=Object(n.a)(m,2),d=f[0],p=f[1];return c.a.createElement("div",null,c.a.createElement(s.a,{title:"Rules"}),c.a.createElement(x,null),c.a.createElement("div",{ref:d,style:{paddingBottom:N}},c.a.createElement(u.a,{height:p-N,width:"100%",itemCount:o.length,itemSize:80,itemData:o,itemKey:T},D)),c.a.createElement("div",{className:w.a.fabgrp},c.a.createElement(i.a,{label:"Refresh",onClick:a})))}},mlDh:function(e,t,a){e.exports={fabgrp:"_2Tux7NhweE"}},xrux:function(e,t,a){e.exports={rule:"_3eSLieOhVX",left:"_2n1pW09UvV",a:"t1XJIwvW7A",b:"_1fNf8kj0HA",type:"_3yJmN0tON0"}}}]);

View File

@ -1 +0,0 @@
!function(e){function t(t){for(var n,o,i=t[0],c=t[1],f=t[2],l=0,d=[];l<i.length;l++)o=i[l],a[o]&&d.push(a[o][0]),a[o]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(s&&s(t);d.length;)d.shift()();return u.push.apply(u,f||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,o=1;o<r.length;o++){var c=r[o];0!==a[c]&&(n=!1)}n&&(u.splice(t--,1),e=i(i.s=r[0]))}return e}var n={},o={5:0},a={5:0},u=[];function i(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,i),r.l=!0,r.exports}i.e=function(e){var t=[];o[e]?t.push(o[e]):0!==o[e]&&{2:1,4:1}[e]&&t.push(o[e]=new Promise(function(t,r){for(var n=({1:"chartjs",2:"proxies",4:"rules",7:"vendors~chartjs"}[e]||e)+"."+{1:"b2d521827b9653fbe51e",2:"5faba7c2002d69028d3b",4:"44a05b7877aa80c5200a",7:"e70a9b7c776e0b5915eb",8:"61b9d343bffeeca67c24"}[e]+".css",a=i.p+n,u=document.getElementsByTagName("link"),c=0;c<u.length;c++){var f=(s=u[c]).getAttribute("data-href")||s.getAttribute("href");if("stylesheet"===s.rel&&(f===n||f===a))return t()}var l=document.getElementsByTagName("style");for(c=0;c<l.length;c++){var s;if((f=(s=l[c]).getAttribute("data-href"))===n||f===a)return t()}var d=document.createElement("link");d.rel="stylesheet",d.type="text/css",d.onload=t,d.onerror=function(t){var n=t&&t.target&&t.target.src||a,u=new Error("Loading CSS chunk "+e+" failed.\n("+n+")");u.request=n,delete o[e],d.parentNode.removeChild(d),r(u)},d.href=a,document.getElementsByTagName("head")[0].appendChild(d)}).then(function(){o[e]=0}));var r=a[e];if(0!==r)if(r)t.push(r[2]);else{var n=new Promise(function(t,n){r=a[e]=[t,n]});t.push(r[2]=n);var u,c=document.createElement("script");c.charset="utf-8",c.timeout=120,i.nc&&c.setAttribute("nonce",i.nc),c.src=function(e){return i.p+""+({1:"chartjs",2:"proxies",4:"rules",7:"vendors~chartjs"}[e]||e)+"."+{1:"d91d6d554779ee39cfc5",2:"17dba4530a8b6bb3aeba",4:"4bbd50e7e2e1a499c1b6",7:"d6fcbfe2bea99b4952bf",8:"f532a0e4e50d9fed13e8"}[e]+".js"}(e),u=function(t){c.onerror=c.onload=null,clearTimeout(f);var r=a[e];if(0!==r){if(r){var n=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src,u=new Error("Loading chunk "+e+" failed.\n("+n+": "+o+")");u.type=n,u.request=o,r[1](u)}a[e]=void 0}};var f=setTimeout(function(){u({type:"timeout",target:c})},12e4);c.onerror=c.onload=u,document.head.appendChild(c)}return Promise.all(t)},i.m=e,i.c=n,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(r,n,function(t){return e[t]}.bind(null,n));return r},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i.oe=function(e){throw console.error(e),e};var c=window.webpackJsonp=window.webpackJsonp||[],f=c.push.bind(c);c.push=t,c=c.slice();for(var l=0;l<c.length;l++)t(c[l]);var s=f;r()}([]);

View File

@ -0,0 +1 @@
!function(e){function t(t){for(var n,o,c=t[0],l=t[1],f=t[2],s=t[3]||[],d=0,h=[];d<c.length;d++)o=c[d],a[o]&&h.push(a[o][0]),a[o]=0;for(n in l)Object.prototype.hasOwnProperty.call(l,n)&&(e[n]=l[n]);for(p&&p(t),i.push.apply(i,s);h.length;)h.shift()();return u.push.apply(u,f||[]),r()}function r(){for(var e,t=0;t<u.length;t++){for(var r=u[t],n=!0,o=1;o<r.length;o++){var f=r[o];0!==a[f]&&(n=!1)}n&&(u.splice(t--,1),e=l(l.s=r[0]))}return 0===u.length&&(i.forEach(function(e){if(void 0===a[e]){a[e]=null;var t=document.createElement("link");l.nc&&t.setAttribute("nonce",l.nc),t.rel="prefetch",t.as="script",t.href=c(e),document.head.appendChild(t)}}),i.length=0),e}var n={},o={5:0},a={5:0},u=[],i=[];function c(e){return l.p+""+({2:"proxies",4:"rules",6:"vendors~chartjs"}[e]||e)+"."+{2:"993826afdebb153e0805",4:"6f76e629fb04fefe588a",6:"429cb8fa2f4d9b575993",7:"a322784ecacd704a28c6"}[e]+".js"}function l(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,l),r.l=!0,r.exports}l.e=function(e){var t=[];o[e]?t.push(o[e]):0!==o[e]&&{2:1,4:1}[e]&&t.push(o[e]=new Promise(function(t,r){for(var n=({2:"proxies",4:"rules",6:"vendors~chartjs"}[e]||e)+"."+{2:"9022775a13e050c1509f",4:"1fba3c440f97fe0e3bb1",6:"7d5d6ed1822d5d0495fb",7:"80c51b1d7a5a45aaeac0"}[e]+".css",a=l.p+n,u=document.getElementsByTagName("link"),i=0;i<u.length;i++){var c=(s=u[i]).getAttribute("data-href")||s.getAttribute("href");if("stylesheet"===s.rel&&(c===n||c===a))return t()}var f=document.getElementsByTagName("style");for(i=0;i<f.length;i++){var s;if((c=(s=f[i]).getAttribute("data-href"))===n||c===a)return t()}var d=document.createElement("link");d.rel="stylesheet",d.type="text/css",d.onload=t,d.onerror=function(t){var n=t&&t.target&&t.target.src||a,u=new Error("Loading CSS chunk "+e+" failed.\n("+n+")");u.code="CSS_CHUNK_LOAD_FAILED",u.request=n,delete o[e],d.parentNode.removeChild(d),r(u)},d.href=a,document.getElementsByTagName("head")[0].appendChild(d)}).then(function(){o[e]=0}));var r=a[e];if(0!==r)if(r)t.push(r[2]);else{var n=new Promise(function(t,n){r=a[e]=[t,n]});t.push(r[2]=n);var u,i=document.createElement("script");i.charset="utf-8",i.timeout=120,l.nc&&i.setAttribute("nonce",l.nc),i.src=c(e);var f=new Error;u=function(t){i.onerror=i.onload=null,clearTimeout(s);var r=a[e];if(0!==r){if(r){var n=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;f.message="Loading chunk "+e+" failed.\n("+n+": "+o+")",f.name="ChunkLoadError",f.type=n,f.request=o,r[1](f)}a[e]=void 0}};var s=setTimeout(function(){u({type:"timeout",target:i})},12e4);i.onerror=i.onload=u,document.head.appendChild(i)}return Promise.all(t)},l.m=e,l.c=n,l.d=function(e,t,r){l.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,t){if(1&t&&(e=l(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(l.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)l.d(r,n,function(t){return e[t]}.bind(null,n));return r},l.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(t,"a",t),t},l.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},l.p="",l.oe=function(e){throw console.error(e),e};var f=window.webpackJsonp=window.webpackJsonp||[],s=f.push.bind(f);f.push=t,f=f.slice();for(var d=0;d<f.length;d++)t(f[d]);var p=s;r()}([]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
/*! modern-normalize | MIT License | https://github.com/sindresorhus/modern-normalize */html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}:root{-moz-tab-size:4;-o-tab-size:4;tab-size:4}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}hr{height:0}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{padding:0}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}

View File

@ -1 +0,0 @@
/*! modern-normalize | MIT License | https://github.com/sindresorhus/modern-normalize */html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}:root{-moz-tab-size:4;-o-tab-size:4;tab-size:4}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}hr{height:0}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{padding:0}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}

File diff suppressed because one or more lines are too long

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@ -0,0 +1,12 @@
INSTALL = install
PREFIX = /usr/bin
po2lmo: src/po2lmo.o src/template_lmo.o
$(CC) $(LDFLAGS) -o src/po2lmo src/po2lmo.o src/template_lmo.o
install:
$(INSTALL) -m 755 src/po2lmo $(PREFIX)
clean:
$(RM) src/po2lmo src/*.o

Binary file not shown.

View File

@ -0,0 +1,247 @@
/*
* lmo - Lua Machine Objects - PO to LMO conversion tool
*
* Copyright (C) 2009-2012 Jo-Philipp Wich <xm@subsignal.org>
*
* Licensed 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.
*/
#include "template_lmo.h"
static void die(const char *msg)
{
fprintf(stderr, "Error: %s\n", msg);
exit(1);
}
static void usage(const char *name)
{
fprintf(stderr, "Usage: %s input.po output.lmo\n", name);
exit(1);
}
static void print(const void *ptr, size_t size, size_t nmemb, FILE *stream)
{
if( fwrite(ptr, size, nmemb, stream) == 0 )
die("Failed to write stdout");
}
static int extract_string(const char *src, char *dest, int len)
{
int pos = 0;
int esc = 0;
int off = -1;
for( pos = 0; (pos < strlen(src)) && (pos < len); pos++ )
{
if( (off == -1) && (src[pos] == '"') )
{
off = pos + 1;
}
else if( off >= 0 )
{
if( esc == 1 )
{
switch (src[pos])
{
case '"':
case '\\':
off++;
break;
}
dest[pos-off] = src[pos];
esc = 0;
}
else if( src[pos] == '\\' )
{
dest[pos-off] = src[pos];
esc = 1;
}
else if( src[pos] != '"' )
{
dest[pos-off] = src[pos];
}
else
{
dest[pos-off] = '\0';
break;
}
}
}
return (off > -1) ? strlen(dest) : -1;
}
static int cmp_index(const void *a, const void *b)
{
uint32_t x = ((const lmo_entry_t *)a)->key_id;
uint32_t y = ((const lmo_entry_t *)b)->key_id;
if (x < y)
return -1;
else if (x > y)
return 1;
return 0;
}
static void print_uint32(uint32_t x, FILE *out)
{
uint32_t y = htonl(x);
print(&y, sizeof(uint32_t), 1, out);
}
static void print_index(void *array, int n, FILE *out)
{
lmo_entry_t *e;
qsort(array, n, sizeof(*e), cmp_index);
for (e = array; n > 0; n--, e++)
{
print_uint32(e->key_id, out);
print_uint32(e->val_id, out);
print_uint32(e->offset, out);
print_uint32(e->length, out);
}
}
int main(int argc, char *argv[])
{
char line[4096];
char key[4096];
char val[4096];
char tmp[4096];
int state = 0;
int offset = 0;
int length = 0;
int n_entries = 0;
void *array = NULL;
lmo_entry_t *entry = NULL;
uint32_t key_id, val_id;
FILE *in;
FILE *out;
if( (argc != 3) || ((in = fopen(argv[1], "r")) == NULL) || ((out = fopen(argv[2], "w")) == NULL) )
usage(argv[0]);
memset(line, 0, sizeof(key));
memset(key, 0, sizeof(val));
memset(val, 0, sizeof(val));
while( (NULL != fgets(line, sizeof(line), in)) || (state >= 2 && feof(in)) )
{
if( state == 0 && strstr(line, "msgid \"") == line )
{
switch(extract_string(line, key, sizeof(key)))
{
case -1:
die("Syntax error in msgid");
case 0:
state = 1;
break;
default:
state = 2;
}
}
else if( state == 1 || state == 2 )
{
if( strstr(line, "msgstr \"") == line || state == 2 )
{
switch(extract_string(line, val, sizeof(val)))
{
case -1:
state = 4;
break;
default:
state = 3;
}
}
else
{
switch(extract_string(line, tmp, sizeof(tmp)))
{
case -1:
state = 2;
break;
default:
strcat(key, tmp);
}
}
}
else if( state == 3 )
{
switch(extract_string(line, tmp, sizeof(tmp)))
{
case -1:
state = 4;
break;
default:
strcat(val, tmp);
}
}
if( state == 4 )
{
if( strlen(key) > 0 && strlen(val) > 0 )
{
key_id = sfh_hash(key, strlen(key));
val_id = sfh_hash(val, strlen(val));
if( key_id != val_id )
{
n_entries++;
array = realloc(array, n_entries * sizeof(lmo_entry_t));
entry = (lmo_entry_t *)array + n_entries - 1;
if (!array)
die("Out of memory");
entry->key_id = key_id;
entry->val_id = val_id;
entry->offset = offset;
entry->length = strlen(val);
length = strlen(val) + ((4 - (strlen(val) % 4)) % 4);
print(val, length, 1, out);
offset += length;
}
}
state = 0;
memset(key, 0, sizeof(key));
memset(val, 0, sizeof(val));
}
memset(line, 0, sizeof(line));
}
print_index(array, n_entries, out);
if( offset > 0 )
{
print_uint32(offset, out);
fsync(fileno(out));
fclose(out);
}
else
{
fclose(out);
unlink(argv[2]);
}
fclose(in);
return(0);
}

View File

@ -0,0 +1,328 @@
/*
* lmo - Lua Machine Objects - Base functions
*
* Copyright (C) 2009-2010 Jo-Philipp Wich <xm@subsignal.org>
*
* Licensed 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.
*/
#include "template_lmo.h"
/*
* Hash function from http://www.azillionmonkeys.com/qed/hash.html
* Copyright (C) 2004-2008 by Paul Hsieh
*/
uint32_t sfh_hash(const char *data, int len)
{
uint32_t hash = len, tmp;
int rem;
if (len <= 0 || data == NULL) return 0;
rem = len & 3;
len >>= 2;
/* Main loop */
for (;len > 0; len--) {
hash += sfh_get16(data);
tmp = (sfh_get16(data+2) << 11) ^ hash;
hash = (hash << 16) ^ tmp;
data += 2*sizeof(uint16_t);
hash += hash >> 11;
}
/* Handle end cases */
switch (rem) {
case 3: hash += sfh_get16(data);
hash ^= hash << 16;
hash ^= data[sizeof(uint16_t)] << 18;
hash += hash >> 11;
break;
case 2: hash += sfh_get16(data);
hash ^= hash << 11;
hash += hash >> 17;
break;
case 1: hash += *data;
hash ^= hash << 10;
hash += hash >> 1;
}
/* Force "avalanching" of final 127 bits */
hash ^= hash << 3;
hash += hash >> 5;
hash ^= hash << 4;
hash += hash >> 17;
hash ^= hash << 25;
hash += hash >> 6;
return hash;
}
uint32_t lmo_canon_hash(const char *str, int len)
{
char res[4096];
char *ptr, prev;
int off;
if (!str || len >= sizeof(res))
return 0;
for (prev = ' ', ptr = res, off = 0; off < len; prev = *str, off++, str++)
{
if (isspace(*str))
{
if (!isspace(prev))
*ptr++ = ' ';
}
else
{
*ptr++ = *str;
}
}
if ((ptr > res) && isspace(*(ptr-1)))
ptr--;
return sfh_hash(res, ptr - res);
}
lmo_archive_t * lmo_open(const char *file)
{
int in = -1;
uint32_t idx_offset = 0;
struct stat s;
lmo_archive_t *ar = NULL;
if (stat(file, &s) == -1)
goto err;
if ((in = open(file, O_RDONLY)) == -1)
goto err;
if ((ar = (lmo_archive_t *)malloc(sizeof(*ar))) != NULL)
{
memset(ar, 0, sizeof(*ar));
ar->fd = in;
ar->size = s.st_size;
fcntl(ar->fd, F_SETFD, fcntl(ar->fd, F_GETFD) | FD_CLOEXEC);
if ((ar->mmap = mmap(NULL, ar->size, PROT_READ, MAP_SHARED, ar->fd, 0)) == MAP_FAILED)
goto err;
idx_offset = ntohl(*((const uint32_t *)
(ar->mmap + ar->size - sizeof(uint32_t))));
if (idx_offset >= ar->size)
goto err;
ar->index = (lmo_entry_t *)(ar->mmap + idx_offset);
ar->length = (ar->size - idx_offset - sizeof(uint32_t)) / sizeof(lmo_entry_t);
ar->end = ar->mmap + ar->size;
return ar;
}
err:
if (in > -1)
close(in);
if (ar != NULL)
{
if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED))
munmap(ar->mmap, ar->size);
free(ar);
}
return NULL;
}
void lmo_close(lmo_archive_t *ar)
{
if (ar != NULL)
{
if ((ar->mmap != NULL) && (ar->mmap != MAP_FAILED))
munmap(ar->mmap, ar->size);
close(ar->fd);
free(ar);
ar = NULL;
}
}
lmo_catalog_t *_lmo_catalogs = NULL;
lmo_catalog_t *_lmo_active_catalog = NULL;
int lmo_load_catalog(const char *lang, const char *dir)
{
DIR *dh = NULL;
char pattern[16];
char path[PATH_MAX];
struct dirent *de = NULL;
lmo_archive_t *ar = NULL;
lmo_catalog_t *cat = NULL;
if (!lmo_change_catalog(lang))
return 0;
if (!dir || !(dh = opendir(dir)))
goto err;
if (!(cat = malloc(sizeof(*cat))))
goto err;
memset(cat, 0, sizeof(*cat));
snprintf(cat->lang, sizeof(cat->lang), "%s", lang);
snprintf(pattern, sizeof(pattern), "*.%s.lmo", lang);
while ((de = readdir(dh)) != NULL)
{
if (!fnmatch(pattern, de->d_name, 0))
{
snprintf(path, sizeof(path), "%s/%s", dir, de->d_name);
ar = lmo_open(path);
if (ar)
{
ar->next = cat->archives;
cat->archives = ar;
}
}
}
closedir(dh);
cat->next = _lmo_catalogs;
_lmo_catalogs = cat;
if (!_lmo_active_catalog)
_lmo_active_catalog = cat;
return 0;
err:
if (dh) closedir(dh);
if (cat) free(cat);
return -1;
}
int lmo_change_catalog(const char *lang)
{
lmo_catalog_t *cat;
for (cat = _lmo_catalogs; cat; cat = cat->next)
{
if (!strncmp(cat->lang, lang, sizeof(cat->lang)))
{
_lmo_active_catalog = cat;
return 0;
}
}
return -1;
}
static lmo_entry_t * lmo_find_entry(lmo_archive_t *ar, uint32_t hash)
{
unsigned int m, l, r;
uint32_t k;
l = 0;
r = ar->length - 1;
while (1)
{
m = l + ((r - l) / 2);
if (r < l)
break;
k = ntohl(ar->index[m].key_id);
if (k == hash)
return &ar->index[m];
if (k > hash)
{
if (!m)
break;
r = m - 1;
}
else
{
l = m + 1;
}
}
return NULL;
}
int lmo_translate(const char *key, int keylen, char **out, int *outlen)
{
uint32_t hash;
lmo_entry_t *e;
lmo_archive_t *ar;
if (!key || !_lmo_active_catalog)
return -2;
hash = lmo_canon_hash(key, keylen);
for (ar = _lmo_active_catalog->archives; ar; ar = ar->next)
{
if ((e = lmo_find_entry(ar, hash)) != NULL)
{
*out = ar->mmap + ntohl(e->offset);
*outlen = ntohl(e->length);
return 0;
}
}
return -1;
}
void lmo_close_catalog(const char *lang)
{
lmo_archive_t *ar, *next;
lmo_catalog_t *cat, *prev;
for (prev = NULL, cat = _lmo_catalogs; cat; prev = cat, cat = cat->next)
{
if (!strncmp(cat->lang, lang, sizeof(cat->lang)))
{
if (prev)
prev->next = cat->next;
else
_lmo_catalogs = cat->next;
for (ar = cat->archives; ar; ar = next)
{
next = ar->next;
lmo_close(ar);
}
free(cat);
break;
}
}
}

View File

@ -0,0 +1,92 @@
/*
* lmo - Lua Machine Objects - General header
*
* Copyright (C) 2009-2012 Jo-Philipp Wich <xm@subsignal.org>
*
* Licensed 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.
*/
#ifndef _TEMPLATE_LMO_H_
#define _TEMPLATE_LMO_H_
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
#include <fnmatch.h>
#include <dirent.h>
#include <ctype.h>
#include <limits.h>
#if (defined(__GNUC__) && defined(__i386__))
#define sfh_get16(d) (*((const uint16_t *) (d)))
#else
#define sfh_get16(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
+(uint32_t)(((const uint8_t *)(d))[0]) )
#endif
struct lmo_entry {
uint32_t key_id;
uint32_t val_id;
uint32_t offset;
uint32_t length;
} __attribute__((packed));
typedef struct lmo_entry lmo_entry_t;
struct lmo_archive {
int fd;
int length;
uint32_t size;
lmo_entry_t *index;
char *mmap;
char *end;
struct lmo_archive *next;
};
typedef struct lmo_archive lmo_archive_t;
struct lmo_catalog {
char lang[6];
struct lmo_archive *archives;
struct lmo_catalog *next;
};
typedef struct lmo_catalog lmo_catalog_t;
uint32_t sfh_hash(const char *data, int len);
uint32_t lmo_canon_hash(const char *data, int len);
lmo_archive_t * lmo_open(const char *file);
void lmo_close(lmo_archive_t *ar);
extern lmo_catalog_t *_lmo_catalogs;
extern lmo_catalog_t *_lmo_active_catalog;
int lmo_load_catalog(const char *lang, const char *dir);
int lmo_change_catalog(const char *lang);
int lmo_translate(const char *key, int keylen, char **out, int *outlen);
void lmo_close_catalog(const char *lang);
#endif