diff --git a/dashboard/public/200.html b/dashboard/public/200.html index f860778..dcf9b80 100644 --- a/dashboard/public/200.html +++ b/dashboard/public/200.html @@ -1 +1 @@ -
{let{slotScopeIds:u}=t;u&&(i=i?i.concat(u):u);let d=o(e),f=p(a(e),t,d,n,r,i,s);return f&&di(f)&&f.data===`]`?a(t.anchor=f):(si(),c(t.anchor=l(`]`),d,f),f)},g=(e,t,r,i,c,l)=>{if(hi(e.parentElement,1)||si(),t.el=null,l){let t=_(e);for(;;){let n=a(e);if(n&&n!==t)s(n);else break}}let u=a(e),d=o(e);return s(e),n(null,t,d,u,r,i,ui(d),c),r&&(r.vnode.el=t.el,go(r,t.el)),u},_=(e,t=`[`,n=`]`)=>{let r=0;for(;e;)if(e=a(e),e&&di(e)&&(e.data===t&&r++,e.data===n)){if(r===0)return a(e);r--}return e},v=(e,t,n)=>{let r=t.parentNode;r&&r.replaceChild(e,t);let i=n;for(;i;)i.vnode.el===t&&(i.vnode.el=i.subTree.el=e),i=i.parent},y=e=>e.nodeType===1&&e.tagName===`TEMPLATE`;return[u,d]}var pi=`data-allow-mismatch`,mi={0:`text`,1:`children`,2:`class`,3:`style`,4:`attribute`};function hi(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(pi);)e=e.parentElement;let n=e&&e.getAttribute(pi);if(n==null)return!1;if(n===``)return!0;{let e=n.split(`,`);return t===0&&e.includes(`children`)?!0:e.includes(mi[t])}}var gi=ve().requestIdleCallback||(e=>setTimeout(e,1)),_i=ve().cancelIdleCallback||(e=>clearTimeout(e)),vi=(e=1e4)=>t=>{let n=gi(t,{timeout:e});return()=>_i(n)};function yi(e){let{top:t,left:n,bottom:r,right:i}=e.getBoundingClientRect(),{innerHeight:a,innerWidth:o}=window;return(t>0&&t0&&r0&&n32))return a;if(r===41){if(o===0)break;o--}i++}return t===i||o!==0?a:(a.str=F(e.slice(t,i)),a.pos=i,a.ok=!0,a)}function vt(e,t,n,r){let i,a=t,o={ok:!1,can_continue:!1,pos:0,str:``,marker:0};if(r)o.str=r.str,o.marker=r.marker;else{if(a>=n)return o;let r=e.charCodeAt(a);if(r!==34&&r!==39&&r!==40)return o;t++,a++,r===40&&(r=41),o.marker=r}for(;a`+I(a.content)+``},V.code_block=function(e,t,n,r,i){let a=e[t];return`
+`},V.fence=function(e,t,n,r,i){let a=e[t],o=a.info?F(a.info).trim():``,s=``,c=``;if(o){let e=o.split(/(\s+)/g);s=e[0],c=e.slice(2).join(``)}let l;if(l=n.highlight&&n.highlight(a.content,s,c)||I(a.content),l.indexOf(``+I(e[t].content)+`
\n`}return`${l}
\n`},V.image=function(e,t,n,r,i){let a=e[t];return a.attrs[a.attrIndex(`alt`)][1]=i.renderInlineAsText(a.children,n,r),i.renderToken(e,t,n)},V.hardbreak=function(e,t,n){return n.xhtmlOut?`${l}
+`:`
+`},V.softbreak=function(e,t,n){return n.breaks?n.xhtmlOut?`
+`:`
+`:`
+`},V.text=function(e,t){return I(e[t].content)},V.html_block=function(e,t){return e[t].content},V.html_inline=function(e,t){return e[t].content};function H(){this.rules=$e({},V)}H.prototype.renderAttrs=function(e){let t,n,r;if(!e.attrs)return``;for(r=``,t=0,n=e.attrs.length;t
`;return this.points?.forEach(e=>{t+=`\u25CF ${e.series.name}: ${c(e.y,!0)}
`}),t}},plotOptions:{areaspline:{fillOpacity:.3,marker:{enabled:!1},lineWidth:2,states:{hover:{lineWidth:3}},threshold:null}},series:i.seriesConfig.map((t,n)=>({type:`areaspline`,name:t.name,color:t.color||e.seriesColors[n]||Ee.default.getOptions().colors?.[n]||`hsl(${n*120}, 70%, 50%)`,data:i.initialData?.[n]||[]}))}}let p={addPoint:(e,t,n)=>{if(u?.series[e]){let r=u.series[e].data.length>=10;u.series[e].addPoint([t,n],!0,r,{duration:800,easing:`linear`})}},addPoints:e=>{if(!u)return;let t=new Map;e.forEach(e=>{t.has(e.seriesIndex)||t.set(e.seriesIndex,[]),t.get(e.seriesIndex).push({time:e.time,value:e.value})}),t.forEach((e,t)=>{let n=u?.series[t];n&&e.forEach(e=>{let t=n.data.length>=10;n.addPoint([e.time,e.value],!1,t)})}),u.redraw({duration:800,easing:`linear`})},setSeriesData:(e,t)=>{u?.series[e]&&u.series[e].setData(t,!0,!1,!1)}};return t({chartRef:p}),g(()=>{if(!l.value)return;u=Ee.default.chart(l.value,f()),o(`chartReady`,p);let e=new ResizeObserver(()=>{u&&l.value&&u.setSize(l.value.clientWidth,l.value.clientHeight,!0)});e.observe(l.value),w(()=>{e.disconnect(),u?.destroy()})}),v(()=>i.title,e=>{u&&u.setTitle({text:e})}),v(()=>i.seriesConfig,e=>{u&&(e.forEach((e,t)=>{u.series[t]&&u.series[t].update({type:`areaspline`,name:e.name,color:e.color},!1)}),u.redraw())},{deep:!0}),v(()=>d.curTheme,()=>{requestAnimationFrame(()=>{if(u){let e=be();u.update({chart:{backgroundColor:e.backgroundColor},title:{style:{color:e.textColor}},legend:{itemStyle:{color:e.textColor},itemHoverStyle:{color:e.textColorHover}},xAxis:{labels:{style:{color:e.textColor}},lineColor:e.lineColor,tickColor:e.tickColor},yAxis:{labels:{style:{color:e.textColor}},gridLineColor:e.gridLineColor}},!0,!1,!1)}})}),(t,r)=>(D(),s(`div`,De,[e.isLoading?(D(),s(`div`,Oe,[...r[0]||=[a(`span`,{class:`loading loading-lg loading-dots`},null,-1)]])):T(``,!0),a(`div`,{ref_key:`containerRef`,ref:l,class:n([`h-full w-full`,{"opacity-0":e.isLoading}])},null,2)]))}}),Ae=Object.assign(ke,{__name:`RealtimeLineChart`}),je=u(ge(),1),Me={class:`relative h-full w-full`},Ne={key:0,class:`absolute inset-0 flex items-center justify-center`},Pe=e({__name:`HighchartsAutoSize`,props:{options:{},isLoading:{type:Boolean,default:!1}},setup(e){let t=e,r=A(),i,o=M();function c(){let e=be();return{chart:{animation:{duration:300},backgroundColor:e.backgroundColor},credits:{enabled:!1},accessibility:{enabled:!1},legend:{itemStyle:{color:e.textColor},itemHoverStyle:{color:e.textColorHover}},title:{style:{color:e.textColor}}}}return g(()=>{if(!r.value)return;let e=c(),n={...e,...t.options,chart:{...e.chart,...t.options.chart}};i=je.default.chart(r.value,n);let a=r.value.clientWidth,o=r.value.clientHeight,s=new ResizeObserver(()=>{if(i&&r.value){let e=r.value.clientWidth,t=r.value.clientHeight;(e!==a||t!==o)&&(a=e,o=t,i.setSize(e,t,!1))}});s.observe(r.value),w(()=>{s.disconnect(),i?.destroy()})}),v(()=>t.options,e=>{i&&i.update(e,!0,!1,!1)},{deep:!0}),v(()=>o.curTheme,()=>{requestAnimationFrame(()=>{if(i){let e=be();i.update({chart:{backgroundColor:e.backgroundColor},title:{style:{color:e.textColor}},legend:{itemStyle:{color:e.textColor},itemHoverStyle:{color:e.textColorHover}},xAxis:{labels:{style:{color:e.textColor}},lineColor:e.lineColor,tickColor:e.tickColor},yAxis:{labels:{style:{color:e.textColor}},gridLineColor:e.gridLineColor}},!0,!1,!1)}})}),(t,i)=>(D(),s(`div`,Me,[e.isLoading?(D(),s(`div`,Ne,[...i[0]||=[a(`span`,{class:`loading loading-lg loading-dots`},null,-1)]])):T(``,!0),a(`div`,{ref_key:`containerRef`,ref:r,class:n([`h-full w-full`,{"opacity-0":e.isLoading}])},null,2)]))}}),Fe=Object.assign(Pe,{__name:`HighchartsAutoSize`}),Ie={"ip.sb":`https://api.ip.sb/geoip`,"ipwho.is":`https://ipwho.is/`,"ipapi.is":`https://api.ipapi.is/`};function Le(e){return{ip:e.ip,country:e.country,city:e.city,asn:e.asn,org:e.asn_organization}}function Re(e){return{ip:e.ip,country:e.country,countryCode:e.country_code,city:e.city,region:e.region,asn:e.connection?.asn,org:e.connection?.org,isp:e.connection?.isp,latitude:e.latitude,longitude:e.longitude,timezone:e.timezone?.id}}function ze(e){return{ip:e.ip,country:e.location?.country,countryCode:e.location?.country_code,city:e.location?.city,region:e.location?.state,asn:e.asn?.asn,org:e.asn?.org,isProxy:e.is_proxy,isVPN:e.is_vpn,latitude:e.location?.latitude,longitude:e.location?.longitude,timezone:e.location?.timezone}}async function Be(e){let t=Ie[e],n=await me.get(t,{timeout:1e4}).json();switch(e){case`ip.sb`:return Le(n);case`ipwho.is`:return Re(n);case`ipapi.is`:return ze(n);default:throw Error(`Unknown IP provider: ${e}`)}}function Ve(){let e=A(`ip.sb`),t=A(null),n=A(!1),r=A(null);async function i(i){let a=i??e.value;n.value=!0,r.value=null;try{t.value=await Be(a),e.value=a}catch(e){r.value=e instanceof Error?e.message:`Failed to fetch IP info`,t.value=null}finally{n.value=!1}}return{currentProvider:e,ipInfo:t,isLoading:n,error:r,fetchIP:i}}var He={class:`card bg-base-200 p-4 shadow-sm`},Ue={class:`mb-3 flex items-center justify-between`},We={class:`flex items-center gap-2`},Ge={class:`font-semibold`},Ke={class:`flex items-center gap-2`},qe=[`value`],Je=[`value`],Ye=[`disabled`],Xe={key:0,class:`flex justify-center py-4`},Ze={key:1,class:`alert alert-error`},Qe={key:2,class:`space-y-2`},$e={class:`flex items-center justify-between gap-2`},et={class:`shrink-0 text-base-content/60`},tt=[`title`],nt={key:0,class:`flex items-center justify-between gap-2`},rt={class:`shrink-0 text-base-content/60`},it={class:`truncate`},at={key:1,class:`flex items-center justify-between gap-2`},ot={class:`shrink-0 text-base-content/60`},st={class:`truncate`},ct={key:2,class:`flex items-center justify-between gap-2`},lt={class:`shrink-0 text-base-content/60`},ut=[`title`],dt={key:3,class:`flex items-center justify-between gap-2`},ft={class:`truncate font-mono`},pt={key:4,class:`flex items-center justify-between gap-2`},mt=[`title`],ht={key:5,class:`flex items-center justify-between`},gt={class:`text-base-content/60`},_t={class:`flex gap-1`},vt={key:0,class:`badge badge-sm badge-warning`},yt={key:1,class:`badge badge-sm badge-warning`},bt={key:2,class:`badge badge-sm badge-success`},xt={key:3,class:`py-4 text-center text-base-content/60`},St=e({__name:`IPInfoCard`,setup(e){let{t}=k(),{currentProvider:r,ipInfo:c,isLoading:l,error:u,fetchIP:d}=Ve(),p=[{value:`ip.sb`,label:`IP.SB`},{value:`ipwho.is`,label:`ipwho.is`},{value:`ipapi.is`,label:`ipapi.is`}];g(()=>{d()});function m(e){let t=e.target;d(t.value)}return(e,h)=>(D(),s(`div`,He,[a(`div`,Ue,[a(`div`,We,[f(i(ie),{class:`h-5 w-5 text-primary`}),a(`h3`,Ge,S(i(t)(`currentIP`)),1)]),a(`div`,Ke,[a(`select`,{value:i(r),class:`select-bordered select select-sm`,onChange:m},[(D(),s(o,null,_(p,e=>a(`option`,{key:e.value,value:e.value},S(e.label),9,Je)),64))],40,qe),a(`button`,{class:n([`btn btn-circle btn-ghost btn-sm`,{"animate-spin":i(l)}]),disabled:i(l),onClick:h[0]||=e=>i(d)()},[f(i(ce),{class:`h-4 w-4`})],10,Ye)])]),i(l)?(D(),s(`div`,Xe,[...h[1]||=[a(`span`,{class:`loading loading-md loading-spinner`},null,-1)]])):i(u)?(D(),s(`div`,Ze,[a(`span`,null,S(i(u)),1)])):i(c)?(D(),s(`div`,Qe,[a(`div`,$e,[a(`span`,et,S(i(t)(`ipAddress`)),1),a(`span`,{class:`truncate font-mono font-semibold`,title:i(c).ip},S(i(c).ip),9,tt)]),i(c).country?(D(),s(`div`,nt,[a(`span`,rt,S(i(t)(`country`)),1),a(`span`,it,S(i(c).country),1)])):T(``,!0),i(c).city?(D(),s(`div`,at,[a(`span`,ot,S(i(t)(`city`)),1),a(`span`,st,S(i(c).city),1)])):T(``,!0),i(c).org?(D(),s(`div`,ct,[a(`span`,lt,S(i(t)(`organization`)),1),a(`span`,{class:`truncate text-right`,title:i(c).org},S(i(c).org),9,ut)])):T(``,!0),i(c).asn?(D(),s(`div`,dt,[h[2]||=a(`span`,{class:`shrink-0 text-base-content/60`},`ASN`,-1),a(`span`,ft,`AS`+S(i(c).asn),1)])):T(``,!0),i(c).isp?(D(),s(`div`,pt,[h[3]||=a(`span`,{class:`shrink-0 text-base-content/60`},`ISP`,-1),a(`span`,{class:`truncate text-right`,title:i(c).isp},S(i(c).isp),9,mt)])):T(``,!0),i(c).isProxy!==void 0||i(c).isVPN!==void 0?(D(),s(`div`,ht,[a(`span`,gt,S(i(t)(`proxyDetection`)),1),a(`div`,_t,[i(c).isProxy?(D(),s(`span`,vt,` Proxy `)):T(``,!0),i(c).isVPN?(D(),s(`span`,yt,` VPN `)):T(``,!0),!i(c).isProxy&&!i(c).isVPN?(D(),s(`span`,bt,S(i(t)(`clean`)),1)):T(``,!0)])])):T(``,!0)])):(D(),s(`div`,xt,S(i(t)(`noData`)),1))]))}}),Ct=Object.assign(St,{__name:`IPInfoCard`}),wt=[{name:`Google`,url:`https://www.google.com/generate_204`},{name:`Cloudflare`,url:`https://www.cloudflare.com/cdn-cgi/trace`},{name:`GitHub`,url:`https://github.com`}];async function Tt(e){try{let t=performance.now();await fetch(e,{method:`HEAD`,mode:`no-cors`,cache:`no-store`});let n=performance.now();return Math.round(n-t)}catch{return null}}function Et(){let e=A(new Map),t=A(!1),n=A(wt);async function r(t,n){e.value.set(n,{url:n,latency:null,status:`pending`,timestamp:Date.now()});let r=await Tt(n);return e.value.set(n,{url:n,latency:r,status:r===null?`error`:`success`,timestamp:Date.now()}),r}async function i(){t.value=!0;let e=n.value.map(e=>r(e.name,e.url));await Promise.all(e),t.value=!1}function a(t){return e.value.get(t)}return{results:e,isTestingAll:t,targets:n,testLatency:r,testAllLatencies:i,getResult:a,allResults:m(()=>n.value.map(t=>({name:t.name,url:t.url,result:e.value.get(t.url)}))),averageLatency:m(()=>{let t=Array.from(e.value.values()).filter(e=>e.status===`success`&&e.latency!==null);if(t.length===0)return null;let n=t.reduce((e,t)=>e+(t.latency??0),0);return Math.round(n/t.length)})}}var Dt={class:`card bg-base-200 p-4 shadow-sm`},Ot={class:`mb-3 flex items-center justify-between`},kt={class:`flex items-center gap-2`},At={class:`font-semibold`},jt={class:`flex items-center gap-2`},Mt=[`disabled`],Nt={class:`space-y-3`},Pt={class:`w-20 shrink-0 truncate text-sm`},Ft={class:`relative h-4 flex-1 overflow-hidden rounded-full bg-base-300`},It={class:`w-16 shrink-0 text-right font-mono text-sm`},Lt={key:0,class:`loading loading-xs loading-spinner`},Rt={key:1},zt={key:2,class:`text-error`},Bt={key:3,class:`text-base-content/40`},Vt=e({__name:`LatencyCard`,setup(e){let{t}=k(),{allResults:r,isTestingAll:c,testAllLatencies:l,averageLatency:u}=Et();g(()=>{l()});function p(e){return e==null?`badge-ghost`:e<100?`badge-success`:e<300?`badge-warning`:`badge-error`}function m(e){return e==null?`0%`:`${Math.min(e/500*100,100)}%`}function h(e){return e==null?`bg-base-300`:e<100?`bg-success`:e<300?`bg-warning`:`bg-error`}return(e,g)=>(D(),s(`div`,Dt,[a(`div`,Ot,[a(`div`,kt,[f(i(te),{class:`h-5 w-5 text-primary`}),a(`h3`,At,S(i(t)(`networkLatency`)),1)]),a(`div`,jt,[i(u)===null?T(``,!0):(D(),s(`span`,{key:0,class:n([`badge`,p(i(u))])},S(i(t)(`average`))+`: `+S(i(u))+`ms `,3)),a(`button`,{class:n([`btn btn-circle btn-ghost btn-sm`,{"animate-spin":i(c)}]),disabled:i(c),onClick:g[0]||=(...e)=>i(l)&&i(l)(...e)},[f(i(ce),{class:`h-4 w-4`})],10,Mt)])]),a(`div`,Nt,[(D(!0),s(o,null,_(i(r),e=>(D(),s(`div`,{key:e.url,class:`flex items-center gap-3`},[a(`span`,Pt,S(e.name),1),a(`div`,Ft,[a(`div`,{class:n([`absolute inset-y-0 left-0 rounded-full transition-all duration-500`,h(e.result?.latency)]),style:d({width:m(e.result?.latency)})},null,6)]),a(`span`,It,[e.result?.status===`pending`?(D(),s(`span`,Lt)):e.result?.status===`success`?(D(),s(`span`,Rt,S(e.result.latency)+`ms `,1)):e.result?.status===`error`?(D(),s(`span`,zt,S(i(t)(`timeout`)),1)):(D(),s(`span`,Bt,`-`))])]))),128))])]))}}),Ht=Object.assign(Vt,{__name:`LatencyCard`}),Ut={value:()=>{}};function Wt(){for(var e=0,t=arguments.length,n={},r;e=0&&(e=e.slice(0,t)),!e||e===`start`})}function Za(e,t,n){var r,i,a=Xa(t)?_a:X;return function(){var o=a(this,e),s=o.on;s!==r&&(i=(r=s).copy()).on(t,n),o.on=i}}function Qa(e,t){var n=this._id;return arguments.length<2?Z(this.node(),n).on.on(e):this.each(Za(n,e,t))}function $a(e){return function(){var t=this.parentNode;for(var n in this.__transition)if(+n!==e)return;t&&t.removeChild(this)}}function eo(){return this.on(`end.remove`,$a(this._id))}function to(e){var t=this._name,n=this._id;typeof e!=`function`&&(e=nn(e));for(var r=this._groups,i=r.length,a=Array(i),o=0;o=0;)t+=n[r].value;e.value=t}function Fo(){return this.eachAfter(Po)}function Io(e,t){let n=-1;for(let r of this)e.call(t,r,++n,this);return this}function Lo(e,t){for(var n=this,r=[n],i,a,o=-1;n=r.pop();)if(e.call(t,n,++o,this),i=n.children)for(a=i.length-1;a>=0;--a)r.push(i[a]);return this}function Ro(e,t){for(var n=this,r=[n],i=[],a,o,s,c=-1;n=r.pop();)if(i.push(n),a=n.children)for(o=0,s=a.length;o=0;)n+=r[i].value;t.value=n})}function Vo(e){return this.eachBefore(function(t){t.children&&t.children.sort(e)})}function Ho(e){for(var t=this,n=Uo(t,e),r=[t];t!==n;)t=t.parent,r.push(t);for(var i=r.length;e!==n;)r.splice(i,0,e),e=e.parent;return r}function Uo(e,t){if(e===t)return e;var n=e.ancestors(),r=t.ancestors(),i=null;for(e=n.pop(),t=r.pop();e===t;)i=e,e=n.pop(),t=r.pop();return i}function Wo(){for(var e=this,t=[e];e=e.parent;)t.push(e);return t}function Go(){return Array.from(this)}function Ko(){var e=[];return this.eachBefore(function(t){t.children||e.push(t)}),e}function qo(){var e=this,t=[];return e.each(function(n){n!==e&&t.push({source:n.parent,target:n})}),t}function*Jo(){var e=this,t,n=[e],r,i,a;do for(t=n.reverse(),n=[];e=t.pop();)if(yield e,r=e.children)for(i=0,a=r.length;i=0;--s)i.push(a=o[s]=new ts(o[s])),a.parent=r,a.depth=r.depth+1;return n.eachBefore(es)}function Xo(){return Yo(this).eachBefore($o)}function Zo(e){return e.children}function Qo(e){return Array.isArray(e)?e[1]:null}function $o(e){e.data.value!==void 0&&(e.value=e.data.value),e.data=e.data.data}function es(e){var t=0;do e.height=t;while((e=e.parent)&&e.height<++t)}function ts(e){this.data=e,this.depth=this.height=0,this.parent=null}ts.prototype=Yo.prototype={constructor:ts,count:Fo,each:Io,eachAfter:Ro,eachBefore:Lo,find:zo,sum:Bo,sort:Vo,path:Ho,ancestors:Wo,descendants:Go,leaves:Ko,links:qo,copy:Xo,[Symbol.iterator]:Jo};function ns(e,t){return e.parent===t.parent?1:2}function rs(e){var t=e.children;return t?t[0]:e.t}function is(e){var t=e.children;return t?t[t.length-1]:e.t}function as(e,t,n){var r=n/(t.i-e.i);t.c-=r,t.s+=n,e.c+=r,t.z+=n,t.m+=n}function os(e){for(var t=0,n=0,r=e.children,i=r.length,a;--i>=0;)a=r[i],a.z+=t,a.m+=t,t+=a.s+(n+=a.c)}function ss(e,t,n){return e.a.parent===t.parent?e.a:n}function cs(e,t){this._=e,this.parent=null,this.children=null,this.A=null,this.a=this,this.z=0,this.m=0,this.c=0,this.s=0,this.t=null,this.i=t}cs.prototype=Object.create(ts.prototype);function ls(e){for(var t=new cs(e,0),n,r=[t],i,a,o,s;n=r.pop();)if(a=n._.children)for(n.children=Array(s=a.length),o=s-1;o>=0;--o)r.push(i=n.children[o]=new cs(a[o],o)),i.parent=n;return(t.parent=new cs(null,0)).children=[t],t}function us(){var e=ns,t=1,n=1,r=null;function i(i){var s=ls(i);if(s.eachAfter(a),s.parent.m=-s.z,s.eachBefore(o),r)i.eachBefore(c);else{var l=i,u=i,d=i;i.eachBefore(function(e){e.x
${z(e).toString()} (${t.toFixed(1)}%)`}},plotOptions:{pie:{allowPointSelect:!0,cursor:`pointer`,dataLabels:{enabled:!1},showInLegend:!0,animation:!1}},legend:{itemStyle:{color:g.value.textColor},itemHoverStyle:{color:g.value.textColorHover}},series:[{type:`pie`,name:r(`flow`),data:[{name:r(`downloadTotal`),y:l.latestConnectionMsg?.downloadTotal||0,color:g.value.seriesColors[0]},{name:r(`uploadTotal`),y:l.latestConnectionMsg?.uploadTotal||0,color:g.value.seriesColors[1]}]}]})),ne=m(()=>{let e=l.activeConnections,t=0,n=0,i=0;return e.forEach(e=>{let r=e.metadata.network?.toLowerCase()||``;r===`tcp`?t++:r===`udp`?n++:i++}),{chart:{type:`pie`,backgroundColor:g.value.backgroundColor,animation:!1},credits:{enabled:!1},accessibility:{enabled:!1},title:{text:r(`networkTypes`),style:{color:g.value.textColor}},tooltip:{pointFormatter(){let e=this.y||0,t=this.percentage||0;return`${this.name}: ${e} (${t.toFixed(1)}%)`}},plotOptions:{pie:{allowPointSelect:!0,cursor:`pointer`,dataLabels:{enabled:!1},showInLegend:!0,animation:!1}},legend:{itemStyle:{color:g.value.textColor},itemHoverStyle:{color:g.value.textColorHover}},series:[{type:`pie`,name:r(`networkTypes`),data:[{name:r(`tcp`),y:t,color:g.value.seriesColors[0]},{name:r(`udp`),y:n,color:g.value.seriesColors[1]},...i>0?[{name:r(`other`),y:i,color:g.value.seriesColors[2]}]:[]]}]}}),re=m(()=>{let e=l.speedGroupByName,t=Object.entries(e).sort(([,e],[,t])=>t-e).slice(0,5),n=t.map(([e])=>e),i=t.map(([,e])=>e);return{chart:{type:`bar`,backgroundColor:g.value.backgroundColor,animation:!1},credits:{enabled:!1},accessibility:{enabled:!1},title:{text:r(`topProxies`),style:{color:g.value.textColor}},xAxis:{categories:n,labels:{style:{color:g.value.textColor}},lineColor:g.value.lineColor},yAxis:{title:{text:void 0},labels:{style:{color:g.value.textColor},formatter(){return`${z(this.value).toString()}/s`}},gridLineColor:g.value.gridLineColor,min:0},tooltip:{formatter(){return`${n[this.x]||this.x}
${z(this.y).toString()}/s`}},legend:{enabled:!1},plotOptions:{bar:{dataLabels:{enabled:!1},animation:!1}},series:[{type:`bar`,name:r(`traffic`),data:i,color:g.value.seriesColors[0]}]}}),I=o.trafficChartHistory.download.at(-1)?.[0]??0,ie=o.memoryChartHistory.at(-1)?.[0]??0,ae=o.connectionCountHistory.at(-1)?.[0]??0;return v(()=>o.latestTraffic,e=>{if(e&&_.value?.chartRef){let t=Date.now();t>I&&(_.value.chartRef.addPoints([{seriesIndex:0,time:t,value:e.down},{seriesIndex:1,time:t,value:e.up}]),I=t)}}),v(()=>o.latestMemory?.inuse,e=>{if(e&&b.value?.chartRef){let t=Date.now();t>ie&&(b.value.chartRef.addPoint(0,t,e),ie=t)}}),v(()=>l.latestConnectionMsg?.connections?.length,e=>{if(e!==void 0&&C.value?.chartRef){let t=Date.now();t>ae&&(C.value.chartRef.addPoint(0,t,e),ae=t)}}),(e,t)=>{let m=Te,g=Ae,v=Fe,x=Ct,k=Ht,A=Es,M=nl;return D(),s(`div`,rl,[a(`div`,il,[f(m,{label:i(r)(`upload`)},{default:y(()=>[h(S(p(i(o).latestTraffic?.up||0))+`/s `,1)]),_:1},8,[`label`]),f(m,{label:i(r)(`download`)},{default:y(()=>[h(S(p(i(o).latestTraffic?.down||0))+`/s `,1)]),_:1},8,[`label`]),f(m,{label:i(r)(`uploadTotal`)},{default:y(()=>[h(S(p(i(l).latestConnectionMsg?.uploadTotal||0)),1)]),_:1},8,[`label`]),f(m,{label:i(r)(`downloadTotal`)},{default:y(()=>[h(S(p(i(l).latestConnectionMsg?.downloadTotal||0)),1)]),_:1},8,[`label`]),f(m,{label:i(r)(`activeConnections`)},{default:y(()=>[h(S(i(l).latestConnectionMsg?.connections?.length||0),1)]),_:1},8,[`label`]),f(m,{label:i(r)(`memoryUsage`)},{default:y(()=>[h(S(p(i(o).latestMemory?.inuse||0)),1)]),_:1},8,[`label`])]),i(u).currentEndpoint?.url?(D(),s(`div`,al,[a(`span`,ol,S(i(r)(`connectedTo`))+`:`,1),a(`span`,sl,S(i(u).currentEndpoint?.url),1)])):T(``,!0),a(`div`,cl,[a(`div`,ll,[f(g,{ref_key:`trafficChartRef`,ref:_,title:i(r)(`traffic`),"series-config":i(w),"initial-data":i(ee),"is-loading":!i(o).latestTraffic},null,8,[`title`,`series-config`,`initial-data`,`is-loading`])]),a(`div`,ul,[f(v,{options:i(P),"is-loading":!i(l).latestConnectionMsg?.connections?.length},null,8,[`options`,`is-loading`])]),a(`div`,dl,[f(g,{ref_key:`memoryChartRef`,ref:b,title:i(r)(`memory`),"series-config":i(E),"initial-data":i(O),"is-loading":!i(o).latestMemory},null,8,[`title`,`series-config`,`initial-data`,`is-loading`])]),a(`div`,fl,[f(g,{ref_key:`connectionsChartRef`,ref:C,title:i(r)(`connectionsChart`),"series-config":i(j),"initial-data":i(te),"is-loading":!i(l).latestConnectionMsg?.connections?.length,"value-mode":`number`},null,8,[`title`,`series-config`,`initial-data`,`is-loading`])]),a(`div`,pl,[f(v,{options:i(ne),"is-loading":!i(l).latestConnectionMsg?.connections?.length},null,8,[`options`,`is-loading`])]),a(`div`,ml,[f(v,{options:i(re),"is-loading":Object.keys(i(l).speedGroupByName).length===0},null,8,[`options`,`is-loading`])])]),a(`div`,hl,[f(x),f(k)]),a(`div`,gl,[a(`div`,{class:`flex cursor-pointer items-center justify-between`,onClick:t[0]||=e=>i(d).showNetworkTopology=!i(d).showNetworkTopology},[a(`h3`,_l,S(i(r)(`networkTopology`)),1),a(`button`,vl,[f(i(F),{class:n([`h-5 w-5 transition-transform`,{"rotate-180":i(d).showNetworkTopology}])},null,8,[`class`])])]),i(d).showNetworkTopology?(D(),c(A,{key:0,class:`mt-4`})):T(``,!0)]),f(M)])}}});export{yl as default};
\ No newline at end of file
diff --git a/dashboard/public/_nuxt/C7eIA7p7.js b/dashboard/public/_nuxt/C7eIA7p7.js
new file mode 100644
index 0000000..7d19328
--- /dev/null
+++ b/dashboard/public/_nuxt/C7eIA7p7.js
@@ -0,0 +1 @@
+import{$ as e,A as t,Dt as n,E as r,Et as i,G as a,H as o,J as s,K as c,Mt as l,Q as u,R as d,T as f,V as p,W as m,Z as h,ct as g,dt as _,et as v,ft as y,ht as ee,j as b,k as x,kt as S,pt as te,q as C,rt as w,st as T,ut as E,w as D,wt as O,x as k,yt as A,z as ne}from"./BMhFqWGI.js";import{i as j,n as M,r as re}from"./_v7-ePgP.js";import{t as ie}from"./D_eq9jO9.js";import"./B_7V5VkU.js";import{M as ae,N as oe,P as se,c as ce,g as le,h as ue,i as de,j as fe,l as pe,n as me,t as he,u as ge,v as _e,w as ve}from"./b3bVkeK4.js";import{i as ye,r as be}from"./DP4NE4zB.js";import{i as xe,n as Se,r as Ce,t as we}from"./CkFKWn77.js";import{c as Te,h as Ee,o as De}from"./Dv_ebRq1.js";import{t as Oe}from"./wm6hNCZN.js";import{t as ke}from"./DMUfQgCK.js";import{t as Ae}from"./Du57LVNU.js";function je(e){var t=typeof e;return e!=null&&(t==`object`||t==`function`)}var Me=je,Ne=`[object AsyncFunction]`,Pe=`[object Function]`,Fe=`[object GeneratorFunction]`,Ie=`[object Proxy]`;function Le(e){if(!Me(e))return!1;var t=Ce(e);return t==Pe||t==Fe||t==Ne||t==Ie}var Re=Le,ze=xe[`__core-js_shared__`],Be=function(){var e=/[^.]+$/.exec(ze&&ze.keys&&ze.keys.IE_PROTO||``);return e?`Symbol(src)_1.`+e:``}();function Ve(e){return!!Be&&Be in e}var He=Ve,Ue=Function.prototype.toString;function We(e){if(e!=null){try{return Ue.call(e)}catch{}try{return e+``}catch{}}return``}var Ge=We,Ke=/[\\^$.*+?()[\]{}|]/g,qe=/^\[object .+?Constructor\]$/,Je=Function.prototype,Ye=Object.prototype,Xe=Je.toString,Ze=Ye.hasOwnProperty,Qe=RegExp(`^`+Xe.call(Ze).replace(Ke,`\\$&`).replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,`$1.*?`)+`$`);function $e(e){return!Me(e)||He(e)?!1:(Re(e)?Qe:qe).test(Ge(e))}var et=$e;function tt(e,t){return e?.[t]}var nt=tt;function rt(e,t){var n=nt(e,t);return et(n)?n:void 0}var it=rt;function at(){}var ot=at;function st(e,t,n,r){for(var i=e.length,a=n+(r?1:-1);r?a--:++a-1}var gt=ht;function _t(e,t){return e===t||e!==e&&t!==t}var vt=_t,yt=it(Object,`create`);function bt(){this.__data__=yt?yt(null):{},this.size=0}var xt=bt;function St(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}var Ct=St,wt=`__lodash_hash_undefined__`,Tt=Object.prototype.hasOwnProperty;function Et(e){var t=this.__data__;if(yt){var n=t[e];return n===wt?void 0:n}return Tt.call(t,e)?t[e]:void 0}var Dt=Et,Ot=Object.prototype.hasOwnProperty;function kt(e){var t=this.__data__;return yt?t[e]!==void 0:Ot.call(t,e)}var At=kt,jt=`__lodash_hash_undefined__`;function Mt(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=yt&&t===void 0?jt:t,this}var Nt=Mt;function Pt(e){var t=-1,n=e==null?0:e.length;for(this.clear();++t
`,pointFormat:`● {series.name}: {point.y}
`,backgroundColor:`#ffffff`,borderWidth:void 0,stickOnContact:!1,style:{color:`#333333`,cursor:`default`,fontSize:`0.8em`},useHTML:!1},credits:{enabled:!0,href:`https://www.highcharts.com?credits`,position:{align:`right`,x:-10,verticalAlign:`bottom`,y:-5},style:{cursor:`pointer`,color:`#999999`,fontSize:`0.6em`},text:`Highcharts.com`}},ze=new Pe(Re.time,Re.lang),Be={defaultOptions:Re,defaultTime:ze,getOptions:function(){return Re},setOptions:function(e){return Ie(S,`setOptions`,{options:e}),Le(!0,Re,e),e.time&&ze.update(Re.time),e.lang&&`locale`in e.lang&&ze.update({locale:e.lang.locale}),e.lang?.chartTitle&&(Re.title={...Re.title,text:e.lang.chartTitle}),Re}},{win:Ve}=S,{isNumber:He,isString:Ue,merge:We,pInt:P,defined:Ge}=M,Ke=(e,t,n)=>`color-mix(in srgb,${e},${t} ${100*n}%)`,qe=e=>Ue(e)&&!!e&&e!==`none`;class F{static parse(e){return e?new F(e):F.None}constructor(e){let t,n,r,i;this.rgba=[NaN,NaN,NaN,NaN],this.input=e;let a=S.Color;if(a&&a!==F)return new a(e);if(typeof e==`object`&&e.stops!==void 0)this.stops=e.stops.map(e=>new F(e[1]));else if(typeof e==`string`)for(this.input=e=F.names[e.toLowerCase()]||e,r=F.parsers.length;r--&&!n;)(t=(i=F.parsers[r]).regex.exec(e))&&(n=i.parse(t));n&&(this.rgba=n)}get(e){let t=this.input,n=this.rgba;if(this.output)return this.output;if(typeof t==`object`&&this.stops!==void 0){let n=We(t);return n.stops=[].slice.call(n.stops),this.stops.forEach((t,r)=>{n.stops[r]=[n.stops[r][0],t.get(e)]}),n}return n&&He(n[0])?e!==`rgb`&&(e||n[3]!==1)?e===`a`?`${n[3]}`:`rgba(`+n.join(`,`)+`)`:`rgb(`+n[0]+`,`+n[1]+`,`+n[2]+`)`:t}brighten(e){let t=this.rgba;if(this.stops)this.stops.forEach(function(t){t.brighten(e)});else if(He(e)&&e!==0)if(He(t[0]))for(let n=0;n<3;n++)t[n]+=P(255*e),t[n]<0&&(t[n]=0),t[n]>255&&(t[n]=255);else F.useColorMix&&qe(this.input)&&(this.output=Ke(this.input,e>0?`white`:`black`,Math.abs(e)));return this}setOpacity(e){return this.rgba[3]=e,this}tweenTo(e,t){let n=this.rgba,r=e.rgba;if(!He(n[0])||!He(r[0]))return F.useColorMix&&qe(this.input)&&qe(e.input)&&t<.99?Ke(this.input,e.input,t):e.input||`none`;let i=r[3]!==1||n[3]!==1,a=(e,r)=>e+(n[r]-e)*(1-t),o=r.slice(0,3).map(a).map(Math.round);return i&&o.push(a(r[3],3)),(i?`rgba(`:`rgb(`)+o.join(`,`)+`)`}}F.names={white:`#ffffff`,black:`#000000`},F.parsers=[{regex:/rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d?(?:\.\d+)?)\s*\)/,parse:function(e){return[P(e[1]),P(e[2]),P(e[3]),parseFloat(e[4],10)]}},{regex:/rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)/,parse:function(e){return[P(e[1]),P(e[2]),P(e[3]),1]}},{regex:/^#([a-f0-9])([a-f0-9])([a-f0-9])([a-f0-9])?$/i,parse:function(e){return[P(e[1]+e[1],16),P(e[2]+e[2],16),P(e[3]+e[3],16),Ge(e[4])?P(e[4]+e[4],16)/255:1]}},{regex:/^#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})?$/i,parse:function(e){return[P(e[1],16),P(e[2],16),P(e[3],16),Ge(e[4])?P(e[4],16)/255:1]}}],F.useColorMix=Ve.CSS?.supports(`color`,`color-mix(in srgb,red,blue 9%)`),F.None=new F(``);let{parse:Je}=F,{win:Ye}=S,{isNumber:Xe,objectEach:Ze}=M;class I{constructor(e,t,n){this.pos=NaN,this.options=t,this.elem=e,this.prop=n}dSetter(){let e=this.paths,t=e?.[0],n=e?.[1],r=this.now||0,i=[];if(r!==1&&t&&n)if(t.length===n.length&&r<1)for(let e=0;e