'use strict';
'require form';
'require fs';
'require uci';
'require view';
var LuciView=(()=>{var H=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var V=Object.prototype.hasOwnProperty;var j=(t,e)=>{for(var a in e)H(t,a,{get:e[a],enumerable:!0})},q=(t,e,a,l)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of G(e))!V.call(t,n)&&n!==a&&H(t,n,{get:()=>e[n],enumerable:!(l=k(e,n))||l.enumerable});return t};var W=t=>q(H({},"__esModule",{value:!0}),t);var ie={};j(ie,{default:()=>re});var M=view;var g={CUSTOM:"custom",LOAD_BALANCE:"load_balance",HYSTERIA2:"hysteria2",SHADOWSOCKS:"shadowsocks",TUIC:"tuic",SHADOWTLS:"shadowtls",VLESS:"vless"},h={XRAY:"xray",SING_BOX:"sing-box",CUSTOM:"custom"};var ue={[h.XRAY]:[g.SHADOWSOCKS,g.HYSTERIA2,g.VLESS],[h.SING_BOX]:[g.SHADOWSOCKS,g.HYSTERIA2,g.VLESS,g.TUIC,g.SHADOWTLS]},pe={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:[h.XRAY,h.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:h.SING_BOX},{label:"xray",value:h.XRAY},{label:"Custom",value:h.CUSTOM}]};var p=form;var m=uci;var d=fs;function Q(){let t=[],e=m.get_first("hijpass","hijpass","log_path");t.push(E("option",{value:e},_("Main Log")));let a=m.get_first("hijpass","shunt","log_path");return a&&t.push(E("option",{value:a},_("Shunt Log"))),m.sections("hijpass","proxy_node",l=>{let n=l[".name"],o=l.name||n,r=l.log_path;r&&t.push(E("option",{value:r},_("Proxy Log")+" - "+o))}),m.sections("hijserver","server_node",l=>{let n=l[".name"],o=l.name||n,r=l.log_path;r&&t.push(E("option",{value:r},_("Server Log")+" - "+o))}),t}function P(t,e,a,l,n){let o=t.value,r=e.value,i=a.value;f(l,_("Loading Logs")),d.exec("/usr/bin/tail",["-n",i,o]).then(function(c){let s=c.stdout||"";if(r){let u=r.toUpperCase();s=s.split(`
`).filter(function(T){let v=T.toUpperCase();return u==="WARN"?v.includes("WARN")||v.includes("WARNING"):v.includes(u)}).join(`
`)}s=D(s),n.innerHTML=s,n.scrollTop=n.scrollHeight,f(l,_("Log Updated")+" - "+new Date().toLocaleTimeString())}).catch(function(c){f(l,_("Failed to Load Log")+c.message),n.textContent=_("Failed to Load Log File")+o})}function D(t){return t=t.replace(/&/g,"&").replace(//g,">"),t=z(t),t=t.replace(/\s+\[?(ERROR|WARN|WARNING|INFO|DEBUG)\]?\s+/gmi,function(e,a){return e.includes("'+e+""}),t}function X(t){switch(t.toUpperCase()){case"ERROR":return"#ff6b6b";case"WARN":case"WARNING":return"#ffa500";case"INFO":return"#4ecdc4";case"DEBUG":return"#95a5a6";default:return"#ffffff"}}function z(t){let e={30:"#2e3436",31:"#cc0000",32:"#4e9a06",33:"#c4a000",34:"#3465a4",35:"#75507b",36:"#06989a",37:"#d3d7cf",90:"#555753",91:"#ef2929",92:"#8ae234",93:"#fce94f",94:"#729fcf",95:"#ad7fa8",96:"#34e2e2",97:"#eeeeec"},a={40:"#2e3436",41:"#cc0000",42:"#4e9a06",43:"#c4a000",44:"#3465a4",45:"#75507b",46:"#06989a",47:"#d3d7cf",100:"#555753",101:"#ef2929",102:"#8ae234",103:"#fce94f",104:"#729fcf",105:"#ad7fa8",106:"#34e2e2",107:"#eeeeec"},l=t,n=[];for(l=l.replace(/\x1b\[([0-9;]*)m/g,function(o,r){r||(r="0");let i=r.split(";"),c="";for(let s of i)if(s=s.trim(),s==="0"||s==="")for(;n.length>0;)c+="",n.pop();else s==="1"?(c+='',n.push("bold")):s==="4"?(c+='',n.push("underline")):e[s]?(c+='',n.push("color")):a[s]&&(c+='',n.push("bgcolor"));return c});n.length>0;)l+="",n.pop();return l}function K(t,e){let a=t.value;f(e,_("Preparing Download")),d.read(a).then(function(l){let n=new Blob([l],{type:"text/plain"}),o=window.URL.createObjectURL(n),r=document.createElement("a");r.href=o,r.download=a.split("/").pop()+"_"+new Date().toISOString().slice(0,19).replace(/:/g,"-")+".log",document.body.appendChild(r),r.click(),document.body.removeChild(r),window.URL.revokeObjectURL(o),f(e,_("Log Downloaded"))}).catch(function(l){f(e,_("Download Failed")+l.message)})}function $(t,e,a,l,n){let o=t.value;f(l,_("Clearing Logs")),d.write(o,"").then(function(){f(l,_("Log Cleared")),P(t,e,a,l,n)}).catch(function(r){f(l,_("Clear Failed")+r.message)})}function f(t,e){t.textContent=e,t.style.color="#666"}function L(t,e,a){t.textContent=e,t.style.display=e?"block":"none",t.style.color=a||"#666"}function A(t,e){t.innerHTML=D(e),t.scrollTop=0}function Z(t){let e=t.url.trim(),a=t.timeout.trim(),l=t.method||"HEAD",n=[];if(!/^https?:\/\/[A-Za-z0-9_.:\-/?#%=&+~[\]]+$/.test(e))throw new Error(_("Please enter a valid HTTP or HTTPS URL"));if(!/^[0-9]+$/.test(a)||parseInt(a,10)<1||parseInt(a,10)>120)throw new Error(_("Timeout must be an integer between 1 and 120"));if(n.push("-t",a),n.push("-X",l),t.mode==="client"){let o=t.clientIp.trim();if(!/^[A-Fa-f0-9:.]+$/.test(o))throw new Error(_("Please enter a valid client IP address"));n.push("-c",o)}if(t.tcpdump){let o=t.tcpdumpInterface.trim()||"any";if(n.push("-p"),!/^[A-Za-z0-9_.:@-]+$/.test(o))throw new Error(_("Please enter a valid tcpdump interface"));n.push("-i",o)}return t.verbose&&n.push("-v"),n.push(e),n}function J(t,e,a,l){let n;try{n=Z(t)}catch(o){L(e,o.message,"#b00020");return}a.innerHTML="",l.disabled=!0,L(e,_("Running Trace Diagnostics")),d.exec("/usr/lib/hijpass/trace-url.sh",n).then(function(o){let r=o.stdout||"",i=o.stderr||"";A(a,r||i||_("No Output")),o.code===0?L(e,_("Trace Completed")+" - "+new Date().toLocaleTimeString()):L(e,_("Trace Failed")+" - "+(i||_("Exit Code")+": "+o.code),"#b00020")}).catch(function(o){A(a,o.message||String(o)),L(e,_("Trace Failed")+" - "+o.message,"#b00020")}).finally(function(){l.disabled=!1})}function ee(){let t=E("div",{style:"display: none; font-size: 12px; color: #666; margin-bottom: 6px;"}),e=E("pre",{style:"width: 100%; min-height: 260px; max-height: 520px; box-sizing: border-box; margin: 0; font-family: monospace; font-size: 12px; background: #101010; color: #eee; border: 1px solid #ccc; padding: 10px; overflow: auto; white-space: pre-wrap; line-height: 1.45;"},_("Trace output will be shown here"));return{statusElement:t,outputElement:e,node:E("div",{},[t,e])}}var x={createLogControlPanel:function(){let t=E("select",{class:"cbi-input-select",style:"margin-right: 10px;"},Q()),e=E("select",{class:"cbi-input-select",style:"margin-right: 10px;"},[E("option",{value:""},_("All")),E("option",{value:"DEBUG"},_("Debug")),E("option",{value:"INFO"},_("Info")),E("option",{value:"WARN"},_("Warning")),E("option",{value:"ERROR"},_("Error"))]),a=E("select",{class:"cbi-input-select",style:"margin-right: 10px;"},[E("option",{value:"50"},"50"),E("option",{value:"100",selected:"selected"},"100"),E("option",{value:"200"},"200"),E("option",{value:"500"},"500"),E("option",{value:"1000"},"1000")]),l=E("div",{style:"font-size: 12px; color: #666; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"}),n=E("div",{class:"log-display",style:"width: 100%; height: 500px; font-family: monospace; font-size: 12px; background: #101010; color: #eee; border: 1px solid #ccc; padding: 10px; overflow: auto; white-space: pre; line-height: 1.4;"},_("Log Content")),o,r=null,i=function(){P(t,e,a,l,n)},c=function(u){r!==null&&(clearInterval(r),r=null),u.textContent=_("Auto Refresh"),u.className="cbi-button cbi-button-neutral"},s=E("button",{class:"cbi-button cbi-button-neutral",style:"margin-right: 5px;",type:"button",click:function(u){u.preventDefault(),r===null?(s.textContent=_("Stop Auto Refresh"),s.className="cbi-button cbi-button-negative",r=window.setInterval(function(){if(!o.isConnected){c(s);return}i()},3e3),f(l,_("Auto Refresh Enabled"))):(c(s),f(l,_("Auto Refresh Disabled")))}},_("Auto Refresh"));return t.addEventListener("change",i),e.addEventListener("change",i),a.addEventListener("change",i),o=E("div",{class:"cbi-section"},[E("div",{class:"cbi-section-node"},[E("div",{class:"cbi-value"},[E("label",{class:"cbi-value-title"},_("Log File")),E("div",{class:"cbi-value-field"},[t])]),E("div",{class:"cbi-value"},[E("label",{class:"cbi-value-title"},_("Log Level Filter")),E("div",{class:"cbi-value-field"},[e])]),E("div",{class:"cbi-value"},[E("label",{class:"cbi-value-title"},_("Display Lines")),E("div",{class:"cbi-value-field"},[a])]),E("div",{class:"cbi-value"},[E("label",{class:"cbi-value-title"},_("Actions")),E("div",{class:"cbi-value-field"},[E("button",{class:"cbi-button cbi-button-action",style:"margin-right: 5px;",type:"button",click:function(u){u.preventDefault(),i()}},_("Refresh")),s,E("button",{class:"cbi-button cbi-button-positive",style:"margin-right: 5px;",type:"button",click:function(u){u.preventDefault(),K(t,l)}},_("Download")),E("button",{class:"cbi-button cbi-button-negative",type:"button",click:function(u){u.preventDefault(),confirm(_("Clear Log Confirmation"))&&$(t,e,a,l,n)}},_("Clear"))])]),E("div",{class:"cbi-value"},[l,n])])]),i(),o},createTraceOutputPanel:ee,runTraceDiagnostics:J};function te(t,e){e.disabled=!0,R(t,_("Updating Rule Files"),"neutral"),d.exec_direct("/usr/lib/hijpass/rules.sh",["update"],"json").then(function(a){a?.success?R(t,_("Rule Files Updated"),"success"):R(t,_("Rule File Update Failed: %s").format(_("Update failed")),"error")}).catch(function(a){R(t,_("Error occurred while updating: %s").format(a.message),"error")}).finally(function(){e.disabled=!1})}function R(t,e,a){t.textContent=e,t.style.color=a==="success"?"#4caf50":a==="error"?"#f44336":"#666"}function I(t,e,a,l){let n=t.value.trim(),o=e.value;if(!n){a.textContent=_("Enter Query Keyword"),a.style.color="#f44336";return}switch(a.textContent=_("Querying"),a.style.color="#666",o){case"domain":ae(n,l,a);break;case"geosite":ne(n,"geosite",l,a);break;case"shunt":le(n,l,a);break;default:a.textContent=_("Unknown Query Type"),a.style.color="#f44336"}}function ae(t,e,a){N(e),d.exec("/usr/bin/lua",["/usr/lib/hijpass/luci-utils.lua","iptype",t]).then(function(l){let n=l.code===0?"geoip":"geosite";return d.exec("/usr/lib/hijpass/geoview.sh",["-l",n,t]).then(C(e,a,"# "+n+`
`))}).catch(O(a)),d.exec("/usr/lib/hijpass/rules.sh",["query",t]).then(C(e,a,_(`# Local Rule Files
`))).catch(O(a))}function le(t,e,a){N(e),d.exec("/usr/lib/hijpass/route-match.sh",[t]).then(C(e,a,_(`# Shunt Rules
`))).catch(O(a))}function ne(t,e,a,l){N(a),d.exec("/usr/lib/hijpass/geoview.sh",["-e",e,t]).then(function(n){if(n.code!==0)throw new Error(n.stderr||_("Query Failed"));let o=n.stdout||"";o.trim()?(a.value&&(a.value+=`
`),a.value+="# "+e+`
`,a.value+=o,l.textContent=_("Query Complete"),l.style.color="#4caf50"):(l.textContent=_("No Matching Results"),l.style.color="#666")}).catch(O(l))}function N(t){t.value=""}function C(t,e,a){return function(l){if(l.code===0)l.stdout&&(t.value&&(t.value+=`
`),t.value+=a,t.value+=l.stdout),e.textContent=_("Query Complete"),e.style.color="#4caf50";else throw new Error(l.stderr||_("Query Failed"))}}function O(t){return function(e){console.log(e),t.textContent=_("Query Failed"),t.style.color="#f44336"}}var U={createUpdateButtons:function(){let t=E("span",{style:"margin-left: 10px; font-size: 12px; color: #666;"}),e=E("button",{class:"cbi-button cbi-button-neutral",style:"margin-right: 10px;",type:"button",click:function(a){a.preventDefault(),te(t,e)}},_("Update Rule Files"));return E("div",{class:"cbi-section"},[E("div",{class:"cbi-section-node"},[E("div",{class:"cbi-value"},[E("label",{class:"cbi-value-title"},_("Rule Update")),E("div",{class:"cbi-value-field"},[e,t])])])])},createQueryPanel:function(){let t={domain:{placeholder:_("Enter a domain or IP address"),description:[_("Domain: Enter a domain (for example, www.example.com) to query GeoSite tags and local domain rule files."),_("IP address: Enter an IP address (for example, 8.8.8.8) to query GeoIP tags and local IP rule files.")]},geosite:{placeholder:_("Enter a GeoSite tag"),description:[_("Enter a GeoSite tag (for example, cn or google) to list the domain rules included in that tag.")]},shunt:{placeholder:_("Enter a domain or IP address"),description:[_("Enter a domain or IP address to show the first matching enabled shunt rule."),_("Protocol and port conditions are not evaluated.")]}},e=E("select",{id:"hijpass-rule-query-type",class:"cbi-input-select",style:"width: 200px; margin-right: 10px;","aria-describedby":"hijpass-rule-query-type-description"},[E("option",{value:"domain"},_("Domain Query")),E("option",{value:"geosite"},_("GeoSite")),E("option",{value:"shunt"},_("Shunt Query"))]),a=E("div",{id:"hijpass-rule-query-type-description",class:"cbi-section-descr",style:"margin-top: 6px;","aria-live":"polite"}),l=E("input",{id:"hijpass-rule-query-keyword",type:"text",class:"cbi-input-text",style:"margin-right: 10px;",keydown:function(i){i.key==="Enter"&&(i.preventDefault(),I(l,e,n,o))}}),n=E("span",{style:"margin-left: 10px; font-size: 12px; color: #666;",role:"status","aria-live":"polite"}),o=E("textarea",{id:"hijpass-rule-query-results",class:"cbi-input-textarea",readonly:"readonly",placeholder:_("Query results will appear here"),style:"width: 100%; height: 300px;","aria-describedby":"hijpass-rule-query-results-description"}),r=function(){let i=t[e.value]||t.domain;l.placeholder=i.placeholder,a.innerHTML="",i.description.forEach(function(c){a.appendChild(E("div",{},c))})};return e.addEventListener("change",r),r(),E("div",{class:"cbi-section"},[E("div",{class:"cbi-section-descr"},_("Query saved rule data without changing configuration. Unsaved form changes are not included.")),E("div",{class:"cbi-section-node"},[E("div",{class:"cbi-value",style:"margin-bottom: 20px;"},[E("label",{class:"cbi-value-title",for:"hijpass-rule-query-type"},_("Query Type")),E("div",{class:"cbi-value-field"},[e,a])]),E("div",{class:"cbi-value",style:"margin-bottom: 20px;"},[E("label",{class:"cbi-value-title",for:"hijpass-rule-query-keyword"},_("Query Keyword")),E("div",{class:"cbi-value-field"},[l,E("button",{class:"cbi-button cbi-button-action",style:"margin-right: 10px;",type:"button",click:function(i){i.preventDefault(),I(l,e,n,o)}},_("Query")),n])]),E("div",{class:"cbi-value"},[E("label",{class:"cbi-value-title",for:"hijpass-rule-query-results"},_("Query Results")),E("div",{class:"cbi-value-field"},[o,E("div",{id:"hijpass-rule-query-results-description",class:"cbi-section-descr",style:"margin-top: 6px;"},_("An empty result means no matching entry was found."))])])])])}};var oe=M.extend({load:function(){return Promise.all([m.load("hijpass"),m.load("hijserver")])},handleSaveApply:null,handleReset:null,handleSave:null,render:function(){let t=new p.Map("hijpass",_("Diagnostics"),_("Inspect logs, trace routing behavior, and query rule resources")),e=t.section(p.TypedSection,"hijpass");e.anonymous=!0,e.addremove=!1,e.tab("logs",_("Logs")),e.tab("trace",_("Routing Diagnostics")),e.tab("rule",_("Rule Diagnostics"));let a=new URLSearchParams(window.location.search).get("tab");(a==="logs"||a==="trace"||a==="rule")&&(e.selected_tab=a);let l=e.taboption("logs",p.DummyValue,"_logs_tab");l.render=function(){return x.createLogControlPanel()};let n=e.taboption("trace",p.Value,"_trace_url",_("URL"));n.default="https://www.gstatic.com/generate_204",n.placeholder="https://www.gstatic.com/generate_204",n.rmempty=!1;let o=e.taboption("trace",p.ListValue,"_trace_mode",_("Mode"));o.value("router",_("Router Local")),o.value("client",_("Client Transparent Proxy")),o.default="router",o.rmempty=!1;let r=e.taboption("trace",p.Value,"_trace_client_ip",_("Client IP"),_("Required only for client transparent proxy mode"));r.placeholder="192.168.1.100",r.datatype="ipaddr",r.rmempty=!1,r.depends("_trace_mode","client");let i=e.taboption("trace",p.ListValue,"_trace_method",_("Request Method"));i.value("HEAD","HEAD"),i.value("GET","GET"),i.default="HEAD",i.rmempty=!1;let c=e.taboption("trace",p.Value,"_trace_timeout",_("Timeout"));c.default="8",c.datatype="range(1,120)",c.rmempty=!1;let s=e.taboption("trace",p.Flag,"_trace_tcpdump",_("Enable tcpdump"),_("Optional. tcpdump must be installed on the router"));s.default="0",s.rmempty=!0;let u=e.taboption("trace",p.Value,"_trace_tcpdump_iface",_("tcpdump Interface"));u.default="any",u.placeholder="any",u.rmempty=!0,u.depends("_trace_tcpdump","1");let S=e.taboption("trace",p.Flag,"_trace_verbose",_("Show raw trace/log tail"));S.default="0",S.rmempty=!0;let T=null,v=null,w=e.taboption("trace",p.Button,"_trace_run",_("Actions"));w.inputtitle=_("Run Trace"),w.inputstyle="action",w.onclick=function(y,b){if(!(!T||!v))return x.runTraceDiagnostics({url:String(n.formvalue(b)||""),mode:String(o.formvalue(b)||"router"),clientIp:String(r.formvalue(b)||""),method:String(i.formvalue(b)||"HEAD"),timeout:String(c.formvalue(b)||"8"),tcpdump:s.formvalue(b)==="1",tcpdumpInterface:String(u.formvalue(b)||"any"),verbose:S.formvalue(b)==="1"},T,v,y.currentTarget)};let F=e.taboption("trace",p.DummyValue,"_trace_output");F.render=function(){let y=x.createTraceOutputPanel();return T=y.statusElement,v=y.outputElement,y.node};let Y=e.taboption("rule",p.DummyValue,"_rule_diagnostics_tab");return Y.render=function(){return U.createQueryPanel()},t.render()}}),re=oe;return W(ie);})();
return LuciView.default;