addTcpProxy() {
    config_content="$config_content"'
        tcpProxy::'${1}' {
            destAddr'$ipVersion' = '$addr';
            '`[ -n "$tls_host" -a "$tls_frontProxy" != "1" ] && echo "tls_client = $tls_host;"`'
            tunnel_proxy = on;
            tunnelHttpMod = '${2}';
            tunnel_encrypt = "'$password'";
            '`[ -n "$tls_host" -a "$tls_frontProxy" = "1" ] && echo "tls_client = $tls_host;"`'
        }'
}
addHttpMod() {
    config_content="$config_content"'
        httpMod::'${1}' {
            del_line = host;
    '
    if [ "$method" = 'WS' ]; then
        config_content="$config_content"'
            set_first = "GET '$url' [V]\r\n'$proxy_key': [H]\r\nHost: '$host'\r\nConnection: Upgrade\r\nSec-WebSocket-Key: Cute Linux Network\r\nSec-WebSocket-Version: 13\r\nUpgrade: websocket\r\nOrigin: http://'$host'/\r\n";
        }'
    else
        config_content="$config_content"'
            set_first = "'"$method $url"' [V]\r\n'$proxy_key': [H]\r\nHost: '$host'\r\n";
        }'
    fi
}
add_httpUDP() {
    unset udp_flag tls_host
    i=0
    for filename in $cnsCHConfigs; do
        . ./${filename}.ini
        if [ -n "$udp_flag" ]; then
            config_content="$config_content"'
                httpUDP::udp {
                    udp_tproxy_listen = :::6650;
                    '`[ "$tls_frontProxy" = "1" ] && echo "send_http = on;"`'
                    '`[ -n "$tls_host" ] && echo "tls_client = $tls_host;"`'
                    destAddr'$ipVersion' = '$addr';
                    header_host = '$host';
                    udp_flag = '$udp_flag';
                    encrypt = "'$password'";
                    httpMod = CHtunnel'$i';
                }'
            return
        fi
        i=$((i+1))
    done
    i=0
    for filename in $cnsGlobalConfigs; do
        . ./${filename}.ini
        if [ -n "$udp_flag" ]; then
            config_content="$config_content"'
                httpUDP::udp {
                    udp_tproxy_listen = :::6650;
                    '`[ "$tls_frontProxy" = "1" ] && echo "send_http = on;"`'
                    '`[ -n "$tls_host" ] && echo "tls_client = $tls_host;"`'
                    destAddr'$ipVersion' = '$addr';
                    header_host = '$host';
                    udp_flag = '$udp_flag';
                    encrypt = "'$password'";
                    httpMod = tunnel'$i';
                }'
            return
        fi
        i=$((i+1))
    done
}

config_content='
    tcp::Global {
        tcp_listen = 0.0.0.0:6650;
    }

    dns::Global {
        dns_listen = 0.0.0.0:6653;
        cachePath = /dev/null;
    }'
i=0
for filename in $cnsCHConfigs; do
    [ -f "./${filename}.ini" ] || continue
    unset addr tls_host
    . ./${filename}.ini
    addHttpMod CHtunnel$i
    addTcpProxy CHtp$i CHtunnel$i
    CH_tcpProxyList="${CH_tcpProxyList}tcpProxy = CHtp$i;
"
    CH_destAddrList="${CH_destAddrList}destAddr$ipVersion = $addr;
"
    i=$((i+1))
done
i=0

for filename in $cnsGlobalConfigs; do
    [ -f "./${filename}.ini" ] || continue
    unset addr tls_host
    . ./${filename}.ini
    addHttpMod tunnel$i
    addTcpProxy tp$i tunnel$i
    tcpProxyList="${tcpProxyList}tcpProxy = tp$i;
"
    destAddrList="${destAddrList}destAddr$ipVersion = $addr;
"
    i=$((i+1))
done

if [ -n "$CH_tcpProxyList" ]; then
    config_content="$config_content"'
        tcpAcl::CH_ips {
            matchMode = firstMatch;
            '"$CH_tcpProxyList"'
            '`cat tcpAcl_CH_ips.list`'
        }
        tcpAcl::cns_first {
            '"$tcpProxyList"'
            matchMode = firstMach;
            //如果不是中国IP则先连接到海外服务器，等读取了数据再尝试匹配tcpAcl::CH_domains
            reMatch = CH_domains;

            dst_port != 0;
        }
        tcpAcl::CH_domains {
            '"$CH_tcpProxyList"'
            '`cat tcpAcl_CH_domains.list`'
        }'
    . ./${cnsCHConfigs%% *}.ini
    config_content="$config_content"'
        dnsAcl {
            destAddr'$ipVersion' = '$addr';
            header_host = '$dnsAddr';
            '`[ -n "$tls_host" -a "$tls_frontProxy" != "1" ] && echo "tls_client = $tls_host;"`'
            tunnelHttpMod = CHtunnel0;
            tunnel_encrypt = "'$password'";
            '`[ -n "$tls_host" -a "$tls_frontProxy" = "1" ] && echo "tls_client = $tls_host;"`'
            lookup_mode = tcpDNS;
            '`cat dnsAcl_CH_domains.list`'
        }'
    . ./${cnsGlobalConfigs%% *}.ini
    config_content="$config_content"'
        dnsAcl {
            destAddr'$ipVersion' = '$addr';
            header_host = '$dnsAddr';
            '`[ -n "$tls_host" ] && echo "tls_client = $tls_host;"`'
            tunnelHttpMod = tunnel0;
            tunnel_encrypt = "'$password'";
            lookup_mode = tcpDNS;
        }'
else
    config_content="$config_content"'
        tcpAcl::cns {
            '"$tcpProxyList"'
            matchMode = firstMatch;
            dst_port != 0;
        }'
    . ./${cnsGlobalConfigs%% *}.ini
    config_content="$config_content"'
        dnsAcl {
            destAddr'$ipVersion' = '$addr';
            header_host = '$dnsAddr';
            '`[ -n "$tls_host" -a "$tls_frontProxy" != "1" ] && echo "tls_client = $tls_host;"`'
            tunnelHttpMod = tunnel0;
            '`[ "$fakeDNS" = '1' ] && echo 'fake_dns = on;'`'
            tunnel_encrypt = "'$password'";
            '`[ -n "$tls_host" -a "$tls_frontProxy" = "1" ] && echo "tls_client = $tls_host;"`'
            lookup_mode = tcpDNS;
        }'
fi
add_httpUDP
echo -E "$config_content" >../${configName}.conf
echo -E 'Tun {
    tunAddr4 = 10.0.0.1;
    tunAddr6 = fc00::1;
    tunMtu = 1500;
    tunDevice = tunDev;
}' >>../${configName}.conf
echo "${configName}.conf已生成"
