mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-09-10 18:34:18 +08:00
124 lines
112 KiB
JavaScript
124 lines
112 KiB
JavaScript
|
|
'use strict';
|
|
'require form';
|
|
'require fs';
|
|
'require poll';
|
|
'require rpc';
|
|
'require uci';
|
|
'require ui';
|
|
'require view';
|
|
|
|
var LuciView=(()=>{var _e=Object.defineProperty;var Pr=Object.getOwnPropertyDescriptor;var wr=Object.getOwnPropertyNames;var Ar=Object.prototype.hasOwnProperty;var Rr=(t,e)=>{for(var r in e)_e(t,r,{get:e[r],enumerable:!0})},Lr=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of wr(e))!Ar.call(t,o)&&o!==r&&_e(t,o,{get:()=>e[o],enumerable:!(n=Pr(e,o))||n.enumerable});return t};var Ir=t=>Lr(_e({},"__esModule",{value:!0}),t);var ps={};Rr(ps,{default:()=>us});var ge=view;var u=uci;var l={CUSTOM:"custom",LOAD_BALANCE:"load_balance",HYSTERIA2:"hysteria2",SHADOWSOCKS:"shadowsocks",TUIC:"tuic",SHADOWTLS:"shadowtls",VLESS:"vless"},d={XRAY:"xray",SING_BOX:"sing-box",CUSTOM:"custom"},gt={NONE:"none",PRE_ROUTING:"pre-routing",ROUTING:"routing"};function w(t){let e=(t||"").trim();return e==="singbox"?d.SING_BOX:e}var J={[d.XRAY]:[l.SHADOWSOCKS,l.HYSTERIA2,l.VLESS],[d.SING_BOX]:[l.SHADOWSOCKS,l.HYSTERIA2,l.VLESS,l.TUIC,l.SHADOWTLS]},A={DNS_STRATEGY_VALUES:[{label:"Prefer IPv6 (sing-box only, xray uses dual stack by default)",value:"64"},{label:"Prefer IPv4 (sing-box only, xray uses dual stack by default)",value:"46"},{label:"IPv6 only",value:"6"},{label:"IPv4 only",value:"4"}],SHUNT_LOG_LEVELS:["info","warn","error","debug"],PROXY_LOG_LEVELS:["info","warn","error","debug"],SHUNT_CONF_TYPE:[d.XRAY,d.SING_BOX],PROXY_TYPES:[{label:"Load Balancing",value:"load_balance"},{label:"Shadowsocks",value:"shadowsocks"},{label:"Hysteria2",value:"hysteria2"},{label:"VLESS",value:"vless"},{label:"TUIC",value:"tuic"},{label:"ShadowTLS",value:"shadowtls"}],SHADOWSOCKS_METHODS:[{label:"2022-blake3-aes-128-gcm",value:"2022-blake3-aes-128-gcm"},{label:"2022-blake3-aes-256-gcm",value:"2022-blake3-aes-256-gcm"},{label:"2022-blake3-chacha20-poly1305",value:"2022-blake3-chacha20-poly1305"},{label:"aes-128-gcm",value:"aes-128-gcm"},{label:"aes-192-gcm",value:"aes-192-gcm"},{label:"aes-256-gcm",value:"aes-256-gcm"},{label:"chacha20-ietf-poly1305",value:"chacha20-ietf-poly1305"},{label:"xchacha20-ietf-poly1305",value:"xchacha20-ietf-poly1305"}],MULTIPLEX_PROTOCOLS:[{label:"smux",value:"smux"},{label:"yamux",value:"yamux"},{label:"h2mux",value:"h2mux"}],TUIC_CONGESTION_CONTROLS:[{label:"cubic",value:"cubic"},{label:"new_reno",value:"new_reno"},{label:"bbr",value:"bbr"}],TUIC_UDP_RELAY_MODES:[{label:"Native UDP",value:"native"},{label:"QUIC Stream",value:"quic"}],SHADOWTLS_VERSIONS:[{label:"v1",value:"1"},{label:"v2",value:"2"},{label:"v3",value:"3"}],VLESS_FLOWS:[{label:"None",value:""},{label:"xtls-rprx-vision",value:"xtls-rprx-vision"},{label:"xtls-rprx-vision-udp443",value:"xtls-rprx-vision-udp443"}],VLESS_PACKET_ENCODINGS:[{label:"Disabled",value:""},{label:"packetaddr",value:"packetaddr"},{label:"xudp",value:"xudp"}],V2RAY_TRANSPORT_TYPES_XRAY:[{label:"None",value:""},{label:"HTTP",value:"http"},{label:"WebSocket",value:"ws"},{label:"gRPC",value:"grpc"},{label:"HTTPUpgrade",value:"httpupgrade"},{label:"XHTTP",value:"xhttp"}],HYSTERIA2_OBFS_TYPES:[{label:"Disabled",value:""},{label:"Salamander",value:"salamander"}],DUAL_CORES:[{label:"sing-box",value:d.SING_BOX},{label:"xray",value:d.XRAY},{label:"Custom",value:d.CUSTOM}]};var c=form;var D=fs;var R=ui;var rt=class{disabled;level;timestamp;constructor(e){this.disabled=!1,this.level=e||"info",this.timestamp=!0}},mt=class{type;tag;server;server_port;detour;constructor(e,r,n,o,s){this.type=e,this.tag=r,this.server=n,this.server_port=Number.isFinite(o)&&o>0?o:void 0,this.detour=s==="direct-out"?void 0:s}},wt=class{servers;rules;strategy;disable_cache;disable_expire;final;constructor(e,r,n){this.servers=[],this.rules=[],this.strategy=r||"prefer_ipv6",this.disable_cache=!n,this.disable_expire=!n,this.final=e}},At=class{action;outbound;constructor(e,r){this.action=e,this.outbound=r}},nt=class extends At{ip_version;protocol;port;port_range;domain;domain_suffix;domain_keyword;domain_regex;rule_set;ip_cidr;network;constructor(e,r){super(e,r)}initRule(e){return this.ip_version=e.ipVersion,this.network=e.network,this.protocol=e.protocol,this.port=e.port,this.port_range=e.portRange.map(r=>r.replace("-",":")),this.domain=e.domain,this.domain_suffix=e.domainSuffix,this.domain_keyword=e.domainKeyword,this.domain_regex=e.domainRegex,this.rule_set=e.ruleSet.map(r=>r.tag),this.ip_cidr=e.ipCidr,this}},Rt=class extends At{domain;domain_keyword;domain_regex;domain_suffix;rule_set;server;strategy;disable_cache;disable_expire;constructor(e,r,n){super(e,void 0),this.action=e,this.server=r,this.strategy=n,this.disable_cache=!0}initRule(e){return this.domain=e.domain,this.domain_suffix=e.domainSuffix,this.domain_keyword=e.domainKeyword,this.domain_regex=e.domainRegex,this.rule_set=e.ruleSet.map(r=>r.tag),this}},me=class extends nt{constructor(){super("sniff",void 0)}},fe=class extends nt{constructor(){super("hijack-dns",void 0),this.protocol=["dns"]}},Lt=class{type;tag;format;constructor(e,r,n){this.type=r,this.tag=e,this.format=n}},It=class extends Lt{url;http_client;update_interval;constructor(e,r,n,o,s){super(e,"remote",r),this.url=n,o&&(this.http_client=new he(o)),this.update_interval=s}},he=class{detour;constructor(e){this.detour=e}},Dt=class extends Lt{path;constructor(e,r,n){super(e,"local",r),this.path=n}},Ut=class{rules;rule_set;default_domain_resolver;final;constructor(e,r){this.rules=[new me,new fe],this.rule_set=[],this.default_domain_resolver=r,this.final=e}},ot=class{type="tproxy";tag;listen;listen_port;constructor(e,r,n){this.tag=r,this.listen=n??"::",this.listen_port=e}},kt=class{type="direct";tag;listen;listen_port;constructor(e,r){this.tag=r,this.listen="::",this.listen_port=e}},ft=class{type="socks";tag;listen;listen_port;users;constructor(e,r,n){this.tag=r,this.listen=n??"::",this.listen_port=e}},Ft=class{type="block";tag;constructor(e){this.tag=e}},Mt=class{type="direct";tag;domain_resolver;constructor(e){this.tag=e}},Yt=class{type="urltest";tag;url;interval;tolerance;idle_timeout;interrupt_exist_connections;outbounds;constructor(e,r,n,o,s,i){this.tag=e,this.outbounds=[],this.url=r,this.interval=n,this.tolerance=o,this.idle_timeout=s,this.interrupt_exist_connections=i}},st=class{type="socks";tag;server;server_port;version="5";domain_resolver;constructor(e,r,n){this.tag=n,this.server=e,this.server_port=r,this.version="5"}},W=class{enabled;server_name;insecure;reality;constructor(e){this.enabled=!0,this.server_name=e}},it=class{enabled;up_mbps;down_mbps;constructor(){this.enabled=!0}},at=class{enabled;protocol;max_connections;min_streams;max_streams;brutal;constructor(){this.enabled=!0}};var ye=class{protocols=new Map;register(e){this.protocols.set(e.type,e)}build(e,r){let n=this.protocols.get(e);if(!n)throw new Error(`Unsupported sing-box protocol: ${e}`);return n.build(r)}},H=new ye;var be=class{type;password;constructor(e){this.type="salamander",this.password=e}},Se=class{type="hysteria2";tag;server;server_port;password;obfs;up_mbps;down_mbps;server_ports;hop_interval;network;tls;constructor(e,r,n,o){this.tag=e,this.server=r,this.server_port=n,this.tls=new W(o)}},Ur={type:"hysteria2",build(t){let e=t,r=new Se(e.name,e.server,parseInt(e.server_port),e.tls_server_name||e.server);return e.password&&(r.password=e.password),e.up_mbps&&(r.up_mbps=Number(e.up_mbps)),e.down_mbps&&(r.down_mbps=Number(e.down_mbps)),e.server_ports&&e.server_ports.length>0&&(r.server_ports=e.server_ports.map(n=>n.replace("-",":")).filter(n=>n.length>0)),e.hop_interval&&(r.hop_interval=e.hop_interval),e.network&&(r.network=e.network),e.obfs_type==="salamander"&&e.obfs_password&&(r.obfs=new be(e.obfs_password)),r.tls.insecure=e.tls_insecure==="1",r}};H.register(Ur);var xe=class{type="shadowsocks";tag;server;server_port;method;password;network;udp_over_tcp;plugin;plugin_opts;multiplex;constructor(e,r,n,o,s){this.tag=e,this.server=r,this.server_port=n,this.method=o,this.password=s}};function kr(t){let e=new at;if(t.multiplex_protocol&&(e.protocol=t.multiplex_protocol),t.multiplex_max_connections&&(e.max_connections=parseInt(t.multiplex_max_connections)),t.multiplex_min_streams&&(e.min_streams=parseInt(t.multiplex_min_streams)),t.multiplex_max_streams&&(e.max_streams=parseInt(t.multiplex_max_streams)),t.multiplex_brutal_enabled==="1"){let r=new it;t.multiplex_brutal_up_mbps&&(r.up_mbps=parseInt(t.multiplex_brutal_up_mbps)),t.multiplex_brutal_down_mbps&&(r.down_mbps=parseInt(t.multiplex_brutal_down_mbps)),e.brutal=r}return e}var Fr={type:"shadowsocks",build(t){let e=t,r=new xe(e.name,e.server,parseInt(e.server_port),e.method,e.password);return e.network&&(r.network=e.network),e.udp_over_tcp==="1"&&(r.udp_over_tcp=!0),e.plugin&&(r.plugin=e.plugin),e.plugin_opts&&(r.plugin_opts=e.plugin_opts),e.multiplex_enabled==="1"&&(r.multiplex=kr(e)),r}};H.register(Fr);var Ee=class{type="vless";tag;server;server_port;uuid;flow;network;packet_encoding;tls;transport;multiplex;constructor(e,r,n,o,s){this.tag=e,this.server=r,this.server_port=n,this.uuid=o,this.tls=new W(s)}};function Mr(t){switch(t.transport_type){case"http":{let e={type:"http"};return t.transport_http_host&&(e.host=t.transport_http_host),t.transport_http_path&&(e.path=t.transport_http_path),t.transport_http_method&&(e.method=t.transport_http_method),t.transport_http_idle_timeout&&(e.idle_timeout=t.transport_http_idle_timeout),t.transport_http_ping_timeout&&(e.ping_timeout=t.transport_http_ping_timeout),e}case"ws":{let e={type:"ws"};return t.transport_ws_path&&(e.path=t.transport_ws_path),t.transport_ws_host&&(e.headers={Host:t.transport_ws_host}),t.transport_ws_max_early_data&&(e.max_early_data=parseInt(t.transport_ws_max_early_data)),t.transport_ws_early_data_header_name&&(e.early_data_header_name=t.transport_ws_early_data_header_name),e}case"grpc":{let e={type:"grpc"};return t.transport_grpc_service_name&&(e.service_name=t.transport_grpc_service_name),t.transport_grpc_idle_timeout&&(e.idle_timeout=t.transport_grpc_idle_timeout),t.transport_grpc_ping_timeout&&(e.ping_timeout=t.transport_grpc_ping_timeout),t.transport_grpc_permit_without_stream==="1"&&(e.permit_without_stream=!0),e}case"httpupgrade":{let e={type:"httpupgrade"};return t.transport_httpupgrade_host&&(e.host=t.transport_httpupgrade_host),t.transport_httpupgrade_path&&(e.path=t.transport_httpupgrade_path),e}default:return}}function Yr(t){let e=new at;if(t.multiplex_protocol&&(e.protocol=t.multiplex_protocol),t.multiplex_max_connections&&(e.max_connections=parseInt(t.multiplex_max_connections)),t.multiplex_min_streams&&(e.min_streams=parseInt(t.multiplex_min_streams)),t.multiplex_max_streams&&(e.max_streams=parseInt(t.multiplex_max_streams)),t.multiplex_brutal_enabled==="1"){let r=new it;t.multiplex_brutal_up_mbps&&(r.up_mbps=parseInt(t.multiplex_brutal_up_mbps)),t.multiplex_brutal_down_mbps&&(r.down_mbps=parseInt(t.multiplex_brutal_down_mbps)),e.brutal=r}return e}var Hr={type:"vless",build(t){let e=t,r=new Ee(e.name,e.server,parseInt(e.server_port),e.uuid,e.tls_server_name||e.server);return e.flow&&(r.flow=e.flow),e.network&&(r.network=e.network),e.packet_encoding&&(r.packet_encoding=e.packet_encoding),r.tls.insecure=e.tls_insecure==="1",e.tls_reality_enabled==="1"&&e.tls_reality_public_key&&(r.tls.reality={enabled:!0,public_key:e.tls_reality_public_key,short_id:e.tls_reality_short_id||""}),e.transport_type&&(r.transport=Mr(e)),e.multiplex_enabled==="1"&&(r.multiplex=Yr(e)),r}};H.register(Hr);var Oe=class{type="tuic";tag;server;server_port;uuid;password;congestion_control;udp_relay_mode;udp_over_stream;zero_rtt_handshake;heartbeat;network;tls;constructor(e,r,n,o,s,i){this.tag=e,this.server=r,this.server_port=n,this.uuid=o,this.password=s,this.tls=new W(i)}},Vr={type:"tuic",build(t){let e=t,r=new Oe(e.name,e.server,parseInt(e.server_port),e.uuid,e.password,e.tls_server_name||e.server);return e.congestion_control&&(r.congestion_control=e.congestion_control),e.udp_relay_mode&&(r.udp_relay_mode=e.udp_relay_mode),e.udp_over_stream==="1"&&(r.udp_over_stream=!0),e.zero_rtt_handshake==="1"&&(r.zero_rtt_handshake=!0),e.heartbeat&&(r.heartbeat=e.heartbeat),e.network&&(r.network=e.network),r.tls.insecure=e.tls_insecure==="1",r}};H.register(Vr);var Ne=class{type="shadowtls";tag;server;server_port;version;password;tls;constructor(e,r,n,o,s){this.tag=e,this.server=r,this.server_port=n,this.version=o,this.tls=new W(s)}},Br={type:"shadowtls",build(t){let e=t,r=new Ne(e.name,e.server,parseInt(e.server_port),parseInt(e.version),e.tls_server_name||e.server);return e.password&&(r.password=e.password),r.tls.insecure=e.tls_insecure==="1",r}};H.register(Br);var Ht=class{tag;type;server;port},Vt=class{defaultDnsNode;defaultStrategy;rulesetDnsNode;useCache;nodes;constructor(){this.nodes=[]}},lt=class{enabled;name;proxyNode;ipVersionSplit;proxyNodeV4;proxyNodeV6;protocol;network;port;portRange;domainList;ipList;dnsNode;dnsProxyNode;dnsStrategy;constructor(){this.port=[],this.portRange=[],this.network=[],this.protocol=[],this.ipVersionSplit="0"}},Bt=class{defaultProxyNode;rulesetOutNode;rulesetConvert;rules;constructor(){this.rules=[]}},Xt=class{type;configType;shuntListenPort;dnsListenPort;logLevel;logPath;route;dns},Gt=class{domain;domainRegex;domainKeyword;domainSuffix;ipCidr;network;protocol;port;portRange;ipVersion;ruleSet;geoIp;geoSite;constructor(){this.domain=[],this.domainRegex=[],this.domainKeyword=[],this.domainSuffix=[],this.ruleSet=[],this.ipCidr=[],this.geoIp=[],this.geoSite=[],this.network=[],this.protocol=[],this.port=[],this.portRange=[]}containDomain(){return this.domain.length>0||this.domainRegex.length>0||this.domainSuffix.length>0||this.domainKeyword.length>0}containGeo(){return this.geoSite.length>0||this.geoIp.length>0}containRuleSet(){return this.ruleSet.length>0}containIp(){return this.ipCidr.length>0||this.geoIp.length>0}isEmpty(e){return!(this.containDomain()||this.containIp()||e==="geo"&&this.containGeo()||e==="set"&&this.containRuleSet()||this.network.length>0||this.port.length>0||this.portRange.length>0||this.protocol.length>0)}},Wt=class{name;type="load_balance";core=d.SING_BOX;enabled="1";listen_port;socks_port;member_node;procd_env;log_level;log_path;url;interval;tolerance;idle_timeout;interrupt_exist_connections;strategy;strategy_expected;strategy_max_rtt;strategy_tolerance;fallback_tag;probe_url;probe_connectivity;probe_interval;probe_timeout;probe_sampling;probe_http_method;constructor(){this.member_node=[],this.procd_env=[]}},jt=class{name;type="custom";enabled="1";command;listen_port;socks_port;procd_env;log_enabled;log_path;constructor(){this.type="custom",this.enabled="1",this.procd_env=[]}},qt=class{name;type="hysteria2";enabled="1";core;server;server_port;server_ports;hop_interval;obfs_type;obfs_password;brutal_debug;udp_idle_timeout;up_mbps;down_mbps;password;network;tls_server_name;tls_insecure;listen_port;socks_port;procd_env;log_path;constructor(){this.type="hysteria2",this.enabled="1",this.core=d.SING_BOX,this.server_ports=[],this.network="",this.brutal_debug="0",this.tls_insecure="0"}},Kt=class{name;type="shadowsocks";enabled="1";core;server;server_port;method;password;plugin;plugin_opts;network;udp_over_tcp;listen_port;socks_port;multiplex_enabled;multiplex_protocol;multiplex_max_connections;multiplex_min_streams;multiplex_max_streams;multiplex_brutal_enabled;multiplex_brutal_up_mbps;multiplex_brutal_down_mbps;procd_env;log_path;constructor(){this.type="shadowsocks",this.enabled="1",this.core=d.SING_BOX,this.network="",this.udp_over_tcp="0",this.multiplex_enabled="0",this.multiplex_protocol="h2mux",this.multiplex_brutal_enabled="0"}},zt=class{name;type="tuic";enabled="1";core;server;server_port;uuid;password;congestion_control;udp_relay_mode;udp_over_stream;zero_rtt_handshake;heartbeat;network;tls_server_name;tls_insecure;listen_port;socks_port;procd_env;log_path;constructor(){this.type="tuic",this.enabled="1",this.core=d.SING_BOX,this.congestion_control="cubic",this.udp_relay_mode="",this.udp_over_stream="0",this.zero_rtt_handshake="0",this.heartbeat="10s",this.network="",this.tls_insecure="0"}},$t=class{name;type="shadowtls";enabled="1";core;server;server_port;version;password;tls_server_name;tls_insecure;listen_port;socks_port;procd_env;log_path;constructor(){this.type="shadowtls",this.enabled="1",this.core=d.SING_BOX,this.version="1",this.tls_insecure="0"}},Qt=class{name;type="vless";enabled="1";core;server;server_port;uuid;flow;network;packet_encoding;tls_server_name;tls_insecure;tls_reality_enabled;tls_reality_public_key;tls_reality_short_id;listen_port;socks_port;multiplex_enabled;multiplex_protocol;multiplex_max_connections;multiplex_min_streams;multiplex_max_streams;multiplex_brutal_enabled;multiplex_brutal_up_mbps;multiplex_brutal_down_mbps;transport_type;transport_http_host;transport_http_path;transport_http_method;transport_http_idle_timeout;transport_http_ping_timeout;transport_ws_host;transport_ws_path;transport_ws_max_early_data;transport_ws_early_data_header_name;transport_grpc_service_name;transport_grpc_idle_timeout;transport_grpc_ping_timeout;transport_grpc_permit_without_stream;transport_httpupgrade_host;transport_httpupgrade_path;transport_xhttp_host;transport_xhttp_path;transport_xhttp_mode;procd_env;log_path;constructor(){this.type="vless",this.enabled="1",this.core=d.XRAY,this.network="tcp",this.packet_encoding="",this.tls_insecure="0",this.tls_reality_enabled="0",this.multiplex_enabled="0",this.multiplex_protocol="h2mux",this.multiplex_brutal_enabled="0",this.transport_type="",this.transport_http_idle_timeout="15s",this.transport_http_ping_timeout="15s",this.transport_grpc_idle_timeout="15s",this.transport_grpc_ping_timeout="15s",this.transport_grpc_permit_without_stream="0",this.transport_xhttp_path="/",this.transport_xhttp_mode="auto"}};var X={camelToSnake:function(t){return t.replace(/([A-Z])/g,function(e){return"_"+e.toLowerCase()})},transFromUci:function(t,e){Object.keys(t).forEach(r=>{let n=X.camelToSnake(r);e[n]&&(t[r]=e[n])})},generateUniqueSectionId:function(t="hijpass"){let e="abcdefghijklmnopqrstuvwxyz0123456789",r="";for(;;){r="";for(let n=0;n<8;n++)r+=e.charAt(Math.floor(Math.random()*e.length));if(!u.get(t,r))break}return r}};function qe(t,e){let r=t.substring(e==="remote"?16:15),n=r.split("/").pop(),o=n.substring(0,n.lastIndexOf("."))||n,s=(e==="remote"?r:n).endsWith("srs")?"binary":"source";return{tag:o,type:e,format:s,pathOrUrl:r}}var I={getShuntSection:function(){let t=new Xt,e=u.get_first("hijpass","shunt");return X.transFromUci(t,e),t.dns=I.getDnsSection(),t.route=I.getRouteSection(),t},getRouteSection:function(){let t=u.get_first("hijpass","shunt"),e=new Bt;return X.transFromUci(e,t),u.sections("hijpass","shunt_route_rule",function(r){let n=new lt;X.transFromUci(n,r),e.rules.push(n)}),e},getRouteRuleVariants:function(t){if(t.ipVersionSplit!=="1")return[{rule:t,proxyNode:t.proxyNode}];let e=[];if(t.proxyNodeV4){let r=Object.assign(new lt,t);r.name=t.name?t.name+"-ipv4":t.name,r.proxyNode=t.proxyNodeV4,e.push({rule:r,proxyNode:t.proxyNodeV4,ipVersion:4})}if(t.proxyNodeV6){let r=Object.assign(new lt,t);r.name=t.name?t.name+"-ipv6":t.name,r.proxyNode=t.proxyNodeV6,e.push({rule:r,proxyNode:t.proxyNodeV6,ipVersion:6})}return e},getDnsSection:function(){let t=u.get_first("hijpass","shunt"),e=new Vt;return e.nodes=[],X.transFromUci(e,t),u.sections("hijpass","shunt_dns_node",function(r){if(r.enabled==="0")return;let n=new Ht;X.transFromUci(n,r),e.nodes.push(n)}),e},parseRuleList:function(t){let e=new Gt,r=t.domainList,n=t.ipList;if(e.network=t.network?t.network:[],e.protocol=t.protocol?t.protocol:[],t.port&&(e.port=t.port.map(o=>parseInt(o,10)).filter(o=>!isNaN(o))),t.portRange&&(e.portRange=t.portRange.map(o=>o.replace("-",":")).filter(o=>o.length>0)),r&&r.trim()!==""){let o=r.split(`
|
|
`);for(let s of o)if(s=s.trim(),!(s===""||s.startsWith("#"))){if(s.startsWith("rule-set:")){let i=s.startsWith("rule-set:remote:")?"remote":"local",a=qe(s,i);e.ruleSet.push(a);continue}s.startsWith("regexp:")?e.domainRegex.push(s.substring(7)):s.startsWith("domain:")?e.domainSuffix.push(s.substring(7)):s.startsWith("full:")?e.domain.push(s.substring(5)):s.startsWith("geosite:")?e.geoSite.push(s):e.domainKeyword.push(s)}}if(n&&n.trim()!==""){let o=n.split(`
|
|
`);for(let s of o)if(s=s.trim(),!(s===""||s.startsWith("#"))){if(s.startsWith("rule-set:")){let i=s.startsWith("rule-set:remote:")?"remote":"local",a=qe(s,i);e.ruleSet.push(a);continue}s.startsWith("geoip:")?e.geoIp.push(s):e.ipCidr.push(s)}}return e}};var Te=3,Jt="lb-member-";function Ke(t){return t?.name||t?.[".name"]||""}function ve(t){return w(t?.core||d.SING_BOX)}function Ce(t){if(!t)return!1;let e=Number(t);return Number.isInteger(e)&&e>0&&e<=65535}function ze(){let t=[];return u.sections("hijpass","proxy_node",function(e){t.push(e)}),t}function Pe(){let t=new Map;return ze().forEach(e=>{let r=Ke(e);r&&t.set(r,e)}),t}function $e(t){return"upstream-"+t}function we(t){return t?(Array.isArray(t)?t:[t]).filter(e=>!!e):[]}function Qe(t){return Jt+t}function Xr(t,e=Pe()){let r=we(t.member_node);if(r.length===0)throw new Error("Load balancing node has no members: "+t.name);return r.map((n,o)=>{if(n===t.name)throw new Error("Load balancing node cannot include itself: "+n);let s=e.get(n);if(!s)throw new Error("Load balancing member node not found: "+n);if(s.type===l.LOAD_BALANCE)throw new Error("Nested load balancing members are not supported: "+n);if(s.enabled!=="1")throw new Error("Load balancing member node disabled: "+n);if(!Ce(s.socks_port))throw new Error("Load balancing member node SOCKS port invalid: "+n);return{name:n,socksPort:Number(s.socks_port),tag:Qe(o),core:ve(s),section:s}})}function Gr(t,e=Pe()){let r=t.upstream_proxy_node;if(!r)return;if(r===t.name)throw new Error("Upstream proxy node cannot be itself: "+r);let n=e.get(r);if(!n)throw new Error("Upstream proxy node not found: "+r);if(n.enabled!=="1")throw new Error("Upstream proxy node disabled: "+r);if(!Ce(n.socks_port))throw new Error("Upstream proxy node SOCKS port invalid: "+r);return{name:r,socksPort:Number(n.socks_port),tag:$e(r),core:ve(n),section:n}}function Wr(t,e){let r=[],n=new Set,o=t;for(;o;){if(n.has(o))return r.push(o),{chain:r,cycle:!0};n.add(o),r.push(o);let s=e.get(o);if(!s||!s.upstream_proxy_node)break;o=s.upstream_proxy_node}return{chain:r,cycle:!1}}function Je(t){let e=[];return t?.type===l.LOAD_BALANCE?e.push(...we(t.member_node)):t?.upstream_proxy_node&&e.push(t.upstream_proxy_node),e}function jr(t){let e=new Set,r=new Set,n=[];function o(s){if(r.has(s)){let a=n.indexOf(s);return n.slice(a).concat(s)}if(e.has(s))return;let i=t.get(s);if(!(!i||i.enabled!=="1")){r.add(s),n.push(s);for(let a of Je(i)){let p=o(a);if(p)return p}n.pop(),r.delete(s),e.add(s)}}for(let s of t.keys()){let i=o(s);if(i)return i}}var b={getProxyName:Ke,getProxyCore:ve,getProxySections:ze,getProxySectionMap:Pe,isPort:Ce,getUpstreamProxyOutboundTag:$e,normalizeProxyNodeList:we,getLoadBalanceMemberOutboundTag:Qe,resolveUpstreamProxy:Gr,resolveLoadBalanceMembers:Xr,collectProxyChain:Wr,getProxyDependencies:Je,findProxyDependencyCycle:jr};var yt={genShuntConf:qr,genProxyConf:Kr,writeGeoRule:Qr};function qr(){let t=I.getShuntSection();if(!t)return;let e=new Map,r=new Map,n=t.dns,o=t.route,s=new Ut(ht(o.defaultProxyNode),n.defaultDnsNode),i=new wt(n.defaultDnsNode,rr(n.defaultStrategy),n.useCache==="1");n.nodes.forEach(function(g){let m=new mt(g.type,g.tag,g.server,parseInt(g.port,10),void 0);e.set(g.tag,m)});let a=[new Mt("direct-out"),new Ft("block")];u.sections("hijpass","proxy_node",function(g){g.enabled==="1"&&a.push(new st("127.0.0.1",Number(g.socks_port),g.name))});let p=[new ot(parseInt(t.shuntListenPort,10),"tproxy-in"),new kt(parseInt(t.dnsListenPort,10),"dns-in")];if(s.default_domain_resolver&&s.final){let g=e.get(s.default_domain_resolver);if(!g)throw new Error(_('Default global DNS "%s" does not exist').format(s.default_domain_resolver));i.servers.push(Ae(g.tag,s.final,g))}if(o.rulesetOutNode){let g=ht(o.rulesetOutNode),m=a.find(S=>S.tag===g);if(m){let S=structuredClone(m);if(S.tag="ruleset-out",n.rulesetDnsNode){S.domain_resolver="ruleset-dns-resolver";let O=e.get(n.rulesetDnsNode);if(!O)throw new Error(_('%s "%s" does not exist').format(_("Rule-set DNS"),n.rulesetDnsNode));i.servers.push(Ae("ruleset-dns-resolver","ruleset-out",O))}a.push(S)}}return o.rules.forEach(function(g){if(g.enabled!=="1")return;let m=g.ipVersionSplit==="1",S,O=!1;if(I.getRouteRuleVariants(g).forEach(function(N){let f=I.parseRuleList(N.rule),y=rn(f,o.rulesetConvert);if(f.ipVersion=N.ipVersion,o.rulesetConvert==="1")Zr(f);else if(f.containGeo()&&(tn(f),!en(f)))return;if(f.isEmpty("set"))return;for(let v of f.ruleSet)r.set(v.tag,Jr(v,o.rulesetOutNode?"ruleset-out":void 0));let T="route",C=ht(N.proxyNode);if(N.proxyNode==="hijpass-block"&&(T="reject",C=void 0),s.rules.push(new nt(T,C).initRule(f)),T!=="reject"){if(m){y&&(S=S||f,O=!0);return}(f.containDomain()||f.containIp()||f.containRuleSet())&&Ze(g,N.rule.name,f,ht(g.dnsProxyNode)||C,e,s,i)}}),m&&O&&S){let N=ht(g.dnsProxyNode);if(!N)throw new Error(_('Route rule "%s" uses IPv4/IPv6 split and must specify a DNS exit node').format(g.name));Ze(g,g.name,S,N,e,s,i)}}),r.forEach(g=>s.rule_set.push(g)),{log:new rt(t.logLevel),inbounds:p,outbounds:a,dns:i,route:s}}function Kr(t){if(t.type===l.LOAD_BALANCE)return zr(t);let e=H.build(t.type,t),r=[e];return $r(t,e,r),{log:new rt(t.log_level),dns:{servers:[{type:"local",tag:"local"}]},inbounds:[new ot(Number(t.listen_port),"tproxy-in","127.0.0.1"),new ft(Number(t.socks_port),"socks-in","127.0.0.1")],outbounds:r}}function zr(t){let e=b.resolveLoadBalanceMembers(t),r=new Yt("slb",t.url||void 0,t.interval||void 0,t.tolerance?parseInt(t.tolerance,10):void 0,t.idle_timeout||void 0,t.interrupt_exist_connections==="1"?!0:void 0);return r.outbounds=e.map(n=>n.tag),{log:new rt(t.log_level),dns:{servers:[{type:"local",tag:"local"}]},inbounds:[new ot(Number(t.listen_port),"tproxy-in","127.0.0.1"),new ft(Number(t.socks_port),"socks-in","127.0.0.1")],outbounds:[r,...e.map(n=>new st("127.0.0.1",n.socksPort,n.tag))],route:{final:"slb"}}}function $r(t,e,r){let n=b.resolveUpstreamProxy(t);n&&(e.detour=n.tag,r.push(new st("127.0.0.1",n.socksPort,n.tag)))}function Qr(){let t=I.getRouteSection(),e=new Set,r=new Set;for(let a of t.rules){if(a.enabled!=="1")continue;let p=I.parseRuleList(a);for(let g of p.geoSite)e.add(g.replace("geosite:",""));for(let g of p.geoIp)r.add(g.replace("geoip:",""))}let n=[...e],o=[...r],s=u.get_first("hijpass","shunt","geoip_ruleset")??[],i=u.get_first("hijpass","shunt","geosite_ruleset")??[];o.length>0?er(s,o)||u.set_first("hijpass","shunt","geoip_ruleset",o):u.set_first("hijpass","shunt","geoip_ruleset",void 0),n.length>0?er(i,n)||u.set_first("hijpass","shunt","geosite_ruleset",n):u.set_first("hijpass","shunt","geosite_ruleset",void 0)}function Ae(t,e,r){return new mt(r.type,t,r.server,r.server_port,e)}function Jr(t,e){return t.type==="remote"?new It(t.tag,t.format,t.pathOrUrl,e,void 0):new Dt(t.tag,t.format,t.pathOrUrl)}function rr(t){switch(t){case"4":return"ipv4_only";case"6":return"ipv6_only";case"64":return"prefer_ipv6";case"46":return"prefer_ipv4";default:return}}function Ze(t,e,r,n,o,s,i){let a=t.dnsNode,p=a?o.get(a):o.get(s.default_domain_resolver);if(!p)throw new Error(_('Route rule "%s" DNS node "%s" does not exist').format(t.name||e,t.dnsNode||s.default_domain_resolver||""));i.servers.push(Ae(tr(e),n,p)),i.rules.push(new Rt("route",tr(e),rr(t.dnsStrategy)).initRule(r))}function ht(t){return t==="hijpass-block"?"block":t==="hijpass-direct"?"direct-out":t}function tr(t){return t+"-dns"}function Zr(t){t.ruleSet=[];for(let e of t.geoSite){let r=e.replace("geosite:","geosite-");t.ruleSet.push({tag:r,type:"local",format:"binary",pathOrUrl:"/etc/hijpass/ruleset/"+r+".srs"})}for(let e of t.geoIp){let r=e.replace("geoip:","geoip-");t.ruleSet.push({tag:r,type:"local",format:"binary",pathOrUrl:"/etc/hijpass/ruleset/"+r+".srs"})}}function tn(t){t.geoSite=[],t.geoIp=[]}function en(t){return t.containDomain()||t.containIp()||t.containRuleSet()}function rn(t,e){return t.containDomain()||t.containRuleSet()||e==="1"&&t.geoSite.length>0}function er(t,e){return!t||!e?!1:t.length===e.length&&t.every((r,n)=>r===e[n])}var Le=class{protocols=new Map;register(e){this.protocols.set(e.type,e)}build(e,r){let n=this.protocols.get(e);if(!n)throw new Error(`Unsupported xray protocol: ${e}`);return n.build(r)}},z=new Le;var Ie=class{settings;protocol;tag;streamSettings;constructor(e,r,n,o,s,i,a,p){this.protocol="hysteria",this.tag=n,this.settings={version:2,address:e,port:r},this.streamSettings={network:"hysteria",security:"tls",tlsSettings:{serverName:s,alpn:["h3"]},hysteriaSettings:{version:2,auth:o,...i!==void 0?{udpIdleTimeout:i}:{}},...a||p?{finalmask:{quicParams:{...a?{brutalUp:a}:{},...p?{brutalDown:p}:{}}}}:{}}}};function nr(t){let e=(t||"").trim();if(e)return e==="0"?"0":e+" mbps"}var nn={type:"hysteria2",build(t){let e=t,r=e.udp_idle_timeout?Number(e.udp_idle_timeout):void 0,n=nr(e.up_mbps),o=nr(e.down_mbps);return new Ie(e.server,Number(e.server_port),e.name,e.password||"",e.tls_server_name||e.server,r,n,o)}};z.register(nn);var De=class{settings;protocol;tag;constructor(e,r,n,o,s,i){this.protocol="shadowsocks",this.tag=n,this.settings={address:e,port:r,method:o,password:s,uot:i||void 0,level:0}}},on={type:"shadowsocks",build(t){let e=t;return new De(e.server,Number(e.server_port),e.name,e.method,e.password,e.udp_over_tcp==="1"?!0:void 0)}};z.register(on);var Ue=class{settings;protocol;tag;streamSettings;constructor(e,r,n,o,s="none",i,a=0){this.protocol="vless",this.tag=o,this.settings={address:e,port:r,id:n,encryption:s,level:a},i&&(this.settings.flow=i)}};function Zt(t){let e=(t||"").trim();if(!e)return;let r=e.match(/^(\d+)(?:s)?$/);if(!r)return;let n=Number(r[1]);return Number.isFinite(n)&&n>0?n:void 0}function sn(t,e){let r=(e||"").trim();if(!r)return t;let n=t||"/",o=n.indexOf("#"),s=o>=0?n.slice(0,o):n,i=o>=0?n.slice(o):"",a=s.indexOf("?")>=0?"&":"?";return s+a+"ed="+encodeURIComponent(r)+i}var an={type:"vless",build(t){let e=t,r=new Ue(e.server,Number(e.server_port),e.uuid,e.name,"none",e.flow||void 0,0),n=e.tls_reality_enabled==="1",o=n?{fingerprint:"chrome",serverName:e.tls_server_name||e.server,password:e.tls_reality_public_key||"",shortId:e.tls_reality_short_id||""}:void 0,s=n?void 0:{alpn:["h2","http/1.1"],serverName:e.tls_server_name||e.server},i=n?"reality":e.tls_server_name?"tls":"none",a={network:"raw",security:i};switch(o&&(a.realitySettings=o),s&&i==="tls"&&(a.tlsSettings=s),e.transport_type||""){case"xhttp":a.network="xhttp",a.xhttpSettings={host:e.transport_xhttp_host||void 0,path:e.transport_xhttp_path||"/",mode:e.transport_xhttp_mode||"auto"};break;case"ws":a.network="websocket",a.wsSettings={host:e.transport_ws_host||void 0,path:sn(e.transport_ws_path||"/",e.transport_ws_max_early_data)};break;case"grpc":a.network="grpc",a.grpcSettings={serviceName:e.transport_grpc_service_name||"TunService",...Zt(e.transport_grpc_idle_timeout)?{idle_timeout:Zt(e.transport_grpc_idle_timeout)}:{},...Zt(e.transport_grpc_ping_timeout)?{health_check_timeout:Zt(e.transport_grpc_ping_timeout)}:{},...e.transport_grpc_permit_without_stream==="1"?{permit_without_stream:!0}:{}};break;case"http":a.network="xhttp",a.xhttpSettings={...e.transport_http_host?{host:e.transport_http_host}:{},path:e.transport_http_path||"/",mode:"stream-one",...e.transport_http_method?{uplinkHTTPMethod:e.transport_http_method}:{}};break;case"httpupgrade":a.network="httpupgrade",a.httpupgradeSettings={host:e.transport_httpupgrade_host||void 0,path:e.transport_httpupgrade_path||"/"};break}return r.streamSettings=a,r}};z.register(an);var ut=class{loglevel;dnsLog;constructor(e){this.loglevel=e||"info",this.dnsLog=!1}},te=class{tag;address;port;queryStrategy;domains;skipFallback;disableCache;constructor(e,r,n,o){switch(e){case"tcp":this.address="tcp://"+n,this.port=o;break;case"https":this.address="https://"+n,o&&(this.address+=":"+o),this.address+="/dns-query";break;case"quic":this.address="quic://"+n,this.port=o;break;case"udp":this.address=n,this.port=o;break;default:throw new Error("Invalid xray DNS server type: "+e)}this.tag=r,this.domains=[],this.skipFallback=!0}},ee=class{servers;rules;queryStrategy;disableCache;serveStale;serveExpiredTTL;disableFallback;disableFallbackIfMatch;constructor(e,r){this.servers=[],this.rules=[],this.queryStrategy=e||"UseIP",this.disableCache=!r,this.serveStale=!r,this.serveExpiredTTL=3600,this.disableFallback=!1,this.disableFallbackIfMatch=!0}},pt=class{ruleTag;inboundTag;outboundTag;balancerTag;constructor(e,r,n){this.ruleTag=e,this.inboundTag=r,n==="slb"?this.balancerTag=n:this.outboundTag=n}},re=class extends pt{domain;network;ip;protocol;port;constructor(e,r){super(e,void 0,r),this.inboundTag=["tproxy-in"],this.domain=[],this.network=[],this.ip=[],this.protocol=[]}},bt=class extends pt{constructor(e,r){super(void 0,e,r)}},St=class{rules;domainStrategy;balancers;constructor(){this.rules=[],this.domainStrategy="AsIs",this.balancers=[]}},ne=class{settings;protocol;tag;streamSettings;constructor(e){this.protocol="blackhole",this.tag=e}},ct=class{settings;protocol;tag;constructor(e,r,n){this.protocol="socks",this.tag=n,this.settings={address:e,port:r}}},oe=class{settings;protocol;tag;constructor(e){this.protocol="dns",this.tag=e,this.settings={rules:[{action:"hijack",qType:"1,28"},{action:"return",rCode:5}]}}},xt=class{settings;protocol;tag;constructor(e){this.protocol="freedom",this.tag=e,this.settings={domainStrategy:"UseIP"}}},se=class{tag;selector;fallbackTag;strategy;constructor(e){this.tag=e,this.selector=[],this.fallbackTag=void 0,this.strategy={type:"leastLoad",settings:{expected:1,maxRTT:"1s",tolerance:.05}}}},ie=class{subjectSelector;pingConfig;constructor(e,r,n,o,s,i){this.subjectSelector=[],this.pingConfig={destination:e||"https://connectivitycheck.gstatic.com/generate_204",connectivity:r||void 0,interval:n||"60s",timeout:o||"2s",sampling:s||3,httpMethod:i||void 0}}},Z=class{protocol;tag;listen;port;settings;streamSettings;sniffing;constructor(e,r,n,o){this.protocol="dokodemo-door",this.tag=n,this.listen=o,this.port=r,this.settings={network:"tcp,udp",followRedirect:void 0},e==="tproxy"&&(this.settings.followRedirect=!0,this.streamSettings={sockopt:{tproxy:"tproxy"}},this.sniffing={enabled:!0,destOverride:["http","tls","quic"],routeOnly:!0})}};var Fe={genShuntConf:un,genProxyConf:pn};function un(){let t=I.getShuntSection(),e=new Map,r=new St,n=t.dns,o=new ee(lr(n.defaultStrategy),n.useCache==="1");n.nodes.forEach(function(f){let y=new te(f.type,f.tag,f.server,Number(f.port));e.set(f.tag,y)});let s=t.route,i=[];u.sections("hijpass","proxy_node",function(f){if(f.enabled==="1"){let y=new ct("127.0.0.1",Number(f.socks_port),ae(f.name));f.name===s.defaultProxyNode?i.unshift(y):i.push(y)}}),s.defaultProxyNode==="hijpass-direct"?i.unshift(new xt("direct-out")):i.push(new xt("direct-out")),i.push(new ne("block")),i.push(new oe("dns-out"));let a=[new Z("tproxy",parseInt(t.shuntListenPort,10),"tproxy-in"),new Z("direct",parseInt(t.dnsListenPort,10),"dns-in","::")],p=[new bt(["dns-in"],"dns-out")],g=[],m=e.get(n.defaultDnsNode);if(!m)throw new Error(_('Default global DNS "%s" does not exist').format(n.defaultDnsNode||""));let S=new Map;s.rules.forEach(function(f){if(f.enabled!=="1")return;let y=f.ipVersionSplit==="1",T,C=!1;if(I.getRouteRuleVariants(f).forEach(function(v){let P=ae(v.proxyNode)||i[0].tag,K=I.parseRuleList(v.rule),je=fn(K);if(K.ipVersion=v.ipVersion,!mn(K)&&(hn(v.rule.name,P,K).forEach(de=>{g.push(de)}),P!=="block")){if(y){je&&(T=T||K,C=!0);return}if(je){let de=ae(f.dnsProxyNode)||P;or(f,v.rule.name,de,K,e,m,o,S)}}}),y&&C&&T){let v=ae(f.dnsProxyNode);if(!v)throw new Error(_('Route rule "%s" uses IPv4/IPv6 split and must specify a DNS exit node').format(f.name));or(f,f.name,v,T,e,m,o,S)}});let O=structuredClone(m);return O.tag=ir("default"),O.skipFallback=!1,o.servers.push(O),S.forEach((f,y)=>p.push(new bt(f,y))),r.rules=r.rules.concat(p),r.rules=r.rules.concat(g),{log:new ut(Me(t.logLevel)),inbounds:a,outbounds:i,dns:o,routing:r}}function pn(t){if(t.type===l.LOAD_BALANCE)return dn(t);let e=z.build(t.type,t);return cn(t,e)}function cn(t,e){let r=sr(t),n=[e];return _n(t,e,n),{log:new ut(Me(t.log_level)),inbounds:r,outbounds:n}}function sr(t){let e=new Z("tproxy",Number(t.listen_port),"tproxy-in");e.sniffing=void 0;let r=new Z("direct",Number(t.socks_port),"socks-in");return r.settings={udp:!0},r.protocol="socks",[e,r]}function dn(t){let e=b.resolveLoadBalanceMembers(t),r=new St;r.rules.push(new pt(void 0,["tproxy-in","socks-in"],"slb"));let n=new se("slb");n.selector=[Jt];let o=e.find(p=>p.name===t.fallback_tag)||e[0];n.fallbackTag=o.tag;let s=t.strategy||"leastLoad";n.strategy.type=s,s==="leastLoad"?(t.strategy_expected&&(n.strategy.settings.expected=parseInt(t.strategy_expected,10)),t.strategy_max_rtt&&(n.strategy.settings.maxRTT=t.strategy_max_rtt),t.strategy_tolerance&&(n.strategy.settings.tolerance=parseFloat(t.strategy_tolerance))):n.strategy.settings=void 0,r.balancers.push(n);let i=new ie(t.probe_url||void 0,t.probe_connectivity||void 0,t.probe_interval||void 0,t.probe_timeout||void 0,t.probe_sampling?parseInt(t.probe_sampling,10):void 0,t.probe_http_method||void 0);i.subjectSelector=[Jt];let a=e.map(p=>new ct("127.0.0.1",p.socksPort,p.tag));return{log:new ut(Me(t.log_level)),inbounds:sr(t),outbounds:a,routing:r,burstObservatory:i}}function Me(t){return t==="warn"?"warning":t}function _n(t,e,r){let n=b.resolveUpstreamProxy(t);n&&(gn(e,n.tag),r.push(new ct("127.0.0.1",n.socksPort,n.tag)))}function gn(t,e){t.streamSettings=t.streamSettings||{},t.streamSettings.sockopt=t.streamSettings.sockopt||{},t.streamSettings.sockopt.dialerProxy=e,t.streamSettings.sockopt.domainStrategy="UseIP"}function ir(t){return t+"-dns"}function mn(t){return t.isEmpty("geo")?!0:t.containRuleSet()&&!t.containDomain()&&!t.containIp()&&!t.containGeo()}function fn(t){return t.containDomain()||t.geoSite.length>0}function or(t,e,r,n,o,s,i,a){let p=ir(e);a.has(r)?a.get(r).push(p):a.set(r,[p]);let g=t.dnsNode?o.get(t.dnsNode):s;if(!g)throw new Error(_('Route rule "%s" DNS node "%s" does not exist').format(t.name||e,t.dnsNode||""));let m=structuredClone(g);m.tag=p,m.queryStrategy=lr(t.dnsStrategy),m.domains=ar(n),i.servers.push(m)}function hn(t,e,r){let n=new re(t,e);n.network=r.network,n.protocol=xn(r.protocol);let o=r.port.map(a=>String(a));r.portRange&&r.portRange.length>0&&(o=o.concat(r.portRange)),n.port=o.join(","),n.domain=ar(r),n.domain=n.domain.length>0?n.domain:void 0,n.ip=yn(r),n.ip=n.ip.length>0?n.ip:void 0;let s=[],i=Sn(r.ipVersion);if(n.domain){let a=structuredClone(n);i?a.ip=[i]:a.ip=void 0,s.push(a)}if(n.ip){let a=structuredClone(n);a.domain=void 0,s.push(a)}return!n.domain&&!n.ip&&(i&&(n.ip=[i]),s.push(n)),s}function ar(t){let e=[ke(t.domain,"full:"),ke(t.domainSuffix,"domain:"),t.domainKeyword,ke(t.domainRegex,"regexp:"),t.geoSite];return[].concat(...e.filter(r=>Array.isArray(r)&&r.length>0))}function yn(t){let e=[bn(t.ipCidr,t.ipVersion),t.geoIp];return[].concat(...e.filter(r=>Array.isArray(r)&&r.length>0))}function bn(t,e){return!e||!Array.isArray(t)?t||[]:t.filter(r=>{let n=r.replace(/^!/,"");return n.startsWith("geoip:")||n.startsWith("ext:")?!0:n.indexOf(":")>=0?e===6:/^\d{1,3}(\.\d{1,3}){3}(\/\d+)?$/.test(n)?e===4:!0})}function Sn(t){if(t===4)return"0.0.0.0/0";if(t===6)return"::/0"}function ae(t){return t==="hijpass-block"?"block":t==="hijpass-direct"?"direct-out":t}function lr(t){switch(t){case"4":return"UseIPv4";case"6":return"UseIPv6";case"64":case"46":return"UseIP";default:return}}function xn(t){if(!t)return;let e=t.map(r=>{switch(r){case"http":case"tls":case"quic":case"bittorrent":return r;default:throw new Error("Unsupported xray rule protocol: "+r)}}).filter(r=>r!==void 0);return e.length===0?void 0:e}function ke(t,e){return Array.isArray(t)?t.map(r=>e+r):[]}var k=d,ur={getCoreAdapter:function(t){switch(w(t)){case k.SING_BOX:return yt;case k.XRAY:return Fe;default:throw new Error("Unsupported core: "+t)}}},Ye={genProxyConf:function(t,e){switch(w(t)){case k.SING_BOX:return yt.genProxyConf(e);case k.XRAY:return Fe.genProxyConf(e);default:throw new Error("Unsupported core: "+t)}}};var En={hijpass:{client_dir:"/etc/hijpass/client",shunt_conf:"/etc/hijpass/shunt.json",ip_direct:"/etc/hijpass/rules/ip-direct.txt",ip_proxy:"/etc/hijpass/rules/ip-proxy.txt",domain_direct:"/etc/hijpass/rules/domain-direct.txt",domain_proxy:"/etc/hijpass/rules/domain-proxy.txt",nft:"/etc/hijpass/fw4-template.nft",nft_hook:"/etc/hijpass/hook/nft-hook.sh",dns_hook:"/etc/hijpass/hook/dns-hook.sh"},hijserver:{server_dir:"/etc/hijpass/server"}};function On(t){let e=(t||"").trim().replace(/\r\n/g,`
|
|
`);return e?e+`
|
|
`:""}function He(t,e="hijpass"){let r=u.get_first(e,e,t);if(r)return r;let n=En[e]?.[t];return n||(console.log(t+" path is empty"),"")}function Nn(t,e,r,n){if(!e)throw new Error(_("Configuration file directory is empty"));let s=n?.section?.formvalue?.(r,"name")||u.get(t,r,"name")||r;return e+"/"+s+"-"+r+".json"}function Tn(t){let e=t.name||t[".name"];return He("client_dir")+"/"+e+"-"+t[".name"]+".json"}function vn(t){let e=t.name||t[".name"];return He("server_dir","hijserver")+"/"+e+"-"+t[".name"]+".json"}var M={normalizeFileContent:On,getFilePath:He,getNodeConfigFilePath:Nn,getProxyConfigFilePath:Tn,getServerConfigFilePath:vn};async function Cn(t){async function e(r,n,o){let s=o?[r,n,o]:[r,n];await D.exec("/usr/lib/hijpass/rm.sh",s)}if(t?.hijpass){for(let r of t.hijpass)if(r.length===2&&r[0]==="remove"&&await e("proxy",r[1]),r.length===4&&r[0]==="set"&&r[2]==="name"){let n=u.get("hijpass",r[1]),o=n?M.getProxyConfigFilePath(n):void 0;await e("proxy",r[1],o)}}if(t?.hijserver){for(let r of t.hijserver)if(r.length===2&&r[0]==="remove"&&await e("server",r[1]),r.length===4&&r[0]==="set"&&r[2]==="name"){let n=u.get("hijserver",r[1]),o=n?M.getServerConfigFilePath(n):void 0;await e("server",r[1],o)}}}var pr={cleanupChangedNodeFiles:Cn};function Pn(t,e){if(!(Array.isArray(e)&&e.length===0)&&e!==null&&!(typeof e=="number"&&!Number.isFinite(e))&&!(typeof e=="string"&&!e.trim()))return e}var dt={omitEmptyReplacer:Pn};var cr={getShuntConfData:function(){if(u.get_first("hijpass","shunt","enabled")==="0"||u.get_first("hijpass","shunt","config_type")!=="tmpl")return"";let r=u.get_first("hijpass","shunt","type");return JSON.stringify(ur.getCoreAdapter(r).genShuntConf(),dt.omitEmptyReplacer,2)}};var Ve=class{container=null;notifications=new Map;notificationId=0;autoCloseTimers=new Map;constructor(){this.initContainer()}initContainer(){this.container||(this.container=document.createElement("div"),this.container.id="notification-container",this.container.style.cssText=`
|
|
position: fixed;
|
|
top: 20px;
|
|
right: 20px;
|
|
z-index: 9999;
|
|
pointer-events: none;
|
|
`,document.body.appendChild(this.container))}getTypeConfig(e){let r={success:{bgColor:"#4caf50",borderColor:"#45a049",icon:"\u2713",textColor:"#fff"},error:{bgColor:"#f44336",borderColor:"#da190b",icon:"\u2715",textColor:"#fff"},warning:{bgColor:"#ff9800",borderColor:"#e68900",icon:"\u26A0",textColor:"#fff"},info:{bgColor:"#2196f3",borderColor:"#0b7dda",icon:"\u2139",textColor:"#fff"}};return r[e]||r.info}show(e){let{message:r,title:n,content:o,type:s="info",duration:i=3e3,icon:a=!1}=e;this.initContainer();let p=`notification-${++this.notificationId}`,g=this.getTypeConfig(s),m=n||r,S=o,O=document.createElement("div");if(O.id=p,O.style.cssText=`
|
|
background-color: ${g.bgColor};
|
|
border-left: 4px solid ${g.borderColor};
|
|
color: ${g.textColor};
|
|
padding: 16px 20px;
|
|
margin-bottom: 10px;
|
|
border-radius: 4px;
|
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
|
display: flex;
|
|
align-items: flex-start;
|
|
gap: 12px;
|
|
min-width: 300px;
|
|
max-width: 400px;
|
|
word-break: break-word;
|
|
animation: slideInRight 0.3s ease-out;
|
|
pointer-events: auto;
|
|
transition: all 0.3s ease;
|
|
font-size: 14px;
|
|
font-weight: 500;
|
|
`,a){let y=document.createElement("span");y.style.cssText=`
|
|
font-size: 20px;
|
|
font-weight: bold;
|
|
flex-shrink: 0;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 24px;
|
|
height: 24px;
|
|
margin-top: 2px;
|
|
`,y.textContent=g.icon,O.appendChild(y)}let N=document.createElement("div");if(N.style.cssText=`
|
|
flex: 1;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 4px;
|
|
`,m){let y=document.createElement("div");y.style.cssText=`
|
|
font-weight: 600;
|
|
font-size: 14px;
|
|
line-height: 1.4;
|
|
`,y.textContent=m,N.appendChild(y)}if(S){let y=document.createElement("div");y.style.cssText=`
|
|
font-weight: 400;
|
|
font-size: 13px;
|
|
line-height: 1.4;
|
|
opacity: 0.9;
|
|
white-space: pre-line;
|
|
`,y.textContent=S,N.appendChild(y)}O.appendChild(N);let f=document.createElement("button");if(f.style.cssText=`
|
|
background: none;
|
|
border: none;
|
|
color: ${g.textColor};
|
|
cursor: pointer;
|
|
font-size: 20px;
|
|
padding: 0;
|
|
width: 24px;
|
|
height: 24px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
flex-shrink: 0;
|
|
opacity: 0.7;
|
|
transition: opacity 0.2s;
|
|
`,f.innerHTML="\xD7",f.onmouseover=()=>f.style.opacity="1",f.onmouseout=()=>f.style.opacity="0.7",f.onclick=y=>{y.stopPropagation(),this.remove(p)},O.appendChild(f),this.container.appendChild(O),this.notifications.set(p,O),i>0){let y=setTimeout(()=>{this.remove(p)},i);this.autoCloseTimers.set(p,y),O.onmouseenter=()=>{let T=this.autoCloseTimers.get(p);T&&(clearTimeout(T),this.autoCloseTimers.delete(p))},O.onmouseleave=()=>{if(this.notifications.has(p)){let T=setTimeout(()=>{this.remove(p)},i);this.autoCloseTimers.set(p,T)}}}return p}remove(e){let r=this.notifications.get(e);if(!r)return;let n=this.autoCloseTimers.get(e);n&&(clearTimeout(n),this.autoCloseTimers.delete(e)),r.style.animation="slideOutRight 0.3s ease-in",r.style.opacity="0",setTimeout(()=>{r.remove(),this.notifications.delete(e)},300)}success(e,r){return this.show({message:e,type:"success",duration:r})}error(e,r){return this.show({message:e,type:"error",duration:r})}warning(e,r){return this.show({message:e,type:"warning",duration:r})}info(e,r){return this.show({message:e,type:"info",duration:r})}clear(){this.notifications.forEach((e,r)=>{this.remove(r)})}},wn=new Ve;function dr(){if(document.getElementById("notification-styles"))return;let t=document.createElement("style");t.id="notification-styles",t.textContent=`
|
|
@keyframes slideInRight {
|
|
from {
|
|
transform: translateX(400px);
|
|
opacity: 0;
|
|
}
|
|
to {
|
|
transform: translateX(0);
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
@keyframes slideOutRight {
|
|
from {
|
|
transform: translateX(0);
|
|
opacity: 1;
|
|
}
|
|
to {
|
|
transform: translateX(400px);
|
|
opacity: 0;
|
|
}
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
#notification-container {
|
|
left: 10px !important;
|
|
right: 10px !important;
|
|
top: 10px !important;
|
|
}
|
|
|
|
#notification-container > div {
|
|
min-width: auto !important;
|
|
max-width: 100% !important;
|
|
}
|
|
}
|
|
`,document.head.appendChild(t)}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",dr):dr();var tt=wn;var F={show:function(t){return tt.show(t)},success:function(t,e,r){return tt.show({title:t,content:e,type:"success",duration:r})},error:function(t,e,r){return tt.show({title:t,content:e,type:"error",duration:r})},warning:function(t,e,r){return tt.show({title:t,content:e,type:"warning",duration:r})},info:function(t,e,r){return tt.show({title:t,content:e,type:"info",duration:r})},clear:function(){return tt.clear()}};var Be={createProxyConfigFromSection:function(t){let e=t.type,r;switch(e){case l.LOAD_BALANCE:r=new Wt;break;case l.HYSTERIA2:r=new qt;break;case l.SHADOWSOCKS:r=new Kt;break;case l.TUIC:r=new zt;break;case l.SHADOWTLS:r=new $t;break;case l.VLESS:r=new Qt;break;case l.CUSTOM:r=new jt;break;default:return null}return Object.keys(t).forEach(n=>{n!==".type"&&n!==".name"&&n!==".anonymous"&&Reflect.set(r,n,t[n])}),r.cfgid=t[".name"],r}};function An(t){return/^(\d{1,3}\.){3}\d{1,3}$/.test(t)||/^[0-9a-fA-F:]+$/.test(t)}function Rn(t){return Array.isArray(t?.outbounds)?t.outbounds[0]:void 0}function Ln(t,e){let r=Rn(t);return r?r.server?(r.server=e,!0):r.settings?.address?(r.settings.address=e,!0):r.settings?.servers?.[0]?.address?(r.settings.servers[0].address=e,!0):r.settings?.vnext?.[0]?.address?(r.settings.vnext[0].address=e,!0):!1:!1}async function In(t,e){if(!t.upstream_proxy_node||!t.server||An(t.server))return;let r=await D.exec_direct("/usr/lib/hijpass/net.sh",["resolve",t.server],"json");if(!r?.address)throw new Error(_("Resolve proxy server failed: %s").format(t.server));if(!Ln(e,r.address))throw new Error(_("Unsupported proxy config server field: %s").format(t.name||t.server))}async function Dn(){let t=[];if(u.sections("hijpass","proxy_node",r=>{let n=Be.createProxyConfigFromSection(r);if(r.enabled!=="1"||!n||n.type===l.CUSTOM||n.core===k.CUSTOM)return;let o=Ye.genProxyConf(n.core,n);t.push(In(n,o).then(()=>{let s=typeof o=="string"?o:JSON.stringify(o,dt.omitEmptyReplacer,2);return D.write(M.getProxyConfigFilePath(r),s)}))}),t.length===0)return;(await Promise.allSettled(t)).forEach(r=>{if(r.status==="rejected")throw new Error(r.reason?.message||String(r.reason))})}function Un(t){let e=Be.createProxyConfigFromSection(t);if(e)return Ye.genProxyConf(e.core,e)}var le={writeGeneratedProxyConfigs:Dn,generateProxyConfigFromSection:Un};var j={setAnonymousGridSectionMembers:function(t){j.setGridSectionMembers(t),t.anonymous=!0,t.sectiontitle=function(e){return u.get("hijpass",e,"name")||u.get("hijpass",e,"tag")||e}},setGridSectionMembers:function(t){t.anonymous=!1,t.addremove=!0,t.sortable=!0,t.nodescriptions=!0,t.rowcolors=!0},setAnonymousSection:function(t){t.anonymous=!0,t.addremove=!1},simpleHash:function(t){let e=0;t=t||"";for(let r=0;r<t.length;r++)e=(e<<5)-e+t.charCodeAt(r),e|=0;return e},setEditorOptionMembers:function(t,e,r){t.rows=30,t.load=function(o){return D.trimmed(e)};async function n(o,s){let i=String(j.simpleHash(s)),a=u.get("hijpass",o,r);i!==a&&(u.set("hijpass",o,r,i),await D.write(e,(s||"").trim().replace(/\r\n/g,`
|
|
`)+`
|
|
`))}return t.write=n,t.remove=n,t.monospace=!0,t},setConfContentOptionMembers:function(t,e,r){t.monospace=!0,t.rows=20,t.load=async function(n){return L.resolveDefault(D.read(M.getNodeConfigFilePath(e,r,n)),"")},t.write=async function(n,o){let s=M.normalizeFileContent(o);await D.write(M.getNodeConfigFilePath(e,r,n,this),s),u.set(e,n,"custom_conf_hash",String(j.simpleHash(s)))},t.remove=async function(n){await D.write(M.getNodeConfigFilePath(e,r,n,this),""),u.set(e,n,"custom_conf_hash","")}},createTextOption:function(t,e,r,n,o,s){let i=t.taboption(e,c.TextValue,r,n,o);return j.setEditorOptionMembers(i,s,r),i},createLogFlagOption:function(t,e,r){let n=u.get_first(e,e,"log_dir"),o=r?t.taboption(r,c.Flag,"log_enabled",_("Record Logs")):t.option(c.Flag,"log_enabled",_("Record Logs"));return o.modalonly=!0,o.write=function(s,i){let a="shunt.log",p=u.get(e,s,"name");p&&(a=p+"-"+s+".log"),u.set(e,s,"log_path",n+"/"+a)},o.remove=function(s){u.unset(e,s,"log_path")},o.load=function(s){return u.get(e,s,"log_path")?"1":"0"},o.rmempty=!0,o},appendEnabledNodeListenPorts:function(t){u.sections("hijpass","proxy_node",e=>{if(e.listen_port&&e.enabled==="1"){let r=_("Proxy node %s: %s").format(e.name,e.listen_port);t.value(e.listen_port,r)}})},loadProxyNodeOptions:function(t,e=!0){t.load=function(r){return delete this.keylist,delete this.vallist,this.value("hijpass-direct",_("Direct")),e&&this.value("hijpass-block",_("Block")),u.sections("hijpass","proxy_node",function(n){if(n.name&&n.enabled==="1"){let o=n.name;n.socks_port&&(o+=" ("+n.socks_port+")"),this.value(n.name,o)}}.bind(this)),c.ListValue.prototype.load.apply(this,[r])}},getEnabledProxyNodeOptions:function(t=!0){let e=[];return t&&(e.push({value:"hijpass-direct",label:_("Direct")}),e.push({value:"hijpass-block",label:_("Block")})),u.sections("hijpass","proxy_node",r=>{if(r.name&&r.enabled==="1"){let n=r.name;r.socks_port&&(n+=" ("+r.socks_port+")"),e.push({value:r.name,label:n})}}),e}};function mr(t){let e=Number(t);return Number.isInteger(e)&&e>0&&e<=65535}function _r(){let t=u.get_first("hijpass","dns"),e=t?.cdg_port||"";return{available:t?.dns_service==="chinadns-ng"&&mr(e),port:e}}function gr(){let t=u.get_first("hijpass","shunt"),e=t?.dns_listen_port||"";return{available:t?.enabled!=="0"&&mr(e),port:e}}function kn(t,e){let r=t;return e.port&&(r+=": "+e.port),e.available||(r+=" - "+_("Not available")),r}var ue={getSource:function(){return u.get_first("hijpass","firewall","dns_forward")||gt.NONE},getPreRoutingTarget:_r,getRoutingTarget:gr,getTargetLabel:kn,validateSource:function(t){return!t||t===gt.NONE?!0:t===gt.PRE_ROUTING?_r().available?!0:_("Independent DNS is unavailable or has no valid listen port"):t===gt.ROUTING?gr().available?!0:_("Core DNS is disabled or has no valid listen port"):_("Unknown DNS forwarding source: %s").format(t)}};var fr=["http","tls","quic","bittorrent"],Fn=["hysteria2","vless"];function Mn(t){return t?Array.isArray(t)?t.filter(e=>e):[t]:[]}function Yn(t){return t==="hijpass-direct"||t==="hijpass-block"}function V(t,e){return e.length===0?!0:(F.warning(t,e.join(`
|
|
`),8e3),!1)}function Hn(){return u.get_first("hijpass","shunt","enabled")!=="0"&&u.get_first("hijpass","shunt","config_type")==="tmpl"}function Vn(){let t=new Set;u.sections("hijpass","proxy_node",function(s){s.name&&t.add(s.name)});let e=[];function r(s,i){s&&!Yn(s)&&!t.has(s)&&e.push(i)}let n=u.get_first("hijpass","shunt","default_proxy_node");n?r(n,_('Default global exit "%s" does not exist').format(n)):e.push(_("Default global exit is not configured"));let o=u.get_first("hijpass","shunt","ruleset_out_node");return r(o,_('Rule-set exit "%s" does not exist').format(o)),u.sections("hijpass","shunt_route_rule",function(s){if(s.enabled!=="1")return;let i=s.name||s[".name"];if(s.ip_version_split==="1"){s.proxy_node_v4?r(s.proxy_node_v4,_('Route rule "%s" IPv4 proxy node "%s" does not exist').format(i,s.proxy_node_v4)):e.push(_('Route rule "%s" IPv4 proxy node is not configured').format(i)),s.proxy_node_v6?r(s.proxy_node_v6,_('Route rule "%s" IPv6 proxy node "%s" does not exist').format(i,s.proxy_node_v6)):e.push(_('Route rule "%s" IPv6 proxy node is not configured').format(i));return}s.proxy_node?r(s.proxy_node,_('Route rule "%s" proxy node "%s" does not exist').format(i,s.proxy_node)):e.push(_('Route rule "%s" proxy node is not configured').format(i))}),V(_("Configuration contains missing proxy nodes"),e)}function Bn(){let t=new Set;if(u.sections("hijpass","proxy_node",function(o){o.enabled!=="1"&&o.name&&t.add(o.name)}),t.size===0)return!0;let e=[],r=u.get_first("hijpass","shunt","default_proxy_node");r&&t.has(r)&&e.push(_('Default global exit "%s" is not enabled').format(r));let n=u.get_first("hijpass","shunt","ruleset_out_node");return n&&t.has(n)&&e.push(_('Rule-set exit "%s" is not enabled').format(n)),u.sections("hijpass","shunt_route_rule",function(o){if(o.enabled!=="1")return;let s=o.name||o[".name"];o.ip_version_split==="1"?(o.proxy_node_v4&&t.has(o.proxy_node_v4)&&e.push(_('Route rule "%s" IPv4 proxy node "%s" is not enabled').format(s,o.proxy_node_v4)),o.proxy_node_v6&&t.has(o.proxy_node_v6)&&e.push(_('Route rule "%s" IPv6 proxy node "%s" is not enabled').format(s,o.proxy_node_v6))):o.proxy_node&&t.has(o.proxy_node)&&e.push(_('Route rule "%s" proxy node "%s" is not enabled').format(s,o.proxy_node)),o.dns_proxy_node&&t.has(o.dns_proxy_node)&&e.push(_('Route rule "%s" DNS exit node "%s" is not enabled').format(s,o.dns_proxy_node))}),V(_("Configuration contains disabled nodes"),e)}function Xn(){let t=b.getProxySectionMap(),e=[];return t.forEach(r=>{if(r.enabled!=="1"||r.type!==l.LOAD_BALANCE)return;let n=b.getProxyName(r),o=w(r.core);o!==d.SING_BOX&&o!==d.XRAY&&e.push(_('Load balancing node "%s" has an unsupported backend core').format(n));let s=b.normalizeProxyNodeList(r.member_node);if(s.length===0){e.push(_('Load balancing node "%s" has no member nodes').format(n));return}let i=s.filter((a,p)=>s.indexOf(a)!==p);i.length>0&&e.push(_('Load balancing node "%s" contains duplicate member nodes: %s').format(n,Array.from(new Set(i)).join(", "))),s.forEach(a=>{if(a===n){e.push(_('Load balancing node "%s" cannot include itself').format(n));return}let p=t.get(a);if(!p){e.push(_('Load balancing node "%s" member node "%s" does not exist').format(n,a));return}p.type===l.LOAD_BALANCE&&e.push(_('Load balancing node "%s" cannot contain load balancing member "%s"').format(n,a)),p.enabled!=="1"&&e.push(_('Load balancing node "%s" member node "%s" is not enabled').format(n,a)),b.isPort(p.socks_port)||e.push(_('Load balancing node "%s" member node "%s" has no valid SOCKS port configured').format(n,a))}),r.fallback_tag&&s.indexOf(r.fallback_tag)<0&&e.push(_('Load balancing node "%s" fallback node "%s" is not a member').format(n,r.fallback_tag))}),V(_("Configuration contains invalid load balancing nodes"),e)}function Gn(){let t=b.getProxySectionMap(),e=[];t.forEach(n=>{if(n.enabled!=="1"||n.type===l.LOAD_BALANCE||!n.upstream_proxy_node)return;let o=b.getProxyName(n),s=n.upstream_proxy_node,i=t.get(s);if(!i){e.push(_('Proxy node "%s" upstream proxy node "%s" does not exist').format(o,s));return}i.enabled!=="1"&&e.push(_('Proxy node "%s" upstream proxy node "%s" is not enabled').format(o,s)),b.isPort(i.socks_port)||e.push(_('Proxy node "%s" upstream proxy node "%s" has no valid SOCKS port configured').format(o,s));let a=b.collectProxyChain(o,t);!a.cycle&&a.chain.length>Te&&e.push(_('Proxy node "%s" nesting chain exceeds %d nodes: %s').format(o,Te,a.chain.join(" -> ")))});let r=b.findProxyDependencyCycle(t);return r&&e.push(_("Proxy node dependency chain has a cycle: %s").format(r.join(" -> "))),V(_("Configuration contains invalid upstream proxy nodes"),e)}function Wn(){let t=new Set,e=new Set;u.sections("hijpass","shunt_dns_node",function(i){i.tag&&(t.add(i.tag),i.enabled==="0"&&e.add(i.tag))});let r=[],n=[];function o(i,a){if(i){if(!t.has(i)){r.push(_('%s "%s" does not exist').format(a,i));return}e.has(i)&&n.push(_('%s "%s" is not enabled').format(a,i))}}let s=u.get_first("hijpass","shunt","default_dns_node");return s?o(s,_("Default global DNS")):r.push(_("Default global DNS is not configured")),o(u.get_first("hijpass","shunt","ruleset_dns_node"),_("Rule-set DNS")),u.sections("hijpass","shunt_route_rule",function(i){i.enabled==="1"&&o(i.dns_node,_('Route rule "%s" DNS node').format(i.name||i[".name"]))}),V(_("Configuration contains missing DNS nodes"),r)&&V(_("Configuration contains disabled DNS nodes"),n)}function jn(){let t=new Set;u.sections("hijpass","proxy_node",function(o){o.name&&t.add(o.name)});let e=u.get_first("hijpass","shunt","type"),r=u.get_first("hijpass","shunt","ruleset_convert"),n=[];return I.getRouteSection().rules.forEach(function(o){if(o.enabled!=="1")return;let s=o.dnsProxyNode,i=o.name||_("Unnamed Rule");if(qn(o,e,r)&&!s){n.push(_('Route rule "%s" uses IPv4/IPv6 split and must specify a DNS exit node').format(i));return}s&&s!=="hijpass-direct"&&!t.has(s)&&n.push(_('Route rule "%s" DNS exit node "%s" does not exist').format(i,s))}),V(_("Configuration contains invalid DNS exit nodes"),n)}function qn(t,e,r){if(t.ipVersionSplit!=="1")return!1;let n=I.parseRuleList(t);return e===k.XRAY?n.containDomain()||n.geoSite.length>0:n.containDomain()||n.containRuleSet()||r==="1"&&n.geoSite.length>0}function Kn(){let t=new Set;u.sections("hijpass","proxy_node",function(i){i.enabled==="1"&&i.listen_port&&t.add(i.listen_port)});let e=u.get_first("hijpass","firewall","proxy_port"),r=u.get_first("hijpass","firewall","shunt_port"),n=u.get_first("hijpass","shunt","enabled")!=="0",o=u.get_first("hijpass","shunt","shunt_listen_port"),s=[];return e&&!t.has(e)&&s.push(_("Firewall proxy port %s does not reference an enabled proxy node").format(e)),r&&!t.has(r)&&!(n&&o===r)&&s.push(_("Firewall shunt port %s does not reference an enabled proxy node or shunt service").format(r)),V(_("Configuration conflict"),s)}function zn(){let t=ue.validateSource(ue.getSource());return t===!0||V(_("Configuration conflict"),[t])}function $n(){if(u.get_first("hijpass","dns","dns_service")!=="chinadns-ng")return!0;let e=ue.getRoutingTarget(),r=e.port?"127.0.0.1#"+e.port:"",n=[];return[["direct_dns",_("Direct Domain DNS")],["proxy_dns",_("Proxy Domain DNS")]].forEach(([o,s])=>{let i=u.get_first("hijpass","dns",o);!i||i==="dnsmasq"||i==="system"||i==="custom"||(!e.available||i!==r)&&n.push(_("%s references an unavailable Core DNS port").format(s))}),V(_("Configuration conflict"),n)}function Qn(){if(u.get_first("hijpass","shunt","type")!==k.XRAY)return!0;let e=[];return u.sections("hijpass","shunt_route_rule",function(r){if(r.enabled!=="1")return;let n=Mn(r.protocol).filter(o=>fr.indexOf(o)===-1);n.length>0&&e.push(_('Route rule "%s" contains protocols unsupported by Xray: %s').format(r.name||r[".name"],n.join(", ")))}),e.length>0?(F.warning(_("Unsupported Xray protocol configuration"),e.join(`
|
|
`)+`
|
|
`+_("Xray route protocol only supports: %s").format(fr.join(", ")),8e3),!1):!0}function Jn(){if(u.get_first("hijpass","shunt","type")!==k.XRAY)return!0;let e=[];return u.sections("hijpass","shunt_dns_node",function(r){r.enabled!=="0"&&r.type==="tls"&&e.push(_('DNS node "%s" uses TLS, which is only supported by sing-box').format(r.tag||r[".name"]))}),V(_("Unsupported Xray DNS configuration"),e)}function Zn(){let t=[];return u.sections("hijpass","proxy_node",function(e){e.enabled!=="1"||w(e.core)!==k.XRAY||e.tls_insecure!=="1"||Fn.indexOf(e.type)!==-1&&t.push(_('Proxy node "%s" enables insecure TLS, which is not supported by current Xray').format(e.name||e[".name"]))}),V(_("Unsupported Xray TLS configuration"),t)}function to(t,e,r){return new Promise(n=>{R.showModal(t,[E("div",{style:["box-sizing:border-box","width:100%","margin:0 0 14px 0","padding:14px 16px","border-radius:4px","background:rgba(127,127,127,0.08)","line-height:1.55"].join(";")},[E("div",{style:"margin:0 0 12px 0"},e),E("div",{style:"display:flex;flex-direction:column;gap:6px;margin:0"},r.map(o=>E("div",{style:"margin:0;word-break:break-word"},o)))]),E("div",{style:"display:flex;justify-content:flex-end;gap:10px;margin:0"},[E("button",{class:"btn cbi-button",click:function(o){o.preventDefault(),R.hideModal(),n(!1)}},_("Cancel")),E("button",{class:"btn cbi-button-action",click:function(o){o.preventDefault(),R.hideModal(),n(!0)}},_("Continue Apply"))])])})}function eo(t,e,r){let n=I.parseRuleList(t),o=t.name||t[".name"]||_("Unnamed Rule"),s=r==="1";if(e===k.XRAY)return n.isEmpty("geo")?_('Route rule "%s" has no valid match conditions for Xray').format(o):n.containRuleSet()&&!n.containDomain()&&!n.containIp()&&!n.containGeo()?_('Route rule "%s" only contains rule-set target conditions unsupported by Xray').format(o):null;if(e===k.SING_BOX){if(!s&&n.containGeo()&&(n.geoSite=[],n.geoIp=[],!n.containDomain()&&!n.containIp()&&!n.containRuleSet()))return _('Route rule "%s" has no target conditions for sing-box after removing unconverted geosite/geoip').format(o);if(n.isEmpty("set")&&!(s&&n.containGeo()))return _('Route rule "%s" has no valid match conditions for sing-box').format(o)}return null}function ro(){let t=u.get_first("hijpass","shunt","type"),e=u.get_first("hijpass","shunt","ruleset_convert"),r=[];return I.getRouteSection().rules.forEach(n=>{if(n.enabled!=="1")return;let o=eo(n,t,e);o&&r.push(o)}),r.length>0?to(_("Some route rules will be skipped"),_("The following rules have no valid configuration for the current core and options, so they will not be written to the final configuration. Continue applying the configuration?"),r):!0}var hr={runSaveApplyPrechecks:async function(){return!Gn()||!Xn()||!Zn()||!Kn()||!zn()||!$n()?!1:Hn()?Vn()&&Bn()&&Wn()&&jn()&&await ro()&&Qn()&&Jn():!0}};function no(){return u.get_first("hijpass","hijpass","enabled")==="0"}var yr={genHandleSaveApply:function(){return async function(t,e){try{if(await this.handleSave(t),no()){await u.save(),await R.changes.apply(e=="0");return}if(!await hr.runSaveApplyPrechecks())return;if(u.get_first("hijpass","shunt","type")===k.SING_BOX&&u.get_first("hijpass","shunt","ruleset_convert")==="1"&&yt.writeGeoRule(),u.get_first("hijpass","shunt","config_type")==="tmpl"){let s=cr.getShuntConfData();await D.write(M.getFilePath("shunt_conf"),s),u.set_first("hijpass","shunt","shunt_hash",s?String(j.simpleHash(s)):"-1")}await u.save();let o=await u.changes();await pr.cleanupChangedNodeFiles(o),await le.writeGeneratedProxyConfigs(),await R.changes.apply(e=="0")}catch(r){console.log(r),F.error(_("Configuration Apply Failed"),_(r.message),5e3)}}}};var br=poll;var Sr=rpc;var Xe=Sr.declare({object:"service",method:"list",params:["name"],expect:{"":{}}}),Ge={};function Er(t){return t||"all"}function xr(t){return"service_status_"+Er(t)}var q={getServiceInstances:async function(t){return(await Xe(t))?.[t]?.instances??{}},getServiceInfo:async function(){let t=await Xe("hijpass"),r=(await Xe("hijserver"))?.hijserver?.instances??{},n=t?.hijpass?.instances??{};return{proxyInfos:q.getInstanceName("hijpass","proxy_node").map(o=>n?.[o]??void 0).filter(o=>o),shuntInfo:n?.[q.getInstanceName("hijpass","shunt")[0]]??void 0,dnsInfo:n?.[q.getInstanceName("hijpass","dns")[0]]??void 0,serverInfos:q.getInstanceName("hijserver","server_node").map(o=>r?.[o]??void 0).filter(o=>o)}},getInstanceName:function(t,e){return u.sections(t,e).map(r=>{let n=r[".name"],o=r.name??r.tag??r.dns_service;return o||(o=e),n+"-"+o})},renderServiceStatusText:function(t,e){let r="",n='<em><span style="color:%s"><strong>%s %s</strong></span></em>',o=(t?.proxyInfos??[]).filter(g=>g?.running).length>0,s=(t?.serverInfos??[]).filter(g=>g?.running).length>0,i=t?.shuntInfo?.running??!1,a=t?.dnsInfo?.running??!1,p=function(g,m){return m?n.format("green",g,_("Running")):n.format("red",g,_("Not Running"))};switch(e){case"dns":r+=p(_("Independent DNS"),a);break;case"shunt":r+=p(_("Proxy Routing"),i);break;case"server":r+=p(_("Local Server"),s);break;case"proxy":r+=p(_("Proxy Node"),o);break;default:r+=p(_("Proxy Node"),o),r+=p(_("Proxy Routing"),i),r+=p(_("Independent DNS"),a),r+=p(_("Local Server"),s)}return r},refreshServiceStatus:function(t){let e=Er(t);if(!Ge[e]){let r=xr(t);Ge[e]=async function(){let n=await L.resolveDefault(q.getServiceInfo()),o=document.getElementById(r);o&&(o.innerHTML=q.renderServiceStatusText(n,t))}}return Ge[e]},renderServiceStatus:function(t){return function(){let e=q.refreshServiceStatus(t);return br.add(e),window.setTimeout(e,0),E("div",{class:"hijpass-service-status"},E("fieldset",{class:"cbi-section"},[E("p",{id:xr(t),style:"display: flex; gap: 1rem;"},_("Fetching Status..."))]))}},createStatusSection:function(t,e){let r=t.section(c.TypedSection);return r.anonymous=!0,r.render=q.renderServiceStatus(e),r}};var Y={createTagValidator:function(t,e,r){return function(n,o){let s=Y.validateNameFormat(n,o);if(s!==!0)return s;let i=!1;return u.sections(t,e,function(a){a[".name"]!==n&&a[r]===o&&(i=!0)}),i?_("%s already exists, use another %s").format(r==="tag"?_("Tag"):_("Name"),r==="tag"?_("Tag"):_("Name")):!0}},getUsedPorts:function(){let t=[];u.sections("hijpass","proxy_node",n=>{n.listen_port&&t.push(Number(n.listen_port)),n.socks_port&&t.push(Number(n.socks_port))}),u.sections("hijserver","server_node",n=>{n.listen_port&&t.push(Number(n.listen_port))});let e=u.get_first("hijpass","shunt");e?.shunt_listen_port&&t.push(Number(e.shunt_listen_port)),e?.dns_listen_port&&t.push(Number(e.dns_listen_port));let r=u.get_first("hijpass","dns");return r?.cdg_port&&t.push(Number(r.cdg_port)),t},getUsedPortsExcluding:function(t){let e=[];u.sections("hijpass","proxy_node",o=>{o[".name"]!==t&&(o.listen_port&&e.push(Number(o.listen_port)),o.socks_port&&e.push(Number(o.socks_port)))}),u.sections("hijserver","server_node",o=>{o.listen_port&&e.push(Number(o.listen_port))});let r=u.get_first("hijpass","shunt");r?.shunt_listen_port&&e.push(Number(r.shunt_listen_port)),r?.dns_listen_port&&e.push(Number(r.dns_listen_port));let n=u.get_first("hijpass","dns");return n?.cdg_port&&e.push(Number(n.cdg_port)),e},findAvailablePort:function(t,e=[]){let r=[...Y.getUsedPorts(),...e],n=t;for(let o=0;o<1e3;o++,n++)if(!r.includes(n))return n;return t},validatePortConflict:function(t,e){let r=u.get_first("hijpass","shunt");if(r&&r[".name"]!==t&&(r.dns_listen_port===e||r.shunt_listen_port===e))return _("Port %s is used by shunt configuration").format(e);let n=u.get_first("hijpass","dns");if(n&&n[".name"]!==t&&n.cdg_port===e)return _("Port %s is used by DNS configuration").format(e);let o=u.sections("hijpass","proxy_node");for(let i=0;i<o.length;i++){let a=o[i];if(a[".name"]!==t&&(a.listen_port===e||a.socks_port===e))return _('Port %s is used by proxy node "%s"').format(e,a.name)}let s=u.sections("hijserver","server_node");for(let i=0;i<s.length;i++){let a=s[i];if(a[".name"]!==t&&a.listen_port===e)return _('Port %s is used by server node "%s"').format(e,a.name)}return!0},validateNameFormat:function(t,e){return!e||e===""?_("Node name cannot be empty"):/^[a-zA-Z0-9_-]+$/.test(e)?!0:_("Node name can only contain letters, numbers, underscores, and hyphens")}};var G={[l.HYSTERIA2]:"443",[l.SHADOWSOCKS]:"8388",[l.TUIC]:"443",[l.SHADOWTLS]:"443",[l.VLESS]:"443"};function oo(t){let e=t.trim(),r=e.match(/^([a-z][a-z0-9+.-]*):\/\//i);if(!r)throw new Error(_("Invalid share link"));let n=r[1].toLowerCase(),o=e.slice(r[0].length),s="",i=o.indexOf("#");i>=0&&(s=_t(o.slice(i+1)),o=o.slice(0,i));let a="",p=o.indexOf("?");return p>=0&&(a=o.slice(p+1),o=o.slice(0,p)),{scheme:n,body:o,query:new URLSearchParams(a),tag:s}}function _t(t){try{return decodeURIComponent(t)}catch{return t}}function B(t){return encodeURIComponent(t)}function Ot(t){return t?"#"+B(t):""}function Nt(t){return t.indexOf(":")>=0&&!t.startsWith("[")?"["+t+"]":t}function so(t){let e=t.indexOf("/");return e>=0?t.slice(0,e):t}function Tt(t){let e=so(t),r=e.lastIndexOf("@"),n=r>=0?_t(e.slice(0,r)):"",o=r>=0?e.slice(r+1):e;if(o.startsWith("[")){let i=o.indexOf("]");if(i<0)throw new Error(_("Invalid server address"));let a=o.slice(1,i),p=o.slice(i+1).replace(/^:/,"");return{userinfo:n,host:a,port:p}}let s=o.lastIndexOf(":");return s>0&&o.indexOf(":")===s?{userinfo:n,host:_t(o.slice(0,s)),port:_t(o.slice(s+1))}:{userinfo:n,host:_t(o),port:""}}function x(t,...e){for(let r of e){let n=t.get(r);if(n!=null&&n!=="")return n}return""}function et(t){return/^(1|true|yes|on)$/i.test(t||"")}function vt(t){let e=new URLSearchParams;Object.keys(t).forEach(n=>{let o=t[n];o!=null&&o!==""&&e.set(n,o)});let r=e.toString();return r?"?"+r:""}function io(t){if(!t)return{path:"",maxEarlyData:""};try{let e=new URL(t,"http://hijpass.local"),r=e.searchParams.get("ed")||"";e.searchParams.delete("ed");let n=e.searchParams.toString();return{path:e.pathname+(n?"?"+n:""),maxEarlyData:r}}catch{return{path:t,maxEarlyData:""}}}function ao(t,e){if(!t||!e)return t;let r=t.indexOf("#"),n=r>=0?t.slice(0,r):t,o=r>=0?t.slice(r):"",s=n.indexOf("?")>=0?"&":"?";return n+s+"ed="+encodeURIComponent(e)+o}function lo(t){return Array.isArray(t)?t.filter(e=>e!=null&&e!=="").map(e=>String(e)):t==null||t===""?[]:[String(t)]}function Ct(t,e){let r=String(t||"").match(/\d+/);return r?r[0]:e}function Or(t){let e=t.trim().replace(/-/g,"+").replace(/_/g,"/");e+="=".repeat((4-e.length%4)%4);let r=atob(e),n=new Uint8Array(r.length);for(let o=0;o<r.length;o++)n[o]=r.charCodeAt(o);return new TextDecoder().decode(n)}function uo(t){let e=new TextEncoder().encode(t),r="";for(let n=0;n<e.length;n++)r+=String.fromCharCode(e[n]);return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function po(t){let e=_t(t);if(e.indexOf(":")>=0)return e;try{let r=Or(t);if(r.indexOf(":")>=0)return r}catch{}return e}function We(t,e){let r=t.indexOf(e);return r<0?[t,""]:[t.slice(0,r),t.slice(r+e.length)]}function Pt(t,e){return{enabled:"1",type:t,core:e,log_level:"info"}}function co(t){let e=w(t);if(e!==d.XRAY&&e!==d.SING_BOX)throw new Error(_("Invalid core selection"));return e}function Et(t,e){if(!(J[e]||[]).includes(t))throw new Error(_('Selected core "%s" does not support %s').format(e,t));return e}function _o(t,e){let r=t.body;if(r.indexOf("@")<0){let m=r.replace(/\/$/,"");try{r=Or(m)}catch{throw new Error(_("Invalid Shadowsocks share link"))}}let n=Tt(r),o=po(n.userinfo),[s,i]=We(o,":");if(!s||!i||!n.host)throw new Error(_("Invalid Shadowsocks share link"));let a=x(t.query,"plugin"),[p,g]=We(a,";");return{name:t.tag||n.host,values:{...Pt(l.SHADOWSOCKS,e),server:n.host,server_port:Ct(n.port,G[l.SHADOWSOCKS]),method:s,password:i,plugin:p,plugin_opts:g,udp_over_tcp:et(x(t.query,"udp-over-tcp","uot","udp_over_tcp"))?"1":"0",multiplex_enabled:"0",multiplex_protocol:"h2mux",multiplex_brutal_enabled:"0"}}}function go(t){let e=String(t.method||""),r=String(t.password||"");if(!e||!r||!t.server)throw new Error(_("Proxy node is incomplete"));let n=e.startsWith("2022-")?B(e+":"+r):uo(e+":"+r),o=t.plugin?String(t.plugin)+(t.plugin_opts?";"+String(t.plugin_opts):""):void 0;return"ss://"+n+"@"+Nt(String(t.server))+":"+B(String(t.server_port||G[l.SHADOWSOCKS]))+vt({plugin:o,"udp-over-tcp":t.udp_over_tcp==="1"?"1":void 0})+Ot(t.name)}function mo(t,e){let r=Tt(t.body);if(!r.userinfo||!r.host)throw new Error(_("Invalid Hysteria2 share link"));let n=r.port||G[l.HYSTERIA2],o=n.split(",").map(i=>i.trim()).filter(Boolean),s=x(t.query,"obfs");return{name:t.tag||r.host,values:{...Pt(l.HYSTERIA2,e),server:r.host,server_port:Ct(n,G[l.HYSTERIA2]),server_ports:o.length>1||n.indexOf("-")>=0?o:[],password:r.userinfo,obfs_type:s,obfs_password:x(t.query,"obfs-password","obfs_password"),tls_server_name:x(t.query,"sni","peer"),tls_insecure:et(x(t.query,"insecure","allowInsecure","allow_insecure"))?"1":"0",network:"",brutal_debug:"0"}}}function fo(t){if(!t.password||!t.server)throw new Error(_("Proxy node is incomplete"));let e=lo(t.server_ports),r=e.length>0?e.join(","):String(t.server_port||G[l.HYSTERIA2]);return"hysteria2://"+B(String(t.password))+"@"+Nt(String(t.server))+":"+B(r)+"/"+vt({obfs:t.obfs_type,"obfs-password":t.obfs_password,sni:t.tls_server_name,insecure:t.tls_insecure==="1"?"1":void 0})+Ot(t.name)}function ho(t,e){let r=Tt(t.body);if(!r.userinfo||!r.host)throw new Error(_("Invalid VLESS share link"));let n=x(t.query,"type"),o=x(t.query,"security");if(n==="xhttp"&&e!==d.XRAY)throw new Error(_("XHTTP transport is only supported by Xray core"));let s={...Pt(l.VLESS,e),server:r.host,server_port:Ct(r.port,G[l.VLESS]),uuid:r.userinfo,flow:x(t.query,"flow"),network:"tcp",packet_encoding:x(t.query,"packetEncoding","packet_encoding"),tls_server_name:x(t.query,"sni","servername"),tls_insecure:et(x(t.query,"allowInsecure","allow_insecure","insecure"))?"1":"0",tls_reality_enabled:o==="reality"?"1":"0",tls_reality_public_key:x(t.query,"pbk","publicKey","public_key"),tls_reality_short_id:x(t.query,"sid","shortId","short_id"),multiplex_enabled:"0",multiplex_protocol:"h2mux",multiplex_brutal_enabled:"0",transport_type:n==="tcp"?"":n,transport_http_idle_timeout:"15s",transport_http_ping_timeout:"15s",transport_grpc_idle_timeout:"15s",transport_grpc_ping_timeout:"15s",transport_grpc_permit_without_stream:"0",transport_xhttp_path:"/",transport_xhttp_mode:"auto"};if(n==="ws"){let i=io(x(t.query,"path"));s.transport_ws_host=x(t.query,"host"),s.transport_ws_path=i.path,s.transport_ws_max_early_data=i.maxEarlyData}else n==="grpc"?s.transport_grpc_service_name=x(t.query,"serviceName","service_name"):n==="http"?(s.transport_http_host=x(t.query,"host"),s.transport_http_path=x(t.query,"path"),s.transport_http_method=x(t.query,"method")):n==="httpupgrade"?(s.transport_httpupgrade_host=x(t.query,"host"),s.transport_httpupgrade_path=x(t.query,"path")):n==="xhttp"&&(s.transport_xhttp_host=x(t.query,"host"),s.transport_xhttp_path=x(t.query,"path")||"/",s.transport_xhttp_mode=x(t.query,"mode")||"auto");return{name:t.tag||r.host,values:s}}function yo(t){if(!t.uuid||!t.server)throw new Error(_("Proxy node is incomplete"));let e=String(t.transport_type||"tcp"),n={encryption:"none",security:t.tls_reality_enabled==="1"?"reality":t.tls_server_name||t.tls_insecure==="1"?"tls":"none",sni:t.tls_server_name,allowInsecure:t.tls_insecure==="1"?"1":void 0,flow:t.flow,type:e===""?"tcp":e,packetEncoding:t.packet_encoding,pbk:t.tls_reality_enabled==="1"?t.tls_reality_public_key:void 0,sid:t.tls_reality_enabled==="1"?t.tls_reality_short_id:void 0};return e==="ws"?(n.host=t.transport_ws_host,n.path=ao(t.transport_ws_path,t.transport_ws_max_early_data)):e==="grpc"?n.serviceName=t.transport_grpc_service_name:e==="http"?(n.host=t.transport_http_host,n.path=t.transport_http_path,n.method=t.transport_http_method):e==="httpupgrade"?(n.host=t.transport_httpupgrade_host,n.path=t.transport_httpupgrade_path):e==="xhttp"&&(n.host=t.transport_xhttp_host,n.path=t.transport_xhttp_path,n.mode=t.transport_xhttp_mode),"vless://"+B(String(t.uuid))+"@"+Nt(String(t.server))+":"+B(String(t.server_port||G[l.VLESS]))+vt(n)+Ot(t.name)}function bo(t,e){let r=Tt(t.body),[n,o]=We(r.userinfo,":");if(!n||!o||!r.host)throw new Error(_("Invalid TUIC share link"));return{name:t.tag||r.host,values:{...Pt(l.TUIC,e),server:r.host,server_port:Ct(r.port,G[l.TUIC]),uuid:n,password:o,congestion_control:x(t.query,"congestion_control")||"cubic",udp_relay_mode:x(t.query,"udp_relay_mode"),udp_over_stream:et(x(t.query,"udp_over_stream"))?"1":"0",zero_rtt_handshake:et(x(t.query,"zero_rtt_handshake","zero_rtt"))?"1":"0",heartbeat:x(t.query,"heartbeat")||"10s",network:"",tls_server_name:x(t.query,"sni","servername"),tls_insecure:et(x(t.query,"allow_insecure","allowInsecure","insecure"))?"1":"0"}}}function So(t){if(!t.uuid||!t.password||!t.server)throw new Error(_("Proxy node is incomplete"));return"tuic://"+B(String(t.uuid))+":"+B(String(t.password))+"@"+Nt(String(t.server))+":"+B(String(t.server_port||G[l.TUIC]))+vt({congestion_control:t.congestion_control,udp_relay_mode:t.udp_relay_mode,udp_over_stream:t.udp_over_stream==="1"?"1":void 0,zero_rtt_handshake:t.zero_rtt_handshake==="1"?"1":void 0,heartbeat:t.heartbeat,sni:t.tls_server_name,allow_insecure:t.tls_insecure==="1"?"1":void 0})+Ot(t.name)}function xo(t,e){let r=Tt(t.body),n=r.userinfo||x(t.query,"password");if(!r.host)throw new Error(_("Invalid ShadowTLS share link"));return{name:t.tag||r.host,values:{...Pt(l.SHADOWTLS,e),server:r.host,server_port:Ct(r.port,G[l.SHADOWTLS]),version:x(t.query,"version")||"1",password:n,tls_server_name:x(t.query,"sni","servername"),tls_insecure:et(x(t.query,"allow_insecure","allowInsecure","insecure"))?"1":"0"}}}function Eo(t){if(!t.server)throw new Error(_("Proxy node is incomplete"));return"shadowtls://"+(t.password?B(String(t.password))+"@":"")+Nt(String(t.server))+":"+B(String(t.server_port||G[l.SHADOWTLS]))+vt({version:t.version,sni:t.tls_server_name,allow_insecure:t.tls_insecure==="1"?"1":void 0})+Ot(t.name)}var pe={canExport:function(t){let e=w(t?.core);return J[e]?.includes(t?.type)??!1},parse:function(t,e){let r=oo(t),n=co(e);switch(r.scheme){case"ss":return _o(r,Et(l.SHADOWSOCKS,n));case"hysteria2":case"hy2":return mo(r,Et(l.HYSTERIA2,n));case"vless":return ho(r,Et(l.VLESS,n));case"tuic":return bo(r,Et(l.TUIC,n));case"shadowtls":case"shadow-tls":return xo(r,Et(l.SHADOWTLS,n));default:throw new Error(_("Unsupported share link protocol: %s").format(r.scheme))}},generate:function(t){switch(t?.type){case l.SHADOWSOCKS:return go(t);case l.HYSTERIA2:return fo(t);case l.VLESS:return yo(t);case l.TUIC:return So(t);case l.SHADOWTLS:return Eo(t);default:throw new Error(_("Unsupported proxy type"))}}};function ce(t,e,r=b.getProxySectionMap()){let n=new Set;function o(s,i){if(s===t)return i;if(n.has(s))return;n.add(s);let a=r.get(s);if(a)for(let p of b.getProxyDependencies(a)){let g=o(p,i.concat(p));if(g)return g}}for(let s of e){let i=o(s,[t,s]);if(i)return i}}var Oo=[d.XRAY,d.SING_BOX];function Nr(t,e){e.textContent=_("Loading..."),D.exec("/usr/bin/tail",["-n","200",t]).then(r=>{let n=r&&r.stdout?r.stdout.trim():"";n=n.replace(/\x1b\[[0-9;]*m/g,""),e.textContent=n||_("No Logs"),e.scrollTop=e.scrollHeight}).catch(()=>{e.textContent=_("Read Failed")})}function No(t,e){t.textContent=e+"ms",e<300?(t.style.backgroundColor="#1a7a3a",t.style.borderColor="#1a7a3a"):e<500?(t.style.backgroundColor="#7a6a00",t.style.borderColor="#7a6a00"):(t.style.backgroundColor="#7a2020",t.style.borderColor="#7a2020")}function Tr(t,e){let r=w(e);if(r===d.CUSTOM)return;let n=r===d.XRAY?d.XRAY:d.SING_BOX,o=[...J[n]??[],l.LOAD_BALANCE];Array.from(t.options).forEach(s=>s.hidden=!o.includes(s.value)),o.includes(t.value)||(t.value=l.SHADOWSOCKS,t.dispatchEvent(new Event("change",{bubbles:!0})))}function To(t){let e=u.get("hijpass",t,"name")||t,r=b.collectProxyChain(e,b.getProxySectionMap()),n=r.chain.slice(1);return n.length===0?"":n.join(" -> ")+(r.cycle?" -> ...":"")}function $(t,e){let r=To(t);if(!r)return e;let n=[];return typeof e=="string"?e&&n.push(E("span",{},e)):n.push(e),n.push(E("span",{style:"opacity:0.65;font-size:0.86em;line-height:1.35"},_("Nested Proxy")+": "+r)),E("span",{style:"display:flex;flex-direction:column;gap:3px;line-height:1.35"},n)}function vr(t){return u.sections("hijpass","proxy_node").find(e=>e[".name"]===t)}function vo(t,e){return navigator.clipboard?.writeText?navigator.clipboard.writeText(t):e?(e.focus(),e.select(),document.execCommand("copy"),Promise.resolve()):Promise.reject(new Error(_("Clipboard is unavailable")))}function Co(t){return(t||"").trim().replace(/[^A-Za-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,48).replace(/-+$/g,"")}function Po(t,e){let r=t.values,n=Co(t.name||String(r.server||"")||String(r.type||"proxy"))||"proxy-"+e,o=new Set;if(u.sections("hijpass","proxy_node",function(s){s.name&&o.add(s.name)}),!o.has(n))return n;for(let s=2;s<1e3;s++){let i="-"+s,a=n.slice(0,48-i.length)+i;if(!o.has(a))return a}return"proxy-"+e}function wo(t,e){let r=Y.findAvailablePort(7890),n=Y.findAvailablePort(7891,[r]),o=Po(e,t),s={...e.values,name:o,listen_port:String(r),socks_port:String(n)};return Object.keys(s).forEach(i=>{let a=s[i];Array.isArray(a)?a.length>0&&u.set("hijpass",t,i,a):a!==""&&u.set("hijpass",t,i,a)}),o}var h={createShareLinkImportSection:function(t){let e=t.section(c.TypedSection);return e.anonymous=!0,e.addremove=!1,e.render=function(){return E("fieldset",{class:"cbi-section"},[E("legend",{},_("Share Link")),E("div",{style:"display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap"},[E("div",{class:"cbi-section-descr",style:"margin:0"},_("Import a proxy node from a supported share link")),E("button",{class:"btn cbi-button-action",click:h.showImportShareLinkModal},_("Import Share Link"))])])},e},showImportShareLinkModal:function(){let t=E("select",{class:"cbi-input-select",style:"min-width:180px"},[E("option",{value:d.SING_BOX},"sing-box"),E("option",{value:d.XRAY},"xray")]),e=E("textarea",{class:"cbi-input-textarea",style:"width:100%;min-height:120px;box-sizing:border-box",placeholder:"vless://..., hysteria2://..., ss://..."});R.showModal(_("Import Share Link"),[E("div",{class:"cbi-section"},[E("div",{class:"cbi-section-descr"},_("Paste one supported proxy share link. Select the backend core manually; local ports and runtime options will be generated automatically.")),E("div",{style:"display:grid;grid-template-columns:minmax(120px,180px) minmax(180px,1fr);gap:10px;align-items:center;margin:0 0 12px 0"},[E("label",{},_("Backend Core")),t]),e]),E("div",{class:"right",style:"display:flex;justify-content:flex-end;gap:10px"},[E("button",{class:"btn cbi-button",click:R.hideModal},_("Cancel")),E("button",{class:"btn cbi-button-action",click:async function(){let r=e.value.trim();if(!r){F.warning(_("Import Failed"),_("Share link is empty"),3e3);return}try{let n=pe.parse(r,t.value),o=X.generateUniqueSectionId("hijpass");u.add("hijpass","proxy_node",o);let s=wo(o,n);await u.save(),R.hideModal(),F.success(_("Import Successful"),_('Imported proxy node "%s". Click Save & Apply to apply it.').format(s),5e3),window.setTimeout(()=>window.location.reload(),500)}catch(n){F.error(_("Import Failed"),_(n.message||"Invalid share link"),5e3)}}},_("Import"))])])},showExportShareLinkModal:function(t){let e=vr(t);if(e)try{let r=pe.generate(e),n=E("textarea",{class:"cbi-input-textarea",readonly:"readonly",style:"width:100%;min-height:120px;box-sizing:border-box"},r),o=u.get("hijpass",t,"name")||t;R.showModal(o+" - "+_("Share Link"),[E("div",{class:"cbi-section"},[E("div",{class:"cbi-section-descr"},_("This link contains protocol connection settings only. Local ports, logs, and nested proxy settings are not exported.")),n]),E("div",{class:"right",style:"display:flex;justify-content:flex-end;gap:10px"},[E("button",{class:"btn cbi-button",click:R.hideModal},_("Close")),E("button",{class:"btn cbi-button-action",click:function(){vo(r,n).then(function(){F.success(_("Success"),_("Share link copied to clipboard"),3e3)}).catch(function(s){F.error(_("Copy Failed"),_(s.message||"Clipboard is unavailable"),3e3)})}},_("Copy Share Link"))])]),window.setTimeout(()=>n.select(),0)}catch(r){F.error(_("Export Failed"),_(r.message||"Unsupported proxy type"),5e3)}},renderProxyType:function(t){let e=u.get("hijpass",t,"type"),r=w(u.get("hijpass",t,"core")||d.CUSTOM);if(r===d.CUSTOM)return E("span",{},_("Custom"));let n=A.PROXY_TYPES.find(i=>i.value===e)?.label||e||"",o=A.DUAL_CORES.find(i=>i.value===r)?.label||r,s=E("span",{style:"opacity:0.55;font-size:0.82em;margin-left:4px"},`(${o})`);return E("span",{},[E("span",{},_(n)),s])},renderProxyServerInfo:function(t){let e=w(u.get("hijpass",t,"core")||d.CUSTOM),r=u.get("hijpass",t,"type")||l.CUSTOM,n=u.get("hijpass",t,"tls_server_name");n||(n=u.get("hijpass",t,"server"));let o=u.get("hijpass",t,"server_port");if(e===d.CUSTOM){let s=u.get("hijpass",t,"command");return s&&s.length>50?$(t,E("span",{title:s},s.substring(0,47)+"...")):$(t,s||"")}switch(r){case l.LOAD_BALANCE:{let s=b.normalizeProxyNodeList(u.get("hijpass",t,"member_node")),i=u.get("hijpass",t,"strategy")||"leastLoad",a={random:_("Random"),roundRobin:_("Round Robin"),leastPing:_("Lowest Ping"),leastLoad:_("Lowest Load")},p=e===d.SING_BOX?"URLTest":a[i]||i;return E("span",{},_("%s member nodes \xB7 %s").format(String(s.length),p))}case l.HYSTERIA2:return $(t,E("span",{},n?n+":"+(o||"443"):_("Not Configured")));case l.SHADOWSOCKS:{let s=u.get("hijpass",t,"method");return $(t,E("span",{},n?n+":"+(o||"-")+" ("+(s||"-")+")":_("Not Configured")))}case l.TUIC:{let s=u.get("hijpass",t,"congestion_control");return $(t,E("span",{},n?n+":"+(o||"-")+" ("+(s||"cubic")+")":_("Not Configured")))}case l.SHADOWTLS:{let s=u.get("hijpass",t,"version");return $(t,E("span",{},n?n+":"+(o||"-")+" (v"+(s||"1")+")":_("Not Configured")))}case l.VLESS:{let s=u.get("hijpass",t,"flow");return $(t,E("span",{},n?n+":"+(o||"-")+(s?" ("+s+")":""):_("Not Configured")))}default:return $(t,"")}},renderRunStatus:function(t,e){let r=u.get("hijpass",t,"name"),n=t+(r?"-"+r:""),o=e?.[n]?.running??!1;return E("span",{style:"color:"+(o?"green":"red")},o?_("Running"):_("Not Running"))},createGridActionButtons:function(t){let e=[],r=vr(t);r&&pe.canExport(r)&&e.push(E("button",{class:"btn cbi-button",style:"background-color:#4d6270;border-color:#4d6270",click:function(){h.showExportShareLinkModal(t)}},_("Share")));let n=u.get("hijpass",t,"core");w(n)!==d.CUSTOM&&e.push(E("button",{class:"btn cbi-button",style:"background-color:#5a4a8a;border-color:#5a4a8a",click:function(){let a=u.sections("hijpass","proxy_node").find(S=>S[".name"]===t);if(!a)return;let p;try{p=le.generateProxyConfigFromSection(a)||{error:_("Invalid proxy config")}}catch(S){p={error:S.message}}let g=u.get("hijpass",t,"name")||t,m=E("pre",{style:"max-height:500px;overflow:auto;padding:10px;border-radius:4px;white-space:pre;font-size:0.8em"},JSON.stringify(p,dt.omitEmptyReplacer,2));R.showModal(g+" - "+_("Config Preview"),[E("div",{class:"cbi-section"},[m]),E("div",{class:"right"},[E("button",{class:"btn cbi-button",click:R.hideModal},_("Close"))])])}},_("Preview")));let o=u.get("hijpass",t,"log_path");if(o){let a=u.get("hijpass",t,"name")||t;e.push(E("button",{class:"btn cbi-button",style:"background-color:#3d6b5e;border-color:#3d6b5e",click:function(){let p=E("pre",{style:"max-height:500px;overflow:auto;padding:10px;border-radius:4px;white-space:pre;font-size:0.8em"},"");Nr(o,p),R.showModal(a+" - "+_("Log"),[E("div",{class:"cbi-section"},[p]),E("div",{class:"right",style:"display:flex;justify-content:flex-end;gap:10px"},[E("button",{class:"btn cbi-button",click:R.hideModal},_("Close")),E("button",{class:"btn cbi-button-action",click:function(){Nr(o,p)}},_("Refresh"))])])}},_("Log")))}let s=u.get("hijpass",t,"socks_port"),i=u.get("hijpass",t,"enabled");return s&&i==="1"&&e.push(E("button",{class:"btn cbi-button","data-latency":s,style:"background-color:#1a6a8a;border-color:#1a6a8a;min-width:70px",click:function(a){let p=a.currentTarget;p.setAttribute("disabled","true"),p.textContent="...",p.style.backgroundColor="#1a6a8a",p.style.borderColor="#1a6a8a",D.exec_direct("/usr/lib/hijpass/net.sh",["ping",s],"json").then(g=>{g&&g.ms!=null?No(p,g.ms):(p.textContent=_("Timeout"),p.style.backgroundColor="#7a2020",p.style.borderColor="#7a2020")}).catch(()=>{p.textContent=_("Failed"),p.style.backgroundColor="#7a2020",p.style.borderColor="#7a2020"}).finally(()=>{p.removeAttribute("disabled")})}},_("Speed Test"))),E("span",{style:"display:flex;gap:8px;flex-wrap:wrap"},e)},forProtocols:function(t,e,r={}){for(let n of e)for(let o of Oo)J[o]?.includes(n)&&t.depends({type:n,core:o,...r})},forCoreProtocols:function(t,e,r){r.forEach(n=>t.depends({type:n,core:e}))},createCoreAndTypeOptions:function(t){let e=t.option(c.ListValue,"core",_("Backend Core"),_("Select backend core for this proxy node"));e.modalonly=!0,e.default=d.SING_BOX,e.rmempty=!1,A.DUAL_CORES.forEach(n=>e.value(n.value,_(n.label)));let r=t.option(c.ListValue,"type",_("Proxy Type"),_("Select Proxy Type"));r.modalonly=!0,r.default=l.SHADOWSOCKS,r.rmempty=!1,r.depends("core",d.XRAY),r.depends("core",d.SING_BOX),A.PROXY_TYPES.forEach(n=>r.value(n.value,_(n.label))),r.validate=function(n,o){let s=w(this.section.formvalue(n,"core"));return o===l.LOAD_BALANCE||J[s]?.includes(o)?!0:_('Selected core "%s" does not support %s').format(s,o)},r.renderWidget=function(n,o,s){let i=c.ListValue.prototype.renderWidget.call(this,n,o,s),a=i.querySelector("select");return setTimeout(()=>{let g=document.getElementById(e.cbid(n))?.querySelector("select");g&&(Tr(a,g.value),g.dataset.filterAttached||(g.dataset.filterAttached="1",g.addEventListener("change",()=>Tr(a,g.value))))},0),i}},createUpstreamProxyNodeOption:function(t){let e=t.option(c.ListValue,"upstream_proxy_node",_("Upstream Proxy Node"),_("Use another proxy node as the upstream through its local SOCKS port"));e.modalonly=!0,e.rmempty=!0;let r=A.PROXY_TYPES.map(n=>n.value).filter(n=>n!==l.LOAD_BALANCE);h.forProtocols(e,r),e.load=function(n){delete this.keylist,delete this.vallist,this.value("",_("None"));let o=u.get("hijpass",n,"name")||n;return b.getProxySections().forEach(s=>{let i=b.getProxyName(s);if(!i||s[".name"]===n||i===o)return;let a=i;s.socks_port&&(a+=" ("+s.socks_port+")"),s.enabled!=="1"&&(a+=" - "+_("Disabled")),this.value(i,a)}),c.ListValue.prototype.load.apply(this,[n])},e.validate=function(n,o){if(!o)return!0;let s=this.section.formvalue(n,"name")||u.get("hijpass",n,"name")||n;if(o===s)return _("Cannot use itself as upstream proxy");let i=b.getProxySectionMap();if(!i.has(o))return _("Upstream proxy node not found");let a=ce(s,[o],i);return a?_("Proxy node dependency chain has a cycle: %s").format(a.join(" -> ")):!0}},createProxyPortOptions:function(t){let e=null,r=null,n=t.option(c.Value,"listen_port",_("Local Listen Port"),_("Local Transparent Proxy Listen Port"));n.datatype="port",n.rmempty=!1,n.modalonly=!0,n.validate=function(s,i){return this.section.formvalue(s,"socks_port")===i?_("Conflicts with SOCKS Port"):Y.validatePortConflict.call(this,s,i)},n.load=function(s){let i=c.Value.prototype.load.call(this,s);if(i)return i;let a=Y.findAvailablePort(7890);return c.Value.prototype.write.call(this,s,a),a.toString()},n.renderWidget=function(s,i,a){let p=c.Value.prototype.renderWidget.call(this,s,i,a);e=p.querySelector("input");let g=E("button",{class:"btn cbi-button",style:"margin-left:6px",type:"button",click:function(){let m=Number(e.value),S=Y.getUsedPortsExcluding(s),O=r?Number(r.value):0;if(O&&S.push(O),m&&!S.includes(m))return;let N=O?O+1:7890;for(;S.includes(N);)N++;e.value=N.toString(),e.dispatchEvent(new Event("input",{bubbles:!0})),e.dispatchEvent(new Event("change",{bubbles:!0}))}},_("Auto Generate"));return E("div",{style:"display:flex;align-items:center"},[p,g])};let o=t.option(c.Value,"socks_port",_("Local SOCKS Port"),_("Local SOCKS Listen Port"));o.datatype="port",o.rmempty=!1,o.modalonly=!0,o.validate=function(s,i){return this.section.formvalue(s,"listen_port")===i?_("Conflicts with Transparent Proxy Port"):Y.validatePortConflict.call(this,s,i)},o.load=function(s){let i=c.Value.prototype.load.call(this,s);if(i)return i;let a=Y.findAvailablePort(7891);return c.Value.prototype.write.call(this,s,a),a.toString()},o.renderWidget=function(s,i,a){let p=c.Value.prototype.renderWidget.call(this,s,i,a);r=p.querySelector("input");let g=E("button",{class:"btn cbi-button",style:"margin-left:6px",type:"button",click:function(){let m=Number(r.value),S=Y.getUsedPortsExcluding(s),O=e?Number(e.value):0;if(O&&S.push(O),m&&!S.includes(m))return;let N=O?O+1:7891;for(;S.includes(N);)N++;r.value=N.toString(),r.dispatchEvent(new Event("input",{bubbles:!0})),r.dispatchEvent(new Event("change",{bubbles:!0}))}},_("Auto Generate"));return E("div",{style:"display:flex;align-items:center"},[p,g])}}};function Ao(t){return b.getProxySections().filter(e=>b.getProxyDependencies(e).includes(t)).map(e=>b.getProxyName(e))}function Ro(t){if(!t)return[];let e=[];return u.get_first("hijpass","firewall","proxy_port")===t&&e.push(_("Proxy Port")),u.get_first("hijpass","firewall","shunt_port")===t&&e.push(_("Default Shunt Port")),e}var Lo=ge.extend({load:function(){return Promise.all([u.load("hijpass"),q.getServiceInstances("hijpass")])},handleSaveApply:yr.genHandleSaveApply(),handleSave:function(t){return ge.prototype.handleSave.call(this,t)},render:async function(t){let e=new c.Map("hijpass",_("Proxy Nodes"),_("Configure Proxy Nodes"));h.createShareLinkImportSection(e);let r=e.section(c.GridSection,"proxy_node");j.setAnonymousGridSectionMembers(r),r.handleAdd=function(o,s){let i=X.generateUniqueSectionId("hijpass");return L.bind(c.GridSection.prototype.handleAdd,this,o,i)()},r.handleRemove=function(o,s){let i=u.get("hijpass",o,"name")||o,a=u.get("hijpass",o,"listen_port"),p=Ro(a);if(p.length>0){F.warning(_("Cannot Delete Proxy Node"),_('Proxy node "%s" listen port %s is referenced by firewall settings: %s. Remove the references first.').format(i,a,p.join(", ")),8e3);return}let g=Ao(i);if(g.length>0){F.warning(_("Cannot Delete Proxy Node"),_('Proxy node "%s" is referenced by proxy nodes: %s. Remove the references first.').format(i,g.join(", ")),8e3);return}return c.GridSection.prototype.handleRemove.call(this,o,s)};let n=t[1]??{};return ls(r,n),e.render()}});function Cr(t){let e=t.option(c.Flag,"enabled",_("Enable"),"");return e.modalonly=!0,e.default="1",e.rmempty=!1,e}function Io(t){let e=t.option(c.Value,"name",_("Node Name"),_("Modify Proxy Node Name"));return e.modalonly=!0,e.validate=Y.createTagValidator("hijpass","proxy_node","name"),e}function Do(t,e){let r=t.option(c.TextValue,"type",_("Type"),_("Proxy Type"));r.modalonly=!1,r.textvalue=function(a){return h.renderProxyType(a)};let n=t.option(c.TextValue,"server_info",_("Configuration Info"),"");n.modalonly=!1,n.textvalue=function(a){return h.renderProxyServerInfo(a)};let o=t.option(c.TextValue,"run_status",_("Status"),"");o.modalonly=!1,o.textvalue=function(a){return h.renderRunStatus(a,e)};let s=Cr(t);s.editable=!0,s.modalonly=!1;let i=t.option(c.TextValue,"actions","");i.modalonly=!1,i.textvalue=function(a){return h.createGridActionButtons(a)}}function Uo(t){let e=t.option(c.Value,"command",_("Run Command"),_("Proxy Run Command"));e.default="/usr/bin/xray -c {conf_path}",e.rmempty=!1,e.modalonly=!0,e.depends("core",d.CUSTOM);let r=t.option(c.TextValue,"custom_conf",_("Configuration File Content"),_("Edit Configuration File"));r.modalonly=!0,r.depends("core",d.CUSTOM),j.setConfContentOptionMembers(r,"hijpass",M.getFilePath("client_dir"))}function ko(t){let e=t.option(c.DynamicList,"procd_env",_("Procd Environment Variables"),_("Procd Environment Variables"));e.modalonly=!0;let r=t.option(c.ListValue,"log_level",_("Log Level"),_("Core Log Level"));r.modalonly=!0,r.default="info",r.rmempty=!1,r.depends("core",d.XRAY),r.depends("core",d.SING_BOX),A.PROXY_LOG_LEVELS.forEach(n=>r.value(n)),j.createLogFlagOption(t,"hijpass",void 0)}function Q(t,e){if(e){t.depends({type:l.LOAD_BALANCE,core:e});return}t.depends({type:l.LOAD_BALANCE,core:d.SING_BOX}),t.depends({type:l.LOAD_BALANCE,core:d.XRAY})}function Fo(t){let e=t.option(c.DynamicList,"member_node",_("Load Balancing Nodes"),_("Select proxy nodes to connect through their local SOCKS ports"));e.modalonly=!0,e.rmempty=!1,Q(e),e.load=function(y){delete this.keylist,delete this.vallist;let T=this.section.formvalue(y,"name")||u.get("hijpass",y,"name")||y;return b.getProxySections().forEach(C=>{let v=b.getProxyName(C);if(!v||v===T||C[".name"]===y||C.type===l.LOAD_BALANCE)return;let P=v;C.socks_port&&(P+=" ("+C.socks_port+")"),C.enabled!=="1"&&(P+=" - "+_("Disabled")),this.value(v,P)}),c.DynamicList.prototype.load.apply(this,[y])},e.validate=function(y,T){if(!T)return!0;let C=this.section.formvalue(y,"name")||u.get("hijpass",y,"name")||y;if(T===C)return _("Load balancing node cannot include itself");let v=b.getProxySectionMap(),P=v.get(T);if(!P)return _("Load balancing member node not found");if(P.type===l.LOAD_BALANCE)return _("Nested load balancing nodes are not supported");let K=ce(C,[T],v);return K?_("Proxy node dependency chain has a cycle: %s").format(K.join(" -> ")):P.enabled!=="1"?_("Load balancing member node is not enabled"):b.isPort(P.socks_port)?!0:_("Load balancing member node has no valid SOCKS port configured")};let r=t.option(c.Value,"url",_("Test URL"),_("Health Check URL"));r.modalonly=!0,r.default="https://www.gstatic.com/generate_204",Q(r,d.SING_BOX);let n=t.option(c.Value,"interval",_("Test Interval"),_("Health Check Interval"));n.modalonly=!0,n.default="3m",Q(n,d.SING_BOX);let o=t.option(c.Value,"tolerance",_("Tolerance (ms)"),_("Tolerance"));o.modalonly=!0,o.default="50",o.datatype="uinteger",Q(o,d.SING_BOX);let s=t.option(c.Value,"idle_timeout",_("Idle Timeout"),_("Node Idle Timeout"));s.modalonly=!0,s.default="30m",Q(s,d.SING_BOX);let i=t.option(c.Flag,"interrupt_exist_connections",_("Interrupt Existing Connections"),_("Interrupt on Outbound Change"));i.modalonly=!0,i.default="0",Q(i,d.SING_BOX);let a=t.option(c.ListValue,"strategy",_("Load Strategy"),_("Load Balancing Strategy"));a.modalonly=!0,a.default="leastLoad",a.value("random",_("Random")),a.value("roundRobin",_("Round Robin")),a.value("leastPing",_("Lowest Ping")),a.value("leastLoad",_("Lowest Load")),Q(a,d.XRAY);let p=t.option(c.Value,"strategy_expected",_("Best Nodes"),_("Best Nodes Count"));p.modalonly=!0,p.default="1",p.datatype="uinteger",p.depends({type:l.LOAD_BALANCE,core:d.XRAY,strategy:"leastLoad"});let g=t.option(c.Value,"strategy_max_rtt",_("Max Acceptable RTT"),_("Max Acceptable RTT"));g.modalonly=!0,g.default="1s",g.depends({type:l.LOAD_BALANCE,core:d.XRAY,strategy:"leastLoad"});let m=t.option(c.Value,"strategy_tolerance",_("Failure Rate Tolerance"),_("Failure Rate Tolerance"));m.modalonly=!0,m.default="0.05",m.depends({type:l.LOAD_BALANCE,core:d.XRAY,strategy:"leastLoad"});let S=t.option(c.ListValue,"fallback_tag",_("Fallback Node"),_("Fallback Outbound"));S.modalonly=!0,S.value("",_("First member node")),S.load=function(y){delete this.keylist,delete this.vallist,this.value("",_("First member node"));let T=this.section.formvalue(y,"name")||u.get("hijpass",y,"name")||y;return b.getProxySections().forEach(C=>{let v=b.getProxyName(C);!v||v===T||C.type===l.LOAD_BALANCE||this.value(v,v)}),c.ListValue.prototype.load.apply(this,[y])},S.validate=function(y,T){return T?b.normalizeProxyNodeList(this.section.formvalue(y,"member_node")).indexOf(T)>=0?!0:_("Fallback node must be a load balancing member"):!0},Q(S,d.XRAY),[["probe_url",_("Probe URL"),_("Health Check Probe URL"),"https://connectivitycheck.gstatic.com/generate_204"],["probe_connectivity",_("Local Connectivity Check URL"),_("Local Connectivity Check URL"),""],["probe_interval",_("Probe Interval"),_("Probe Interval"),"1m"],["probe_timeout",_("Probe Timeout"),_("Probe Timeout"),"5s"]].forEach(([y,T,C,v])=>{let P=t.option(c.Value,y,T,C);P.modalonly=!0,v&&(P.default=v),P.depends({type:l.LOAD_BALANCE,core:d.XRAY,strategy:"leastPing"}),P.depends({type:l.LOAD_BALANCE,core:d.XRAY,strategy:"leastLoad"})});let N=t.option(c.Value,"probe_sampling",_("Results to Retain"),_("Retain Recent Probe Results"));N.modalonly=!0,N.default="10",N.datatype="uinteger",N.depends({type:l.LOAD_BALANCE,core:d.XRAY,strategy:"leastPing"}),N.depends({type:l.LOAD_BALANCE,core:d.XRAY,strategy:"leastLoad"});let f=t.option(c.ListValue,"probe_http_method",_("Probe HTTP Method"),_("Probe HTTP Method"));f.modalonly=!0,f.value("",_("Default (HEAD)")),f.value("HEAD","HEAD"),f.value("GET","GET"),f.depends({type:l.LOAD_BALANCE,core:d.XRAY,strategy:"leastPing"}),f.depends({type:l.LOAD_BALANCE,core:d.XRAY,strategy:"leastLoad"})}function Mo(t){let e=t.option(c.Value,"server",_("Server Address"),_("Proxy Server Address"));e.modalonly=!0,e.rmempty=!1,h.forProtocols(e,[l.HYSTERIA2,l.SHADOWSOCKS,l.TUIC,l.SHADOWTLS,l.VLESS]);let r=t.option(c.Value,"server_port",_("Server Port"),_("Proxy Server Port"));r.datatype="port",r.modalonly=!0,r.rmempty=!1,h.forProtocols(r,[l.HYSTERIA2,l.SHADOWSOCKS,l.TUIC,l.SHADOWTLS,l.VLESS])}function Yo(t){let e=t.option(c.DynamicList,"server_ports",_("Port Hopping"),_("Port Hopping Range"));e.modalonly=!0,e.datatype="portrange",e.depends({type:l.HYSTERIA2,core:d.SING_BOX});let r=t.option(c.Value,"hop_interval",_("Port Hop Interval"),_("Port Hop Interval"));r.modalonly=!0,r.depends({type:l.HYSTERIA2,core:d.SING_BOX,server_ports:/./});let n=t.option(c.Value,"up_mbps",_("Uplink Speed"),_("Maximum Uplink Bandwidth"));n.datatype="uinteger",n.modalonly=!0,n.depends({type:l.HYSTERIA2,core:d.SING_BOX}),n.depends({type:l.HYSTERIA2,core:d.XRAY});let o=t.option(c.Value,"down_mbps",_("Downlink Speed"),_("Maximum Downlink Bandwidth"));o.datatype="uinteger",o.modalonly=!0,o.depends({type:l.HYSTERIA2,core:d.SING_BOX}),o.depends({type:l.HYSTERIA2,core:d.XRAY})}function Ho(t){let e=t.option(c.Value,"udp_idle_timeout",_("UDP Idle Timeout"),_("UDP connection idle timeout in seconds"));e.datatype="uinteger",e.modalonly=!0,e.placeholder="60",e.depends({type:l.HYSTERIA2,core:d.XRAY})}function Vo(t){let e=t.option(c.ListValue,"obfs_type",_("OBFS Type"),_("QUIC Obfuscation Type"));e.modalonly=!0,e.depends({type:l.HYSTERIA2,core:d.SING_BOX}),A.HYSTERIA2_OBFS_TYPES.forEach(n=>{e.value(n.value,_(n.label))});let r=t.option(c.Value,"obfs_password",_("OBFS Password"),_("QUIC Obfuscation Password"));r.modalonly=!0,r.depends({type:l.HYSTERIA2,core:d.SING_BOX,obfs_type:"salamander"})}function Bo(t){let e=t.option(c.ListValue,"packet_encoding",_("UDP Packet Encoding"),_("UDP Packet Encoding Method"));e.modalonly=!0,e.depends({type:l.VLESS,core:d.SING_BOX}),A.VLESS_PACKET_ENCODINGS.forEach(r=>{e.value(r.value,_(r.label))})}function Xo(t){let e=t.option(c.ListValue,"transport_type",_("Transport Protocol"),_("Proxy Transport Protocol"));e.modalonly=!0,h.forProtocols(e,[l.VLESS]),A.V2RAY_TRANSPORT_TYPES_XRAY.forEach(r=>{e.value(r.value,_(r.label))}),e.validate=function(r,n){let o=this.section.formvalue(r,"core"),s=this.section.formvalue(r,"tls_reality_enabled");return n==="xhttp"&&o!==d.XRAY?_("XHTTP transport is only supported by Xray core"):o===d.XRAY&&s==="1"&&(n==="ws"||n==="httpupgrade")?_("Xray REALITY only supports RAW, XHTTP and gRPC transports"):!0}}function Go(t){let e=t.option(c.Value,"transport_http_host",_("HTTP Host"),_("HTTP Host List"));e.modalonly=!0,h.forProtocols(e,[l.VLESS],{transport_type:"http"});let r=t.option(c.Value,"transport_http_path",_("HTTP Path"),_("HTTP Request Path"));r.modalonly=!0,h.forProtocols(r,[l.VLESS],{transport_type:"http"});let n=t.option(c.Value,"transport_http_method",_("HTTP Method"),_("HTTP Request Method"));n.modalonly=!0,h.forProtocols(n,[l.VLESS],{transport_type:"http"});let o=t.option(c.Value,"transport_http_idle_timeout",_("Idle Timeout"),_("Idle Timeout"));o.modalonly=!0,o.default="15s",h.forProtocols(o,[l.VLESS],{transport_type:"http"});let s=t.option(c.Value,"transport_http_ping_timeout",_("PING Timeout"),_("PING Response Timeout"));s.modalonly=!0,s.default="15s",h.forProtocols(s,[l.VLESS],{transport_type:"http"})}function Wo(t){let e=t.option(c.Value,"transport_ws_host",_("WebSocket Host"),_("WebSocket Host Domain"));e.modalonly=!0,h.forProtocols(e,[l.VLESS],{transport_type:"ws"});let r=t.option(c.Value,"transport_ws_path",_("WebSocket Path"),_("HTTP Request Path"));r.modalonly=!0,h.forProtocols(r,[l.VLESS],{transport_type:"ws"});let n=t.option(c.Value,"transport_ws_max_early_data",_("Max Early Data"),_("Maximum allowed payload size in requests"));n.datatype="uinteger",n.modalonly=!0,h.forProtocols(n,[l.VLESS],{transport_type:"ws"});let o=t.option(c.Value,"transport_ws_early_data_header_name",_("Early Data Header Name"),_("Early Data Header Name"));o.modalonly=!0,h.forProtocols(o,[l.VLESS],{transport_type:"ws"})}function jo(t){let e=t.option(c.Value,"transport_grpc_service_name",_("gRPC Service Name"),_("gRPC Service Name"));e.modalonly=!0,e.default="TunService",h.forProtocols(e,[l.VLESS],{transport_type:"grpc"});let r=t.option(c.Value,"transport_grpc_idle_timeout",_("Idle Timeout"),_("Idle Timeout"));r.modalonly=!0,r.default="15s",h.forProtocols(r,[l.VLESS],{transport_type:"grpc"});let n=t.option(c.Value,"transport_grpc_ping_timeout",_("PING Timeout"),_("PING Response Timeout"));n.modalonly=!0,n.default="15s",h.forProtocols(n,[l.VLESS],{transport_type:"grpc"});let o=t.option(c.Flag,"transport_grpc_permit_without_stream",_("Permit Without Stream"),_("Send Keepalive Ping"));o.modalonly=!0,h.forProtocols(o,[l.VLESS],{transport_type:"grpc"})}function qo(t){let e=t.option(c.Value,"transport_httpupgrade_host",_("HTTPUpgrade Host"),_("Host Domain"));e.modalonly=!0,h.forProtocols(e,[l.VLESS],{transport_type:"httpupgrade"});let r=t.option(c.Value,"transport_httpupgrade_path",_("HTTPUpgrade Path"),_("HTTP Request Path"));r.modalonly=!0,h.forProtocols(r,[l.VLESS],{transport_type:"httpupgrade"})}function Ko(t){let e=t.option(c.Value,"tls_server_name",_("TLS Server Name"),_("TLS Server Name"));e.modalonly=!0,e.rmempty=!1,h.forProtocols(e,[l.HYSTERIA2,l.TUIC,l.SHADOWTLS,l.VLESS]);let r=t.option(c.Flag,"tls_insecure",_("Ignore Certificate Verification"),_("Accept Any Certificate"));r.modalonly=!0,r.depends({type:l.HYSTERIA2,core:d.SING_BOX}),r.depends({type:l.VLESS,core:d.SING_BOX}),h.forProtocols(r,[l.TUIC,l.SHADOWTLS])}function zo(t){let e=t.option(c.Flag,"tls_reality_enabled",_("Enable TLS Reality"),_("Enable TLS Reality Obfuscation"));e.modalonly=!0,h.forProtocols(e,[l.VLESS]);let r=t.option(c.Value,"tls_reality_public_key",_("Reality Public Key"),_("Server Reality Public Key"));r.modalonly=!0,h.forProtocols(r,[l.VLESS],{tls_reality_enabled:"1"});let n=t.option(c.Value,"tls_reality_short_id",_("Reality Short ID"),_("Server Reality Short ID"));n.modalonly=!0,h.forProtocols(n,[l.VLESS],{tls_reality_enabled:"1"})}function $o(t){let e=t.option(c.Flag,"brutal_debug",_("Enable Brutal CC Debug"),_("Enable Hysteria Brutal CC Debug"));e.modalonly=!0,e.depends({type:l.HYSTERIA2,core:d.SING_BOX})}function Qo(t){let e=t.option(c.ListValue,"network",_("Network Protocol"),_("Enabled Network Protocols"));e.modalonly=!0,e.default="",e.value("",_("Default")),e.value("tcp","TCP"),e.value("udp","UDP"),h.forProtocols(e,[l.HYSTERIA2,l.SHADOWSOCKS,l.TUIC,l.VLESS])}function Jo(t){let e=t.option(c.Value,"password",_("Password"),_("Authentication Password"));e.modalonly=!0,e.password=!0,e.rmempty=!1,h.forProtocols(e,[l.HYSTERIA2,l.SHADOWSOCKS,l.TUIC]),h.forProtocols(e,[l.SHADOWTLS],{version:"2"}),h.forProtocols(e,[l.SHADOWTLS],{version:"3"})}function Zo(t){let e=t.option(c.Value,"uuid",_("UUID"),_("User UUID"));e.modalonly=!0,e.rmempty=!1,h.forProtocols(e,[l.VLESS,l.TUIC])}function ts(t){let e=[l.SHADOWSOCKS,l.VLESS],r=t.option(c.Flag,"multiplex_enabled",_("Enable Multiplexing"),_("Enable Multiplexing for Better Efficiency"));r.modalonly=!0,h.forCoreProtocols(r,d.SING_BOX,e);let n=t.option(c.ListValue,"multiplex_protocol",_("Multiplexing Protocol"),_("Multiplexing Protocol"));n.modalonly=!0,n.default="h2mux",e.forEach(m=>n.depends({type:m,core:d.SING_BOX,multiplex_enabled:"1"})),A.MULTIPLEX_PROTOCOLS.forEach(m=>n.value(m.value,m.label));let o=t.option(c.Value,"multiplex_max_connections",_("Max Connections"),_("Max Connections"));o.datatype="uinteger",o.modalonly=!0,e.forEach(m=>o.depends({type:m,core:d.SING_BOX,multiplex_enabled:"1"}));let s=t.option(c.Value,"multiplex_min_streams",_("Min Streams"),_("Min Concurrent Streams"));s.datatype="uinteger",s.modalonly=!0,e.forEach(m=>s.depends({type:m,core:d.SING_BOX,multiplex_enabled:"1"}));let i=t.option(c.Value,"multiplex_max_streams",_("Max Streams"),_("Max Concurrent Streams"));i.datatype="uinteger",i.modalonly=!0,e.forEach(m=>i.depends({type:m,core:d.SING_BOX,multiplex_enabled:"1"}));let a=t.option(c.Flag,"multiplex_brutal_enabled",_("Enable TCP Brutal"),_("Enable TCP Brutal Congestion Control"));a.modalonly=!0,e.forEach(m=>a.depends({type:m,core:d.SING_BOX,multiplex_enabled:"1"}));let p=t.option(c.Value,"multiplex_brutal_up_mbps",_("Uplink Bandwidth"),_("Uplink Bandwidth"));p.datatype="uinteger",p.modalonly=!0,e.forEach(m=>p.depends({type:m,core:d.SING_BOX,multiplex_enabled:"1",multiplex_brutal_enabled:"1"}));let g=t.option(c.Value,"multiplex_brutal_down_mbps",_("Downlink Bandwidth"),_("Downlink Bandwidth"));g.datatype="uinteger",g.modalonly=!0,e.forEach(m=>g.depends({type:m,core:d.SING_BOX,multiplex_enabled:"1",multiplex_brutal_enabled:"1"}))}function es(t){let e=t.option(c.ListValue,"method",_("Encryption Method"),_("Shadowsocks Encryption Method"));e.modalonly=!0,e.rmempty=!1,e.default="2022-blake3-aes-256-gcm",h.forProtocols(e,[l.SHADOWSOCKS]),A.SHADOWSOCKS_METHODS.forEach(r=>{e.value(r.value,r.label)})}function rs(t){let e=t.option(c.ListValue,"plugin",_("Plugin"),_("Shadowsocks SIP003 Plugin"));e.modalonly=!0,e.value("",_("None")),e.value("obfs-local","obfs-local"),e.value("v2ray-plugin","v2ray-plugin"),h.forProtocols(e,[l.SHADOWSOCKS]);let r=t.option(c.Value,"plugin_opts",_("Plugin Options"),_("Shadowsocks SIP003 Plugin Options"));r.modalonly=!0,h.forProtocols(r,[l.SHADOWSOCKS],{plugin:/./})}function ns(t){let e=t.option(c.Flag,"udp_over_tcp",_("UDP over TCP"),_("Enable UDP over TCP"));e.modalonly=!0,h.forProtocols(e,[l.SHADOWSOCKS])}function os(t){let e=t.option(c.ListValue,"congestion_control",_("Congestion Control"),_("QUIC Congestion Control"));e.modalonly=!0,e.default="cubic",h.forProtocols(e,[l.TUIC]),A.TUIC_CONGESTION_CONTROLS.forEach(i=>{e.value(i.value,i.label)});let r=t.option(c.ListValue,"udp_relay_mode",_("UDP Relay Mode"),_("UDP Packet Relay Mode"));r.modalonly=!0,r.default="",h.forProtocols(r,[l.TUIC],{udp_over_stream:"0"}),r.value("",_("None")),A.TUIC_UDP_RELAY_MODES.forEach(i=>{r.value(i.value,_(i.label))});let n=t.option(c.Flag,"udp_over_stream",_("UDP over Stream"),_("Use UDP Stream Relay"));n.modalonly=!0,h.forProtocols(n,[l.TUIC]);let o=t.option(c.Flag,"zero_rtt_handshake",_("0-RTT Handshake"),_("Enable 0-RTT QUIC Handshake"));o.modalonly=!0,h.forProtocols(o,[l.TUIC]);let s=t.option(c.Value,"heartbeat",_("Heartbeat Interval"),_("Heartbeat Interval"));s.modalonly=!0,s.default="10s",h.forProtocols(s,[l.TUIC])}function ss(t){let e=t.option(c.ListValue,"version",_("Protocol Version"),_("ShadowTLS Protocol Version"));e.modalonly=!0,e.default="1",h.forProtocols(e,[l.SHADOWTLS]),A.SHADOWTLS_VERSIONS.forEach(r=>{e.value(r.value,r.label)})}function is(t){let e=t.option(c.ListValue,"flow",_("VLESS Flow Control"),_("VLESS Flow Control"));e.modalonly=!0,h.forProtocols(e,[l.VLESS]),A.VLESS_FLOWS.forEach(r=>{e.value(r.value,_(r.label))})}function as(t){let e=t.option(c.Value,"transport_xhttp_host",_("XHTTP Host"),_("XHTTP Host Domain"));e.modalonly=!0,e.depends({type:l.VLESS,core:d.XRAY,transport_type:"xhttp"});let r=t.option(c.Value,"transport_xhttp_path",_("XHTTP Path"),_("XHTTP Request Path"));r.modalonly=!0,r.default="/",r.depends({type:l.VLESS,core:d.XRAY,transport_type:"xhttp"});let n=t.option(c.ListValue,"transport_xhttp_mode",_("XHTTP Mode"),_("XHTTP Transport Mode"));n.modalonly=!0,n.default="auto",n.value("auto",_("Auto")),n.value("packet-up","packet-up"),n.value("stream-one","stream-one"),n.value("stream-up","stream-up"),n.depends({type:l.VLESS,core:d.XRAY,transport_type:"xhttp"})}function ls(t,e){Do(t,e),Io(t),Cr(t),h.createCoreAndTypeOptions(t),h.createUpstreamProxyNodeOption(t),Fo(t),Mo(t),Uo(t),Zo(t),Jo(t),Ko(t),Qo(t),Yo(t),Ho(t),Vo(t),$o(t),es(t),rs(t),ns(t),os(t),ss(t),is(t),Bo(t),zo(t),Xo(t),Go(t),Wo(t),jo(t),qo(t),as(t),ts(t),h.createProxyPortOptions(t),ko(t)}var us=Lo;return Ir(ps);})();
|
|
|
|
|
|
return LuciView.default;
|