From 46cbe2b08fd1ddb7b7ebd073c357fc342c48671c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 8 Nov 2025 07:52:46 -0600 Subject: [PATCH] chore: update generated transmission-web files (#7777) Co-authored-by: ckerr <70381+ckerr@users.noreply.github.com> --- web/public_html/transmission-app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/public_html/transmission-app.js b/web/public_html/transmission-app.js index fb698f0f3..2df137801 100644 --- a/web/public_html/transmission-app.js +++ b/web/public_html/transmission-app.js @@ -1,4 +1,4 @@ -(()=>{var ve=Object.create;var Ce=Object.defineProperty;var Fe=Object.getOwnPropertyDescriptor;var Ze=Object.getOwnPropertyNames;var Xe=Object.getPrototypeOf,We=Object.prototype.hasOwnProperty;var Qe=(i,e)=>()=>(e||i((e={exports:{}}).exports,e),e.exports);var we=(i,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ze(e))!We.call(i,r)&&r!==t&&Ce(i,r,{get:()=>e[r],enumerable:!(o=Fe(e,r))||o.enumerable});return i};var Le=(i,e,t)=>(t=i!=null?ve(Xe(i)):{},we(e||!i||!i.__esModule?Ce(t,"default",{value:i,enumerable:!0}):t,i));var fe=Qe((je,Ae)=>{"use strict";Ae.exports=function i(e,t){if(e===t)return!0;if(e&&t&&typeof e=="object"&&typeof t=="object"){if(e.constructor!==t.constructor)return!1;var o,r,s;if(Array.isArray(e)){if(o=e.length,o!=t.length)return!1;for(r=o;r--!==0;)if(!i(e[r],t[r]))return!1;return!0}if(e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(r of e.entries())if(!t.has(r[0]))return!1;for(r of e.entries())if(!i(r[1],t.get(r[0])))return!1;return!0}if(e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(r of e.entries())if(!t.has(r[0]))return!1;return!0}if(ArrayBuffer.isView(e)&&ArrayBuffer.isView(t)){if(o=e.length,o!=t.length)return!1;for(r=o;r--!==0;)if(e[r]!==t[r])return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===t.toString();if(s=Object.keys(e),o=s.length,o!==Object.keys(t).length)return!1;for(r=o;r--!==0;)if(!Object.prototype.hasOwnProperty.call(t,s[r]))return!1;for(r=o;r--!==0;){var a=s[r];if(!i(e[a],t[a]))return!1}return!0}return e!==e&&t!==t}});var j=class i extends EventTarget{constructor(){super(),this.actions=Object.seal({"deselect-all":{enabled:!1,shortcut:"D",text:"Deselect all"},"move-bottom":{enabled:!1,text:"Bottom"},"move-down":{enabled:!1,text:"Down"},"move-top":{enabled:!1,text:"Top"},"move-up":{enabled:!1,text:"Up"},"open-torrent":{enabled:!0,shortcut:"O",text:"Open torrent\u2026"},"pause-all-torrents":{enabled:!1,text:"Pause all"},"pause-selected-torrents":{enabled:!1,shortcut:"U",text:"Pause"},"reannounce-selected-torrents":{enabled:!1,text:"Ask tracker for more peers"},"remove-selected-torrents":{enabled:!1,text:"Remove from list\u2026"},"resume-selected-torrents":{enabled:!1,shortcut:"R",text:"Resume"},"resume-selected-torrents-now":{enabled:!1,text:"Resume now"},"select-all":{enabled:!1,shortcut:"A",text:"Select all"},"show-about-dialog":{enabled:!0,text:"About"},"show-inspector":{enabled:!1,shortcut:"I",text:"Torrent Inspector"},"show-labels-dialog":{enabled:!1,shortcut:"K",text:"Edit Labels\u2026"},"show-move-dialog":{enabled:!1,shortcut:"L",text:"Set location\u2026"},"show-overflow-menu":{enabled:!0,text:"More options\u2026"},"show-preferences-dialog":{enabled:!0,shortcut:"P",text:"Edit preferences"},"show-rename-dialog":{enabled:!1,shortcut:"N",text:"Rename\u2026"},"show-shortcuts-dialog":{enabled:!0,text:"Keyboard shortcuts"},"show-statistics-dialog":{enabled:!0,shortcut:"S",text:"Statistics"},"start-all-torrents":{enabled:!1,text:"Start all"},"toggle-compact-rows":{enabled:!0,text:"Compact rows"},"toggle-contrast":{enabled:!0,text:"High contrast UI"},"trash-selected-torrents":{enabled:!1,text:"Trash data and remove from list\u2026"},"verify-selected-torrents":{enabled:!1,shortcut:"V",text:"Verify local data"}})}click(e){if(this.isEnabled(e)){let t=new Event("click");t.action=e,this.dispatchEvent(t)}}getActionForShortcut(e){for(let[t,o]of Object.entries(this.actions))if(e===o.shortcut)return t;return null}allShortcuts(){return new Map(Object.entries(this.actions).filter(([,e])=>e.shortcut).map(([e,t])=>[t.shortcut,e]))}isEnabled(e){return this._getAction(e).enabled}text(e){return this._getAction(e).text}keyshortcuts(e){return this._getAction(e).shortcut}update(e){let t=i._recount(e.selected,e.nonselected);this._updateStates(t)}_getAction(e){let t=this.actions[e];if(!t)throw new Error(`no such action: ${e}`);return t}static _recount(e,t){let o=e.length+t.length,r=e.filter(d=>d.isStopped()).length,s=e.length-r,a=t.filter(d=>d.isStopped()).length,l=t.length-a,n=r+a,c=s+l,u=e.filter(d=>d.isQueued()).length;return{active:c,nonselected_active:l,nonselected_paused:a,paused:n,selected:e.length,selected_active:s,selected_paused:r,selected_queued:u,total:o}}_updateStates(e){let t=(o,r)=>{for(let s of r)this._updateActionState(s,o)};t(e.selected_paused>0,["resume-selected-torrents"]),t(e.paused>0,["start-all-torrents"]),t(e.active>0,["pause-all-torrents"]),t(e.selected_paused>0||e.selected_queued>0,["resume-selected-torrents-now"]),t(e.selected_active>0,["pause-selected-torrents","reannounce-selected-torrents"]),t(e.selected>0,["deselect-all","move-bottom","move-down","move-top","move-up","remove-selected-torrents","show-inspector","show-labels-dialog","show-move-dialog","trash-selected-torrents","verify-selected-torrents"]),t(e.selected===1,["show-rename-dialog"]),t(e.selectedke(r,d,a,c,t))}return l[0].classList.add("selected"),a.children[0].classList.remove("hidden"),{buttons:l,dismiss:s,root:o}}function F(i){let e=document.createElement("dialog");e.classList.add("dialog-container","popup",i),e.open=!0,e.setAttribute("role","dialog");let t=document.createElement("div");t.classList.add("dialog-window"),e.append(t);let o=document.createElement("div");o.classList.add("dialog-logo"),t.append(o);let r=document.createElement("div");r.classList.add("dialog-heading"),t.append(r);let s=document.createElement("div");s.classList.add("dialog-message"),t.append(s);let a=document.createElement("div");a.classList.add("dialog-workarea"),t.append(a);let l=document.createElement("div");l.classList.add("dialog-buttons"),t.append(l);let n=document.createElement("span");n.className="flexible-space",l.append(n);let c=document.createElement("button");c.classList.add("dialog-dismiss-button"),c.textContent="Cancel",l.append(c);let u=document.createElement("button");return u.textContent="OK",l.append(u),t.addEventListener("keyup",({key:d})=>{d==="Enter"&&u.click()}),{confirm:u,dismiss:c,heading:r,message:s,root:e,workarea:a}}function v(){return typeof crypto.randomUUID=="function"?crypto.randomUUID():("10000000-1000-4000-8000"+-1e11).replaceAll(/[018]/g,i=>(i^crypto.getRandomValues(new Uint8Array(1))[0]&15>>i/4).toString(16))}function N(i,e,t){let o=t.map(r=>new Option(...r));if(e){let r=document.createElement("OPTGROUP");r.label=e,r.append(...o),i.append(r)}else i.append(...o)}var P=Object.freeze({delete:()=>T(["polyline",{points:"3 6 5 6 21 6"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"}],["line",{x1:10,x2:10,y1:11,y2:17}],["line",{x1:14,x2:14,y1:11,y2:17}]),inspector:()=>{let i=V("svg",{fill:"none","fill-opacity":1,height:26,stroke:"currentColor",viewBox:"-1 -1 26 26",width:26}),e=V("g",{});return e.append(V("circle",{cx:12,cy:12,r:12,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":2}),V("path",{d:"M 11.88208 4.883789 C 12.326418 4.883789 12.702391 5.039305 13.01001 5.350342 C 13.317628 5.6613785 13.471436 6.035642 13.471436 6.4731445 C 13.471436 6.910647 13.31592 7.283202 13.004883 7.59082 C 12.693846 7.898439 12.319582 8.052246 11.88208 8.052246 C 11.444578 8.052246 11.072023 7.898439 10.764404 7.59082 C 10.456786 7.283202 10.302979 6.910647 10.302979 6.4731445 C 10.302979 6.035642 10.456786 5.6613785 10.764404 5.350342 C 11.072023 5.039305 11.444578 4.883789 11.88208 4.883789 Z M 13.317627 9.528809 L 13.317627 17.126953 C 13.317627 17.803714 13.39624 18.236083 13.553467 18.424072 C 13.710694 18.612061 14.018308 18.719726 14.476318 18.74707 L 14.476318 19.11621 L 9.298096 19.11621 L 9.298096 18.74707 C 9.721926 18.733398 10.036376 18.610353 10.241455 18.37793 C 10.378175 18.220702 10.446533 17.803714 10.446533 17.126953 L 10.446533 11.52832 C 10.446533 10.851559 10.367921 10.41919 10.210693 10.231201 C 10.053466 10.043212 9.74927 9.935547 9.298096 9.908203 L 9.298096 9.528809 Z",fill:"currentColor"})),i.append(e),i},open:()=>T(["path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"}],["line",{x1:12,x2:12,y1:11,y2:17}],["line",{x1:9,x2:15,y1:14,y2:14}]),overflow:()=>T(["line",{x1:3,x2:21,y1:12,y2:12}],["line",{x1:3,x2:21,y1:6,y2:6}],["line",{x1:3,x2:21,y1:18,y2:18}]),pause:()=>T(["rect",{height:16,width:4,x:6,y:4}],["rect",{height:16,width:4,x:14,y:4}]),speedDown:()=>T(["polyline",{points:"6 9 12 15 18 9"}]),speedUp:()=>T(["polyline",{points:"18 15 12 9 6 15"}]),start:()=>T(["polyline",{points:"5 3 19 12 5 21 5 3"}])});function Oe(i){let e=document.createElement("fieldset");e.classList.add("section");let t=document.createElement("legend");t.classList.add("title"),t.textContent=i,e.append(t);let o=document.createElement("div");return o.classList.add("content"),e.append(o),{content:o,root:e}}function be(i,e){let t=[],{root:o,content:r}=Oe(i);for(let s of e){let a=document.createElement("label");a.textContent=s,r.append(a);let l=document.createElement("div");l.id=v(),r.append(l),a.setAttribute("for",l.id),t.push(l)}return{children:t,root:o}}function R(i,e=100){let t=null;return(...o)=>{t||(t=setTimeout(()=>{t=null,i(...o)},e))}}function K(i,e){return(0,Be.default)(i,e)}function Ye(i,e,t){t?i.setAttribute(e,!0):i.removeAttribute(e)}function W(i,e){Ye(i,"disabled",!e)}function q(i,e){i.classList.toggle("checked",e)}var Y=class extends EventTarget{constructor(e){super(),this.listener=t=>{e.contains(t.target)||(this.dispatchEvent(new MouseEvent(t.type,t)),t.preventDefault())},Object.seal(this),this.start()}start(){setTimeout(()=>document.addEventListener("click",this.listener),0)}stop(){document.removeEventListener("click",this.listener)}};function b(i,e){i.textContent!==e&&(i.textContent=e)}var $=class{constructor(e){this._prefs=e,this._elements={toggle:document.querySelector("#toggle-notifications")}}_setEnabled(e){this.prefs.notifications_enabled=e,b(this._toggle,`${e?"Disable":"Enable"} Notifications`)}_requestPermission(){Notification.requestPermission().then(e=>this._setEnabled(e==="granted"))}toggle(){this._enabled?this._setEnabled(!1):Notification.permission==="granted"?this._setEnabled(!0):Notification.permission!=="denied"&&this._requestPermission()}};var p=class i extends EventTarget{constructor(){super(),this._cache={},this.dispatchPrefsChange=R((e,t,o)=>{let r=new Event("change");Object.assign(r,{key:e,old_value:t,value:o}),this.dispatchEvent(r)});for(let[e,t]of Object.entries(i._Defaults))this._set(e,i._getCookie(e,t)),Object.defineProperty(this,e.replaceAll("-","_"),{get:()=>this._get(e),set:o=>{this._set(e,o)}});Object.seal(this)}entries(){return Object.entries(this._cache)}keys(){return Object.keys(this._cache)}_get(e){let{_cache:t}=this;if(!Object.prototype.hasOwnProperty.call(t,e))throw new Error(e);return t[e]}_set(e,t){let{_cache:o}=this,r=o[e];r!==t&&(o[e]=t,i._setCookie(e,t),this.dispatchPrefsChange(e,r,t))}static _setCookie(e,t){let o=new Date;o.setFullYear(o.getFullYear()+1),document.cookie=`${e}=${t}; SameSite=Strict; expires=${o.toGMTString()}`}static _getCookie(e,t){let o=i._readCookie(e);if(o===null)return t;let r=typeof t;if(r==="boolean")return o==="true"?!0:o==="false"?!1:t;if(r==="number"){let s=Number.parseFloat(o);return Number.isNaN(s)?t:s}return o}static _readCookie(e){let o=`; ${document.cookie}`.split(`; ${e}=`);return o.length===2?o.pop().split(";").shift():null}};p.AltSpeedEnabled="alt-speed-enabled";p.DisplayCompact="compact";p.DisplayFull="full";p.DisplayMode="display-mode";p.ContrastLess="less";p.ContrastMore="more";p.ContrastMode="contrast-mode";p.FilterActive="active";p.FilterAll="all";p.FilterDownloading="downloading";p.FilterError="error";p.FilterFinished="finished";p.FilterMode="filter-mode";p.FilterPaused="paused";p.FilterPrivate="private";p.FilterPublic="public";p.FilterSeeding="seeding";p.NotificationsEnabled="notifications-enabled";p.RefreshRate="refresh-rate-sec";p.SortAscending="ascending";p.SortByActivity="activity";p.SortByAge="age";p.SortByName="name";p.SortByProgress="progress";p.SortByQueue="queue";p.SortByRatio="ratio";p.SortBySize="size";p.SortByState="state";p.SortDescending="descending";p.SortDirection="sort-direction";p.SortMode="sort-mode";p._Defaults={[p.AltSpeedEnabled]:!1,[p.DisplayMode]:p.DisplayFull,[p.ContrastMode]:globalThis.matchMedia("(prefers-contrast: more)").matches?p.ContrastMore:p.ContrastLess,[p.FilterMode]:p.FilterAll,[p.NotificationsEnabled]:!1,[p.RefreshRate]:5,[p.SortDirection]:p.SortAscending,[p.SortMode]:p.SortByName};var ee=class i extends EventTarget{constructor(e){super(),this.elements=i._create(e),this.elements.dismiss.addEventListener("click",()=>this.close()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements}static _create(e){let t=F("about-dialog");t.root.setAttribute("aria-label","About transmission"),t.heading.textContent="Transmission",t.dismiss.textContent="Close";let o=document.createElement("div");return o.classList.add("about-dialog-version-number"),o.textContent=e.version,t.heading.append(o),o=document.createElement("div"),o.classList.add("about-dialog-version-checksum"),o.textContent=e.checksum,t.heading.append(o),o=document.createElement("div"),o.textContent="A fast and easy bitTorrent client",t.workarea.append(o),o=document.createElement("div"),o.textContent="Copyright \xA9 The Transmission Project",t.workarea.append(o),o=document.createElement("a"),o.href="https://transmissionbt.com/",o.target="_blank",o.textContent="https://transmissionbt.com/",t.workarea.append(o),t.confirm.remove(),delete t.confirm,t}};var te=class extends EventTarget{constructor(e){super(),this.action_listener=this._update.bind(this),this.action_manager=e,this.action_manager.addEventListener("change",this.action_listener),Object.assign(this,this._create()),this.outside=new Y(this.root),this.outside.addEventListener("click",()=>this.close()),this.show()}show(){for(let[e,t]of Object.entries(this.actions))W(t,this.action_manager.isEnabled(e));document.body.append(this.root)}close(){if(!this.closed){this.outside.stop(),this.action_manager.removeEventListener("change",this.action_listener),this.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_update(e){let t=this.actions[e.action];t&&W(t,e.enabled)}_create(){let e=document.createElement("div");e.role="menu",e.classList.add("context-menu","popup"),e.addEventListener("contextmenu",a=>{a.preventDefault()}),e.style.pointerEvents="none";let t={},o=(a,l=!1)=>{let n=document.createElement("div"),c=this.action_manager.text(a);n.role="menuitem",l?n.classList.add("context-menuitem","warning"):n.classList.add("context-menuitem"),n.dataset.action=a,n.textContent=c;let u=this.action_manager.keyshortcuts(a);return u&&n.setAttribute("aria-keyshortcuts",u),n.addEventListener("click",()=>{this.action_manager.click(a),this.close()}),t[a]=n,n},r=()=>{let a=document.createElement("div");return a.classList.add("context-menu-separator"),a},s=(a,...l)=>{let n=document.createElement("div");n.className="context-menuitem",n.textContent=a;let c=document.createElement("div");c.className="arrow",n.append(c);let u=document.createElement("div");u.className="submenu",c.append(u);let d=document.createElement("div");return d.className="open right",u.append(d),d.append(...l.map(g=>o(g))),n.addEventListener("click",g=>{let m=n.lastChild.lastChild;if(!g.target.classList.contains("right")&&!g.target.parentNode.classList.contains("right")&&!g.target.classList.contains("left")&&!g.target.parentNode.classList.contains("left")&&m.style.display==="block"){m.style.display="none";return}for(let h of e.querySelectorAll(".submenu"))h.style.display="none";m.style.display="block";let I=n.getBoundingClientRect(),B=m.lastChild.getBoundingClientRect(),f=Math.min(0,document.documentElement.clientHeight-window.visualViewport.offsetTop-I.top-m.clientHeight+3),C=Math.min(0,document.documentElement.clientWidth-window.visualViewport.offsetLeft-I.right-m.clientWidth);m.style.top=`${f}px`,C?(m.lastChild.className="open left",m.style.left=`${-I.width-B.width}px`):(m.lastChild.className="open right",m.style.left=`${C}px`)}),n};return e.append(o("resume-selected-torrents"),o("resume-selected-torrents-now"),o("pause-selected-torrents"),r(),s("Move in the queue","move-top","move-up","move-down","move-bottom"),r(),o("remove-selected-torrents",!0),o("trash-selected-torrents",!0),r(),o("verify-selected-torrents"),o("show-move-dialog"),o("show-rename-dialog"),o("show-labels-dialog"),r(),o("reannounce-selected-torrents"),r(),s("Select operation","select-all","deselect-all")),{actions:t,root:e}}};var xe=new Intl.PluralRules,w=xe.resolvedOptions().locale,Te=new Intl.NumberFormat(w),Ie=1e3,Re=[new Intl.NumberFormat(w,{maximumFractionDigits:0,style:"unit",unit:"byte"}),new Intl.NumberFormat(w,{maximumFractionDigits:0,style:"unit",unit:"kilobyte"}),new Intl.NumberFormat(w,{maximumFractionDigits:0,style:"unit",unit:"megabyte"}),new Intl.NumberFormat(w,{maximumFractionDigits:2,style:"unit",unit:"gigabyte"}),new Intl.NumberFormat(w,{maximumFractionDigits:2,style:"unit",unit:"terabyte"}),new Intl.NumberFormat(w,{maximumFractionDigits:2,style:"unit",unit:"petabyte"})],Ve=new Intl.NumberFormat(w,{maximumFractionDigits:2,style:"unit",unit:"kilobyte-per-second"}),Ne=new Intl.NumberFormat(w,{maximumFractionDigits:2,style:"unit",unit:"megabyte-per-second"}),Se=new Intl.NumberFormat(w,{maximumFractionDigits:2,style:"unit",unit:"gigabyte-per-second"}),y={_toTruncFixed(i,e){return(Math.floor(i*10**e)/10**e).toFixed(e)},countString(i,e,t){return`${this.number(t)} ${this.ngettext(i,e,t)}`},mem(i){if(i<0)return"Unknown";if(i===0)return"None";let e=i;for(let t of Re){if(ei.includes(e))?"\u2026":i},timeInterval(i,e=3){let t=Math.floor(i/86400),o=[];t&&o.push(this.countString("day","days",t));let r=Math.floor(i%86400/3600);(t||r)&&o.push(this.countString("hour","hours",r));let s=Math.floor(i%3600/60);return t||r||s?(o.push(this.countString("minute","minutes",s)),o=o.slice(0,e),o.length>1?`${o.slice(0,-1).join(", ")} and ${o.slice(-1)}`:o[0]):this.countString("second","seconds",Math.floor(i%60))},timestamp(i){if(!i)return"N/A";let e=new Date(i*1e3),t=new Date,o="",r="",s=t.getFullYear()===e.getFullYear(),a=t.getMonth()===e.getMonth(),l=t.getDate()-e.getDate();s&&a&&Math.abs(l)<=1?l===0?o="Today":l===1?o="Yesterday":o="Tomorrow":o=e.toDateString();let n=e.getHours(),c="AM";n>12&&(n=n-12,c="PM"),n===0&&(n=12),n<10&&(n=`0${n}`);let u=e.getMinutes();return u<10&&(u=`0${u}`),i=e.getSeconds(),i<10&&(i=`0${i}`),r=[n,u,i].join(":"),[o,r,c].join(" ")},toKBps(i){return Math.floor(i/Ie)}};var oe=class extends EventTarget{isDone(){return this.fields.have>=this.fields.size}isEditable(){return this.fields.torrent.getFileCount()>1&&!this.isDone()}refreshWantedHTML(){let e=this.elements.root;e.classList.toggle("skip",!this.fields.isWanted),e.classList.toggle("complete",this.isDone()),W(e.checkbox,this.isEditable()),e.checkbox.checked=this.fields.isWanted}refreshProgressHTML(){let{size:e,have:t}=this.fields,o=100*(e?t/e:1),r=y,s=`${r.size(t)} of ${r.size(e)} (${r.percentString(o,1)}%)`;b(this.elements.progress,s)}refresh(){let e=0,t=!1,o=!1,r=!1,s=0,a=!1,l=this.fields.torrent.getFiles();for(let n of this.fields.indices){let c=l[n];switch(e+=c.bytesCompleted,s+=c.length,a|=c.wanted,c.priority.toString()){case"-1":o=!0;break;case"1":t=!0;break;default:r=!0;break}}q(this.elements.priority_low_button,o),q(this.elements.priority_normal_button,r),q(this.elements.priority_high_button,t),(this.fields.have!==e||this.fields.size!==s)&&(this.fields.have=e,this.fields.size=s,this.refreshProgressHTML()),this.fields.isWanted!==a&&(this.fields.isWanted=a,this.refreshWantedHTML())}fireWantedChanged(e){let t=new Event("wantedToggled");t.indices=[...this.fields.indices],t.wanted=e,this.dispatchEvent(t)}firePriorityChanged(e){let t=new Event("priorityToggled");t.indices=[...this.fields.indices],t.priority=e,this.dispatchEvent(t)}createRow(e,t,o){let r=document.createElement("li");r.classList.add("inspector-torrent-file-list-entry"),this.elements.root=r;let s=document.createElement("input"),a=v();s.type="checkbox",s.className="file-wanted-control",s.title="Download file",s.id=a,s.addEventListener("change",c=>this.fireWantedChanged(c.target.checked)),r.checkbox=s,r.append(s),s=document.createElement("label"),s.className="inspector-torrent-file-list-entry-name",s.setAttribute("for",a),b(s,o),r.append(s),s=document.createElement("div"),s.className="inspector-torrent-file-list-entry-progress",r.append(s),this.elements.progress=s,s=document.createElement("div"),s.className="file-priority-radiobox";let l=s,n=c=>this.firePriorityChanged(c.target.value);s=document.createElement("input"),s.type="radio",s.value="-1",s.className="low",s.title="Low Priority",s.addEventListener("click",n),this.elements.priority_low_button=s,l.append(s),s=document.createElement("input"),s.type="radio",s.value="0",s.className="normal",s.title="Normal Priority",s.addEventListener("click",n),this.elements.priority_normal_button=s,l.append(s),s=document.createElement("input"),s.type="radio",s.value="1",s.title="High Priority",s.className="high",s.addEventListener("click",n),this.elements.priority_high_button=s,l.append(s),r.append(l),r.style.paddingLeft=`${t*20}px`,this.refresh()}getElement(){return this.elements.root}constructor(e,t,o,r){super(),this.fields={have:0,indices:r,isWanted:!0,size:0,torrent:e},this.elements={priority_high_button:null,priority_low_button:null,priority_normal_button:null,progress:null,root:null},this.createRow(e,t,o)}};var A=class i extends EventTarget{constructor(e){super(),this.fieldObservers={},this.fields={},this.refresh(e),this.setLazyCollatedField("name","collatedName"),this.setLazyCollatedField("trackers","collatedTrackers")}setLazyCollatedField(e,t){this.notifyOnFieldChange(e,()=>delete this.fields[t])}notifyOnFieldChange(e,t){(this.fieldObservers[e]??=[]).push(t)}setField(e,t,o){let r=e[t];if(K(r,o))return!1;let s=this.fieldObservers[t];if(e===this.fields&&s&&s.length>0)for(let a of s)a.call(this,o,r,t);return e[t]=o,!0}updateFiles(e){let t=!1,o=this.fields.files||[],r=["length","name","bytesCompleted","wanted","priority"];for(let[s,a]of e.entries()){let l=o[s]||{};for(let n of r)n in a&&(t|=this.setField(l,n,a[n]));o[s]=l}return this.fields.files=o,t}static collateTrackers(e){return e.map(t=>t.announce.toLowerCase()).join(" ")}refreshFields(e){let t=!1;for(let[o,r]of Object.entries(e))switch(o){case"files":case"fileStats":t|=this.updateFiles(r);break;case"trackerStats":t|=this.setField(this.fields,"trackers",r);break;case"trackers":o in this.fields||(t|=this.setField(this.fields,o,r));break;default:t|=this.setField(this.fields,o,r)}return t}refresh(e){this.refreshFields(e)&&this.dispatchEvent(new Event("dataChanged"))}getComment(){return this.fields.comment}getCreator(){return this.fields.creator}getDateAdded(){return this.fields.addedDate}getDateCreated(){return this.fields.dateCreated}getDesiredAvailable(){return this.fields.desiredAvailable}getDownloadDir(){return this.fields.downloadDir}getDownloadSpeed(){return this.fields.rateDownload}getDownloadedEver(){return this.fields.downloadedEver}getError(){return this.fields.error}getErrorString(){return this.fields.errorString}getETA(){return this.fields.eta}getFailedEver(){return this.fields.corruptEver}getFiles(){return this.fields.files||[]}getFile(e){return this.fields.files[e]}getFileCount(){return this.fields["file-count"]}getHashString(){return this.fields.hashString}getHave(){return this.getHaveValid()+this.getHaveUnchecked()}getHaveUnchecked(){return this.fields.haveUnchecked}getHaveValid(){return this.fields.haveValid}getId(){return this.fields.id}getLabels(){return this.fields.labels.toSorted()}getLastActivity(){return this.fields.activityDate}getLeftUntilDone(){return this.fields.leftUntilDone}getMagnetLink(){return this.fields.magnetLink}getMetadataPercentComplete(){return this.fields.metadataPercentComplete}getName(){return this.fields.name||"Unknown"}getPeers(){return this.fields.peers||[]}getPeersConnected(){return this.fields.peersConnected}getPeersGettingFromUs(){return this.fields.peersGettingFromUs}getPeersSendingToUs(){return this.fields.peersSendingToUs}getPieceCount(){return this.fields.pieceCount}getPieceSize(){return this.fields.pieceSize}getPrimaryMimeType(){return this.fields["primary-mime-type"]||"application/octet-stream"}getPrivateFlag(){return this.fields.isPrivate}getQueuePosition(){return this.fields.queuePosition}getRecheckProgress(){return this.fields.recheckProgress}getSeedRatioLimit(){return this.fields.seedRatioLimit}getSeedRatioMode(){return this.fields.seedRatioMode}getSizeWhenDone(){return this.fields.sizeWhenDone}getStartDate(){return this.fields.startDate}getStatus(){return this.fields.status}getTotalSize(){return this.fields.totalSize}getTrackers(){return this.fields.trackers||[]}getUploadSpeed(){return this.fields.rateUpload}getUploadRatio(){return this.fields.uploadRatio}getUploadedEver(){return this.fields.uploadedEver}getWebseedsSendingToUs(){return this.fields.webseedsSendingToUs}isFinished(){return this.fields.isFinished}hasExtraInfo(){return"hashString"in this.fields}isSeeding(){return this.getStatus()===i._StatusSeed}isStopped(){return this.getStatus()===i._StatusStopped}isChecking(){return this.getStatus()===i._StatusCheck}isDownloading(){return this.getStatus()===i._StatusDownload}isQueued(){return this.getStatus()===i._StatusDownloadWait||this.getStatus()===i._StatusSeedWait}isDone(){return this.getLeftUntilDone()<1}needsMetaData(){return this.getMetadataPercentComplete()<1}getActivity(){return this.getDownloadSpeed()+this.getUploadSpeed()}getPercentDoneStr(){return y.percentString(100*this.getPercentDone(),1)}getPercentDone(){return this.fields.percentDone}getStateString(){switch(this.getStatus()){case i._StatusStopped:return this.isFinished()?"Seeding complete":"Paused";case i._StatusCheckWait:return"Queued for verification";case i._StatusCheck:return"Verifying local data";case i._StatusDownloadWait:return"Queued for download";case i._StatusDownload:return"Downloading";case i._StatusSeedWait:return"Queued for seeding";case i._StatusSeed:return"Seeding";case null:return"Unknown";default:return"Error"}}seedRatioLimit(e){switch(this.getSeedRatioMode()){case i._RatioUseGlobal:return e.seedRatioLimit();case i._RatioUseLocal:return this.getSeedRatioLimit();default:return-1}}getErrorMessage(){let e=this.getErrorString();switch(this.getError()){case i._ErrTrackerWarning:return`Tracker returned a warning: ${e}`;case i._ErrTrackerError:return`Tracker returned an error: ${e}`;case i._ErrLocalError:return`Error: ${e}`;default:return null}}getCollatedName(){let e=this.fields;return!e.collatedName&&e.name&&(e.collatedName=e.name.toLowerCase()),e.collatedName||""}getCollatedTrackers(){let e=this.fields;return!e.collatedTrackers&&e.trackers&&(e.collatedTrackers=i.collateTrackers(e.trackers)),e.collatedTrackers||""}testState(e){let t=this.getStatus();switch(e){case p.FilterError:return this.getError();case p.FilterPrivate:return this.getPrivateFlag();case p.FilterPublic:return!this.getPrivateFlag();case p.FilterActive:return this.getPeersGettingFromUs()>0||this.getPeersSendingToUs()>0||this.getWebseedsSendingToUs()>0||this.isChecking();case p.FilterSeeding:return t===i._StatusSeed||t===i._StatusSeedWait;case p.FilterDownloading:return t===i._StatusDownload||t===i._StatusDownloadWait;case p.FilterPaused:return this.isStopped();case p.FilterFinished:return this.isFinished();default:return!0}}test(e,t,o,r){let s=this.testState(e);if(s&&o&&(s=this.getCollatedName().includes(o.toLowerCase())),s){let a=this.getLabels();r.length>0&&(s=r.some(l=>a.includes(l)))}return s&&t&&t.length>0&&(s=this.getCollatedTrackers().includes(t)),s}static compareById(e,t){return e.getId()-t.getId()}static compareByName(e,t){return e.getCollatedName().localeCompare(t.getCollatedName())||i.compareById(e,t)}static compareByQueue(e,t){return e.getQueuePosition()-t.getQueuePosition()}static compareByAge(e,t){let o=e.getDateAdded();return t.getDateAdded()-o||i.compareByQueue(e,t)}static compareByState(e,t){let o=e.getStatus();return t.getStatus()-o||i.compareByQueue(e,t)}static compareByActivity(e,t){let o=e.getActivity();return t.getActivity()-o||i.compareByState(e,t)}static compareByRatio(e,t){let o=e.getUploadRatio(),r=t.getUploadRatio();return or?-1:i.compareByState(e,t)}static compareByProgress(e,t){let o=e.getPercentDone(),r=t.getPercentDone();return o-r||i.compareByRatio(e,t)}static compareBySize(e,t){let o=e.getTotalSize(),r=t.getTotalSize();return o-r||i.compareByName(e,t)}static compareTorrents(e,t,o,r){let s=0;switch(o){case p.SortByActivity:s=i.compareByActivity(e,t);break;case p.SortByAge:s=i.compareByAge(e,t);break;case p.SortByQueue:s=i.compareByQueue(e,t);break;case p.SortByProgress:s=i.compareByProgress(e,t);break;case p.SortBySize:s=i.compareBySize(e,t);break;case p.SortByState:s=i.compareByState(e,t);break;case p.SortByRatio:s=i.compareByRatio(e,t);break;case p.SortByName:s=i.compareByName(e,t);break;default:console.log(`Unrecognized sort mode: ${o}`),s=i.compareByName(e,t);break}return r===p.SortDescending&&(s=-s),s}static sortTorrents(e,t,o){switch(t){case p.SortByActivity:e.sort(this.compareByActivity);break;case p.SortByAge:e.sort(this.compareByAge);break;case p.SortByName:e.sort(this.compareByName);break;case p.SortByProgress:e.sort(this.compareByProgress);break;case p.SortByQueue:e.sort(this.compareByQueue);break;case p.SortByRatio:e.sort(this.compareByRatio);break;case p.SortBySize:e.sort(this.compareBySize);break;case p.SortByState:e.sort(this.compareByState);break;default:console.log(`Unrecognized sort mode: ${t}`),e.sort(this.compareByName);break}return o===p.SortDescending&&e.reverse(),e}};A._StatusStopped=0;A._StatusCheckWait=1;A._StatusCheck=2;A._StatusDownloadWait=3;A._StatusDownload=4;A._StatusSeedWait=5;A._StatusSeed=6;A._RatioUseGlobal=0;A._RatioUseLocal=1;A._RatioUnlimited=2;A._ErrNone=0;A._ErrTrackerWarning=1;A._ErrTrackerError=2;A._ErrLocalError=3;A._TrackerInactive=0;A._TrackerWaiting=1;A._TrackerQueued=2;A._TrackerActive=3;A.Fields={};A.Fields.Metadata=["addedDate","file-count","name","primary-mime-type","totalSize"];A.Fields.Stats=["error","errorString","eta","isFinished","isStalled","labels","leftUntilDone","metadataPercentComplete","peersConnected","peersGettingFromUs","peersSendingToUs","percentDone","queuePosition","rateDownload","rateUpload","recheckProgress","seedRatioMode","seedRatioLimit","sizeWhenDone","status","trackers","downloadDir","uploadedEver","uploadRatio","webseedsSendingToUs"];A.Fields.InfoExtra=["comment","creator","dateCreated","files","hashString","isPrivate","magnetLink","pieceCount","pieceSize"];A.Fields.StatsExtra=["activityDate","corruptEver","desiredAvailable","downloadedEver","fileStats","haveUnchecked","haveValid","peers","startDate","trackerStats"];var ye=["encryption","speed-up","speed-down","percent-done","status","peer-address","peer-app-name"],E=class i extends EventTarget{constructor(e){super(),this.closed=!1,this.controller=e,this.elements=this._create(),this.current_page=this.elements.info.root,this.interval=setInterval(this._refreshTorrents.bind(this),3e3),this.name="inspector",this.selection_listener=t=>this._setTorrents(t.selected),this.torrent_listener=()=>this._updateCurrentPage(),this.torrents=[],this.file_torrent=null,this.file_torrent_n=null,this.file_rows=null,this.elements.dismiss.addEventListener("click",()=>this.close()),Object.seal(this),e.addEventListener("torrent-selection-changed",this.selection_listener),this._setTorrents(this.controller.getSelectedTorrents()),document.querySelector("#mainwin-workarea").append(this.elements.root)}close(){if(!this.closed){clearInterval(this.interval),this._setTorrents([]),this.elements.root.remove(),this.controller.removeEventListener("torrent-selection-changed",this.selection_listener),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))this[e]=null;this.closed=!0}}static _createInfoPage(){let e=document.createElement("div");e.classList.add("inspector-info-page");let t={root:e},o=a=>{let l=document.createElement("div");l.textContent=a,l.classList.add("section-label"),e.append(l)},r=a=>{let l=document.createElement("label");b(l,a),e.append(l);let n=document.createElement("span");return e.append(n),n};o("Activity");let s=[["have","Have:"],["availability","Availability:"],["uploaded","Uploaded:"],["downloaded","Downloaded:"],["state","State:"],["running_time","Running time:"],["remaining_time","Remaining:"],["last_activity","Last activity:"],["error","Error:"]];for(let[a,l]of s)t[a]=r(l);o("Details"),s=[["name","Name:"],["size","Size:"],["location","Location:"],["hash","Hash:"],["privacy","Privacy:"],["origin","Origin:"],["dateAdded","Date added:"],["magnetLink","Magnet:"],["comment","Comment:"],["labels","Labels:"]];for(let[a,l]of s)t[a]=r(l);return t}static _createListPage(e,t){let o=document.createElement("div"),r=document.createElement(e);return r.id=t,o.append(r),{list:r,root:o}}static _createTiersPage(){return i._createListPage("div","inspector-tiers-list")}static _createFilesPage(){return i._createListPage("ul","inspector-file-list")}static _createPeersPage(){let e=document.createElement("table");e.classList.add("peer-list");let t=document.createElement("thead"),o=document.createElement("tr"),r=["","Up","Down","Done","Status","Address","Client"];for(let[a,l]of r.entries()){let n=document.createElement("th"),c=ye[a];c==="encryption"&&(n.dataset.encrypted=!0),n.classList.add(c),b(n,l),o.append(n)}let s=document.createElement("tbody");return t.append(o),e.append(t),e.append(s),{root:e,tbody:s}}_create(){let e={files:i._createFilesPage(),info:i._createInfoPage(),peers:i._createPeersPage(),tiers:i._createTiersPage()},t=r=>{this.current_page=r,this._updateCurrentPage()};return{...M("inspector",[["inspector-tab-info",e.info.root,"Info"],["inspector-tab-peers",e.peers.root,"Peers"],["inspector-tab-tiers",e.tiers.root,"Tiers"],["inspector-tab-files",e.files.root,"Files"]],t.bind(this)),...e}}_setTorrents(e){let t="dataChanged",o=this.torrent_listener;for(let r of this.torrents)r.removeEventListener(t,o);this.torrents=[...e];for(let r of this.torrents)r.addEventListener(t,o);this._refreshTorrents(),this._updateCurrentPage()}static _needsExtraInfo(e){return e.some(t=>!t.hasExtraInfo())}_refreshTorrents(){let{controller:e,torrents:t}=this,o=t.map(r=>r.getId());if(o&&o.length>0){let r=["id",...A.Fields.StatsExtra];i._needsExtraInfo(t)&&r.push(...A.Fields.InfoExtra),e.updateTorrents(o,r)}}_updateCurrentPage(){let{current_page:e,elements:t}=this;switch(e){case t.files.root:this._updateFiles();break;case t.info.root:this._updateInfo();break;case t.peers.root:this._updatePeers();break;case t.tiers.root:this._updateTiers();break;default:console.warn("unexpected page"),console.log(e)}}_updateInfo(){let e="None",t="Mixed",o="Unknown",r=y,s=Date.now(),{elements:a,torrents:l}=this,n=l.reduce((d,g)=>d+g.getSizeWhenDone(),0),c=null;if(l.length===0)c=e;else if(l.every(d=>d.isFinished()))c="Finished";else if(l.every(d=>d.isStopped()))c="Paused";else{let d=m=>m.getStateString(),g=d(l[0]);c=l.every(m=>d(m)===g)?g:t}b(a.info.state,c);let u=c;if(l.length===0)c=e;else{let d=l.reduce((B,f)=>B+f.getHaveValid(),0),g=l.reduce((B,f)=>B+f.getHaveUnchecked(),0),m=l.reduce((B,f)=>B+f.getLeftUntilDone(),0),I=100*(n?(n-m)/n:1);c=r.percentString(I,1),g?c=`${r.size(d)} of ${r.size(n)} (${c}%), ${r.size(g)} Unverified`:m?c=`${r.size(d)} of ${r.size(n)} (${c}%)`:c=`${r.size(d)} (100%)`}if(b(a.info.have,r.stringSanitizer(c)),l.length===0)c=e;else if(n===0)c=e;else{let d=l.reduce((g,m)=>m.getHave()+m.getDesiredAvailable(),0);c=`${r.percentString(100*d/n,1)}%`}if(b(a.info.availability,r.stringSanitizer(c)),l.length===0)c=e;else{let d=l.reduce((m,I)=>m+I.getDownloadedEver(),0),g=l.reduce((m,I)=>m+I.getFailedEver(),0);c=g?`${r.size(d)} (+${r.size(g)} discarded after failed checksum)`:r.size(d)}if(b(a.info.downloaded,r.stringSanitizer(c)),l.length===0)c=e;else{let d=l.reduce((m,I)=>m+I.getUploadedEver(),0),g=l.reduce((m,I)=>m+I.getSizeWhenDone(),0)||l.reduce((m,I)=>m+I.getHaveValid(),0);c=`${r.size(d)} (Ratio: ${r.ratioString(D.ratio(d,g))})`}if(b(a.info.uploaded,c),l.length===0)c=e;else if(l.every(d=>d.isStopped()))c=u;else{let d=m=>m.getStartDate(),g=d(l[0]);c=l.every(m=>d(m)===g)?r.timeInterval(s/1e3-g):t}if(b(a.info.running_time,c),l.length===0)c=e;else{let d=m=>m.getETA(),g=d(l[0]);l.every(m=>d(m)===g)?g<0?c=o:c=r.timeInterval(g):c=t}if(b(a.info.remaining_time,c),l.length===0)c=e;else{let d=l.reduce((m,I)=>Math.max(m,I.getLastActivity()),-1),g=Math.floor(s/1e3);if(0m.getErrorString(),g=d(l[0]);c=l.every(m=>d(m)===g)?g:t}if(b(a.info.error,c||e),l.length===1?c=l[0].getName():c=l.length>0?t:e,b(a.info.name,c),l.length===0)c=e;else{let d=l.reduce((g,m)=>g+m.getTotalSize(),0);if(d){let g=f=>f.getPieceSize(),m=l.reduce((f,C)=>f+C.getPieceCount(),0),I=r.number(m),B=g(l[0]);c=l.every(f=>g(f)===B)?`${r.size(d)} (${I} pieces @ ${r.mem(B)})`:`${r.size(d)} (${I} pieces)`}else c="None"}if(b(a.info.size,r.stringSanitizer(c)),l.length===0)c=e;else{let d=m=>m.getHashString(),g=d(l[0]);c=l.every(m=>d(m)===g)?g:t}if(b(a.info.hash,c),l.length===0)c=e;else{let d=m=>m.getPrivateFlag(),g=d(l[0]);l.every(m=>d(m)===g)?g?c="Private to this tracker -- DHT and PEX disabled":c="Public torrent":c=t}if(b(a.info.privacy,c),l.length===0)c=e;else{let d=m=>m.getComment(),g=d(l[0]);c=l.every(m=>d(m)===g)?g:t}if(c=c||e,c.startsWith("https://")||c.startsWith("http://")?(c=encodeURI(c),a.info.comment.innerHTML=`${c}`):b(a.info.comment,c),c=l.length===0?e:l[0].getLabels().join(", "),b(a.info.labels,c),l.length===0)c=e;else{let d=h=>h.getCreator(),g=d(l[0]),m=!l.every(h=>d(h)===g);d=h=>h.getDateCreated();let I=d(l[0]),B=!l.every(h=>d(h)===I),f=!g||g.length===0,C=!I;m||B?c=t:f&&C?c=o:C&&!f?c=`Created by ${g}`:f&&!C?c=`Created on ${new Date(I*1e3).toDateString()}`:c=`Created by ${g} on ${new Date(I*1e3).toDateString()}`}if(b(a.info.origin,c),l.length===0)c=e;else{let d=m=>m.getDownloadDir(),g=d(l[0]);c=l.every(m=>d(m)===g)?g:t}if(b(a.info.location,c),l.length===0)c=e;else{let d=m=>m.getDateAdded(),g=d(l[0]);c=l.every(m=>d(m)===g)?new Date(g*1e3).toLocaleString(navigator.language,{day:"2-digit",hour:"2-digit",hour12:!1,minute:"2-digit",month:"short",second:"2-digit",timeZoneName:"short",weekday:"short",year:"numeric"}):t}if(b(a.info.dateAdded,c),l.length===0)b(a.info.magnetLink,e);else if(l.length>1)b(a.info.magnetLink,t);else{let d=l[0].getMagnetLink();a.info.magnetLink.innerHTML=``}}static _peerStatusTitle(e){let t=Object.seal({"?":"We unchoked this peer, but they're not interested",D:"Downloading from this peer",E:"Encrypted Connection",H:"Peer was discovered through Distributed Hash Table (DHT)",I:"Peer is an incoming connection",K:"Peer has unchoked us, but we're not interested",O:"Optimistic unchoke",T:"Peer is connected via uTP",U:"Uploading to peer",X:"Peer was discovered through Peer Exchange (PEX)",d:"We would download from this peer if they'd let us",u:"We would upload to this peer if they'd ask"});return[...e].filter(o=>t[o]).map(o=>`${o}: ${t[o]}`).join(` -`)}_updatePeers(){let e=y,{elements:t,torrents:o}=this,{tbody:r}=t.peers,s=[(l,n)=>{n.dataset.encrypted=l.isEncrypted},(l,n)=>b(n,l.rateToPeer?e.speedBps(l.rateToPeer):""),(l,n)=>b(n,l.rateToClient?e.speedBps(l.rateToClient):""),(l,n)=>b(n,`${Math.floor(l.progress*100)}%`),(l,n)=>{b(n,l.flagStr),n.setAttribute("title",i._peerStatusTitle(l.flagStr))},(l,n)=>{b(n,l.address),n.setAttribute("title",l.address)},(l,n)=>{b(n,l.clientName),n.setAttribute("title",l.clientName)}],a=[];for(let l of o){let n=document.createElement("tr");n.classList.add("torrent-row");let c=document.createElement("td");c.setAttribute("colspan",s.length),b(c,l.getName()),n.append(c),a.push(n);for(let u of l.getPeers()){let d=document.createElement("tr");d.classList.add("peer-row");for(let[g,m]of s.entries()){let I=document.createElement("td");I.classList.add(ye[g]),m(u,I),d.append(I)}a.push(d)}for(;r.firstChild;)r.firstChild.remove();r.append(...a)}}static getAnnounceState(e){switch(e.announceState){case A._TrackerActive:return"Announce in progress";case A._TrackerWaiting:{let t=Math.max(0,e.nextAnnounceTime-Date.now()/1e3);return`Next announce in ${y.timeInterval(t)}`}case A._TrackerQueued:return"Announce is queued";case A._TrackerInactive:return e.isBackup?"Tracker will be used as a backup":"Announce not scheduled";default:return`unknown announce state: ${e.announceState}`}}static lastAnnounceStatus(e){let t="Last Announce",o=["N/A"];if(e.hasAnnounced){let r=y.timestamp(e.lastAnnounceTime);e.lastAnnounceSucceeded?o=[r," (got ",y.countString("peer","peers",e.lastAnnouncePeerCount),")"]:(t="Announce error",o=[e.lastAnnounceResult?`${e.lastAnnounceResult} - `:"",r])}return{label:t,value:o.join("")}}static lastScrapeStatus(e){let t="Last Scrape",o="N/A";if(e.hasScraped){let r=y.timestamp(e.lastScrapeTime);e.lastScrapeSucceeded?o=r:(t="Scrape error",o=(e.lastScrapeResult?`${e.lastScrapeResult} - `:"")+r)}return{label:t,value:o}}static _getOrigin(e){try{let t="udp://";if(e.announce.startsWith(t)){let r="http://",s=e.announce.replace(t,r);return new URL(s).origin.replace(r,t)}return new URL(e.announce).origin}catch{return[e.sitename||e.host||e.announce]}}_updateTiers(){let{list:t}=this.elements.tiers,{torrents:o}=this,r=[];for(let s of o){if(o.length>1){let a=document.createElement("div");a.classList.add("tier-list-torrent"),b(a,s.getName()),r.push(a)}for(let a of s.getTrackers()){let l=i.getAnnounceState(a),n=i.lastAnnounceStatus(a),c=i.lastScrapeStatus(a),u=document.createElement("div");u.classList.add("tier-list-row");let d=document.createElement("div"),g=i._getOrigin(a);d.classList.add("tier-list-tracker"),b(d,`${g} - tier ${a.tier+1}`),d.setAttribute("title",a.announce),u.append(d),d=document.createElement("div"),d.classList.add("tier-announce"),b(d,`${n.label}: ${n.value}`),u.append(d),d=document.createElement("div"),d.classList.add("tier-seeders"),b(d,`Seeders: ${a.seederCount>-1?a.seederCount:"N/A"}`),u.append(d),d=document.createElement("div"),d.classList.add("tier-state"),b(d,l),u.append(d),d=document.createElement("div"),d.classList.add("tier-leechers"),b(d,`Leechers: ${a.leecherCount>-1?a.leecherCount:"N/A"}`),u.append(d),d=document.createElement("div"),d.classList.add("tier-scrape"),b(d,`${c.label}: ${c.value}`),u.append(d),d=document.createElement("div"),d.classList.add("tier-downloads"),b(d,`Downloads: ${a.downloadCount>-1?a.downloadCount:"N/A"}`),u.append(d),r.push(u)}}for(;t.firstChild;)t.firstChild.remove();t.append(...r)}_changeFileCommand(e,t){let{controller:o,file_torrent:r}=this,s=r.getId();o.changeFileCommand(s,e,t)}_onFileWantedToggled(e){let{indices:t,wanted:o}=e;this._changeFileCommand(t,o?"files-wanted":"files-unwanted")}_onFilePriorityToggled(e){let{indices:t,priority:o}=e,r=null;switch(o.toString()){case"-1":r="priority-low";break;case"1":r="priority-high";break;default:r="priority-normal"}this._changeFileCommand(t,r)}_clearFileList(){let{list:e}=this.elements.files;for(;e.firstChild;)e.firstChild.remove();this.file_torrent=null,this.file_torrent_n=null,this.file_rows=null}static createFileTreeModel(e){let t=[],o={children:{},file_indices:[]};for(let[r,s]of e.getFiles().entries()){let{name:a}=s,l=a.split("/"),n=o;for(let[c,u]of l.entries()){let d=n.children[u];d||(n.children[u]=d={children:{},depth:c,file_indices:[],name:u,parent:n}),n=d}n.file_index=r,delete n.children,t.push(n)}for(let r of t){let{file_index:s}=r,a=r;do a.file_indices.push(s),a=a.parent;while(a)}return o}addNodeToView(e,t,o){let r=new oe(e,o.depth,o.name,o.file_indices);r.addEventListener("wantedToggled",this._onFileWantedToggled.bind(this)),r.addEventListener("priorityToggled",this._onFilePriorityToggled.bind(this)),this.file_rows.push(r),t.append(r.getElement())}addSubtreeToView(e,t,o){if(o.parent&&this.addNodeToView(e,t,o),o.children)for(let r of Object.values(o.children))this.addSubtreeToView(e,t,r)}_updateFiles(){let{list:e}=this.elements.files,{file_rows:t,file_torrent:o,file_torrent_n:r,torrents:s}=this;if(s.length!==1){this._clearFileList();return}let[a]=s,l=a.getFiles().length;if(a!==o||l!==r){this._clearFileList(),this.file_torrent=a,this.file_torrent_n=l,this.file_rows=[];let n=document.createDocumentFragment(),c=i.createFileTreeModel(a);this.addSubtreeToView(a,n,c),e.append(n)}else for(let n of t)n.refresh()}};var re=class i extends EventTarget{constructor(e,t){super(),this.controller=e,this.remote=t,this.elements={},this.torrents=[],this.show()}show(){let e=this.controller.getSelectedTorrents();e.length!==0&&(this.torrents=e,this.elements=i._create(),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.entry.value=e[0].getDownloadDir(),document.body.append(this.elements.root),this.elements.entry.focus())}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.controller,delete this.remote,delete this.elements,delete this.torrents}_onDismiss(){this.close()}_onConfirm(){let e=this.torrents.map(o=>o.getId()),t=this.elements.entry.value.trim();this.remote.moveTorrents(e,t),this.close()}static _create(){let e=F("move-dialog");e.root.setAttribute("aria-label","Move Torrent"),e.heading.textContent="Set Torrent Location",confirm.textContent="Apply";let t=document.createElement("label");t.setAttribute("for","torrent-path"),t.textContent="Location:",e.workarea.append(t);let o=document.createElement("input");return o.setAttribute("type","text"),o.id="torrent-path",e.entry=o,e.workarea.append(o),e}};var U=class i extends EventTarget{constructor(e){super(),this.elements=i._create(e),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.options=e,document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}static _create(e){let{heading:t,message:o}=e,r=F("confirm-dialog");return r.confirm.remove(),delete r.confirm,r.heading.textContent=t,r.workarea.textContent=o,r}};var De=/iPad|iPhone|iPod/.test(navigator.userAgent)&&!globalThis.MSStream,Ee=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),He=!(De&&Ee),S=class extends EventTarget{constructor(e,t,o="",r=null){super(),this.controller=e,this.remote=t,this.elements=this._create(o),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),document.body.append(this.elements.root),r&&(this.elements.file_input.files=r),this._updateFreeSpaceInAddDialog(),this.elements.url_input.focus()}close(){if(!this.closed){clearInterval(this.interval),this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_updateFreeSpaceInAddDialog(){let e=this.elements.folder_input.value;this.remote.getFreeSpace(e,(t,o)=>{this.closed||(this.elements.freespace.textContent=o>0?`${y.size(o)} Free`:"")})}_onConfirm(){let{controller:e,elements:t,remote:o}=this,{file_input:r,folder_input:s,start_input:a,url_input:l}=t,n=!a.checked,c=s.value.trim();for(let d of r.files){let g=new FileReader;g.addEventListener("load",m=>{let I=m.target.result,B="base64,",f=I.indexOf(B);if(f===-1)return;let C={arguments:{"download-dir":c,metainfo:I.slice(Math.max(0,f+B.length)),paused:n},method:"torrent-add"};o.sendRequest(C,h=>{h.result!=="success"&&(alert(`Error adding "${d.name}": ${h.result}`),e.setCurrentPopup(new U({heading:`Error adding "${d.name}"`,message:h.result})))})}),g.readAsDataURL(d)}let u=l.value.trim();if(u.length>0){/^[\da-f]{40}$/i.test(u)&&(u=`magnet:?xt=urn:btih:${u}`);let d={arguments:{"download-dir":c,filename:u,paused:n},method:"torrent-add"};o.sendRequest(d,g=>{g.result!=="success"&&e.setCurrentPopup(new U({heading:`Error adding "${u}"`,message:g.result}))})}this._onDismiss()}_create(e){let t=F(),{confirm:o,root:r,heading:s,workarea:a}=t;r.classList.add("open-torrent"),s.textContent="Add Torrents",o.textContent="Add";let l=v(),n=document.createElement("label");n.setAttribute("for",l),n.textContent="Please select torrent files to add:",a.append(n);let c=document.createElement("input");c.type="file",c.name="torrent-files[]",c.id=l,c.multiple=!0,He&&(c.accept=".torrent,application/x-bittorrent"),a.append(c),t.file_input=c,l=v(),n=document.createElement("label"),n.setAttribute("for",l),n.textContent="Or enter a URL:",a.append(n),c=document.createElement("input"),c.type="url",c.id=l,c.value=e,a.append(c),t.url_input=c,l=v(),n=document.createElement("label"),n.id="add-dialog-folder-label",n.for=l,n.textContent="Destination folder: ",a.append(n);let u=document.createElement("span");u.id="free-space-text",n.append(u),a.append(n),t.freespace=u,c=document.createElement("input"),c.type="text",c.id="add-dialog-folder-input",c.addEventListener("change",()=>this._updateFreeSpaceInAddDialog()),c.value=this.controller.session_properties["download-dir"],a.append(c),t.folder_input=c;let d=document.createElement("div");a.append(d);let g=document.createElement("input");return g.type="checkbox",g.id="auto-start-check",g.checked=this.controller.shouldAddedTorrentsStart(),d.append(g),t.start_input=g,n=document.createElement("label"),n.id="auto-start-label",n.setAttribute("for",g.id),n.textContent="Start when added",d.append(n),t}};var G={_DaemonVersion:"version",_DownSpeedLimit:"speed-limit-down",_DownSpeedLimited:"speed-limit-down-enabled",_QueueMoveBottom:"queue-move-bottom",_QueueMoveDown:"queue-move-down",_QueueMoveTop:"queue-move-top",_QueueMoveUp:"queue-move-up",_Root:"../rpc",_TurtleDownSpeedLimit:"alt-speed-down",_TurtleState:"alt-speed-enabled",_TurtleUpSpeedLimit:"alt-speed-up",_UpSpeedLimit:"speed-limit-up",_UpSpeedLimited:"speed-limit-up-enabled"},H=class i{_connection_alert=null;_session_id="";constructor(e){this._controller=e}sendRequest(e,t,o){let r=new Headers;r.append("cache-control","no-cache"),r.append("content-type","application/json"),r.append("pragma","no-cache"),this._session_id&&r.append(i._SessionHeader,this._session_id);let s=null;fetch(G._Root,{body:JSON.stringify(e),headers:r,method:"POST"}).then(a=>{if(s=a,a.status===409){let l=new Error(i._SessionHeader);throw l.header=a.headers.get(i._SessionHeader),l}return a.json()}).then(a=>{t&&t.call(o,a,s),this._connection_alert&&(this._connection_alert.close(),this._connection_alert=null)}).catch(a=>{if(a.message===i._SessionHeader){this._session_id=a.header,this.sendRequest(e,t,o);return}console.trace(a),this._controller.togglePeriodicSessionRefresh(!1),this._connection_alert=new U({heading:"Connection failed",message:"Could not connect to the server. You may need to reload the page to reconnect."}),this._controller.setCurrentPopup(this._connection_alert)})}loadDaemonPrefs(e,t){let o={method:"session-get"};this.sendRequest(o,e,t)}checkPort(e,t,o){let r={arguments:{ip_protocol:e},method:"port-test"};this.sendRequest(r,t,o)}renameTorrent(e,t,o,r,s){let a={arguments:{ids:e,name:o,path:t},method:"torrent-rename-path"};this.sendRequest(a,r,s)}setLabels(e,t,o){let r={ids:e,labels:t};this.sendRequest({arguments:r,method:"torrent-set"},o)}loadDaemonStats(e,t){let o={method:"session-stats"};this.sendRequest(o,e,t)}updateTorrents(e,t,o,r){let s={arguments:{fields:t,format:"table"},method:"torrent-get"};e&&(s.arguments.ids=e),this.sendRequest(s,a=>{let l=a.arguments;o.call(r,l.torrents,l.removed)})}getFreeSpace(e,t,o){let r={arguments:{path:e},method:"free-space"};this.sendRequest(r,s=>{let a=s.arguments;t.call(o,a.path,a["size-bytes"])})}changeFileCommand(e,t,o){let r={ids:[e]};r[o]=t,this.sendRequest({arguments:r,method:"torrent-set"},()=>{this._controller.refreshTorrents([e])})}sendTorrentSetRequests(e,t,o,r,s){o||(o={}),o.ids=t;let a={arguments:o,method:e};this.sendRequest(a,r,s)}sendTorrentActionRequests(e,t,o,r){this.sendTorrentSetRequests(e,t,null,o,r)}startTorrents(e,t,o,r){let s=t?"torrent-start-now":"torrent-start";this.sendTorrentActionRequests(s,e,o,r)}stopTorrents(e,t,o){this.sendTorrentActionRequests("torrent-stop",e,t,o)}moveTorrents(e,t,o,r){this.sendTorrentSetRequests("torrent-set-location",e,{location:t,move:!0},o,r)}removeTorrents(e,t){let o={arguments:{"delete-local-data":t,ids:[]},method:"torrent-remove"};if(e)for(let r=0,s=e.length;r{this._controller.refreshTorrents()})}verifyTorrents(e,t,o){this.sendTorrentActionRequests("torrent-verify",e,t,o)}reannounceTorrents(e,t,o){this.sendTorrentActionRequests("torrent-reannounce",e,t,o)}addTorrentByUrl(e,t){/^[\da-f]{40}$/i.test(e)&&(e=`magnet:?xt=urn:btih:${e}`);let o={arguments:{filename:e,paused:t.paused},method:"torrent-add"};this.sendRequest(o,()=>{this._controller.refreshTorrents()})}savePrefs(e){let t={arguments:e,method:"session-set"};this.sendRequest(t,()=>{this._controller.loadDaemonPrefs()})}updateBlocklist(){let e={method:"blocklist-update"};this.sendRequest(e,()=>{this._controller.loadDaemonPrefs()})}moveTorrentsToTop(e,t,o){this.sendTorrentActionRequests(G._QueueMoveTop,e,t,o)}moveTorrentsToBottom(e,t,o){this.sendTorrentActionRequests(G._QueueMoveBottom,e,t,o)}moveTorrentsUp(e,t,o){this.sendTorrentActionRequests(G._QueueMoveUp,e,t,o)}moveTorrentsDown(e,t,o){this.sendTorrentActionRequests(G._QueueMoveDown,e,t,o)}};H._SessionHeader="X-Transmission-Session-Id";function se(i,e){let t=document.createElement("fieldset");t.classList.add("section",i);let o=document.createElement("legend");return o.classList.add("title"),o.textContent=e,t.append(o),t}function Ge(i,e,t,o){let r=document.createElement("button");return r.textContent=e,r.addEventListener("click",o),i.append(r),r.dataset.action=t,r}var J=class extends EventTarget{constructor(e,t,o,r){super(),this.action_listener=this._onActionChange.bind(this),this.action_manager=r,this.action_manager.addEventListener("change",this.action_listener),this.prefs_listener=this._onPrefsChange.bind(this),this.prefs=t,this.prefs.addEventListener("change",this.prefs_listener),this.closed=!1,this.remote=o,this.name="overflow-menu",this.session_listener=this._onSessionChange.bind(this),this.session_manager=e,this.session_manager.addEventListener("session-change",this.session_listener);let{session_properties:s}=e;Object.assign(this,this._create(s)),this.outside=new Y(this.root),this.outside.addEventListener("click",()=>this.close()),Object.seal(this),this.show()}show(){document.body.append(this.root)}close(){if(!this.closed){this.outside.stop(),this.session_manager.removeEventListener("session-change",this.session_listener),this.action_manager.removeEventListener("change",this.action_listener),this.prefs.removeEventListener("change",this.prefs_listener),this.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))this[e]=null;this.closed=!0}}_onSessionChange(e){let{alt_speed_check:t}=this.elements,{session_properties:o}=e;t.checked=o[G._TurtleState]}_onPrefsChange(e){switch(e.key){case p.SortDirection:case p.SortMode:this.root.querySelector(`[data-pref="${e.key}"]`).value=e.value;break;default:break}}_onActionChange(e){let t=this.actions[e.action];t&&this._updateElement(t)}_updateElement(e){if(e.dataset.action){let{action:t}=e.dataset,o=this.action_manager.keyshortcuts(t);o&&e.setAttribute("aria-keyshortcuts",o),W(e,this.action_manager.isEnabled(t))}}_onClick(e){let{action:t,pref:o}=e.target.dataset;if(t){this.action_manager.click(t);return}if(o){this.prefs[o]=e.target.value;return}console.log("unhandled"),console.log(e),console.trace()}_create(e){let t={},o={},r=this._onClick.bind(this),s=document.createElement("div");s.classList.add("overflow-menu","popup");let a=document.createElement("div"),l=(C,h)=>{let x=document.createElement("input");x.id=v(),x.type="checkbox";let k=document.createElement("label");k.htmlFor=x.id,k.textContent=C,a.append(x,k),h(x)},n=se("display","Display");s.append(n);let c=document.createElement("div");c.id="display-options",n.append(c),a.classList.add("table-row"),c.append(a);let u=document.createElement("label");u.id="display-sort-mode-label",u.textContent="Sort by",a.append(u);let d=document.createElement("select");d.id="display-sort-mode-select",d.dataset.pref=p.SortMode,a.append(d);let g=[[p.SortByActivity,"Activity"],[p.SortByAge,"Age"],[p.SortByName,"Name"],[p.SortByProgress,"Progress"],[p.SortByQueue,"Queue order"],[p.SortByRatio,"Ratio"],[p.SortBySize,"Size"],[p.SortByState,"State"]];for(let[C,h]of g){let x=document.createElement("option");x.value=C,x.textContent=h,d.append(x)}u.htmlFor=d.id,d.value=this.prefs.sort_mode,d.addEventListener("change",C=>{this.prefs.sort_mode=C.target.value}),a=document.createElement("div"),a.classList.add("table-row"),c.append(a);let m=C=>{C.dataset.pref=p.SortDirection,C.checked=this.prefs.sort_direction!==p.SortAscending,C.addEventListener("input",h=>{this.prefs.sort_direction=h.target.checked?p.SortDescending:p.SortAscending})};l("Reverse sort",m),a=document.createElement("div"),a.classList.add("table-row"),c.append(a),m=C=>{C.checked=this.prefs.display_mode===p.DisplayCompact,C.addEventListener("change",h=>{let{checked:x}=h.target;this.prefs.display_mode=x?p.DisplayCompact:p.DisplayFull})},l(this.action_manager.text("toggle-compact-rows"),m),a=document.createElement("div"),a.classList.add("table-row"),c.append(a),m=C=>{C.checked=this.prefs.contrast_mode===p.ContrastMore,C.addEventListener("change",h=>{let{checked:x}=h.target;this.prefs.contrast_mode=x?p.ContrastMore:p.ContrastLess})},l(this.action_manager.text("toggle-contrast"),m),a=document.createElement("div"),a.classList.add("table-row","display-fullscreen-row"),c.append(a),m=C=>{let h=()=>document.fullscreenElement!==null;C.checked=h(),document.addEventListener("fullscreenchange",()=>{C.checked=h()}),C.addEventListener("change",()=>{h()?document.exitFullscreen():document.body.requestFullscreen()})},l("Fullscreen",m),n=se("speed","Speed Limit"),s.append(n),c=document.createElement("div"),c.id="speed-options",n.append(c),a=document.createElement("div"),a.classList.add("speed-up"),c.append(a),u=document.createElement("label"),u.id="speed-up-label",u.textContent="Upload:",a.append(u);let I="Unlimited";d=document.createElement("select"),d.id="speed-up-select",a.append(d);let B=["50","100","250","500","1000","2500","5000","10000",I];for(let C of[...new Set(B).add(`${e[G._UpSpeedLimit]}`).values()].toSorted((h,x)=>h-x)){let h=document.createElement("option");h.value=C,h.textContent=C===I?I:y.speed(C),d.append(h)}u.htmlFor=d.id,d.value=e[G._UpSpeedLimited]?`${e[G._UpSpeedLimit]}`:I,d.addEventListener("change",C=>{let{value:h}=C.target;console.log(C),h===I?this.remote.savePrefs({[G._UpSpeedLimited]:!1}):this.remote.savePrefs({[G._UpSpeedLimited]:!0,[G._UpSpeedLimit]:Number.parseInt(h,10)})}),a=document.createElement("div"),a.classList.add("speed-down"),c.append(a),u=document.createElement("label"),u.id="speed-down-label",u.textContent="Download:",a.append(u),d=document.createElement("select"),d.id="speed-down-select",a.append(d);for(let C of[...new Set(B).add(`${e[G._DownSpeedLimit]}`).values()].toSorted((h,x)=>h-x)){let h=document.createElement("option");h.value=C,h.textContent=C===I?I:y.speed(C),d.append(h)}u.htmlFor=d.id,d.value=e[G._DownSpeedLimited]?`${e[G._DownSpeedLimit]}`:I,d.addEventListener("change",C=>{let{value:h}=C.target;console.log(C),h===I?this.remote.savePrefs({[G._DownSpeedLimited]:!1}):this.remote.savePrefs({[G._DownSpeedLimited]:!0,[G._DownSpeedLimit]:Number.parseInt(h,10)})}),a=document.createElement("div"),a.classList.add("alt-speed"),c.append(a),m=C=>{C.checked=e[G._TurtleState],o.alt_speed_check=C,C.addEventListener("change",O=>{this.remote.savePrefs({[G._TurtleState]:O.target.checked})});let h=document.createElement("label");h.htmlFor=C.id,h.id="alt-speed-image";let x=document.createElement("label");x.htmlFor=C.id;let k=y.speed(e[G._TurtleUpSpeedLimit]),_=y.speed(e[G._TurtleDownSpeedLimit]);x.textContent=`(${k} up, ${_} down)`,a.append(h,x)},l("Use Temp limits",m),n=se("actions","Actions"),s.append(n);for(let C of["show-preferences-dialog","show-shortcuts-dialog","pause-all-torrents","start-all-torrents"]){let h=this.action_manager.text(C);t[C]=Ge(n,h,C,r)}n=se("help","Help"),s.append(n),c=document.createElement("div"),n.append(c);for(let C of["show-statistics-dialog","show-about-dialog"]){let h=this.action_manager.text(C);t[C]=Ge(c,h,C,r)}let f=document.createElement("a");return f.href="https://transmissionbt.com/donate.html",f.target="_blank",f.textContent="Donate",c.append(f),this._updateElement=this._updateElement.bind(this),{actions:t,elements:o,root:s}}};var ie=class i extends EventTarget{static _initTimeDropDown(e){for(let t=0;t<96;++t){let o=t/4,r=t%4*15,s=t*15,a=`${o}:${r||"00"}`;e.options[t]=new Option(a,s)}}static _initDayDropDown(e){let t=[["Everyday","127"],["Weekdays","62"],["Weekends","65"],["Sunday","1"],["Monday","2"],["Tuesday","4"],["Wednesday","8"],["Thursday","16"],["Friday","32"],["Saturday","64"]];for(let o=0;t[o];++o){let[r,s]=t[o];e.options[o]=new Option(r,s)}}_checkPort(){for(let[e,t]of Object.entries(this.elements.network.port_status_label))delete t.dataset.open,b(t,"Checking..."),this.remote.checkPort(e,o=>this._onPortChecked(e,o),this)}_onPortChecked(e,t){if(this.closed)return;let o=this.elements.network.port_status_label[e],r=t.arguments["port-is-open"]||!1;o.dataset.open=r,"port-is-open"in t.arguments?b(o,r?"Open":"Closed"):b(o,"Error")}_setBlocklistButtonEnabled(e){let t=this.elements.peers.blocklist_update_button;W(t,e),t.value=e?"Update":"Updating..."}static _getValue(e){if(e.tagName==="TEXTAREA")return e.value;switch(e.type){case"checkbox":case"radio":return e.checked;case"number":case"select-one":case"text":case"url":{let t=e.value;return Number.parseInt(t,10).toString()===t?Number.parseInt(t,10):Number.parseFloat(t).toString()===t?Number.parseFloat(t):t}default:return null}}_onMaybePortChanged(e){(e==="peer-port"||e==="port-forwarding-enabled")&&this._checkPort()}_onControlChanged(e){let{key:t}=e.target.dataset;this.remote.savePrefs({[t]:i._getValue(e.target)}),this._onMaybePortChanged(t)}_onDialogClosed(){this.dispatchEvent(new Event("closed"))}_update(){this._setBlocklistButtonEnabled(!0);for(let[e,t]of Object.entries(this.session_manager.session_properties))for(let o of this.elements.root.querySelectorAll(`[data-key="${e}"]`)){if(e==="blocklist-size"){let r=y.number(t);o.innerHTML=`Blocklist has ${r} rules`,b(this.elements.peers.blocklist_update_button,"Update")}else switch(o.type){case"checkbox":case"radio":o.checked=t;break;case"text":case"textarea":case"url":case"email":case"number":case"search":o!==document.activeElement&&(o.value!=t&&this._onMaybePortChanged(e),o.value=t);break;case"select-one":o.value=t;break;default:console.log(o.type);break}o.dispatchEvent(new Event("session-change"))}}shouldAddedTorrentsStart(){return this.data.elements.root.find("#start-added-torrents")[0].checked}static _createCheckAndLabel(e,t){let o=document.createElement("div");o.id=e;let r=document.createElement("input");r.id=v(),r.type="checkbox",o.append(r);let s=document.createElement("label");return s.textContent=t,s.setAttribute("for",r.id),o.append(s),{check:r,label:s,root:o}}static _enableIfChecked(e,t){let o=()=>{e.tagName==="INPUT"?W(e,t.checked):e.classList.toggle("disabled",!t.checked)};t.addEventListener("session-change",o),o()}static _getProtocolHandlerRegistered(){return localStorage.getItem("protocol-handler-registered")==="true"}static _updateProtocolHandlerButton(e){e.removeAttribute("disabled"),e.removeAttribute("title"),i._getProtocolHandlerRegistered()?(e.textContent="Remove Browser Handler","unregisterProtocolHandler"in navigator||e.setAttribute("title","Your browser does not support removing protocol handlers. This button only allows you to re-register a handler.")):(e.textContent="Add Browser Handler",e.removeAttribute("title"),"registerProtocolHandler"in navigator||(e.setAttribute("disabled",!0),e.setAttribute("title","Your browser does not support protocol handlers")))}static _toggleProtocolHandler(e){let t=new URL(globalThis.location.href);t.search="addtorrent=%s",this._getProtocolHandlerRegistered()?(navigator.unregisterProtocolHandler?.("magnet",t.toString()),localStorage.removeItem("protocol-handler-registered"),i._updateProtocolHandlerButton(e)):(navigator.registerProtocolHandler("magnet",t.toString(),"Transmission Web"),localStorage.setItem("protocol-handler-registered","true"),i._updateProtocolHandlerButton(e))}static _createTorrentsPage(){let e=document.createElement("div");e.classList.add("prefs-torrents-page");let t=document.createElement("div");t.textContent="Downloading",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Download to:",e.append(t);let o=document.createElement("input");o.type="text",o.id=v(),o.dataset.key="download-dir",t.setAttribute("for",o.id),e.append(o);let r=o,s=i._createCheckAndLabel("incomplete-dir-div","Use temporary folder:");s.check.title="Separate folder to temporarily store downloads until they are complete.",s.check.dataset.key="incomplete-dir-enabled",s.label.title=s.check.title,e.append(s.root);let a=s.check;o=document.createElement("input"),o.type="text",o.dataset.key="incomplete-dir",e.append(o),i._enableIfChecked(o,s.check);let l=o;s=i._createCheckAndLabel("autostart-div","Start when added"),s.check.dataset.key="start-added-torrents",e.append(s.root);let n=s.check;s=i._createCheckAndLabel("suffix-div",`Append "part" to incomplete files' names`),s.check.dataset.key="rename-partial-files",e.append(s.root);let c=s.check;s=i._createCheckAndLabel("download-queue-div","Download queue size:"),s.check.dataset.key="download-queue-enabled",e.append(s.root);let u=s.check;o=document.createElement("input"),o.type="number",o.dataset.key="download-queue-size",e.append(o),i._enableIfChecked(o,s.check);let d=o;t=document.createElement("div"),t.textContent="Seeding",t.classList.add("section-label"),e.append(t),s=i._createCheckAndLabel("stop-ratio-div","Stop seeding at ratio:"),s.check.dataset.key="seedRatioLimited",e.append(s.root);let g=s.check;o=document.createElement("input"),o.type="number",o.min="0.1",o.step="any",o.dataset.key="seedRatioLimit",e.append(o),i._enableIfChecked(o,s.check);let m=o;s=i._createCheckAndLabel("stop-idle-div","Stop seeding if idle for N mins:"),s.check.dataset.key="idle-seeding-limit-enabled",e.append(s.root);let I=s.check;o=document.createElement("input"),o.type="number",o.min="0.1",o.step="any",o.dataset.key="idle-seeding-limit",e.append(o),i._enableIfChecked(o,s.check);let B=o;t=document.createElement("div"),t.textContent="Magnet Protocol Handler",t.classList.add("section-label"),e.append(t);let f=document.createElement("button");return f.classList.add("register-handler-button"),i._updateProtocolHandlerButton(f),e.append(f),{autostart_check:n,download_dir:r,download_queue_check:u,download_queue_input:d,incomplete_dir_check:a,incomplete_dir_input:l,register_handler_button:f,root:e,stop_idle_check:I,stop_idle_input:B,stop_ratio_check:g,stop_ratio_input:m,suffix_check:c}}static _createSpeedPage(){let e=document.createElement("div");e.classList.add("prefs-speed-page");let t=document.createElement("div");t.textContent="Speed Limits",t.classList.add("section-label"),e.append(t);let o=i._createCheckAndLabel("upload-speed-div","Upload (kB/s):");o.check.dataset.key="speed-limit-up-enabled",e.append(o.root);let r=o.check,s=document.createElement("input");s.type="number",s.dataset.key="speed-limit-up",e.append(s),i._enableIfChecked(s,o.check);let a=s;o=i._createCheckAndLabel("download-speed-div","Download (kB/s):"),o.check.dataset.key="speed-limit-down-enabled",e.append(o.root);let l=o.check;s=document.createElement("input"),s.type="number",s.dataset.key="speed-limit-down",e.append(s),i._enableIfChecked(s,o.check);let n=s;t=document.createElement("div"),t.textContent="Alternative Speed Limits",t.classList.add("section-label","alt-speed-section-label"),e.append(t),t=document.createElement("div"),t.textContent="Override normal speed limits manually or at scheduled times",t.classList.add("alt-speed-label"),e.append(t),t=document.createElement("label"),t.textContent="Upload (kB/s):",e.append(t),s=document.createElement("input"),s.type="number",s.dataset.key="alt-speed-up",s.id=v(),t.setAttribute("for",s.id),e.append(s);let c=s;t=document.createElement("label"),t.textContent="Download (kB/s):",e.append(t),s=document.createElement("input"),s.type="number",s.dataset.key="alt-speed-down",s.id=v(),t.setAttribute("for",s.id),e.append(s);let u=s;o=i._createCheckAndLabel("alt-times-div","Scheduled times"),o.check.dataset.key="alt-speed-time-enabled",e.append(o.root);let d=o.check;t=document.createElement("label"),t.textContent="From:",i._enableIfChecked(t,o.check),e.append(t);let g=document.createElement("select");g.id=v(),g.dataset.key="alt-speed-time-begin",i._initTimeDropDown(g),t.setAttribute("for",g.id),e.append(g),i._enableIfChecked(g,o.check);let m=g;t=document.createElement("label"),t.textContent="To:",i._enableIfChecked(t,o.check),e.append(t),g=document.createElement("select"),g.id=v(),g.dataset.key="alt-speed-time-end",i._initTimeDropDown(g),t.setAttribute("for",g.id),e.append(g),i._enableIfChecked(g,o.check);let I=g;return t=document.createElement("label"),t.textContent="On days:",i._enableIfChecked(t,o.check),e.append(t),g=document.createElement("select"),g.id=v(),g.dataset.key="alt-speed-time-day",i._initDayDropDown(g),t.setAttribute("for",g.id),e.append(g),i._enableIfChecked(g,o.check),{alt_days_select:g,alt_download_speed_input:u,alt_from_select:m,alt_times_check:d,alt_to_select:I,alt_upload_speed_input:c,download_speed_check:l,download_speed_input:n,root:e,upload_speed_check:r,upload_speed_input:a}}static _createPeersPage(){let e=document.createElement("div");e.classList.add("prefs-peers-page");let t=document.createElement("div");t.textContent="Connections",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Max peers per torrent:",e.append(t);let o=document.createElement("input");o.type="number",o.dataset.key="peer-limit-per-torrent",o.id=v(),t.setAttribute("for",o.id),e.append(o);let r=o;t=document.createElement("label"),t.textContent="Max peers overall:",e.append(t),o=document.createElement("input"),o.type="number",o.dataset.key="peer-limit-global",o.id=v(),t.setAttribute("for",o.id),e.append(o);let s=o;t=document.createElement("div"),t.textContent="Options",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Encryption mode:",e.append(t);let a=document.createElement("select");a.id=v(),a.dataset.key="encryption",a.options[0]=new Option("Prefer encryption","preferred"),a.options[1]=new Option("Allow encryption","tolerated"),a.options[2]=new Option("Require encryption","required"),e.append(a);let l=a,n=i._createCheckAndLabel("use-pex-div","Use PEX to find more peers");n.check.title="PEX is a tool for exchanging peer lists with the peers you're connected to.",n.check.dataset.key="pex-enabled",n.label.title=n.check.title,e.append(n.root);let c=n.check;n=i._createCheckAndLabel("use-dht-div","Use DHT to find more peers"),n.check.title="DHT is a tool for finding peers without a tracker.",n.check.dataset.key="dht-enabled",n.label.title=n.check.title,e.append(n.root);let u=n.check;n=i._createCheckAndLabel("use-lpd-div","Use LPD to find more peers"),n.check.title="LPD is a tool for finding peers on your local network.",n.check.dataset.key="lpd-enabled",n.label.title=n.check.title,e.append(n.root);let d=n.check;t=document.createElement("div"),t.textContent="Blocklist",t.classList.add("section-label"),e.append(t),n=i._createCheckAndLabel("blocklist-enabled-div","Enable blocklist:"),n.check.dataset.key="blocklist-enabled",e.append(n.root);let g=n.check;o=document.createElement("input"),o.type="url",o.value="http://www.example.com/blocklist",o.dataset.key="blocklist-url",e.append(o),i._enableIfChecked(o,n.check);let m=o;t=document.createElement("label"),t.textContent="Blocklist has {n} rules",t.dataset.key="blocklist-size",t.classList.add("blocklist-size-label"),i._enableIfChecked(t,n.check),e.append(t);let I=document.createElement("button");return I.classList.add("blocklist-update-button"),I.textContent="Update",e.append(I),i._enableIfChecked(I,n.check),{blocklist_enabled_check:g,blocklist_update_button:I,blocklist_url_input:m,dht_check:u,encryption_select:l,lpd_check:d,max_peers_overall_input:s,max_peers_per_torrent_input:r,pex_check:c,root:e}}static _createNetworkPage(){let e=document.createElement("div");e.classList.add("prefs-network-page");let t=document.createElement("div");t.textContent="Listening Port",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Peer listening port:",e.append(t);let o=document.createElement("input");o.type="number",o.dataset.key="peer-port",o.id=v(),t.setAttribute("for",o.id),e.append(o);let r=o,s=document.createElement("div");s.classList.add("port-status"),t=document.createElement("label"),t.textContent="IPv4 port is",s.append(t);let a=document.createElement("label");a.textContent="?",a.classList.add("port-status-label"),s.append(a),s.append(document.createElement("br")),t=document.createElement("label"),t.textContent="IPv6 port is",s.append(t);let l=document.createElement("label");l.textContent="?",l.classList.add("port-status-label"),s.append(l),e.append(s);let n=i._createCheckAndLabel("randomize-port","Randomize port on launch");n.check.dataset.key="peer-port-random-on-start",e.append(n.root);let c=n.check;n=i._createCheckAndLabel("port-forwarding","Use port forwarding from my router"),n.check.dataset.key="port-forwarding-enabled",e.append(n.root);let u=n.check;t=document.createElement("div"),t.textContent="Options",t.classList.add("section-label"),e.append(t),n=i._createCheckAndLabel("utp-enabled","Enable uTP for peer communication"),n.check.dataset.key="utp-enabled",e.append(n.root);let d=n.check;t=document.createElement("div"),t.textContent="Default Public Trackers",t.classList.add("section-label"),e.append(t);let g=["Trackers to use on all public torrents.","To add a backup URL, add it on the next line after a primary URL.","To add a new primary URL, add it after a blank line."];for(let B of g)t=document.createElement("label"),t.classList.add("default-trackers-label"),t.textContent=B,t.setAttribute("for","default-trackers"),e.append(t);let m=document.createElement("textarea");return m.dataset.key="default-trackers",m.id="default-trackers",e.append(m),{default_trackers_textarea:m,port_forwarding_check:u,port_input:r,port_status_label:{ipv4:a,ipv6:l},random_port_check:c,root:e,utp_check:d}}static _create(){let e={network:i._createNetworkPage(),peers:i._createPeersPage(),speed:i._createSpeedPage(),torrents:i._createTorrentsPage()};return{...M("prefs-dialog",[["prefs-tab-torrent",e.torrents.root,"Torrents"],["prefs-tab-speed",e.speed.root,"Speed"],["prefs-tab-peers",e.peers.root,"Peers"],["prefs-tab-network",e.network.root,"Network"]]),...e}}constructor(e,t){super(),this.closed=!1,this.session_manager=e,this.remote=t,this.update_from_session=()=>this._update(),this.elements=i._create(),this.elements.peers.blocklist_update_button.addEventListener("click",s=>{b(s.target,"Updating blocklist..."),this.remote.updateBlocklist(),this._setBlocklistButtonEnabled(!1)}),this.elements.torrents.register_handler_button.addEventListener("click",s=>{i._toggleProtocolHandler(s.currentTarget)}),this.elements.dismiss.addEventListener("click",()=>this.close()),this.outside=new Y(this.elements.root),this.outside.addEventListener("click",()=>this.close()),Object.seal(this);let o=this._onControlChanged.bind(this),r=s=>{for(let a of Object.values(s))if(a.tagName==="INPUT")switch(a.type){case"checkbox":case"radio":case"number":case"text":case"url":a.addEventListener("change",o);break;default:console.trace(`unhandled input: ${a.type}`);break}else(a.tagName==="TEXTAREA"||a.tagName==="SELECT")&&a.addEventListener("change",o)};r(this.elements.network),r(this.elements.peers),r(this.elements.speed),r(this.elements.torrents),this.session_manager.addEventListener("session-change",this.update_from_session),this.update_from_session(),document.body.append(this.elements.root)}close(){if(!this.closed){this.outside.stop(),this.session_manager.removeEventListener("session-change",this.update_from_session),this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))this[e]=null;this.closed=!0}}};var ne=class i extends EventTarget{constructor(e){super(),this.options=e,this.elements=i._create(e),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_onConfirm(){let{remote:e,torrents:t,trash:o}=this.options;t.length>0&&e.removeTorrents(t,o),this.close()}static _create(e){let{trash:t}=e,{heading:o,message:r}=i._createMessage(e),s=F("remove-dialog");return s.heading.textContent=o,s.message.textContent=r,s.confirm.textContent=t?"Trash":"Remove",s}static _createMessage(e){let t=null,o=null,{torrents:r,trash:s}=e,[a]=r;return s&&r.length===1?(t=`Remove ${a.getName()} and delete data?`,o="All data downloaded for this torrent will be deleted. Are you sure you want to remove it?"):s?(t=`Remove ${r.length} transfers and delete data?`,o="All data downloaded for these torrents will be deleted. Are you sure you want to remove them?"):r.length===1?(t=`Remove ${a.getName()}?`,o="Once removed, continuing the transfer will require the torrent file. Are you sure you want to remove it?"):(t=`Remove ${r.length} transfers?`,o="Once removed, continuing the transfers will require the torrent files. Are you sure you want to remove them?"),{heading:t,message:o}}};var ae=class i extends EventTarget{constructor(e,t){super(),this.controller=e,this.remote=t,this.elements={},this.torrents=[],this.show()}show(){let e=this.controller.getSelectedTorrents();if(e.length!==1){console.trace();return}this.torrents=e,this.elements=i._create(),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),this.elements.entry.value=e[0].getName(),document.body.append(this.elements.root),this.elements.entry.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.remote,delete this.elements,delete this.torrents}_onDismiss(){this.close()}_onConfirm(){let[e]=this.torrents,t=e.getName(),o=this.elements.entry.value;this.remote.renameTorrent([e.getId()],t,o,r=>{if(r.result==="success")e.refresh(r.arguments);else if(r.result==="Invalid argument"){let s=new U({heading:`Error renaming "${t}"`,message:"Could not rename a torrent or file name. The path to file may have changed/not reflected correctly or the argument is invalid."});this.controller.setCurrentPopup(s)}delete this.controller}),this.close()}static _create(){let e=F("rename-dialog");e.root.setAttribute("aria-label","Rename Torrent"),e.heading.textContent="Enter new name:",e.confirm.textContent="Rename";let t=document.createElement("label");t.setAttribute("for","torrent-rename-name"),t.textContent="Enter new name:",e.workarea.append(t);let o=document.createElement("input");return o.setAttribute("type","text"),o.id="torrent-rename-name",e.entry=o,e.workarea.append(o),e}};var ce=class i extends EventTarget{constructor(e,t){super(),this.controller=e,this.remote=t,this.elements={},this.torrents=[],this.show()}show(){let e=this.controller.getSelectedTorrents();if(e.length===0){console.error("At least one selected torrent expected.");return}let[t]=e;this.torrents=e,this.elements=i._create(),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),this.elements.entry.value=t.getLabels().join(", "),document.body.append(this.elements.root),this.elements.entry.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements,delete this.torrents}_onDismiss(){this.close()}_onConfirm(){let{torrents:e}=this,{remote:t}=this,o=e.map(n=>n.getId()),{elements:r}=this,{entry:s}=r,{value:a}=s,l=a.split(",").map(n=>n.trim()).filter(n=>n.length>0);t.setLabels(o,l,n=>{if(n.result==="success")for(let c of e)c.refresh({labels:l})}),this.close()}static _create(){let e=F("labels-dialog");e.root.setAttribute("aria-label","Edit Labels"),e.heading.textContent="Edit Labels:",e.confirm.textContent="Save";let t=document.createElement("label");t.setAttribute("for","torrent-labels"),t.textContent="Labels:",e.workarea.append(t);let o=document.createElement("input");return o.setAttribute("type","text"),o.id="torrent-labels",e.entry=o,e.workarea.append(o),e}};var le=class i extends EventTarget{constructor(e){super(),this.elements=i._create(e),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements}_onDismiss(){this.close()}static _create(e){let t=F("shortcuts-dialog");t.root.setAttribute("aria-label","Keyboard Shortcuts");let o=document.createElement("table"),r=document.createElement("thead");o.append(r);let s=document.createElement("tr");r.append(s);let a=document.createElement("th");a.textContent="Key",s.append(a),a=document.createElement("th"),a.textContent="Action",s.append(a);let l=document.createElement("tbody");o.append(l);let n={};for(let[c,u]of e.allShortcuts().entries()){let d=c.split("+"),g=[d.pop(),...d].join("+");n[g]={name:u,shortcut:c}}for(let[,c]of Object.entries(n).toSorted()){let{name:u,shortcut:d}=c;s=document.createElement("tr"),l.append(s);let g=document.createElement("td");g.textContent=d.replaceAll("+"," + "),s.append(g),g=document.createElement("td"),g.textContent=e.text(u),s.append(g)}return t.heading.textContent="Transmission",t.dismiss.textContent="Close",t.heading.textContent="Keyboard shortcuts",t.message.append(o),t.confirm.remove(),delete t.confirm,t}};var de=class i extends EventTarget{constructor(e){super(),this.remote=e;let t=()=>this.remote.loadDaemonStats(r=>this._update(r.arguments)),o=5e3;this.interval=setInterval(t,o),t(),this.elements=i._create(),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){clearInterval(this.interval),this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_update(e){console.log(e);let t=y,o=e["current-stats"],r=D.ratio(o.uploadedBytes,o.downloadedBytes);b(this.elements.session.up,t.size(o.uploadedBytes)),b(this.elements.session.down,t.size(o.downloadedBytes)),this.elements.session.ratio.innerHTML=t.ratioString(r),b(this.elements.session.time,t.timeInterval(o.secondsActive)),o=e["cumulative-stats"],r=D.ratio(o.uploadedBytes,o.downloadedBytes),b(this.elements.total.up,t.size(o.uploadedBytes)),b(this.elements.total.down,t.size(o.downloadedBytes)),this.elements.total.ratio.innerHTML=t.ratioString(r),b(this.elements.total.time,t.timeInterval(o.secondsActive))}static _create(){let e=F("statistics-dialog"),{confirm:t,dismiss:o,heading:r,root:s,workarea:a}=e;t.remove(),o.textContent="Close",delete e.confirm;let l="Statistics";s.setAttribute("aria-label",l),r.textContent=l;let n=["Uploaded:","Downloaded:","Ratio:","Running time:"],c=be("Current session",n),[u,d,g,m]=c.children,I=e.session={};I.up=u,I.down=d,I.ratio=g,I.time=m,a.append(c.root),c=be("Total",n);let[B,f,C,h]=c.children,x=e.total={};return x.up=B,x.down=f,x.ratio=C,x.time=h,a.append(c.root),e}};var X={formatETA:i=>{let e=i.getETA();return e<0||e>=999*60*60?"":`ETA: ${y.timeInterval(e,1)}`},formatLabels:(i,e)=>{let t=i.getLabels();e.innerHTML="";for(let o of t){let r=document.createElement("span");r.classList.add("torrent-label"),r.textContent=o,e.append(r)}},getProgressInfo:(i,e)=>{let t=e.getStatus(),o=["torrent-progress-bar"],r=100,s=null;if(t===A._StatusStopped&&o.push("paused"),e.needsMetaData())o.push("magnet"),r=e.getMetadataPercentComplete()*100;else if(t===A._StatusCheck)o.push("verify"),r=e.getRecheckProgress()*100;else if(e.getLeftUntilDone()>0)o.push("leech"),r=e.getPercentDone()*100;else if(o.push("seed"),t!==A._StatusStopped){let a=e.seedRatioLimit(i);s=a>0?e.getUploadRatio()*100/a:100}return e.isQueued()&&o.push("queued"),{classList:o,percent:r,ratio:s}},renderProgressbar:(i,e,t)=>{let o=X.getProgressInfo(i,e),r=Math.min(o.ratio||o.percent,100),s=`${y.percentString(r,2)}%`;t.className=o.classList.join(" "),t.style.setProperty("--progress",s),t.dataset.progress=o.ratio?"100%":s},symbol:{down:"\u25BC",up:"\u25B2"},updateIcon:(i,e)=>{i.dataset.iconMimeType=e.getPrimaryMimeType().split("/",1).pop(),i.dataset.iconMultifile=e.getFileCount()>1?"true":"false"}},ge=class i{static renderPeerDetails(e,t){let o=y,r=e.getError()!==A._ErrNone;t.classList.toggle("error",r);let s=e.getErrorMessage();if(s)b(t,s);else if(e.isDownloading()){let a=e.getPeersConnected(),l=e.getWebseedsSendingToUs(),n=["Downloading from"];a&&(n.push(e.getPeersSendingToUs(),"of",o.countString("peer","peers",a)),l&&n.push("and")),l&&n.push(o.countString("web seed","web seeds",l)),n.push("-",X.symbol.down,o.speedBps(e.getDownloadSpeed()),X.symbol.up,o.speedBps(e.getUploadSpeed())),b(t,n.join(" "))}else if(e.isSeeding()){let a=["Seeding to",e.getPeersGettingFromUs(),"of",o.countString("peer","peers",e.getPeersConnected()),"-",X.symbol.up,o.speedBps(e.getUploadSpeed())].join(" ");b(t,a)}else if(e.isChecking()){let a=["Verifying local data (",o.percentString(100*e.getRecheckProgress(),1),"% tested)"].join("");b(t,a)}else b(t,e.getStateString())}static renderProgressDetails(e,t,o){let r=y;if(t.needsMetaData()){let c="retrieving";t.isStopped()&&(c="needs");let u=100*t.getMetadataPercentComplete(),d=["Magnetized transfer - ",c," metadata (",r.percentString(u,1),"%)"].join("");b(o,d);return}let s=t.getSizeWhenDone(),a=t.getTotalSize(),l=t.isDone()||t.isSeeding(),n=[];if(l?(a===s?n.push(r.size(a)):n.push(r.size(s)," of ",r.size(t.getTotalSize())," (",t.getPercentDoneStr(),"%)"),n.push(", uploaded ",r.size(t.getUploadedEver())," (Ratio: ",r.ratioString(t.getUploadRatio()),")")):n.push(r.size(s-t.getLeftUntilDone())," of ",r.size(s)," (",t.getPercentDoneStr(),"%)"),!t.isStopped()&&(!l||t.seedRatioLimit(e)>0)){n.push(" - ");let c=t.getETA();c<0||c>=999*60*60?n.push("remaining time unknown"):n.push(r.timeInterval(t.getETA(),1)," remaining")}b(o,n.join(""))}render(e,t,o){let r=t.isStopped();o.classList.toggle("paused",r);let{labels:s,name:a,peer_details:l,progressbar:n,progress_details:c}=o;b(a,t.getName()),X.formatLabels(t,s),i.renderProgressDetails(e,t,c),X.renderProgressbar(e,t,n),i.renderPeerDetails(t,l)}createRow(e){let t=document.createElement("li");t.className="torrent";let o=[["icon","icon"],["name","torrent-name"],["labels","torrent-labels"],["progress_details","torrent-progress-details"],["progressbar","torrent-progress-bar"],["peer_details","torrent-peer-details"]];for(let[r,s]of o){let a=document.createElement("div");a.className=s,t.append(a),t[r]=a}return X.updateIcon(t.icon,e),t}},pe=class i{static renderPeerDetails(e,t){let o=y,r=e.getError()!==A._ErrNone;t.classList.toggle("error",r);let s=e.getErrorMessage();if(s)b(t,s);else if(e.isDownloading()){let a=e.getDownloadSpeed()>0,l=e.getUploadSpeed()>0;if(!l&&!a)b(t,"Idle");else{let n=[X.formatETA(e)];a&&n.push(X.symbol.down,o.speedBps(e.getDownloadSpeed())),l&&n.push(X.symbol.up,o.speedBps(e.getUploadSpeed())),b(t,n.join(" "))}}else if(e.isSeeding()){let a=["Ratio:",o.ratioString(e.getUploadRatio()),"-",X.symbol.up,o.speedBps(e.getUploadSpeed())].join(" ");b(t,a)}else b(t,e.getStateString())}render(e,t,o){o.classList.toggle("paused",t.isStopped());let{labels:r,name:s,peer_details:a,progressbar:l}=o;b(s,t.getName()),X.formatLabels(t,r),i.renderPeerDetails(t,a),X.renderProgressbar(e,t,l),l.classList.add("compact")}createRow(e){let t=document.createElement("li");t.className="torrent compact";let o=[["icon","icon"],["name","torrent-name compact"],["labels","torrent-labels compact"],["peer_details","torrent-peer-details compact"],["progressbar","torrent-progress-bar compact"]];for(let[r,s]of o){let a=document.createElement("div");a.className=s,t.append(a),t[r]=a}return X.updateIcon(t.icon,e),t}},ue=class{constructor(e,t,o){this._view=e,this._torrent=o,this._element=e.createRow(o);let r=()=>this.render(t);this._torrent.addEventListener("dataChanged",r),r()}getElement(){return this._element}render(e){let t=this.getTorrent();t&&this._view.render(e,t,this.getElement())}isSelected(){return this.getElement().classList.contains("selected")}getTorrent(){return this._torrent}getTorrentId(){return this.getTorrent().getId()}};var me=class i extends EventTarget{constructor(e,t,o){super(),this.action_manager=e,this.notifications=t,this.prefs=o,this.remote=new H(this),this.speed={down:document.querySelector("#speed-down"),up:document.querySelector("#speed-up")};for(let[n,c]of[["#toolbar-open","open"],["#toolbar-delete","delete"],["#toolbar-start","start"],["#toolbar-pause","pause"],["#toolbar-inspector","inspector"],["#toolbar-overflow","overflow"]]){let u=document.querySelector(n);for(;u.firstChild;)u.lastChild.remove();u.append(P[c]())}document.querySelector(".speed-container").append(P.speedDown()),document.querySelector(".speed-container + .speed-container").append(P.speedUp()),this.addEventListener("torrent-selection-changed",n=>this.action_manager.update(n)),this.filterText="",this._torrents={},this._rows=[],this.oldTrackers=[],this.dirtyTorrents=new Set,this.changeStatus=!1,this.refilterSoon=R(()=>this._refilter(!1)),this.refilterAllSoon=R(()=>this._refilter(!0)),this.pointer_device=Object.seal({is_touch_device:"ontouchstart"in globalThis,long_press_callback:null,x:0,y:0}),this.popup=Array.from({length:i.max_popups}).fill(null),this.busytyping=!1;for(let n of document.querySelectorAll("button[data-action]")){let{action:c}=n.dataset;W(n,this.action_manager.isEnabled(c)),n.addEventListener("click",()=>{this.action_manager.click(c)})}document.querySelector("#filter-tracker").addEventListener("change",n=>{this.setFilterTracker(n.target.value)}),this.action_manager.addEventListener("change",n=>{for(let c of document.querySelectorAll(`[data-action="${n.action}"]`))W(c,n.enabled)}),this.action_manager.addEventListener("click",n=>{switch(n.action){case"deselect-all":this._deselectAll();break;case"move-bottom":this._moveBottom();break;case"move-down":this._moveDown();break;case"move-top":this._moveTop();break;case"move-up":this._moveUp();break;case"open-torrent":this.setCurrentPopup(new S(this,this.remote));break;case"pause-all-torrents":this._stopTorrents(this._getAllTorrents());break;case"pause-selected-torrents":this._stopTorrents(this.getSelectedTorrents());break;case"reannounce-selected-torrents":this._reannounceTorrents(this.getSelectedTorrents());break;case"remove-selected-torrents":this._removeSelectedTorrents(!1);break;case"resume-selected-torrents":this._startSelectedTorrents(!1);break;case"resume-selected-torrents-now":this._startSelectedTorrents(!0);break;case"select-all":this._selectAll();break;case"show-about-dialog":this.setCurrentPopup(new ee(this.version_info));break;case"show-inspector":this.popup[0]instanceof E?this.popup[0].close():this.setCurrentPopup(new E(this),0);break;case"show-move-dialog":this.setCurrentPopup(new re(this,this.remote));break;case"show-overflow-menu":this.popup[i.default_popup_level]instanceof J?this.popup[i.default_popup_level].close():this.setCurrentPopup(new J(this,this.prefs,this.remote,this.action_manager));break;case"show-preferences-dialog":this.setCurrentPopup(new ie(this,this.remote),0);break;case"show-shortcuts-dialog":this.setCurrentPopup(new le(this.action_manager));break;case"show-statistics-dialog":this.setCurrentPopup(new de(this.remote));break;case"show-rename-dialog":this.setCurrentPopup(new ae(this,this.remote));break;case"show-labels-dialog":this.setCurrentPopup(new ce(this,this.remote));break;case"start-all-torrents":this._startTorrents(this._getAllTorrents());break;case"toggle-compact-rows":this.prefs.display_mode=this.prefs.display_mode===p.DisplayCompact?p.DisplayFull:p.DisplayCompact;break;case"trash-selected-torrents":this._removeSelectedTorrents(!0);break;case"verify-selected-torrents":this._verifyTorrents(this.getSelectedTorrents());break;default:console.warn(`unhandled action: ${n.action}`)}});let r=document.querySelector("#filter-mode");N(r,null,[["All",p.FilterAll]]),N(r,"status",[["Active",p.FilterActive],["Downloading",p.FilterDownloading],["Seeding",p.FilterSeeding],["Paused",p.FilterPaused],["Finished",p.FilterFinished],["Error",p.FilterError]]),N(r,"list",[["Private torrents",p.FilterPrivate],["Public torrents",p.FilterPublic]]),r.value=this.prefs.filter_mode,r.addEventListener("change",n=>{this.prefs.filter_mode=n.target.value,this.refilterAllSoon()}),r=document.querySelector("#filter-tracker"),N(r,null,[["All",p.FilterAll]]);let s=document.querySelector("#torrent-search");r=document.querySelector("#reset"),r.addEventListener("click",()=>{s.value="",this._setFilterText(s.value),this.refilterAllSoon()}),s.value.trim()&&(this.filterText=s.value,r.style.display="block",this.refilterAllSoon()),document.addEventListener("keydown",this._keyDown.bind(this)),document.addEventListener("keyup",this._keyUp.bind(this)),r=document.querySelector("#torrent-container"),r.addEventListener("click",n=>{this.popup[i.default_popup_level]&&this.setCurrentPopup(null),n.target===n.currentTarget&&this._deselectAll()}),r.addEventListener("dblclick",()=>{(!this.popup[0]||this.popup[0].name!=="inspector")&&this.action_manager.click("show-inspector")}),r.addEventListener("dragenter",i._dragenter),r.addEventListener("dragover",i._dragenter),r.addEventListener("drop",this._drop.bind(this)),this._setupSearchBox(),this.elements={torrent_list:document.querySelector("#torrent-list")};let a=()=>{let n=new te(this.action_manager);this.setCurrentPopup(n);let u=document.querySelector("#torrent-container").getBoundingClientRect(),d=Math.min(this.pointer_device.x,u.right+globalThis.scrollX-n.root.clientWidth),g=Math.min(this.pointer_device.y,u.bottom+globalThis.scrollY-n.root.clientHeight);n.root.style.left=`${Math.max(d,0)}px`,n.root.style.top=`${Math.max(g,0)}px`},l=n=>{if(this.pointer_device.is_touch_device&&n.touches.length>1)return;let c=n.target;for(;c&&!c.classList.contains("torrent");)c=c.parentNode;let u=this._rows.find(d=>d.getElement()===c);u&&!u.isSelected()&&this._setSelectedRow(u),a(),n.preventDefault()};if(this.pointer_device.is_touch_device){let n=this.pointer_device;this.elements.torrent_list.addEventListener("touchstart",c=>{n.x=c.touches[0].pageX,n.y=c.touches[0].pageY,n.long_press_callback?(clearTimeout(n.long_press_callback),n.long_press_callback=null):n.long_press_callback=setTimeout(l.bind(this),500,c)}),this.elements.torrent_list.addEventListener("touchend",()=>{clearTimeout(n.long_press_callback),n.long_press_callback=null,setTimeout(()=>{let c=this.popup[i.default_popup_level];c&&(c.root.style.pointerEvents="auto")},1)}),this.elements.torrent_list.addEventListener("touchmove",c=>{n.x=c.touches[0].pageX,n.y=c.touches[0].pageY,clearTimeout(n.long_press_callback),n.long_press_callback=null}),this.elements.torrent_list.addEventListener("contextmenu",c=>{c.preventDefault()})}else this.elements.torrent_list.addEventListener("mousemove",n=>{this.pointer_device.x=n.pageX,this.pointer_device.y=n.pageY}),this.elements.torrent_list.addEventListener("contextmenu",n=>{l(n);let c=this.popup[i.default_popup_level];c&&(c.root.style.pointerEvents="auto")});this.loadDaemonPrefs(),this._initializeTorrents(),this.refreshTorrents(),this.togglePeriodicSessionRefresh(!0),this.prefs.addEventListener("change",({key:n,value:c})=>this._onPrefChanged(n,c));for(let[n,c]of this.prefs.entries())this._onPrefChanged(n,c)}_openTorrentFromUrl(){setTimeout(()=>{let e=new URLSearchParams(globalThis.location.search).get("addtorrent");if(e){this.setCurrentPopup(new S(this,this.remote,e));let t=new URL(globalThis.location);t.search="",globalThis.history.pushState("","",t.toString())}},0)}loadDaemonPrefs(){this.remote.loadDaemonPrefs(e=>{this.session_properties=e.arguments,this._openTorrentFromUrl()})}get session_properties(){return this._session_properties}set session_properties(e){if(K(this._session_properties,e))return;this._session_properties=Object.seal(e);let t=new Event("session-change");t.session_properties=e,this.dispatchEvent(t),this._updateGuiFromSession(e)}_setupSearchBox(){let e=document.querySelector("#torrent-search"),t="blur";e.classList.add(t),e.addEventListener("blur",()=>e.classList.add(t)),e.addEventListener("focus",()=>e.classList.remove(t)),e.addEventListener("input",()=>{e.value.trim()!==this.filterText&&this._setFilterText(e.value)})}_onPrefChanged(e,t){switch(e){case p.DisplayMode:{this.torrentRenderer=t==="compact"?new pe:new ge,this.refilterAllSoon();break}case p.ContrastMode:{document.body.classList.remove("contrast-more","contrast-less"),document.body.classList.add(`contrast-${t}`);break}case p.FilterMode:case p.SortDirection:case p.SortMode:this.refilterAllSoon();break;case p.RefreshRate:{clearInterval(this.refreshTorrentsInterval);let o=this.refreshTorrents.bind(this),r=this.prefs.refresh_rate_sec,s=r>0?r*1e3:1e3;this.refreshTorrentsInterval=setInterval(o,s);break}default:break}}static get max_popups(){return 2}static get default_popup_level(){return i.max_popups-1}_getAllTorrents(){return Object.values(this._torrents)}static _getTorrentIds(e){return e.map(t=>t.getId())}seedRatioLimit(){let e=this.session_properties;return e&&e.seedRatioLimited?e.seedRatioLimit:-1}_getSelectedRows(){return this._rows.filter(e=>e.isSelected())}getSelectedTorrents(){return this._getSelectedRows().map(e=>e.getTorrent())}_getSelectedTorrentIds(){return i._getTorrentIds(this.getSelectedTorrents())}_setSelectedRow(e){let t=e?e.getElement():null;for(let o of this.elements.torrent_list.children)o.classList.toggle("selected",o===t);this._dispatchSelectionChanged()}_selectRow(e){e.getElement().classList.add("selected"),this._dispatchSelectionChanged()}_deselectRow(e){e.getElement().classList.remove("selected"),this._dispatchSelectionChanged()}_selectAll(){for(let e of this.elements.torrent_list.children)e.classList.add("selected");this._dispatchSelectionChanged()}_deselectAll(){for(let e of this.elements.torrent_list.children)e.classList.remove("selected");this._dispatchSelectionChanged(),delete this._last_torrent_clicked}_indexOfLastTorrent(){return this._rows.findIndex(e=>e.getTorrentId()===this._last_torrent_clicked)}_selectRange(e){let t=this._indexOfLastTorrent();if(t===-1)this._selectRow(e);else{let o=this._rows.indexOf(e),r=Math.min(t,o),s=Math.max(t,o);for(let a=r;a<=s;++a)this._selectRow(this._rows[a])}this._dispatchSelectionChanged()}_dispatchSelectionChanged(){let e=[],t=[];for(let r of this._rows)(r.isSelected()?t:e).push(r.getTorrent());let o=new Event("torrent-selection-changed");o.nonselected=e,o.selected=t,this.dispatchEvent(o)}static _createKeyShortcutFromKeyboardEvent(e){let t=[];return e.ctrlKey&&t.push("Control"),e.altKey&&t.push("Alt"),e.metaKey&&t.push("Meta"),e.shiftKey&&t.push("Shift"),t.push(e.key.length===1?e.key.toUpperCase():e.key),t.join("+")}_keyDown(e){let{ctrlKey:t,keyCode:o,metaKey:r,shiftKey:s,target:a}=e,l=["INPUT","TEXTAREA"].includes(a.tagName);if(!l){let d=i._createKeyShortcutFromKeyboardEvent(e),g=this.action_manager.getActionForShortcut(d);if(g){e.preventDefault(),this.action_manager.click(g);return}}if(o===27&&this.popup.some(Boolean)){this.setCurrentPopup(null,0),e.preventDefault();return}let c=document.querySelector(".popup:not(.hidden)"),u=this._rows;if(!l&&!c&&!r&&!t){let d=o===16,g=o===38,m=o===40;if((g||m)&&u.length>0){let I=this._indexOfLastTorrent(),B=this._shift_index,f=0,C=u.length-1,h=I;m&&h+1<=C?++h:g&&h-1>=f&&--h;let x=u[h];B>=0?B<=I&&I=I&&I>h?this._selectRow(x):(B>=I&&h>I||B<=I&&I>h)&&this._deselectRow(u[I]):s?this._selectRange(x):this._setSelectedRow(x),x&&(this._last_torrent_clicked=x.getTorrentId(),x.getElement().scrollIntoView(),e.preventDefault())}else d&&(this._shift_index=this._indexOfLastTorrent())}}_keyUp(e){e.keyCode===16&&delete this._shift_index}static _dragenter(e){if(e.dataTransfer&&e.dataTransfer.types){let t=new Set(["text/uri-list","text/plain"]);if(e.dataTransfer.types.some(o=>t.has(o))||e.dataTransfer.types.includes("Files"))return e.stopPropagation(),e.preventDefault(),e.dataTransfer.dropEffect="copy",!1}else e.dataTransfer&&(e.dataTransfer.dropEffect="none");return!0}static _isValidURL(e){try{return!!new URL(e)}catch{return!1}}shouldAddedTorrentsStart(){return this.session_properties["start-added-torrents"]}_drop(e){let t=!this.shouldAddedTorrentsStart();if(!e.dataTransfer||!e.dataTransfer.types)return!0;let o=e.dataTransfer.types.findLast(s=>["text/uri-list","text/plain"].includes(s));for(let s of e.dataTransfer.getData(o).split(` -`).map(a=>a.trim()).filter(a=>i._isValidURL(a)))this.remote.addTorrentByUrl(s,t);let{files:r}=e.dataTransfer;return r.length>0&&this.setCurrentPopup(new S(this,this.remote,"",r)),e.preventDefault(),!1}togglePeriodicSessionRefresh(e){!e&&this.sessionInterval&&(clearInterval(this.sessionInterval),delete this.sessionInterval),e&&(this.loadDaemonPrefs(),this.sessionInterval||(this.sessionInterval=setInterval(this.loadDaemonPrefs.bind(this),8e3)))}_setFilterText(e){clearTimeout(this.busytyping),this.busytyping=setTimeout(()=>{this.busytyping=!1,this.filterText=e.trim(),this.refilterAllSoon()},e?250:0)}_onTorrentChanged(e){this.changeStatus&&(this._dispatchSelectionChanged(),this.changeStatus=!1);let t=e.currentTarget;this.dirtyTorrents.add(t.getId()),this.refilterSoon()}updateTorrents(e,t){this.remote.updateTorrents(e,t,(o,r)=>{let s=[],a=o.shift(),l={};for(let n of o){for(let[d,g]of a.entries())l[g]=n[d];let{id:c}=l,u=this._torrents[c];if(u){let d=u.needsMetaData();u.refresh(l),d&&!u.needsMetaData()&&s.push(c)}else u=this._torrents[c]=new A(l),u.addEventListener("dataChanged",this._onTorrentChanged.bind(this)),this.dirtyTorrents.add(c),(!("name"in u.fields)||!("status"in u.fields))&&s.push(c)}if(s.length>0){let n=["id",...A.Fields.Metadata,...A.Fields.Stats];this.updateTorrents(s,n),this.refilterSoon()}r&&(this._deleteTorrents(r),this.refilterSoon())})}refreshTorrents(){let e=["id",...A.Fields.Stats];this.updateTorrents("recently-active",e)}_initializeTorrents(){let e=["id",...A.Fields.Metadata,...A.Fields.Stats];this.updateTorrents(null,e)}_onRowClicked(e){let t=e.metaKey||e.ctrlKey,{row:o}=e.currentTarget;this.popup[i.default_popup_level]&&this.setCurrentPopup(null),e.stopPropagation(),e.shiftKey?(this._selectRange(o),globalThis.focus()):!o.isSelected()&&t?this._selectRow(o):o.isSelected()?o.isSelected()&&t?this._deselectRow(o):o.isSelected()&&this._setSelectedRow(o):this._setSelectedRow(o),this._last_torrent_clicked=o.getTorrentId()}_deleteTorrents(e){if(e&&e.length>0){for(let t of e)this.dirtyTorrents.add(t),delete this._torrents[t];this.refilterSoon()}}_removeSelectedTorrents(e){let t=this.getSelectedTorrents();t.length>0&&this.setCurrentPopup(new ne({remote:this.remote,torrents:t,trash:e}))}_startSelectedTorrents(e){this._startTorrents(this.getSelectedTorrents(),e)}_startTorrents(e,t){this.changeStatus=!0,this.remote.startTorrents(i._getTorrentIds(e),t,this.refreshTorrents,this)}_verifyTorrents(e){this.remote.verifyTorrents(i._getTorrentIds(e),this.refreshTorrents,this)}_reannounceTorrents(e){this.remote.reannounceTorrents(i._getTorrentIds(e),this.refreshTorrents,this)}_stopTorrents(e){this.changeStatus=!0,this.remote.stopTorrents(i._getTorrentIds(e),()=>{setTimeout(()=>{this.refreshTorrents()},500)},this)}changeFileCommand(e,t,o){this.remote.changeFileCommand(e,t,o)}_moveTop(){this.remote.moveTorrentsToTop(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveUp(){this.remote.moveTorrentsUp(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveDown(){this.remote.moveTorrentsDown(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveBottom(){this.remote.moveTorrentsToBottom(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_updateGuiFromSession(e){let[,t,o]=e.version.match(/^(.*)\s\(([\da-f]+)\)/);this.version_info={checksum:o,version:t},document.querySelector("#toolbar-overflow").classList.toggle("alt-speed-enabled",e[G._TurtleState])}_updateStatusbar(){let e=y,t=this._getAllTorrents(),o=t.reduce((a,l)=>a+l.getUploadSpeed(),0),r=t.reduce((a,l)=>a+l.getDownloadSpeed(),0),s=e.countString("Transfer","Transfers",this._rows.length);b(this.speed.down,e.speedBps(r)),b(this.speed.up,e.speedBps(o)),b(document.querySelector("#filter-count"),s)}static _displayName(e){let t=e;return t.length>0&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}_updateFilterSelect(){let e=this._getTrackerCounts(),t=Object.keys(e).toSorted();if(t.length!==this.oldTrackers.length||t.some((o,r)=>o!==this.oldTrackers[r])){this.oldTrackers=t;let o=[["All",p.FilterAll,!this.filterTracker],...t.map(s=>[i._displayName(s),s,s===this.filterTracker])],r=document.querySelector("#filter-tracker");for(;r.firstChild;)r.lastChild.remove();N(r,null,o)}}sortRows(e){let t=e.map(r=>r.getTorrent()),o=e.reduce((r,s)=>(r[s.getTorrent().getId()]=s,r),{});A.sortTorrents(t,this.prefs.sort_mode,this.prefs.sort_direction);for(let[r,s]of t.entries())e[r]=o[s.getId()]}_refilter(e){let{sort_mode:t,sort_direction:o,filter_mode:r}=this.prefs,s=this.filterTracker,a=this.torrentRenderer,l=this.elements.torrent_list,n=null,c=null,u=/^labels:([\w,-\s]*)(.*)$/.exec(this.filterText);u?(n=u[2].trim(),c=u[1].split(",")):(n=this.filterText,c=[]);let d=()=>[...l.children].length,g=()=>[...l.children].reduce((Z,Q)=>Z+Q.classList.contains("selected")?1:0,0),m=d(),I=g();if(this._updateFilterSelect(),e){for(;l.firstChild;)l.firstChild.remove();this._rows=[],this.dirtyTorrents=new Set(Object.keys(this._torrents)),document.querySelector("#reset").style.display=this.filterText.length>0?"block":"none"}let B=[],f=[];for(let Z of this._rows)this.dirtyTorrents.has(Z.getTorrentId())?f.push(Z):B.push(Z);for(let Z of f)Z.getElement().remove();let C=[];for(let Z of f){let Q=Z.getTorrentId(),L=this._torrents[Q];L&&L.test(r,s,n,c)&&C.push(Z),this.dirtyTorrents.delete(Q)}f=C;for(let Z of this.dirtyTorrents.values()){let Q=this._torrents[Z];if(Q&&Q.test(r,s,n,c)){let L=new ue(a,this,Q),he=L.getElement();he.row=L,f.push(L),he.addEventListener("click",this._onRowClicked.bind(this))}}this.sortRows(f);let h=[],x=B.length,k=f.length,_=document.createDocumentFragment(),O=0,z=0;for(;O!==x||z!==k;){let Z=null;if(O===x?Z=!1:z===k?Z=!0:Z=A.compareTorrents(B[O].getTorrent(),f[z].getTorrent(),t,o)<0,Z)h.push(B[O++]);else{let Q=f[z++],L=Q.getElement();O===x?_.append(L):l.insertBefore(L,B[O].getElement()),h.push(Q)}}l.append(_),this._rows=h,this.dirtyTorrents.clear(),this._updateStatusbar(),(I!==g()||m!==d())&&this._dispatchSelectionChanged()}setFilterTracker(e){let t=document.querySelector("#filter-tracker");t.value=e,this.filterTracker=e===p.FilterAll?"":e,this.refilterAllSoon()}_getTrackerCounts(){let e={};for(let t of this._getAllTorrents())for(let o of t.getTrackers()){let{sitename:r}=o;e[r]=(e[r]||0)+1}return e}setCurrentPopup(e,t=i.default_popup_level){for(let o=t;o{this.popup[t]&&(this.popup[t].removeEventListener("close",o),this.popup[t]=null)};this.popup[t].addEventListener("close",o)}}};function Je(){let i=new j,e=new p,t=new $(e),o=new me(i,t,e),r=R(()=>o.elements.torrent_list.scrollTo(0,1));globalThis.addEventListener("load",r),globalThis.addEventListener("orientationchange",r)}document.addEventListener("DOMContentLoaded",Je);})(); +(()=>{var ve=Object.create;var Ce=Object.defineProperty;var Fe=Object.getOwnPropertyDescriptor;var Ze=Object.getOwnPropertyNames;var Xe=Object.getPrototypeOf,We=Object.prototype.hasOwnProperty;var Qe=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports);var we=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ze(e))!We.call(n,r)&&r!==t&&Ce(n,r,{get:()=>e[r],enumerable:!(o=Fe(e,r))||o.enumerable});return n};var Le=(n,e,t)=>(t=n!=null?ve(Xe(n)):{},we(e||!n||!n.__esModule?Ce(t,"default",{value:n,enumerable:!0}):t,n));var fe=Qe((je,Ae)=>{"use strict";Ae.exports=function n(e,t){if(e===t)return!0;if(e&&t&&typeof e=="object"&&typeof t=="object"){if(e.constructor!==t.constructor)return!1;var o,r,s;if(Array.isArray(e)){if(o=e.length,o!=t.length)return!1;for(r=o;r--!==0;)if(!n(e[r],t[r]))return!1;return!0}if(e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(r of e.entries())if(!t.has(r[0]))return!1;for(r of e.entries())if(!n(r[1],t.get(r[0])))return!1;return!0}if(e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(r of e.entries())if(!t.has(r[0]))return!1;return!0}if(ArrayBuffer.isView(e)&&ArrayBuffer.isView(t)){if(o=e.length,o!=t.length)return!1;for(r=o;r--!==0;)if(e[r]!==t[r])return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===t.toString();if(s=Object.keys(e),o=s.length,o!==Object.keys(t).length)return!1;for(r=o;r--!==0;)if(!Object.prototype.hasOwnProperty.call(t,s[r]))return!1;for(r=o;r--!==0;){var a=s[r];if(!n(e[a],t[a]))return!1}return!0}return e!==e&&t!==t}});var j=class n extends EventTarget{constructor(){super(),this.actions=Object.seal({"deselect-all":{enabled:!1,shortcut:"D",text:"Deselect all"},"move-bottom":{enabled:!1,text:"Bottom"},"move-down":{enabled:!1,text:"Down"},"move-top":{enabled:!1,text:"Top"},"move-up":{enabled:!1,text:"Up"},"open-torrent":{enabled:!0,shortcut:"O",text:"Open torrent\u2026"},"pause-all-torrents":{enabled:!1,text:"Pause all"},"pause-selected-torrents":{enabled:!1,shortcut:"U",text:"Pause"},"reannounce-selected-torrents":{enabled:!1,text:"Ask tracker for more peers"},"remove-selected-torrents":{enabled:!1,text:"Remove selected torrents"},"resume-selected-torrents":{enabled:!1,shortcut:"R",text:"Resume"},"resume-selected-torrents-now":{enabled:!1,text:"Resume now"},"select-all":{enabled:!1,shortcut:"A",text:"Select all"},"show-about-dialog":{enabled:!0,text:"About"},"show-inspector":{enabled:!1,shortcut:"I",text:"Torrent Inspector"},"show-labels-dialog":{enabled:!1,shortcut:"K",text:"Edit Labels\u2026"},"show-move-dialog":{enabled:!1,shortcut:"L",text:"Set location\u2026"},"show-overflow-menu":{enabled:!0,text:"More options\u2026"},"show-preferences-dialog":{enabled:!0,shortcut:"P",text:"Edit preferences"},"show-rename-dialog":{enabled:!1,shortcut:"N",text:"Rename\u2026"},"show-shortcuts-dialog":{enabled:!0,text:"Keyboard shortcuts"},"show-statistics-dialog":{enabled:!0,shortcut:"S",text:"Statistics"},"start-all-torrents":{enabled:!1,text:"Start all"},"toggle-compact-rows":{enabled:!0,text:"Compact rows"},"toggle-contrast":{enabled:!0,text:"High contrast UI"},"verify-selected-torrents":{enabled:!1,shortcut:"V",text:"Verify local data"}})}click(e){if(this.isEnabled(e)){let t=new Event("click");t.action=e,this.dispatchEvent(t)}}getActionForShortcut(e){for(let[t,o]of Object.entries(this.actions))if(e===o.shortcut)return t;return null}allShortcuts(){return new Map(Object.entries(this.actions).filter(([,e])=>e.shortcut).map(([e,t])=>[t.shortcut,e]))}isEnabled(e){return this._getAction(e).enabled}text(e){return this._getAction(e).text}keyshortcuts(e){return this._getAction(e).shortcut}update(e){let t=n._recount(e.selected,e.nonselected);this._updateStates(t)}_getAction(e){let t=this.actions[e];if(!t)throw new Error(`no such action: ${e}`);return t}static _recount(e,t){let o=e.length+t.length,r=e.filter(d=>d.isStopped()).length,s=e.length-r,a=t.filter(d=>d.isStopped()).length,l=t.length-a,i=r+a,c=s+l,u=e.filter(d=>d.isQueued()).length;return{active:c,nonselected_active:l,nonselected_paused:a,paused:i,selected:e.length,selected_active:s,selected_paused:r,selected_queued:u,total:o}}_updateStates(e){let t=(o,r)=>{for(let s of r)this._updateActionState(s,o)};t(e.selected_paused>0,["resume-selected-torrents"]),t(e.paused>0,["start-all-torrents"]),t(e.active>0,["pause-all-torrents"]),t(e.selected_paused>0||e.selected_queued>0,["resume-selected-torrents-now"]),t(e.selected_active>0,["pause-selected-torrents","reannounce-selected-torrents"]),t(e.selected>0,["deselect-all","move-bottom","move-down","move-top","move-up","remove-selected-torrents","show-inspector","show-labels-dialog","show-move-dialog","verify-selected-torrents"]),t(e.selected===1,["show-rename-dialog"]),t(e.selectedke(r,d,a,c,t))}return l[0].classList.add("selected"),a.children[0].classList.remove("hidden"),{buttons:l,dismiss:s,root:o}}function F(n){let e=document.createElement("dialog");e.classList.add("dialog-container","popup",n),e.open=!0,e.setAttribute("role","dialog");let t=document.createElement("div");t.classList.add("dialog-window"),e.append(t);let o=document.createElement("div");o.classList.add("dialog-logo"),t.append(o);let r=document.createElement("div");r.classList.add("dialog-heading"),t.append(r);let s=document.createElement("div");s.classList.add("dialog-message"),t.append(s);let a=document.createElement("div");a.classList.add("dialog-workarea"),t.append(a);let l=document.createElement("div");l.classList.add("dialog-buttons"),t.append(l);let i=document.createElement("span");i.className="flexible-space",l.append(i);let c=document.createElement("button");c.classList.add("dialog-dismiss-button"),c.textContent="Cancel",l.append(c);let u=document.createElement("button");return u.textContent="OK",l.append(u),t.addEventListener("keyup",({key:d})=>{d==="Enter"&&u.click()}),{confirm:u,dismiss:c,heading:r,message:s,root:e,workarea:a}}function v(){return typeof crypto.randomUUID=="function"?crypto.randomUUID():("10000000-1000-4000-8000"+-1e11).replaceAll(/[018]/g,n=>(n^crypto.getRandomValues(new Uint8Array(1))[0]&15>>n/4).toString(16))}function N(n,e,t){let o=t.map(r=>new Option(...r));if(e){let r=document.createElement("OPTGROUP");r.label=e,r.append(...o),n.append(r)}else n.append(...o)}var P=Object.freeze({delete:()=>T(["polyline",{points:"3 6 5 6 21 6"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"}],["line",{x1:10,x2:10,y1:11,y2:17}],["line",{x1:14,x2:14,y1:11,y2:17}]),inspector:()=>{let n=V("svg",{fill:"none","fill-opacity":1,height:26,stroke:"currentColor",viewBox:"-1 -1 26 26",width:26}),e=V("g",{});return e.append(V("circle",{cx:12,cy:12,r:12,"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":2}),V("path",{d:"M 11.88208 4.883789 C 12.326418 4.883789 12.702391 5.039305 13.01001 5.350342 C 13.317628 5.6613785 13.471436 6.035642 13.471436 6.4731445 C 13.471436 6.910647 13.31592 7.283202 13.004883 7.59082 C 12.693846 7.898439 12.319582 8.052246 11.88208 8.052246 C 11.444578 8.052246 11.072023 7.898439 10.764404 7.59082 C 10.456786 7.283202 10.302979 6.910647 10.302979 6.4731445 C 10.302979 6.035642 10.456786 5.6613785 10.764404 5.350342 C 11.072023 5.039305 11.444578 4.883789 11.88208 4.883789 Z M 13.317627 9.528809 L 13.317627 17.126953 C 13.317627 17.803714 13.39624 18.236083 13.553467 18.424072 C 13.710694 18.612061 14.018308 18.719726 14.476318 18.74707 L 14.476318 19.11621 L 9.298096 19.11621 L 9.298096 18.74707 C 9.721926 18.733398 10.036376 18.610353 10.241455 18.37793 C 10.378175 18.220702 10.446533 17.803714 10.446533 17.126953 L 10.446533 11.52832 C 10.446533 10.851559 10.367921 10.41919 10.210693 10.231201 C 10.053466 10.043212 9.74927 9.935547 9.298096 9.908203 L 9.298096 9.528809 Z",fill:"currentColor"})),n.append(e),n},open:()=>T(["path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"}],["line",{x1:12,x2:12,y1:11,y2:17}],["line",{x1:9,x2:15,y1:14,y2:14}]),overflow:()=>T(["line",{x1:3,x2:21,y1:12,y2:12}],["line",{x1:3,x2:21,y1:6,y2:6}],["line",{x1:3,x2:21,y1:18,y2:18}]),pause:()=>T(["rect",{height:16,width:4,x:6,y:4}],["rect",{height:16,width:4,x:14,y:4}]),speedDown:()=>T(["polyline",{points:"6 9 12 15 18 9"}]),speedUp:()=>T(["polyline",{points:"18 15 12 9 6 15"}]),start:()=>T(["polyline",{points:"5 3 19 12 5 21 5 3"}])});function Oe(n){let e=document.createElement("fieldset");e.classList.add("section");let t=document.createElement("legend");t.classList.add("title"),t.textContent=n,e.append(t);let o=document.createElement("div");return o.classList.add("content"),e.append(o),{content:o,root:e}}function be(n,e){let t=[],{root:o,content:r}=Oe(n);for(let s of e){let a=document.createElement("label");a.textContent=s,r.append(a);let l=document.createElement("div");l.id=v(),r.append(l),a.setAttribute("for",l.id),t.push(l)}return{children:t,root:o}}function R(n,e=100){let t=null;return(...o)=>{t||(t=setTimeout(()=>{t=null,n(...o)},e))}}function K(n,e){return(0,Be.default)(n,e)}function Ye(n,e,t){t?n.setAttribute(e,!0):n.removeAttribute(e)}function W(n,e){Ye(n,"disabled",!e)}function q(n,e){n.classList.toggle("checked",e)}var Y=class extends EventTarget{constructor(e){super(),this.listener=t=>{e.contains(t.target)||(this.dispatchEvent(new MouseEvent(t.type,t)),t.preventDefault())},Object.seal(this),this.start()}start(){setTimeout(()=>document.addEventListener("click",this.listener),0)}stop(){document.removeEventListener("click",this.listener)}};function b(n,e){n.textContent!==e&&(n.textContent=e)}var $=class{constructor(e){this._prefs=e,this._elements={toggle:document.querySelector("#toggle-notifications")}}_setEnabled(e){this.prefs.notifications_enabled=e,b(this._toggle,`${e?"Disable":"Enable"} Notifications`)}_requestPermission(){Notification.requestPermission().then(e=>this._setEnabled(e==="granted"))}toggle(){this._enabled?this._setEnabled(!1):Notification.permission==="granted"?this._setEnabled(!0):Notification.permission!=="denied"&&this._requestPermission()}};var p=class n extends EventTarget{constructor(){super(),this._cache={},this.dispatchPrefsChange=R((e,t,o)=>{let r=new Event("change");Object.assign(r,{key:e,old_value:t,value:o}),this.dispatchEvent(r)});for(let[e,t]of Object.entries(n._Defaults))this._set(e,n._getCookie(e,t)),Object.defineProperty(this,e.replaceAll("-","_"),{get:()=>this._get(e),set:o=>{this._set(e,o)}});Object.seal(this)}entries(){return Object.entries(this._cache)}keys(){return Object.keys(this._cache)}_get(e){let{_cache:t}=this;if(!Object.prototype.hasOwnProperty.call(t,e))throw new Error(e);return t[e]}_set(e,t){let{_cache:o}=this,r=o[e];r!==t&&(o[e]=t,n._setCookie(e,t),this.dispatchPrefsChange(e,r,t))}static _setCookie(e,t){let o=new Date;o.setFullYear(o.getFullYear()+1),document.cookie=`${e}=${t}; SameSite=Strict; expires=${o.toGMTString()}`}static _getCookie(e,t){let o=n._readCookie(e);if(o===null)return t;let r=typeof t;if(r==="boolean")return o==="true"?!0:o==="false"?!1:t;if(r==="number"){let s=Number.parseFloat(o);return Number.isNaN(s)?t:s}return o}static _readCookie(e){let o=`; ${document.cookie}`.split(`; ${e}=`);return o.length===2?o.pop().split(";").shift():null}};p.AltSpeedEnabled="alt-speed-enabled";p.DisplayCompact="compact";p.DisplayFull="full";p.DisplayMode="display-mode";p.ContrastLess="less";p.ContrastMore="more";p.ContrastMode="contrast-mode";p.FilterActive="active";p.FilterAll="all";p.FilterDownloading="downloading";p.FilterError="error";p.FilterFinished="finished";p.FilterMode="filter-mode";p.FilterPaused="paused";p.FilterPrivate="private";p.FilterPublic="public";p.FilterSeeding="seeding";p.NotificationsEnabled="notifications-enabled";p.RefreshRate="refresh-rate-sec";p.SortAscending="ascending";p.SortByActivity="activity";p.SortByAge="age";p.SortByName="name";p.SortByProgress="progress";p.SortByQueue="queue";p.SortByRatio="ratio";p.SortBySize="size";p.SortByState="state";p.SortDescending="descending";p.SortDirection="sort-direction";p.SortMode="sort-mode";p._Defaults={[p.AltSpeedEnabled]:!1,[p.DisplayMode]:p.DisplayFull,[p.ContrastMode]:globalThis.matchMedia("(prefers-contrast: more)").matches?p.ContrastMore:p.ContrastLess,[p.FilterMode]:p.FilterAll,[p.NotificationsEnabled]:!1,[p.RefreshRate]:5,[p.SortDirection]:p.SortAscending,[p.SortMode]:p.SortByName};var ee=class n extends EventTarget{constructor(e){super(),this.elements=n._create(e),this.elements.dismiss.addEventListener("click",()=>this.close()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements}static _create(e){let t=F("about-dialog");t.root.setAttribute("aria-label","About transmission"),t.heading.textContent="Transmission",t.dismiss.textContent="Close";let o=document.createElement("div");return o.classList.add("about-dialog-version-number"),o.textContent=e.version,t.heading.append(o),o=document.createElement("div"),o.classList.add("about-dialog-version-checksum"),o.textContent=e.checksum,t.heading.append(o),o=document.createElement("div"),o.textContent="A fast and easy bitTorrent client",t.workarea.append(o),o=document.createElement("div"),o.textContent="Copyright \xA9 The Transmission Project",t.workarea.append(o),o=document.createElement("a"),o.href="https://transmissionbt.com/",o.target="_blank",o.textContent="https://transmissionbt.com/",t.workarea.append(o),t.confirm.remove(),delete t.confirm,t}};var te=class extends EventTarget{constructor(e){super(),this.action_listener=this._update.bind(this),this.action_manager=e,this.action_manager.addEventListener("change",this.action_listener),Object.assign(this,this._create()),this.outside=new Y(this.root),this.outside.addEventListener("click",()=>this.close()),this.show()}show(){for(let[e,t]of Object.entries(this.actions))W(t,this.action_manager.isEnabled(e));document.body.append(this.root)}close(){if(!this.closed){this.outside.stop(),this.action_manager.removeEventListener("change",this.action_listener),this.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_update(e){let t=this.actions[e.action];t&&W(t,e.enabled)}_create(){let e=document.createElement("div");e.role="menu",e.classList.add("context-menu","popup"),e.addEventListener("contextmenu",a=>{a.preventDefault()}),e.style.pointerEvents="none";let t={},o=(a,l=!1)=>{let i=document.createElement("div"),c=this.action_manager.text(a);i.role="menuitem",l?i.classList.add("context-menuitem","warning"):i.classList.add("context-menuitem"),i.dataset.action=a,i.textContent=c;let u=this.action_manager.keyshortcuts(a);return u&&i.setAttribute("aria-keyshortcuts",u),i.addEventListener("click",()=>{this.action_manager.click(a),this.close()}),t[a]=i,i},r=()=>{let a=document.createElement("div");return a.classList.add("context-menu-separator"),a},s=(a,...l)=>{let i=document.createElement("div");i.className="context-menuitem",i.textContent=a;let c=document.createElement("div");c.className="arrow",i.append(c);let u=document.createElement("div");u.className="submenu",c.append(u);let d=document.createElement("div");return d.className="open right",u.append(d),d.append(...l.map(g=>o(g))),i.addEventListener("click",g=>{let m=i.lastChild.lastChild;if(!g.target.classList.contains("right")&&!g.target.parentNode.classList.contains("right")&&!g.target.classList.contains("left")&&!g.target.parentNode.classList.contains("left")&&m.style.display==="block"){m.style.display="none";return}for(let h of e.querySelectorAll(".submenu"))h.style.display="none";m.style.display="block";let I=i.getBoundingClientRect(),B=m.lastChild.getBoundingClientRect(),f=Math.min(0,document.documentElement.clientHeight-window.visualViewport.offsetTop-I.top-m.clientHeight+3),C=Math.min(0,document.documentElement.clientWidth-window.visualViewport.offsetLeft-I.right-m.clientWidth);m.style.top=`${f}px`,C?(m.lastChild.className="open left",m.style.left=`${-I.width-B.width}px`):(m.lastChild.className="open right",m.style.left=`${C}px`)}),i};return e.append(o("resume-selected-torrents"),o("resume-selected-torrents-now"),o("pause-selected-torrents"),r(),s("Move in the queue","move-top","move-up","move-down","move-bottom"),r(),o("remove-selected-torrents",!0),r(),o("verify-selected-torrents"),o("show-move-dialog"),o("show-rename-dialog"),o("show-labels-dialog"),r(),o("reannounce-selected-torrents"),r(),s("Select operation","select-all","deselect-all")),{actions:t,root:e}}};var xe=new Intl.PluralRules,w=xe.resolvedOptions().locale,Te=new Intl.NumberFormat(w),Ie=1e3,Re=[new Intl.NumberFormat(w,{maximumFractionDigits:0,style:"unit",unit:"byte"}),new Intl.NumberFormat(w,{maximumFractionDigits:0,style:"unit",unit:"kilobyte"}),new Intl.NumberFormat(w,{maximumFractionDigits:0,style:"unit",unit:"megabyte"}),new Intl.NumberFormat(w,{maximumFractionDigits:2,style:"unit",unit:"gigabyte"}),new Intl.NumberFormat(w,{maximumFractionDigits:2,style:"unit",unit:"terabyte"}),new Intl.NumberFormat(w,{maximumFractionDigits:2,style:"unit",unit:"petabyte"})],Ve=new Intl.NumberFormat(w,{maximumFractionDigits:2,style:"unit",unit:"kilobyte-per-second"}),Ne=new Intl.NumberFormat(w,{maximumFractionDigits:2,style:"unit",unit:"megabyte-per-second"}),Se=new Intl.NumberFormat(w,{maximumFractionDigits:2,style:"unit",unit:"gigabyte-per-second"}),y={_toTruncFixed(n,e){return(Math.floor(n*10**e)/10**e).toFixed(e)},countString(n,e,t){return`${this.number(t)} ${this.ngettext(n,e,t)}`},mem(n){if(n<0)return"Unknown";if(n===0)return"None";let e=n;for(let t of Re){if(en.includes(e))?"\u2026":n},timeInterval(n,e=3){let t=Math.floor(n/86400),o=[];t&&o.push(this.countString("day","days",t));let r=Math.floor(n%86400/3600);(t||r)&&o.push(this.countString("hour","hours",r));let s=Math.floor(n%3600/60);return t||r||s?(o.push(this.countString("minute","minutes",s)),o=o.slice(0,e),o.length>1?`${o.slice(0,-1).join(", ")} and ${o.slice(-1)}`:o[0]):this.countString("second","seconds",Math.floor(n%60))},timestamp(n){if(!n)return"N/A";let e=new Date(n*1e3),t=new Date,o="",r="",s=t.getFullYear()===e.getFullYear(),a=t.getMonth()===e.getMonth(),l=t.getDate()-e.getDate();s&&a&&Math.abs(l)<=1?l===0?o="Today":l===1?o="Yesterday":o="Tomorrow":o=e.toDateString();let i=e.getHours(),c="AM";i>12&&(i=i-12,c="PM"),i===0&&(i=12),i<10&&(i=`0${i}`);let u=e.getMinutes();return u<10&&(u=`0${u}`),n=e.getSeconds(),n<10&&(n=`0${n}`),r=[i,u,n].join(":"),[o,r,c].join(" ")},toKBps(n){return Math.floor(n/Ie)}};var oe=class extends EventTarget{isDone(){return this.fields.have>=this.fields.size}isEditable(){return this.fields.torrent.getFileCount()>1&&!this.isDone()}refreshWantedHTML(){let e=this.elements.root;e.classList.toggle("skip",!this.fields.isWanted),e.classList.toggle("complete",this.isDone()),W(e.checkbox,this.isEditable()),e.checkbox.checked=this.fields.isWanted}refreshProgressHTML(){let{size:e,have:t}=this.fields,o=100*(e?t/e:1),r=y,s=`${r.size(t)} of ${r.size(e)} (${r.percentString(o,1)}%)`;b(this.elements.progress,s)}refresh(){let e=0,t=!1,o=!1,r=!1,s=0,a=!1,l=this.fields.torrent.getFiles();for(let i of this.fields.indices){let c=l[i];switch(e+=c.bytesCompleted,s+=c.length,a|=c.wanted,c.priority.toString()){case"-1":o=!0;break;case"1":t=!0;break;default:r=!0;break}}q(this.elements.priority_low_button,o),q(this.elements.priority_normal_button,r),q(this.elements.priority_high_button,t),(this.fields.have!==e||this.fields.size!==s)&&(this.fields.have=e,this.fields.size=s,this.refreshProgressHTML()),this.fields.isWanted!==a&&(this.fields.isWanted=a,this.refreshWantedHTML())}fireWantedChanged(e){let t=new Event("wantedToggled");t.indices=[...this.fields.indices],t.wanted=e,this.dispatchEvent(t)}firePriorityChanged(e){let t=new Event("priorityToggled");t.indices=[...this.fields.indices],t.priority=e,this.dispatchEvent(t)}createRow(e,t,o){let r=document.createElement("li");r.classList.add("inspector-torrent-file-list-entry"),this.elements.root=r;let s=document.createElement("input"),a=v();s.type="checkbox",s.className="file-wanted-control",s.title="Download file",s.id=a,s.addEventListener("change",c=>this.fireWantedChanged(c.target.checked)),r.checkbox=s,r.append(s),s=document.createElement("label"),s.className="inspector-torrent-file-list-entry-name",s.setAttribute("for",a),b(s,o),r.append(s),s=document.createElement("div"),s.className="inspector-torrent-file-list-entry-progress",r.append(s),this.elements.progress=s,s=document.createElement("div"),s.className="file-priority-radiobox";let l=s,i=c=>this.firePriorityChanged(c.target.value);s=document.createElement("input"),s.type="radio",s.value="-1",s.className="low",s.title="Low Priority",s.addEventListener("click",i),this.elements.priority_low_button=s,l.append(s),s=document.createElement("input"),s.type="radio",s.value="0",s.className="normal",s.title="Normal Priority",s.addEventListener("click",i),this.elements.priority_normal_button=s,l.append(s),s=document.createElement("input"),s.type="radio",s.value="1",s.title="High Priority",s.className="high",s.addEventListener("click",i),this.elements.priority_high_button=s,l.append(s),r.append(l),r.style.paddingLeft=`${t*20}px`,this.refresh()}getElement(){return this.elements.root}constructor(e,t,o,r){super(),this.fields={have:0,indices:r,isWanted:!0,size:0,torrent:e},this.elements={priority_high_button:null,priority_low_button:null,priority_normal_button:null,progress:null,root:null},this.createRow(e,t,o)}};var A=class n extends EventTarget{constructor(e){super(),this.fieldObservers={},this.fields={},this.refresh(e),this.setLazyCollatedField("name","collatedName"),this.setLazyCollatedField("trackers","collatedTrackers")}setLazyCollatedField(e,t){this.notifyOnFieldChange(e,()=>delete this.fields[t])}notifyOnFieldChange(e,t){(this.fieldObservers[e]??=[]).push(t)}setField(e,t,o){let r=e[t];if(K(r,o))return!1;let s=this.fieldObservers[t];if(e===this.fields&&s&&s.length>0)for(let a of s)a.call(this,o,r,t);return e[t]=o,!0}updateFiles(e){let t=!1,o=this.fields.files||[],r=["length","name","bytesCompleted","wanted","priority"];for(let[s,a]of e.entries()){let l=o[s]||{};for(let i of r)i in a&&(t|=this.setField(l,i,a[i]));o[s]=l}return this.fields.files=o,t}static collateTrackers(e){return e.map(t=>t.announce.toLowerCase()).join(" ")}refreshFields(e){let t=!1;for(let[o,r]of Object.entries(e))switch(o){case"files":case"fileStats":t|=this.updateFiles(r);break;case"trackerStats":t|=this.setField(this.fields,"trackers",r);break;case"trackers":o in this.fields||(t|=this.setField(this.fields,o,r));break;default:t|=this.setField(this.fields,o,r)}return t}refresh(e){this.refreshFields(e)&&this.dispatchEvent(new Event("dataChanged"))}getComment(){return this.fields.comment}getCreator(){return this.fields.creator}getDateAdded(){return this.fields.addedDate}getDateCreated(){return this.fields.dateCreated}getDesiredAvailable(){return this.fields.desiredAvailable}getDownloadDir(){return this.fields.downloadDir}getDownloadSpeed(){return this.fields.rateDownload}getDownloadedEver(){return this.fields.downloadedEver}getError(){return this.fields.error}getErrorString(){return this.fields.errorString}getETA(){return this.fields.eta}getFailedEver(){return this.fields.corruptEver}getFiles(){return this.fields.files||[]}getFile(e){return this.fields.files[e]}getFileCount(){return this.fields["file-count"]}getHashString(){return this.fields.hashString}getHave(){return this.getHaveValid()+this.getHaveUnchecked()}getHaveUnchecked(){return this.fields.haveUnchecked}getHaveValid(){return this.fields.haveValid}getId(){return this.fields.id}getLabels(){return this.fields.labels.toSorted()}getLastActivity(){return this.fields.activityDate}getLeftUntilDone(){return this.fields.leftUntilDone}getMagnetLink(){return this.fields.magnetLink}getMetadataPercentComplete(){return this.fields.metadataPercentComplete}getName(){return this.fields.name||"Unknown"}getPeers(){return this.fields.peers||[]}getPeersConnected(){return this.fields.peersConnected}getPeersGettingFromUs(){return this.fields.peersGettingFromUs}getPeersSendingToUs(){return this.fields.peersSendingToUs}getPieceCount(){return this.fields.pieceCount}getPieceSize(){return this.fields.pieceSize}getPrimaryMimeType(){return this.fields["primary-mime-type"]||"application/octet-stream"}getPrivateFlag(){return this.fields.isPrivate}getQueuePosition(){return this.fields.queuePosition}getRecheckProgress(){return this.fields.recheckProgress}getSeedRatioLimit(){return this.fields.seedRatioLimit}getSeedRatioMode(){return this.fields.seedRatioMode}getSizeWhenDone(){return this.fields.sizeWhenDone}getStartDate(){return this.fields.startDate}getStatus(){return this.fields.status}getTotalSize(){return this.fields.totalSize}getTrackers(){return this.fields.trackers||[]}getUploadSpeed(){return this.fields.rateUpload}getUploadRatio(){return this.fields.uploadRatio}getUploadedEver(){return this.fields.uploadedEver}getWebseedsSendingToUs(){return this.fields.webseedsSendingToUs}isFinished(){return this.fields.isFinished}hasExtraInfo(){return"hashString"in this.fields}isSeeding(){return this.getStatus()===n._StatusSeed}isStopped(){return this.getStatus()===n._StatusStopped}isChecking(){return this.getStatus()===n._StatusCheck}isDownloading(){return this.getStatus()===n._StatusDownload}isQueued(){return this.getStatus()===n._StatusDownloadWait||this.getStatus()===n._StatusSeedWait}isDone(){return this.getLeftUntilDone()<1}needsMetaData(){return this.getMetadataPercentComplete()<1}getActivity(){return this.getDownloadSpeed()+this.getUploadSpeed()}getPercentDoneStr(){return y.percentString(100*this.getPercentDone(),1)}getPercentDone(){return this.fields.percentDone}getStateString(){switch(this.getStatus()){case n._StatusStopped:return this.isFinished()?"Seeding complete":"Paused";case n._StatusCheckWait:return"Queued for verification";case n._StatusCheck:return"Verifying local data";case n._StatusDownloadWait:return"Queued for download";case n._StatusDownload:return"Downloading";case n._StatusSeedWait:return"Queued for seeding";case n._StatusSeed:return"Seeding";case null:return"Unknown";default:return"Error"}}seedRatioLimit(e){switch(this.getSeedRatioMode()){case n._RatioUseGlobal:return e.seedRatioLimit();case n._RatioUseLocal:return this.getSeedRatioLimit();default:return-1}}getErrorMessage(){let e=this.getErrorString();switch(this.getError()){case n._ErrTrackerWarning:return`Tracker returned a warning: ${e}`;case n._ErrTrackerError:return`Tracker returned an error: ${e}`;case n._ErrLocalError:return`Error: ${e}`;default:return null}}getCollatedName(){let e=this.fields;return!e.collatedName&&e.name&&(e.collatedName=e.name.toLowerCase()),e.collatedName||""}getCollatedTrackers(){let e=this.fields;return!e.collatedTrackers&&e.trackers&&(e.collatedTrackers=n.collateTrackers(e.trackers)),e.collatedTrackers||""}testState(e){let t=this.getStatus();switch(e){case p.FilterError:return this.getError();case p.FilterPrivate:return this.getPrivateFlag();case p.FilterPublic:return!this.getPrivateFlag();case p.FilterActive:return this.getPeersGettingFromUs()>0||this.getPeersSendingToUs()>0||this.getWebseedsSendingToUs()>0||this.isChecking();case p.FilterSeeding:return t===n._StatusSeed||t===n._StatusSeedWait;case p.FilterDownloading:return t===n._StatusDownload||t===n._StatusDownloadWait;case p.FilterPaused:return this.isStopped();case p.FilterFinished:return this.isFinished();default:return!0}}test(e,t,o,r){let s=this.testState(e);if(s&&o&&(s=this.getCollatedName().includes(o.toLowerCase())),s){let a=this.getLabels();r.length>0&&(s=r.some(l=>a.includes(l)))}return s&&t&&t.length>0&&(s=this.getCollatedTrackers().includes(t)),s}static compareById(e,t){return e.getId()-t.getId()}static compareByName(e,t){return e.getCollatedName().localeCompare(t.getCollatedName())||n.compareById(e,t)}static compareByQueue(e,t){return e.getQueuePosition()-t.getQueuePosition()}static compareByAge(e,t){let o=e.getDateAdded();return t.getDateAdded()-o||n.compareByQueue(e,t)}static compareByState(e,t){let o=e.getStatus();return t.getStatus()-o||n.compareByQueue(e,t)}static compareByActivity(e,t){let o=e.getActivity();return t.getActivity()-o||n.compareByState(e,t)}static compareByRatio(e,t){let o=e.getUploadRatio(),r=t.getUploadRatio();return or?-1:n.compareByState(e,t)}static compareByProgress(e,t){let o=e.getPercentDone(),r=t.getPercentDone();return o-r||n.compareByRatio(e,t)}static compareBySize(e,t){let o=e.getTotalSize(),r=t.getTotalSize();return o-r||n.compareByName(e,t)}static compareTorrents(e,t,o,r){let s=0;switch(o){case p.SortByActivity:s=n.compareByActivity(e,t);break;case p.SortByAge:s=n.compareByAge(e,t);break;case p.SortByQueue:s=n.compareByQueue(e,t);break;case p.SortByProgress:s=n.compareByProgress(e,t);break;case p.SortBySize:s=n.compareBySize(e,t);break;case p.SortByState:s=n.compareByState(e,t);break;case p.SortByRatio:s=n.compareByRatio(e,t);break;case p.SortByName:s=n.compareByName(e,t);break;default:console.log(`Unrecognized sort mode: ${o}`),s=n.compareByName(e,t);break}return r===p.SortDescending&&(s=-s),s}static sortTorrents(e,t,o){switch(t){case p.SortByActivity:e.sort(this.compareByActivity);break;case p.SortByAge:e.sort(this.compareByAge);break;case p.SortByName:e.sort(this.compareByName);break;case p.SortByProgress:e.sort(this.compareByProgress);break;case p.SortByQueue:e.sort(this.compareByQueue);break;case p.SortByRatio:e.sort(this.compareByRatio);break;case p.SortBySize:e.sort(this.compareBySize);break;case p.SortByState:e.sort(this.compareByState);break;default:console.log(`Unrecognized sort mode: ${t}`),e.sort(this.compareByName);break}return o===p.SortDescending&&e.reverse(),e}};A._StatusStopped=0;A._StatusCheckWait=1;A._StatusCheck=2;A._StatusDownloadWait=3;A._StatusDownload=4;A._StatusSeedWait=5;A._StatusSeed=6;A._RatioUseGlobal=0;A._RatioUseLocal=1;A._RatioUnlimited=2;A._ErrNone=0;A._ErrTrackerWarning=1;A._ErrTrackerError=2;A._ErrLocalError=3;A._TrackerInactive=0;A._TrackerWaiting=1;A._TrackerQueued=2;A._TrackerActive=3;A.Fields={};A.Fields.Metadata=["addedDate","file-count","name","primary-mime-type","totalSize"];A.Fields.Stats=["error","errorString","eta","isFinished","isStalled","labels","leftUntilDone","metadataPercentComplete","peersConnected","peersGettingFromUs","peersSendingToUs","percentDone","queuePosition","rateDownload","rateUpload","recheckProgress","seedRatioMode","seedRatioLimit","sizeWhenDone","status","trackers","downloadDir","uploadedEver","uploadRatio","webseedsSendingToUs"];A.Fields.InfoExtra=["comment","creator","dateCreated","files","hashString","isPrivate","magnetLink","pieceCount","pieceSize"];A.Fields.StatsExtra=["activityDate","corruptEver","desiredAvailable","downloadedEver","fileStats","haveUnchecked","haveValid","peers","startDate","trackerStats"];var ye=["encryption","speed-up","speed-down","percent-done","status","peer-address","peer-app-name"],E=class n extends EventTarget{constructor(e){super(),this.closed=!1,this.controller=e,this.elements=this._create(),this.current_page=this.elements.info.root,this.interval=setInterval(this._refreshTorrents.bind(this),3e3),this.name="inspector",this.selection_listener=t=>this._setTorrents(t.selected),this.torrent_listener=()=>this._updateCurrentPage(),this.torrents=[],this.file_torrent=null,this.file_torrent_n=null,this.file_rows=null,this.elements.dismiss.addEventListener("click",()=>this.close()),Object.seal(this),e.addEventListener("torrent-selection-changed",this.selection_listener),this._setTorrents(this.controller.getSelectedTorrents()),document.querySelector("#mainwin-workarea").append(this.elements.root)}close(){if(!this.closed){clearInterval(this.interval),this._setTorrents([]),this.elements.root.remove(),this.controller.removeEventListener("torrent-selection-changed",this.selection_listener),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))this[e]=null;this.closed=!0}}static _createInfoPage(){let e=document.createElement("div");e.classList.add("inspector-info-page");let t={root:e},o=a=>{let l=document.createElement("div");l.textContent=a,l.classList.add("section-label"),e.append(l)},r=a=>{let l=document.createElement("label");b(l,a),e.append(l);let i=document.createElement("span");return e.append(i),i};o("Activity");let s=[["have","Have:"],["availability","Availability:"],["uploaded","Uploaded:"],["downloaded","Downloaded:"],["state","State:"],["running_time","Running time:"],["remaining_time","Remaining:"],["last_activity","Last activity:"],["error","Error:"]];for(let[a,l]of s)t[a]=r(l);o("Details"),s=[["name","Name:"],["size","Size:"],["location","Location:"],["hash","Hash:"],["privacy","Privacy:"],["origin","Origin:"],["dateAdded","Date added:"],["magnetLink","Magnet:"],["comment","Comment:"],["labels","Labels:"]];for(let[a,l]of s)t[a]=r(l);return t}static _createListPage(e,t){let o=document.createElement("div"),r=document.createElement(e);return r.id=t,o.append(r),{list:r,root:o}}static _createTiersPage(){return n._createListPage("div","inspector-tiers-list")}static _createFilesPage(){return n._createListPage("ul","inspector-file-list")}static _createPeersPage(){let e=document.createElement("table");e.classList.add("peer-list");let t=document.createElement("thead"),o=document.createElement("tr"),r=["","Up","Down","Done","Status","Address","Client"];for(let[a,l]of r.entries()){let i=document.createElement("th"),c=ye[a];c==="encryption"&&(i.dataset.encrypted=!0),i.classList.add(c),b(i,l),o.append(i)}let s=document.createElement("tbody");return t.append(o),e.append(t),e.append(s),{root:e,tbody:s}}_create(){let e={files:n._createFilesPage(),info:n._createInfoPage(),peers:n._createPeersPage(),tiers:n._createTiersPage()},t=r=>{this.current_page=r,this._updateCurrentPage()};return{...M("inspector",[["inspector-tab-info",e.info.root,"Info"],["inspector-tab-peers",e.peers.root,"Peers"],["inspector-tab-tiers",e.tiers.root,"Tiers"],["inspector-tab-files",e.files.root,"Files"]],t.bind(this)),...e}}_setTorrents(e){let t="dataChanged",o=this.torrent_listener;for(let r of this.torrents)r.removeEventListener(t,o);this.torrents=[...e];for(let r of this.torrents)r.addEventListener(t,o);this._refreshTorrents(),this._updateCurrentPage()}static _needsExtraInfo(e){return e.some(t=>!t.hasExtraInfo())}_refreshTorrents(){let{controller:e,torrents:t}=this,o=t.map(r=>r.getId());if(o&&o.length>0){let r=["id",...A.Fields.StatsExtra];n._needsExtraInfo(t)&&r.push(...A.Fields.InfoExtra),e.updateTorrents(o,r)}}_updateCurrentPage(){let{current_page:e,elements:t}=this;switch(e){case t.files.root:this._updateFiles();break;case t.info.root:this._updateInfo();break;case t.peers.root:this._updatePeers();break;case t.tiers.root:this._updateTiers();break;default:console.warn("unexpected page"),console.log(e)}}_updateInfo(){let e="None",t="Mixed",o="Unknown",r=y,s=Date.now(),{elements:a,torrents:l}=this,i=l.reduce((d,g)=>d+g.getSizeWhenDone(),0),c=null;if(l.length===0)c=e;else if(l.every(d=>d.isFinished()))c="Finished";else if(l.every(d=>d.isStopped()))c="Paused";else{let d=m=>m.getStateString(),g=d(l[0]);c=l.every(m=>d(m)===g)?g:t}b(a.info.state,c);let u=c;if(l.length===0)c=e;else{let d=l.reduce((B,f)=>B+f.getHaveValid(),0),g=l.reduce((B,f)=>B+f.getHaveUnchecked(),0),m=l.reduce((B,f)=>B+f.getLeftUntilDone(),0),I=100*(i?(i-m)/i:1);c=r.percentString(I,1),g?c=`${r.size(d)} of ${r.size(i)} (${c}%), ${r.size(g)} Unverified`:m?c=`${r.size(d)} of ${r.size(i)} (${c}%)`:c=`${r.size(d)} (100%)`}if(b(a.info.have,r.stringSanitizer(c)),l.length===0)c=e;else if(i===0)c=e;else{let d=l.reduce((g,m)=>m.getHave()+m.getDesiredAvailable(),0);c=`${r.percentString(100*d/i,1)}%`}if(b(a.info.availability,r.stringSanitizer(c)),l.length===0)c=e;else{let d=l.reduce((m,I)=>m+I.getDownloadedEver(),0),g=l.reduce((m,I)=>m+I.getFailedEver(),0);c=g?`${r.size(d)} (+${r.size(g)} discarded after failed checksum)`:r.size(d)}if(b(a.info.downloaded,r.stringSanitizer(c)),l.length===0)c=e;else{let d=l.reduce((m,I)=>m+I.getUploadedEver(),0),g=l.reduce((m,I)=>m+I.getSizeWhenDone(),0)||l.reduce((m,I)=>m+I.getHaveValid(),0);c=`${r.size(d)} (Ratio: ${r.ratioString(D.ratio(d,g))})`}if(b(a.info.uploaded,c),l.length===0)c=e;else if(l.every(d=>d.isStopped()))c=u;else{let d=m=>m.getStartDate(),g=d(l[0]);c=l.every(m=>d(m)===g)?r.timeInterval(s/1e3-g):t}if(b(a.info.running_time,c),l.length===0)c=e;else{let d=m=>m.getETA(),g=d(l[0]);l.every(m=>d(m)===g)?g<0?c=o:c=r.timeInterval(g):c=t}if(b(a.info.remaining_time,c),l.length===0)c=e;else{let d=l.reduce((m,I)=>Math.max(m,I.getLastActivity()),-1),g=Math.floor(s/1e3);if(0m.getErrorString(),g=d(l[0]);c=l.every(m=>d(m)===g)?g:t}if(b(a.info.error,c||e),l.length===1?c=l[0].getName():c=l.length>0?t:e,b(a.info.name,c),l.length===0)c=e;else{let d=l.reduce((g,m)=>g+m.getTotalSize(),0);if(d){let g=f=>f.getPieceSize(),m=l.reduce((f,C)=>f+C.getPieceCount(),0),I=r.number(m),B=g(l[0]);c=l.every(f=>g(f)===B)?`${r.size(d)} (${I} pieces @ ${r.mem(B)})`:`${r.size(d)} (${I} pieces)`}else c="None"}if(b(a.info.size,r.stringSanitizer(c)),l.length===0)c=e;else{let d=m=>m.getHashString(),g=d(l[0]);c=l.every(m=>d(m)===g)?g:t}if(b(a.info.hash,c),l.length===0)c=e;else{let d=m=>m.getPrivateFlag(),g=d(l[0]);l.every(m=>d(m)===g)?g?c="Private to this tracker -- DHT and PEX disabled":c="Public torrent":c=t}if(b(a.info.privacy,c),l.length===0)c=e;else{let d=m=>m.getComment(),g=d(l[0]);c=l.every(m=>d(m)===g)?g:t}if(c=c||e,c.startsWith("https://")||c.startsWith("http://")?(c=encodeURI(c),a.info.comment.innerHTML=`${c}`):b(a.info.comment,c),c=l.length===0?e:l[0].getLabels().join(", "),b(a.info.labels,c),l.length===0)c=e;else{let d=h=>h.getCreator(),g=d(l[0]),m=!l.every(h=>d(h)===g);d=h=>h.getDateCreated();let I=d(l[0]),B=!l.every(h=>d(h)===I),f=!g||g.length===0,C=!I;m||B?c=t:f&&C?c=o:C&&!f?c=`Created by ${g}`:f&&!C?c=`Created on ${new Date(I*1e3).toDateString()}`:c=`Created by ${g} on ${new Date(I*1e3).toDateString()}`}if(b(a.info.origin,c),l.length===0)c=e;else{let d=m=>m.getDownloadDir(),g=d(l[0]);c=l.every(m=>d(m)===g)?g:t}if(b(a.info.location,c),l.length===0)c=e;else{let d=m=>m.getDateAdded(),g=d(l[0]);c=l.every(m=>d(m)===g)?new Date(g*1e3).toLocaleString(navigator.language,{day:"2-digit",hour:"2-digit",hour12:!1,minute:"2-digit",month:"short",second:"2-digit",timeZoneName:"short",weekday:"short",year:"numeric"}):t}if(b(a.info.dateAdded,c),l.length===0)b(a.info.magnetLink,e);else if(l.length>1)b(a.info.magnetLink,t);else{let d=l[0].getMagnetLink();a.info.magnetLink.innerHTML=``}}static _peerStatusTitle(e){let t=Object.seal({"?":"We unchoked this peer, but they're not interested",D:"Downloading from this peer",E:"Encrypted Connection",H:"Peer was discovered through Distributed Hash Table (DHT)",I:"Peer is an incoming connection",K:"Peer has unchoked us, but we're not interested",O:"Optimistic unchoke",T:"Peer is connected via uTP",U:"Uploading to peer",X:"Peer was discovered through Peer Exchange (PEX)",d:"We would download from this peer if they'd let us",u:"We would upload to this peer if they'd ask"});return[...e].filter(o=>t[o]).map(o=>`${o}: ${t[o]}`).join(` +`)}_updatePeers(){let e=y,{elements:t,torrents:o}=this,{tbody:r}=t.peers,s=[(l,i)=>{i.dataset.encrypted=l.isEncrypted},(l,i)=>b(i,l.rateToPeer?e.speedBps(l.rateToPeer):""),(l,i)=>b(i,l.rateToClient?e.speedBps(l.rateToClient):""),(l,i)=>b(i,`${Math.floor(l.progress*100)}%`),(l,i)=>{b(i,l.flagStr),i.setAttribute("title",n._peerStatusTitle(l.flagStr))},(l,i)=>{b(i,l.address),i.setAttribute("title",l.address)},(l,i)=>{b(i,l.clientName),i.setAttribute("title",l.clientName)}],a=[];for(let l of o){let i=document.createElement("tr");i.classList.add("torrent-row");let c=document.createElement("td");c.setAttribute("colspan",s.length),b(c,l.getName()),i.append(c),a.push(i);for(let u of l.getPeers()){let d=document.createElement("tr");d.classList.add("peer-row");for(let[g,m]of s.entries()){let I=document.createElement("td");I.classList.add(ye[g]),m(u,I),d.append(I)}a.push(d)}for(;r.firstChild;)r.firstChild.remove();r.append(...a)}}static getAnnounceState(e){switch(e.announceState){case A._TrackerActive:return"Announce in progress";case A._TrackerWaiting:{let t=Math.max(0,e.nextAnnounceTime-Date.now()/1e3);return`Next announce in ${y.timeInterval(t)}`}case A._TrackerQueued:return"Announce is queued";case A._TrackerInactive:return e.isBackup?"Tracker will be used as a backup":"Announce not scheduled";default:return`unknown announce state: ${e.announceState}`}}static lastAnnounceStatus(e){let t="Last Announce",o=["N/A"];if(e.hasAnnounced){let r=y.timestamp(e.lastAnnounceTime);e.lastAnnounceSucceeded?o=[r," (got ",y.countString("peer","peers",e.lastAnnouncePeerCount),")"]:(t="Announce error",o=[e.lastAnnounceResult?`${e.lastAnnounceResult} - `:"",r])}return{label:t,value:o.join("")}}static lastScrapeStatus(e){let t="Last Scrape",o="N/A";if(e.hasScraped){let r=y.timestamp(e.lastScrapeTime);e.lastScrapeSucceeded?o=r:(t="Scrape error",o=(e.lastScrapeResult?`${e.lastScrapeResult} - `:"")+r)}return{label:t,value:o}}static _getOrigin(e){try{let t="udp://";if(e.announce.startsWith(t)){let r="http://",s=e.announce.replace(t,r);return new URL(s).origin.replace(r,t)}return new URL(e.announce).origin}catch{return[e.sitename||e.host||e.announce]}}_updateTiers(){let{list:t}=this.elements.tiers,{torrents:o}=this,r=[];for(let s of o){if(o.length>1){let a=document.createElement("div");a.classList.add("tier-list-torrent"),b(a,s.getName()),r.push(a)}for(let a of s.getTrackers()){let l=n.getAnnounceState(a),i=n.lastAnnounceStatus(a),c=n.lastScrapeStatus(a),u=document.createElement("div");u.classList.add("tier-list-row");let d=document.createElement("div"),g=n._getOrigin(a);d.classList.add("tier-list-tracker"),b(d,`${g} - tier ${a.tier+1}`),d.setAttribute("title",a.announce),u.append(d),d=document.createElement("div"),d.classList.add("tier-announce"),b(d,`${i.label}: ${i.value}`),u.append(d),d=document.createElement("div"),d.classList.add("tier-seeders"),b(d,`Seeders: ${a.seederCount>-1?a.seederCount:"N/A"}`),u.append(d),d=document.createElement("div"),d.classList.add("tier-state"),b(d,l),u.append(d),d=document.createElement("div"),d.classList.add("tier-leechers"),b(d,`Leechers: ${a.leecherCount>-1?a.leecherCount:"N/A"}`),u.append(d),d=document.createElement("div"),d.classList.add("tier-scrape"),b(d,`${c.label}: ${c.value}`),u.append(d),d=document.createElement("div"),d.classList.add("tier-downloads"),b(d,`Downloads: ${a.downloadCount>-1?a.downloadCount:"N/A"}`),u.append(d),r.push(u)}}for(;t.firstChild;)t.firstChild.remove();t.append(...r)}_changeFileCommand(e,t){let{controller:o,file_torrent:r}=this,s=r.getId();o.changeFileCommand(s,e,t)}_onFileWantedToggled(e){let{indices:t,wanted:o}=e;this._changeFileCommand(t,o?"files-wanted":"files-unwanted")}_onFilePriorityToggled(e){let{indices:t,priority:o}=e,r=null;switch(o.toString()){case"-1":r="priority-low";break;case"1":r="priority-high";break;default:r="priority-normal"}this._changeFileCommand(t,r)}_clearFileList(){let{list:e}=this.elements.files;for(;e.firstChild;)e.firstChild.remove();this.file_torrent=null,this.file_torrent_n=null,this.file_rows=null}static createFileTreeModel(e){let t=[],o={children:{},file_indices:[]};for(let[r,s]of e.getFiles().entries()){let{name:a}=s,l=a.split("/"),i=o;for(let[c,u]of l.entries()){let d=i.children[u];d||(i.children[u]=d={children:{},depth:c,file_indices:[],name:u,parent:i}),i=d}i.file_index=r,delete i.children,t.push(i)}for(let r of t){let{file_index:s}=r,a=r;do a.file_indices.push(s),a=a.parent;while(a)}return o}addNodeToView(e,t,o){let r=new oe(e,o.depth,o.name,o.file_indices);r.addEventListener("wantedToggled",this._onFileWantedToggled.bind(this)),r.addEventListener("priorityToggled",this._onFilePriorityToggled.bind(this)),this.file_rows.push(r),t.append(r.getElement())}addSubtreeToView(e,t,o){if(o.parent&&this.addNodeToView(e,t,o),o.children)for(let r of Object.values(o.children))this.addSubtreeToView(e,t,r)}_updateFiles(){let{list:e}=this.elements.files,{file_rows:t,file_torrent:o,file_torrent_n:r,torrents:s}=this;if(s.length!==1){this._clearFileList();return}let[a]=s,l=a.getFiles().length;if(a!==o||l!==r){this._clearFileList(),this.file_torrent=a,this.file_torrent_n=l,this.file_rows=[];let i=document.createDocumentFragment(),c=n.createFileTreeModel(a);this.addSubtreeToView(a,i,c),e.append(i)}else for(let i of t)i.refresh()}};var re=class n extends EventTarget{constructor(e,t){super(),this.controller=e,this.remote=t,this.elements={},this.torrents=[],this.show()}show(){let e=this.controller.getSelectedTorrents();e.length!==0&&(this.torrents=e,this.elements=n._create(),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.entry.value=e[0].getDownloadDir(),document.body.append(this.elements.root),this.elements.entry.focus())}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.controller,delete this.remote,delete this.elements,delete this.torrents}_onDismiss(){this.close()}_onConfirm(){let e=this.torrents.map(o=>o.getId()),t=this.elements.entry.value.trim();this.remote.moveTorrents(e,t),this.close()}static _create(){let e=F("move-dialog");e.root.setAttribute("aria-label","Move Torrent"),e.heading.textContent="Set Torrent Location",confirm.textContent="Apply";let t=document.createElement("label");t.setAttribute("for","torrent-path"),t.textContent="Location:",e.workarea.append(t);let o=document.createElement("input");return o.setAttribute("type","text"),o.id="torrent-path",e.entry=o,e.workarea.append(o),e}};var U=class n extends EventTarget{constructor(e){super(),this.elements=n._create(e),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.options=e,document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}static _create(e){let{heading:t,message:o}=e,r=F("confirm-dialog");return r.confirm.remove(),delete r.confirm,r.heading.textContent=t,r.workarea.textContent=o,r}};var De=/iPad|iPhone|iPod/.test(navigator.userAgent)&&!globalThis.MSStream,Ee=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),He=!(De&&Ee),S=class extends EventTarget{constructor(e,t,o="",r=null){super(),this.controller=e,this.remote=t,this.elements=this._create(o),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),document.body.append(this.elements.root),r&&(this.elements.file_input.files=r),this._updateFreeSpaceInAddDialog(),this.elements.url_input.focus()}close(){if(!this.closed){clearInterval(this.interval),this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_updateFreeSpaceInAddDialog(){let e=this.elements.folder_input.value;this.remote.getFreeSpace(e,(t,o)=>{this.closed||(this.elements.freespace.textContent=o>0?`${y.size(o)} Free`:"")})}_onConfirm(){let{controller:e,elements:t,remote:o}=this,{file_input:r,folder_input:s,start_input:a,url_input:l}=t,i=!a.checked,c=s.value.trim();for(let d of r.files){let g=new FileReader;g.addEventListener("load",m=>{let I=m.target.result,B="base64,",f=I.indexOf(B);if(f===-1)return;let C={arguments:{"download-dir":c,metainfo:I.slice(Math.max(0,f+B.length)),paused:i},method:"torrent-add"};o.sendRequest(C,h=>{h.result!=="success"&&(alert(`Error adding "${d.name}": ${h.result}`),e.setCurrentPopup(new U({heading:`Error adding "${d.name}"`,message:h.result})))})}),g.readAsDataURL(d)}let u=l.value.trim();if(u.length>0){/^[\da-f]{40}$/i.test(u)&&(u=`magnet:?xt=urn:btih:${u}`);let d={arguments:{"download-dir":c,filename:u,paused:i},method:"torrent-add"};o.sendRequest(d,g=>{g.result!=="success"&&e.setCurrentPopup(new U({heading:`Error adding "${u}"`,message:g.result}))})}this._onDismiss()}_create(e){let t=F(),{confirm:o,root:r,heading:s,workarea:a}=t;r.classList.add("open-torrent"),s.textContent="Add Torrents",o.textContent="Add";let l=v(),i=document.createElement("label");i.setAttribute("for",l),i.textContent="Please select torrent files to add:",a.append(i);let c=document.createElement("input");c.type="file",c.name="torrent-files[]",c.id=l,c.multiple=!0,He&&(c.accept=".torrent,application/x-bittorrent"),a.append(c),t.file_input=c,l=v(),i=document.createElement("label"),i.setAttribute("for",l),i.textContent="Or enter a URL:",a.append(i),c=document.createElement("input"),c.type="url",c.id=l,c.value=e,a.append(c),t.url_input=c,l=v(),i=document.createElement("label"),i.id="add-dialog-folder-label",i.for=l,i.textContent="Destination folder: ",a.append(i);let u=document.createElement("span");u.id="free-space-text",i.append(u),a.append(i),t.freespace=u,c=document.createElement("input"),c.type="text",c.id="add-dialog-folder-input",c.addEventListener("change",()=>this._updateFreeSpaceInAddDialog()),c.value=this.controller.session_properties["download-dir"],a.append(c),t.folder_input=c;let d=document.createElement("div");a.append(d);let g=document.createElement("input");return g.type="checkbox",g.id="auto-start-check",g.checked=this.controller.shouldAddedTorrentsStart(),d.append(g),t.start_input=g,i=document.createElement("label"),i.id="auto-start-label",i.setAttribute("for",g.id),i.textContent="Start when added",d.append(i),t}};var G={_DaemonVersion:"version",_DownSpeedLimit:"speed-limit-down",_DownSpeedLimited:"speed-limit-down-enabled",_QueueMoveBottom:"queue-move-bottom",_QueueMoveDown:"queue-move-down",_QueueMoveTop:"queue-move-top",_QueueMoveUp:"queue-move-up",_Root:"../rpc",_TurtleDownSpeedLimit:"alt-speed-down",_TurtleState:"alt-speed-enabled",_TurtleUpSpeedLimit:"alt-speed-up",_UpSpeedLimit:"speed-limit-up",_UpSpeedLimited:"speed-limit-up-enabled"},H=class n{_connection_alert=null;_session_id="";constructor(e){this._controller=e}sendRequest(e,t,o){let r=new Headers;r.append("cache-control","no-cache"),r.append("content-type","application/json"),r.append("pragma","no-cache"),this._session_id&&r.append(n._SessionHeader,this._session_id);let s=null;fetch(G._Root,{body:JSON.stringify(e),headers:r,method:"POST"}).then(a=>{if(s=a,a.status===409){let l=new Error(n._SessionHeader);throw l.header=a.headers.get(n._SessionHeader),l}return a.json()}).then(a=>{t&&t.call(o,a,s),this._connection_alert&&(this._connection_alert.close(),this._connection_alert=null)}).catch(a=>{if(a.message===n._SessionHeader){this._session_id=a.header,this.sendRequest(e,t,o);return}console.trace(a),this._controller.togglePeriodicSessionRefresh(!1),this._connection_alert=new U({heading:"Connection failed",message:"Could not connect to the server. You may need to reload the page to reconnect."}),this._controller.setCurrentPopup(this._connection_alert)})}loadDaemonPrefs(e,t){let o={method:"session-get"};this.sendRequest(o,e,t)}checkPort(e,t,o){let r={arguments:{ip_protocol:e},method:"port-test"};this.sendRequest(r,t,o)}renameTorrent(e,t,o,r,s){let a={arguments:{ids:e,name:o,path:t},method:"torrent-rename-path"};this.sendRequest(a,r,s)}setLabels(e,t,o){let r={ids:e,labels:t};this.sendRequest({arguments:r,method:"torrent-set"},o)}loadDaemonStats(e,t){let o={method:"session-stats"};this.sendRequest(o,e,t)}updateTorrents(e,t,o,r){let s={arguments:{fields:t,format:"table"},method:"torrent-get"};e&&(s.arguments.ids=e),this.sendRequest(s,a=>{let l=a.arguments;o.call(r,l.torrents,l.removed)})}getFreeSpace(e,t,o){let r={arguments:{path:e},method:"free-space"};this.sendRequest(r,s=>{let a=s.arguments;t.call(o,a.path,a["size-bytes"])})}changeFileCommand(e,t,o){let r={ids:[e]};r[o]=t,this.sendRequest({arguments:r,method:"torrent-set"},()=>{this._controller.refreshTorrents([e])})}sendTorrentSetRequests(e,t,o,r,s){o||(o={}),o.ids=t;let a={arguments:o,method:e};this.sendRequest(a,r,s)}sendTorrentActionRequests(e,t,o,r){this.sendTorrentSetRequests(e,t,null,o,r)}startTorrents(e,t,o,r){let s=t?"torrent-start-now":"torrent-start";this.sendTorrentActionRequests(s,e,o,r)}stopTorrents(e,t,o){this.sendTorrentActionRequests("torrent-stop",e,t,o)}moveTorrents(e,t,o,r){this.sendTorrentSetRequests("torrent-set-location",e,{location:t,move:!0},o,r)}removeTorrents(e,t){let o={arguments:{"delete-local-data":t,ids:[]},method:"torrent-remove"};if(e)for(let r=0,s=e.length;r{this._controller.refreshTorrents()})}verifyTorrents(e,t,o){this.sendTorrentActionRequests("torrent-verify",e,t,o)}reannounceTorrents(e,t,o){this.sendTorrentActionRequests("torrent-reannounce",e,t,o)}addTorrentByUrl(e,t){/^[\da-f]{40}$/i.test(e)&&(e=`magnet:?xt=urn:btih:${e}`);let o={arguments:{filename:e,paused:t.paused},method:"torrent-add"};this.sendRequest(o,()=>{this._controller.refreshTorrents()})}savePrefs(e){let t={arguments:e,method:"session-set"};this.sendRequest(t,()=>{this._controller.loadDaemonPrefs()})}updateBlocklist(){let e={method:"blocklist-update"};this.sendRequest(e,()=>{this._controller.loadDaemonPrefs()})}moveTorrentsToTop(e,t,o){this.sendTorrentActionRequests(G._QueueMoveTop,e,t,o)}moveTorrentsToBottom(e,t,o){this.sendTorrentActionRequests(G._QueueMoveBottom,e,t,o)}moveTorrentsUp(e,t,o){this.sendTorrentActionRequests(G._QueueMoveUp,e,t,o)}moveTorrentsDown(e,t,o){this.sendTorrentActionRequests(G._QueueMoveDown,e,t,o)}};H._SessionHeader="X-Transmission-Session-Id";function se(n,e){let t=document.createElement("fieldset");t.classList.add("section",n);let o=document.createElement("legend");return o.classList.add("title"),o.textContent=e,t.append(o),t}function Ge(n,e,t,o){let r=document.createElement("button");return r.textContent=e,r.addEventListener("click",o),n.append(r),r.dataset.action=t,r}var J=class extends EventTarget{constructor(e,t,o,r){super(),this.action_listener=this._onActionChange.bind(this),this.action_manager=r,this.action_manager.addEventListener("change",this.action_listener),this.prefs_listener=this._onPrefsChange.bind(this),this.prefs=t,this.prefs.addEventListener("change",this.prefs_listener),this.closed=!1,this.remote=o,this.name="overflow-menu",this.session_listener=this._onSessionChange.bind(this),this.session_manager=e,this.session_manager.addEventListener("session-change",this.session_listener);let{session_properties:s}=e;Object.assign(this,this._create(s)),this.outside=new Y(this.root),this.outside.addEventListener("click",()=>this.close()),Object.seal(this),this.show()}show(){document.body.append(this.root)}close(){if(!this.closed){this.outside.stop(),this.session_manager.removeEventListener("session-change",this.session_listener),this.action_manager.removeEventListener("change",this.action_listener),this.prefs.removeEventListener("change",this.prefs_listener),this.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))this[e]=null;this.closed=!0}}_onSessionChange(e){let{alt_speed_check:t}=this.elements,{session_properties:o}=e;t.checked=o[G._TurtleState]}_onPrefsChange(e){switch(e.key){case p.SortDirection:case p.SortMode:this.root.querySelector(`[data-pref="${e.key}"]`).value=e.value;break;default:break}}_onActionChange(e){let t=this.actions[e.action];t&&this._updateElement(t)}_updateElement(e){if(e.dataset.action){let{action:t}=e.dataset,o=this.action_manager.keyshortcuts(t);o&&e.setAttribute("aria-keyshortcuts",o),W(e,this.action_manager.isEnabled(t))}}_onClick(e){let{action:t,pref:o}=e.target.dataset;if(t){this.action_manager.click(t);return}if(o){this.prefs[o]=e.target.value;return}console.log("unhandled"),console.log(e),console.trace()}_create(e){let t={},o={},r=this._onClick.bind(this),s=document.createElement("div");s.classList.add("overflow-menu","popup");let a=document.createElement("div"),l=(C,h)=>{let x=document.createElement("input");x.id=v(),x.type="checkbox";let k=document.createElement("label");k.htmlFor=x.id,k.textContent=C,a.append(x,k),h(x)},i=se("display","Display");s.append(i);let c=document.createElement("div");c.id="display-options",i.append(c),a.classList.add("table-row"),c.append(a);let u=document.createElement("label");u.id="display-sort-mode-label",u.textContent="Sort by",a.append(u);let d=document.createElement("select");d.id="display-sort-mode-select",d.dataset.pref=p.SortMode,a.append(d);let g=[[p.SortByActivity,"Activity"],[p.SortByAge,"Age"],[p.SortByName,"Name"],[p.SortByProgress,"Progress"],[p.SortByQueue,"Queue order"],[p.SortByRatio,"Ratio"],[p.SortBySize,"Size"],[p.SortByState,"State"]];for(let[C,h]of g){let x=document.createElement("option");x.value=C,x.textContent=h,d.append(x)}u.htmlFor=d.id,d.value=this.prefs.sort_mode,d.addEventListener("change",C=>{this.prefs.sort_mode=C.target.value}),a=document.createElement("div"),a.classList.add("table-row"),c.append(a);let m=C=>{C.dataset.pref=p.SortDirection,C.checked=this.prefs.sort_direction!==p.SortAscending,C.addEventListener("input",h=>{this.prefs.sort_direction=h.target.checked?p.SortDescending:p.SortAscending})};l("Reverse sort",m),a=document.createElement("div"),a.classList.add("table-row"),c.append(a),m=C=>{C.checked=this.prefs.display_mode===p.DisplayCompact,C.addEventListener("change",h=>{let{checked:x}=h.target;this.prefs.display_mode=x?p.DisplayCompact:p.DisplayFull})},l(this.action_manager.text("toggle-compact-rows"),m),a=document.createElement("div"),a.classList.add("table-row"),c.append(a),m=C=>{C.checked=this.prefs.contrast_mode===p.ContrastMore,C.addEventListener("change",h=>{let{checked:x}=h.target;this.prefs.contrast_mode=x?p.ContrastMore:p.ContrastLess})},l(this.action_manager.text("toggle-contrast"),m),a=document.createElement("div"),a.classList.add("table-row","display-fullscreen-row"),c.append(a),m=C=>{let h=()=>document.fullscreenElement!==null;C.checked=h(),document.addEventListener("fullscreenchange",()=>{C.checked=h()}),C.addEventListener("change",()=>{h()?document.exitFullscreen():document.body.requestFullscreen()})},l("Fullscreen",m),i=se("speed","Speed Limit"),s.append(i),c=document.createElement("div"),c.id="speed-options",i.append(c),a=document.createElement("div"),a.classList.add("speed-up"),c.append(a),u=document.createElement("label"),u.id="speed-up-label",u.textContent="Upload:",a.append(u);let I="Unlimited";d=document.createElement("select"),d.id="speed-up-select",a.append(d);let B=["50","100","250","500","1000","2500","5000","10000",I];for(let C of[...new Set(B).add(`${e[G._UpSpeedLimit]}`).values()].toSorted((h,x)=>h-x)){let h=document.createElement("option");h.value=C,h.textContent=C===I?I:y.speed(C),d.append(h)}u.htmlFor=d.id,d.value=e[G._UpSpeedLimited]?`${e[G._UpSpeedLimit]}`:I,d.addEventListener("change",C=>{let{value:h}=C.target;console.log(C),h===I?this.remote.savePrefs({[G._UpSpeedLimited]:!1}):this.remote.savePrefs({[G._UpSpeedLimited]:!0,[G._UpSpeedLimit]:Number.parseInt(h,10)})}),a=document.createElement("div"),a.classList.add("speed-down"),c.append(a),u=document.createElement("label"),u.id="speed-down-label",u.textContent="Download:",a.append(u),d=document.createElement("select"),d.id="speed-down-select",a.append(d);for(let C of[...new Set(B).add(`${e[G._DownSpeedLimit]}`).values()].toSorted((h,x)=>h-x)){let h=document.createElement("option");h.value=C,h.textContent=C===I?I:y.speed(C),d.append(h)}u.htmlFor=d.id,d.value=e[G._DownSpeedLimited]?`${e[G._DownSpeedLimit]}`:I,d.addEventListener("change",C=>{let{value:h}=C.target;console.log(C),h===I?this.remote.savePrefs({[G._DownSpeedLimited]:!1}):this.remote.savePrefs({[G._DownSpeedLimited]:!0,[G._DownSpeedLimit]:Number.parseInt(h,10)})}),a=document.createElement("div"),a.classList.add("alt-speed"),c.append(a),m=C=>{C.checked=e[G._TurtleState],o.alt_speed_check=C,C.addEventListener("change",O=>{this.remote.savePrefs({[G._TurtleState]:O.target.checked})});let h=document.createElement("label");h.htmlFor=C.id,h.id="alt-speed-image";let x=document.createElement("label");x.htmlFor=C.id;let k=y.speed(e[G._TurtleUpSpeedLimit]),_=y.speed(e[G._TurtleDownSpeedLimit]);x.textContent=`(${k} up, ${_} down)`,a.append(h,x)},l("Use Temp limits",m),i=se("actions","Actions"),s.append(i);for(let C of["show-preferences-dialog","show-shortcuts-dialog","pause-all-torrents","start-all-torrents"]){let h=this.action_manager.text(C);t[C]=Ge(i,h,C,r)}i=se("help","Help"),s.append(i),c=document.createElement("div"),i.append(c);for(let C of["show-statistics-dialog","show-about-dialog"]){let h=this.action_manager.text(C);t[C]=Ge(c,h,C,r)}let f=document.createElement("a");return f.href="https://transmissionbt.com/donate.html",f.target="_blank",f.textContent="Donate",c.append(f),this._updateElement=this._updateElement.bind(this),{actions:t,elements:o,root:s}}};var ie=class n extends EventTarget{static _initTimeDropDown(e){for(let t=0;t<96;++t){let o=t/4,r=t%4*15,s=t*15,a=`${o}:${r||"00"}`;e.options[t]=new Option(a,s)}}static _initDayDropDown(e){let t=[["Everyday","127"],["Weekdays","62"],["Weekends","65"],["Sunday","1"],["Monday","2"],["Tuesday","4"],["Wednesday","8"],["Thursday","16"],["Friday","32"],["Saturday","64"]];for(let o=0;t[o];++o){let[r,s]=t[o];e.options[o]=new Option(r,s)}}_checkPort(){for(let[e,t]of Object.entries(this.elements.network.port_status_label))delete t.dataset.open,b(t,"Checking..."),this.remote.checkPort(e,o=>this._onPortChecked(e,o),this)}_onPortChecked(e,t){if(this.closed)return;let o=this.elements.network.port_status_label[e],r=t.arguments["port-is-open"]||!1;o.dataset.open=r,"port-is-open"in t.arguments?b(o,r?"Open":"Closed"):b(o,"Error")}_setBlocklistButtonEnabled(e){let t=this.elements.peers.blocklist_update_button;W(t,e),t.value=e?"Update":"Updating..."}static _getValue(e){if(e.tagName==="TEXTAREA")return e.value;switch(e.type){case"checkbox":case"radio":return e.checked;case"number":case"select-one":case"text":case"url":{let t=e.value;return Number.parseInt(t,10).toString()===t?Number.parseInt(t,10):Number.parseFloat(t).toString()===t?Number.parseFloat(t):t}default:return null}}_onMaybePortChanged(e){(e==="peer-port"||e==="port-forwarding-enabled")&&this._checkPort()}_onControlChanged(e){let{key:t}=e.target.dataset;this.remote.savePrefs({[t]:n._getValue(e.target)}),this._onMaybePortChanged(t)}_onDialogClosed(){this.dispatchEvent(new Event("closed"))}_update(){this._setBlocklistButtonEnabled(!0);for(let[e,t]of Object.entries(this.session_manager.session_properties))for(let o of this.elements.root.querySelectorAll(`[data-key="${e}"]`)){if(e==="blocklist-size"){let r=y.number(t);o.innerHTML=`Blocklist has ${r} rules`,b(this.elements.peers.blocklist_update_button,"Update")}else switch(o.type){case"checkbox":case"radio":o.checked=t;break;case"text":case"textarea":case"url":case"email":case"number":case"search":o!==document.activeElement&&(o.value!=t&&this._onMaybePortChanged(e),o.value=t);break;case"select-one":o.value=t;break;default:console.log(o.type);break}o.dispatchEvent(new Event("session-change"))}}shouldAddedTorrentsStart(){return this.data.elements.root.find("#start-added-torrents")[0].checked}static _createCheckAndLabel(e,t){let o=document.createElement("div");o.id=e;let r=document.createElement("input");r.id=v(),r.type="checkbox",o.append(r);let s=document.createElement("label");return s.textContent=t,s.setAttribute("for",r.id),o.append(s),{check:r,label:s,root:o}}static _enableIfChecked(e,t){let o=()=>{e.tagName==="INPUT"?W(e,t.checked):e.classList.toggle("disabled",!t.checked)};t.addEventListener("session-change",o),o()}static _getProtocolHandlerRegistered(){return localStorage.getItem("protocol-handler-registered")==="true"}static _updateProtocolHandlerButton(e){e.removeAttribute("disabled"),e.removeAttribute("title"),n._getProtocolHandlerRegistered()?(e.textContent="Remove Browser Handler","unregisterProtocolHandler"in navigator||e.setAttribute("title","Your browser does not support removing protocol handlers. This button only allows you to re-register a handler.")):(e.textContent="Add Browser Handler",e.removeAttribute("title"),"registerProtocolHandler"in navigator||(e.setAttribute("disabled",!0),e.setAttribute("title","Your browser does not support protocol handlers")))}static _toggleProtocolHandler(e){let t=new URL(globalThis.location.href);t.search="addtorrent=%s",this._getProtocolHandlerRegistered()?(navigator.unregisterProtocolHandler?.("magnet",t.toString()),localStorage.removeItem("protocol-handler-registered"),n._updateProtocolHandlerButton(e)):(navigator.registerProtocolHandler("magnet",t.toString(),"Transmission Web"),localStorage.setItem("protocol-handler-registered","true"),n._updateProtocolHandlerButton(e))}static _createTorrentsPage(){let e=document.createElement("div");e.classList.add("prefs-torrents-page");let t=document.createElement("div");t.textContent="Downloading",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Download to:",e.append(t);let o=document.createElement("input");o.type="text",o.id=v(),o.dataset.key="download-dir",t.setAttribute("for",o.id),e.append(o);let r=o,s=n._createCheckAndLabel("incomplete-dir-div","Use temporary folder:");s.check.title="Separate folder to temporarily store downloads until they are complete.",s.check.dataset.key="incomplete-dir-enabled",s.label.title=s.check.title,e.append(s.root);let a=s.check;o=document.createElement("input"),o.type="text",o.dataset.key="incomplete-dir",e.append(o),n._enableIfChecked(o,s.check);let l=o;s=n._createCheckAndLabel("autostart-div","Start when added"),s.check.dataset.key="start-added-torrents",e.append(s.root);let i=s.check;s=n._createCheckAndLabel("suffix-div",`Append "part" to incomplete files' names`),s.check.dataset.key="rename-partial-files",e.append(s.root);let c=s.check;s=n._createCheckAndLabel("download-queue-div","Download queue size:"),s.check.dataset.key="download-queue-enabled",e.append(s.root);let u=s.check;o=document.createElement("input"),o.type="number",o.dataset.key="download-queue-size",e.append(o),n._enableIfChecked(o,s.check);let d=o;t=document.createElement("div"),t.textContent="Seeding",t.classList.add("section-label"),e.append(t),s=n._createCheckAndLabel("stop-ratio-div","Stop seeding at ratio:"),s.check.dataset.key="seedRatioLimited",e.append(s.root);let g=s.check;o=document.createElement("input"),o.type="number",o.min="0.1",o.step="any",o.dataset.key="seedRatioLimit",e.append(o),n._enableIfChecked(o,s.check);let m=o;s=n._createCheckAndLabel("stop-idle-div","Stop seeding if idle for N mins:"),s.check.dataset.key="idle-seeding-limit-enabled",e.append(s.root);let I=s.check;o=document.createElement("input"),o.type="number",o.min="0.1",o.step="any",o.dataset.key="idle-seeding-limit",e.append(o),n._enableIfChecked(o,s.check);let B=o;t=document.createElement("div"),t.textContent="Magnet Protocol Handler",t.classList.add("section-label"),e.append(t);let f=document.createElement("button");return f.classList.add("register-handler-button"),n._updateProtocolHandlerButton(f),e.append(f),{autostart_check:i,download_dir:r,download_queue_check:u,download_queue_input:d,incomplete_dir_check:a,incomplete_dir_input:l,register_handler_button:f,root:e,stop_idle_check:I,stop_idle_input:B,stop_ratio_check:g,stop_ratio_input:m,suffix_check:c}}static _createSpeedPage(){let e=document.createElement("div");e.classList.add("prefs-speed-page");let t=document.createElement("div");t.textContent="Speed Limits",t.classList.add("section-label"),e.append(t);let o=n._createCheckAndLabel("upload-speed-div","Upload (kB/s):");o.check.dataset.key="speed-limit-up-enabled",e.append(o.root);let r=o.check,s=document.createElement("input");s.type="number",s.dataset.key="speed-limit-up",e.append(s),n._enableIfChecked(s,o.check);let a=s;o=n._createCheckAndLabel("download-speed-div","Download (kB/s):"),o.check.dataset.key="speed-limit-down-enabled",e.append(o.root);let l=o.check;s=document.createElement("input"),s.type="number",s.dataset.key="speed-limit-down",e.append(s),n._enableIfChecked(s,o.check);let i=s;t=document.createElement("div"),t.textContent="Alternative Speed Limits",t.classList.add("section-label","alt-speed-section-label"),e.append(t),t=document.createElement("div"),t.textContent="Override normal speed limits manually or at scheduled times",t.classList.add("alt-speed-label"),e.append(t),t=document.createElement("label"),t.textContent="Upload (kB/s):",e.append(t),s=document.createElement("input"),s.type="number",s.dataset.key="alt-speed-up",s.id=v(),t.setAttribute("for",s.id),e.append(s);let c=s;t=document.createElement("label"),t.textContent="Download (kB/s):",e.append(t),s=document.createElement("input"),s.type="number",s.dataset.key="alt-speed-down",s.id=v(),t.setAttribute("for",s.id),e.append(s);let u=s;o=n._createCheckAndLabel("alt-times-div","Scheduled times"),o.check.dataset.key="alt-speed-time-enabled",e.append(o.root);let d=o.check;t=document.createElement("label"),t.textContent="From:",n._enableIfChecked(t,o.check),e.append(t);let g=document.createElement("select");g.id=v(),g.dataset.key="alt-speed-time-begin",n._initTimeDropDown(g),t.setAttribute("for",g.id),e.append(g),n._enableIfChecked(g,o.check);let m=g;t=document.createElement("label"),t.textContent="To:",n._enableIfChecked(t,o.check),e.append(t),g=document.createElement("select"),g.id=v(),g.dataset.key="alt-speed-time-end",n._initTimeDropDown(g),t.setAttribute("for",g.id),e.append(g),n._enableIfChecked(g,o.check);let I=g;return t=document.createElement("label"),t.textContent="On days:",n._enableIfChecked(t,o.check),e.append(t),g=document.createElement("select"),g.id=v(),g.dataset.key="alt-speed-time-day",n._initDayDropDown(g),t.setAttribute("for",g.id),e.append(g),n._enableIfChecked(g,o.check),{alt_days_select:g,alt_download_speed_input:u,alt_from_select:m,alt_times_check:d,alt_to_select:I,alt_upload_speed_input:c,download_speed_check:l,download_speed_input:i,root:e,upload_speed_check:r,upload_speed_input:a}}static _createPeersPage(){let e=document.createElement("div");e.classList.add("prefs-peers-page");let t=document.createElement("div");t.textContent="Connections",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Max peers per torrent:",e.append(t);let o=document.createElement("input");o.type="number",o.dataset.key="peer-limit-per-torrent",o.id=v(),t.setAttribute("for",o.id),e.append(o);let r=o;t=document.createElement("label"),t.textContent="Max peers overall:",e.append(t),o=document.createElement("input"),o.type="number",o.dataset.key="peer-limit-global",o.id=v(),t.setAttribute("for",o.id),e.append(o);let s=o;t=document.createElement("div"),t.textContent="Options",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Encryption mode:",e.append(t);let a=document.createElement("select");a.id=v(),a.dataset.key="encryption",a.options[0]=new Option("Prefer encryption","preferred"),a.options[1]=new Option("Allow encryption","tolerated"),a.options[2]=new Option("Require encryption","required"),e.append(a);let l=a,i=n._createCheckAndLabel("use-pex-div","Use PEX to find more peers");i.check.title="PEX is a tool for exchanging peer lists with the peers you're connected to.",i.check.dataset.key="pex-enabled",i.label.title=i.check.title,e.append(i.root);let c=i.check;i=n._createCheckAndLabel("use-dht-div","Use DHT to find more peers"),i.check.title="DHT is a tool for finding peers without a tracker.",i.check.dataset.key="dht-enabled",i.label.title=i.check.title,e.append(i.root);let u=i.check;i=n._createCheckAndLabel("use-lpd-div","Use LPD to find more peers"),i.check.title="LPD is a tool for finding peers on your local network.",i.check.dataset.key="lpd-enabled",i.label.title=i.check.title,e.append(i.root);let d=i.check;t=document.createElement("div"),t.textContent="Blocklist",t.classList.add("section-label"),e.append(t),i=n._createCheckAndLabel("blocklist-enabled-div","Enable blocklist:"),i.check.dataset.key="blocklist-enabled",e.append(i.root);let g=i.check;o=document.createElement("input"),o.type="url",o.value="http://www.example.com/blocklist",o.dataset.key="blocklist-url",e.append(o),n._enableIfChecked(o,i.check);let m=o;t=document.createElement("label"),t.textContent="Blocklist has {n} rules",t.dataset.key="blocklist-size",t.classList.add("blocklist-size-label"),n._enableIfChecked(t,i.check),e.append(t);let I=document.createElement("button");return I.classList.add("blocklist-update-button"),I.textContent="Update",e.append(I),n._enableIfChecked(I,i.check),{blocklist_enabled_check:g,blocklist_update_button:I,blocklist_url_input:m,dht_check:u,encryption_select:l,lpd_check:d,max_peers_overall_input:s,max_peers_per_torrent_input:r,pex_check:c,root:e}}static _createNetworkPage(){let e=document.createElement("div");e.classList.add("prefs-network-page");let t=document.createElement("div");t.textContent="Listening Port",t.classList.add("section-label"),e.append(t),t=document.createElement("label"),t.textContent="Peer listening port:",e.append(t);let o=document.createElement("input");o.type="number",o.dataset.key="peer-port",o.id=v(),t.setAttribute("for",o.id),e.append(o);let r=o,s=document.createElement("div");s.classList.add("port-status"),t=document.createElement("label"),t.textContent="IPv4 port is",s.append(t);let a=document.createElement("label");a.textContent="?",a.classList.add("port-status-label"),s.append(a),s.append(document.createElement("br")),t=document.createElement("label"),t.textContent="IPv6 port is",s.append(t);let l=document.createElement("label");l.textContent="?",l.classList.add("port-status-label"),s.append(l),e.append(s);let i=n._createCheckAndLabel("randomize-port","Randomize port on launch");i.check.dataset.key="peer-port-random-on-start",e.append(i.root);let c=i.check;i=n._createCheckAndLabel("port-forwarding","Use port forwarding from my router"),i.check.dataset.key="port-forwarding-enabled",e.append(i.root);let u=i.check;t=document.createElement("div"),t.textContent="Options",t.classList.add("section-label"),e.append(t),i=n._createCheckAndLabel("utp-enabled","Enable uTP for peer communication"),i.check.dataset.key="utp-enabled",e.append(i.root);let d=i.check;t=document.createElement("div"),t.textContent="Default Public Trackers",t.classList.add("section-label"),e.append(t);let g=["Trackers to use on all public torrents.","To add a backup URL, add it on the next line after a primary URL.","To add a new primary URL, add it after a blank line."];for(let B of g)t=document.createElement("label"),t.classList.add("default-trackers-label"),t.textContent=B,t.setAttribute("for","default-trackers"),e.append(t);let m=document.createElement("textarea");return m.dataset.key="default-trackers",m.id="default-trackers",e.append(m),{default_trackers_textarea:m,port_forwarding_check:u,port_input:r,port_status_label:{ipv4:a,ipv6:l},random_port_check:c,root:e,utp_check:d}}static _create(){let e={network:n._createNetworkPage(),peers:n._createPeersPage(),speed:n._createSpeedPage(),torrents:n._createTorrentsPage()};return{...M("prefs-dialog",[["prefs-tab-torrent",e.torrents.root,"Torrents"],["prefs-tab-speed",e.speed.root,"Speed"],["prefs-tab-peers",e.peers.root,"Peers"],["prefs-tab-network",e.network.root,"Network"]]),...e}}constructor(e,t){super(),this.closed=!1,this.session_manager=e,this.remote=t,this.update_from_session=()=>this._update(),this.elements=n._create(),this.elements.peers.blocklist_update_button.addEventListener("click",s=>{b(s.target,"Updating blocklist..."),this.remote.updateBlocklist(),this._setBlocklistButtonEnabled(!1)}),this.elements.torrents.register_handler_button.addEventListener("click",s=>{n._toggleProtocolHandler(s.currentTarget)}),this.elements.dismiss.addEventListener("click",()=>this.close()),this.outside=new Y(this.elements.root),this.outside.addEventListener("click",()=>this.close()),Object.seal(this);let o=this._onControlChanged.bind(this),r=s=>{for(let a of Object.values(s))if(a.tagName==="INPUT")switch(a.type){case"checkbox":case"radio":case"number":case"text":case"url":a.addEventListener("change",o);break;default:console.trace(`unhandled input: ${a.type}`);break}else(a.tagName==="TEXTAREA"||a.tagName==="SELECT")&&a.addEventListener("change",o)};r(this.elements.network),r(this.elements.peers),r(this.elements.speed),r(this.elements.torrents),this.session_manager.addEventListener("session-change",this.update_from_session),this.update_from_session(),document.body.append(this.elements.root)}close(){if(!this.closed){this.outside.stop(),this.session_manager.removeEventListener("session-change",this.update_from_session),this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))this[e]=null;this.closed=!0}}};var ne=class n extends EventTarget{constructor(e){super(),this.options=e,this.options.trash=!1,this.elements=n._create(e),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_onConfirm(){let{remote:e,torrents:t,trash:o}=this.options;t.length>0&&e.removeTorrents(t,o),this.close()}static _create(e){let{torrents:t}=e,o=F("remove-dialog"),{confirm:r,heading:s,message:a,workarea:l}=o;s.textContent=t.length===1?`Remove ${t[0].getName()}?`:`Remove ${t.length} transfers?`;let i=document.createElement("input");i.id="delete-local-data-check",i.type="checkbox",i.checked=!1,a.append(i);let c=document.createElement("label");c.id="delete-local-data-label",c.setAttribute("for",i.id),c.textContent="Delete downloaded data",a.append(c);let u=document.createElement("div"),d=g=>{g&&t.length===1?u.textContent="All data downloaded for this torrent will be deleted. Are you sure you want to remove it?":g?u.textContent="All data downloaded for these torrents will be deleted. Are you sure you want to remove them?":t.length===1?u.textContent="Once removed, continuing the transfer will require the torrent file. Are you sure you want to remove it?":u.textContent="Once removed, continuing the transfers will require the torrent files. Are you sure you want to remove them?",r.textContent=g?"Delete":"Remove"};return d(i.checked),i.addEventListener("click",()=>{e.trash=i.checked,d(i.checked)}),l.append(u),o}};var ae=class n extends EventTarget{constructor(e,t){super(),this.controller=e,this.remote=t,this.elements={},this.torrents=[],this.show()}show(){let e=this.controller.getSelectedTorrents();if(e.length!==1){console.trace();return}this.torrents=e,this.elements=n._create(),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),this.elements.entry.value=e[0].getName(),document.body.append(this.elements.root),this.elements.entry.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.remote,delete this.elements,delete this.torrents}_onDismiss(){this.close()}_onConfirm(){let[e]=this.torrents,t=e.getName(),o=this.elements.entry.value;this.remote.renameTorrent([e.getId()],t,o,r=>{if(r.result==="success")e.refresh(r.arguments);else if(r.result==="Invalid argument"){let s=new U({heading:`Error renaming "${t}"`,message:"Could not rename a torrent or file name. The path to file may have changed/not reflected correctly or the argument is invalid."});this.controller.setCurrentPopup(s)}delete this.controller}),this.close()}static _create(){let e=F("rename-dialog");e.root.setAttribute("aria-label","Rename Torrent"),e.heading.textContent="Enter new name:",e.confirm.textContent="Rename";let t=document.createElement("label");t.setAttribute("for","torrent-rename-name"),t.textContent="Enter new name:",e.workarea.append(t);let o=document.createElement("input");return o.setAttribute("type","text"),o.id="torrent-rename-name",e.entry=o,e.workarea.append(o),e}};var ce=class n extends EventTarget{constructor(e,t){super(),this.controller=e,this.remote=t,this.elements={},this.torrents=[],this.show()}show(){let e=this.controller.getSelectedTorrents();if(e.length===0){console.error("At least one selected torrent expected.");return}let[t]=e;this.torrents=e,this.elements=n._create(),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),this.elements.confirm.addEventListener("click",()=>this._onConfirm()),this.elements.entry.value=t.getLabels().join(", "),document.body.append(this.elements.root),this.elements.entry.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements,delete this.torrents}_onDismiss(){this.close()}_onConfirm(){let{torrents:e}=this,{remote:t}=this,o=e.map(i=>i.getId()),{elements:r}=this,{entry:s}=r,{value:a}=s,l=a.split(",").map(i=>i.trim()).filter(i=>i.length>0);t.setLabels(o,l,i=>{if(i.result==="success")for(let c of e)c.refresh({labels:l})}),this.close()}static _create(){let e=F("labels-dialog");e.root.setAttribute("aria-label","Edit Labels"),e.heading.textContent="Edit Labels:",e.confirm.textContent="Save";let t=document.createElement("label");t.setAttribute("for","torrent-labels"),t.textContent="Labels:",e.workarea.append(t);let o=document.createElement("input");return o.setAttribute("type","text"),o.id="torrent-labels",e.entry=o,e.workarea.append(o),e}};var le=class n extends EventTarget{constructor(e){super(),this.elements=n._create(e),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){this.elements.root.remove(),this.dispatchEvent(new Event("close")),delete this.elements}_onDismiss(){this.close()}static _create(e){let t=F("shortcuts-dialog");t.root.setAttribute("aria-label","Keyboard Shortcuts");let o=document.createElement("table"),r=document.createElement("thead");o.append(r);let s=document.createElement("tr");r.append(s);let a=document.createElement("th");a.textContent="Key",s.append(a),a=document.createElement("th"),a.textContent="Action",s.append(a);let l=document.createElement("tbody");o.append(l);let i={};for(let[c,u]of e.allShortcuts().entries()){let d=c.split("+"),g=[d.pop(),...d].join("+");i[g]={name:u,shortcut:c}}for(let[,c]of Object.entries(i).toSorted()){let{name:u,shortcut:d}=c;s=document.createElement("tr"),l.append(s);let g=document.createElement("td");g.textContent=d.replaceAll("+"," + "),s.append(g),g=document.createElement("td"),g.textContent=e.text(u),s.append(g)}return t.heading.textContent="Transmission",t.dismiss.textContent="Close",t.heading.textContent="Keyboard shortcuts",t.message.append(o),t.confirm.remove(),delete t.confirm,t}};var de=class n extends EventTarget{constructor(e){super(),this.remote=e;let t=()=>this.remote.loadDaemonStats(r=>this._update(r.arguments)),o=5e3;this.interval=setInterval(t,o),t(),this.elements=n._create(),this.elements.dismiss.addEventListener("click",()=>this._onDismiss()),document.body.append(this.elements.root),this.elements.dismiss.focus()}close(){if(!this.closed){clearInterval(this.interval),this.elements.root.remove(),this.dispatchEvent(new Event("close"));for(let e of Object.keys(this))delete this[e];this.closed=!0}}_onDismiss(){this.close()}_update(e){console.log(e);let t=y,o=e["current-stats"],r=D.ratio(o.uploadedBytes,o.downloadedBytes);b(this.elements.session.up,t.size(o.uploadedBytes)),b(this.elements.session.down,t.size(o.downloadedBytes)),this.elements.session.ratio.innerHTML=t.ratioString(r),b(this.elements.session.time,t.timeInterval(o.secondsActive)),o=e["cumulative-stats"],r=D.ratio(o.uploadedBytes,o.downloadedBytes),b(this.elements.total.up,t.size(o.uploadedBytes)),b(this.elements.total.down,t.size(o.downloadedBytes)),this.elements.total.ratio.innerHTML=t.ratioString(r),b(this.elements.total.time,t.timeInterval(o.secondsActive))}static _create(){let e=F("statistics-dialog"),{confirm:t,dismiss:o,heading:r,root:s,workarea:a}=e;t.remove(),o.textContent="Close",delete e.confirm;let l="Statistics";s.setAttribute("aria-label",l),r.textContent=l;let i=["Uploaded:","Downloaded:","Ratio:","Running time:"],c=be("Current session",i),[u,d,g,m]=c.children,I=e.session={};I.up=u,I.down=d,I.ratio=g,I.time=m,a.append(c.root),c=be("Total",i);let[B,f,C,h]=c.children,x=e.total={};return x.up=B,x.down=f,x.ratio=C,x.time=h,a.append(c.root),e}};var X={formatETA:n=>{let e=n.getETA();return e<0||e>=999*60*60?"":`ETA: ${y.timeInterval(e,1)}`},formatLabels:(n,e)=>{let t=n.getLabels();e.innerHTML="";for(let o of t){let r=document.createElement("span");r.classList.add("torrent-label"),r.textContent=o,e.append(r)}},getProgressInfo:(n,e)=>{let t=e.getStatus(),o=["torrent-progress-bar"],r=100,s=null;if(t===A._StatusStopped&&o.push("paused"),e.needsMetaData())o.push("magnet"),r=e.getMetadataPercentComplete()*100;else if(t===A._StatusCheck)o.push("verify"),r=e.getRecheckProgress()*100;else if(e.getLeftUntilDone()>0)o.push("leech"),r=e.getPercentDone()*100;else if(o.push("seed"),t!==A._StatusStopped){let a=e.seedRatioLimit(n);s=a>0?e.getUploadRatio()*100/a:100}return e.isQueued()&&o.push("queued"),{classList:o,percent:r,ratio:s}},renderProgressbar:(n,e,t)=>{let o=X.getProgressInfo(n,e),r=Math.min(o.ratio||o.percent,100),s=`${y.percentString(r,2)}%`;t.className=o.classList.join(" "),t.style.setProperty("--progress",s),t.dataset.progress=o.ratio?"100%":s},symbol:{down:"\u25BC",up:"\u25B2"},updateIcon:(n,e)=>{n.dataset.iconMimeType=e.getPrimaryMimeType().split("/",1).pop(),n.dataset.iconMultifile=e.getFileCount()>1?"true":"false"}},ge=class n{static renderPeerDetails(e,t){let o=y,r=e.getError()!==A._ErrNone;t.classList.toggle("error",r);let s=e.getErrorMessage();if(s)b(t,s);else if(e.isDownloading()){let a=e.getPeersConnected(),l=e.getWebseedsSendingToUs(),i=["Downloading from"];a&&(i.push(e.getPeersSendingToUs(),"of",o.countString("peer","peers",a)),l&&i.push("and")),l&&i.push(o.countString("web seed","web seeds",l)),i.push("-",X.symbol.down,o.speedBps(e.getDownloadSpeed()),X.symbol.up,o.speedBps(e.getUploadSpeed())),b(t,i.join(" "))}else if(e.isSeeding()){let a=["Seeding to",e.getPeersGettingFromUs(),"of",o.countString("peer","peers",e.getPeersConnected()),"-",X.symbol.up,o.speedBps(e.getUploadSpeed())].join(" ");b(t,a)}else if(e.isChecking()){let a=["Verifying local data (",o.percentString(100*e.getRecheckProgress(),1),"% tested)"].join("");b(t,a)}else b(t,e.getStateString())}static renderProgressDetails(e,t,o){let r=y;if(t.needsMetaData()){let c="retrieving";t.isStopped()&&(c="needs");let u=100*t.getMetadataPercentComplete(),d=["Magnetized transfer - ",c," metadata (",r.percentString(u,1),"%)"].join("");b(o,d);return}let s=t.getSizeWhenDone(),a=t.getTotalSize(),l=t.isDone()||t.isSeeding(),i=[];if(l?(a===s?i.push(r.size(a)):i.push(r.size(s)," of ",r.size(t.getTotalSize())," (",t.getPercentDoneStr(),"%)"),i.push(", uploaded ",r.size(t.getUploadedEver())," (Ratio: ",r.ratioString(t.getUploadRatio()),")")):i.push(r.size(s-t.getLeftUntilDone())," of ",r.size(s)," (",t.getPercentDoneStr(),"%)"),!t.isStopped()&&(!l||t.seedRatioLimit(e)>0)){i.push(" - ");let c=t.getETA();c<0||c>=999*60*60?i.push("remaining time unknown"):i.push(r.timeInterval(t.getETA(),1)," remaining")}b(o,i.join(""))}render(e,t,o){let r=t.isStopped();o.classList.toggle("paused",r);let{labels:s,name:a,peer_details:l,progressbar:i,progress_details:c}=o;b(a,t.getName()),X.formatLabels(t,s),n.renderProgressDetails(e,t,c),X.renderProgressbar(e,t,i),n.renderPeerDetails(t,l)}createRow(e){let t=document.createElement("li");t.className="torrent";let o=[["icon","icon"],["name","torrent-name"],["labels","torrent-labels"],["progress_details","torrent-progress-details"],["progressbar","torrent-progress-bar"],["peer_details","torrent-peer-details"]];for(let[r,s]of o){let a=document.createElement("div");a.className=s,t.append(a),t[r]=a}return X.updateIcon(t.icon,e),t}},pe=class n{static renderPeerDetails(e,t){let o=y,r=e.getError()!==A._ErrNone;t.classList.toggle("error",r);let s=e.getErrorMessage();if(s)b(t,s);else if(e.isDownloading()){let a=e.getDownloadSpeed()>0,l=e.getUploadSpeed()>0;if(!l&&!a)b(t,"Idle");else{let i=[X.formatETA(e)];a&&i.push(X.symbol.down,o.speedBps(e.getDownloadSpeed())),l&&i.push(X.symbol.up,o.speedBps(e.getUploadSpeed())),b(t,i.join(" "))}}else if(e.isSeeding()){let a=["Ratio:",o.ratioString(e.getUploadRatio()),"-",X.symbol.up,o.speedBps(e.getUploadSpeed())].join(" ");b(t,a)}else b(t,e.getStateString())}render(e,t,o){o.classList.toggle("paused",t.isStopped());let{labels:r,name:s,peer_details:a,progressbar:l}=o;b(s,t.getName()),X.formatLabels(t,r),n.renderPeerDetails(t,a),X.renderProgressbar(e,t,l),l.classList.add("compact")}createRow(e){let t=document.createElement("li");t.className="torrent compact";let o=[["icon","icon"],["name","torrent-name compact"],["labels","torrent-labels compact"],["peer_details","torrent-peer-details compact"],["progressbar","torrent-progress-bar compact"]];for(let[r,s]of o){let a=document.createElement("div");a.className=s,t.append(a),t[r]=a}return X.updateIcon(t.icon,e),t}},ue=class{constructor(e,t,o){this._view=e,this._torrent=o,this._element=e.createRow(o);let r=()=>this.render(t);this._torrent.addEventListener("dataChanged",r),r()}getElement(){return this._element}render(e){let t=this.getTorrent();t&&this._view.render(e,t,this.getElement())}isSelected(){return this.getElement().classList.contains("selected")}getTorrent(){return this._torrent}getTorrentId(){return this.getTorrent().getId()}};var me=class n extends EventTarget{constructor(e,t,o){super(),this.action_manager=e,this.notifications=t,this.prefs=o,this.remote=new H(this),this.speed={down:document.querySelector("#speed-down"),up:document.querySelector("#speed-up")};for(let[i,c]of[["#toolbar-open","open"],["#toolbar-delete","delete"],["#toolbar-start","start"],["#toolbar-pause","pause"],["#toolbar-inspector","inspector"],["#toolbar-overflow","overflow"]]){let u=document.querySelector(i);for(;u.firstChild;)u.lastChild.remove();u.append(P[c]())}document.querySelector(".speed-container").append(P.speedDown()),document.querySelector(".speed-container + .speed-container").append(P.speedUp()),this.addEventListener("torrent-selection-changed",i=>this.action_manager.update(i)),this.filterText="",this._torrents={},this._rows=[],this.oldTrackers=[],this.dirtyTorrents=new Set,this.changeStatus=!1,this.refilterSoon=R(()=>this._refilter(!1)),this.refilterAllSoon=R(()=>this._refilter(!0)),this.pointer_device=Object.seal({is_touch_device:"ontouchstart"in globalThis,long_press_callback:null,x:0,y:0}),this.popup=Array.from({length:n.max_popups}).fill(null),this.busytyping=!1;for(let i of document.querySelectorAll("button[data-action]")){let{action:c}=i.dataset;W(i,this.action_manager.isEnabled(c)),i.addEventListener("click",()=>{this.action_manager.click(c)})}document.querySelector("#filter-tracker").addEventListener("change",i=>{this.setFilterTracker(i.target.value)}),this.action_manager.addEventListener("change",i=>{for(let c of document.querySelectorAll(`[data-action="${i.action}"]`))W(c,i.enabled)}),this.action_manager.addEventListener("click",i=>{switch(i.action){case"deselect-all":this._deselectAll();break;case"move-bottom":this._moveBottom();break;case"move-down":this._moveDown();break;case"move-top":this._moveTop();break;case"move-up":this._moveUp();break;case"open-torrent":this.setCurrentPopup(new S(this,this.remote));break;case"pause-all-torrents":this._stopTorrents(this._getAllTorrents());break;case"pause-selected-torrents":this._stopTorrents(this.getSelectedTorrents());break;case"reannounce-selected-torrents":this._reannounceTorrents(this.getSelectedTorrents());break;case"remove-selected-torrents":this._removeSelectedTorrents();break;case"resume-selected-torrents":this._startSelectedTorrents(!1);break;case"resume-selected-torrents-now":this._startSelectedTorrents(!0);break;case"select-all":this._selectAll();break;case"show-about-dialog":this.setCurrentPopup(new ee(this.version_info));break;case"show-inspector":this.popup[0]instanceof E?this.popup[0].close():this.setCurrentPopup(new E(this),0);break;case"show-move-dialog":this.setCurrentPopup(new re(this,this.remote));break;case"show-overflow-menu":this.popup[n.default_popup_level]instanceof J?this.popup[n.default_popup_level].close():this.setCurrentPopup(new J(this,this.prefs,this.remote,this.action_manager));break;case"show-preferences-dialog":this.setCurrentPopup(new ie(this,this.remote),0);break;case"show-shortcuts-dialog":this.setCurrentPopup(new le(this.action_manager));break;case"show-statistics-dialog":this.setCurrentPopup(new de(this.remote));break;case"show-rename-dialog":this.setCurrentPopup(new ae(this,this.remote));break;case"show-labels-dialog":this.setCurrentPopup(new ce(this,this.remote));break;case"start-all-torrents":this._startTorrents(this._getAllTorrents());break;case"toggle-compact-rows":this.prefs.display_mode=this.prefs.display_mode===p.DisplayCompact?p.DisplayFull:p.DisplayCompact;break;case"verify-selected-torrents":this._verifyTorrents(this.getSelectedTorrents());break;default:console.warn(`unhandled action: ${i.action}`)}});let r=document.querySelector("#filter-mode");N(r,null,[["All",p.FilterAll]]),N(r,"status",[["Active",p.FilterActive],["Downloading",p.FilterDownloading],["Seeding",p.FilterSeeding],["Paused",p.FilterPaused],["Finished",p.FilterFinished],["Error",p.FilterError]]),N(r,"list",[["Private torrents",p.FilterPrivate],["Public torrents",p.FilterPublic]]),r.value=this.prefs.filter_mode,r.addEventListener("change",i=>{this.prefs.filter_mode=i.target.value,this.refilterAllSoon()}),r=document.querySelector("#filter-tracker"),N(r,null,[["All",p.FilterAll]]);let s=document.querySelector("#torrent-search");r=document.querySelector("#reset"),r.addEventListener("click",()=>{s.value="",this._setFilterText(s.value),this.refilterAllSoon()}),s.value.trim()&&(this.filterText=s.value,r.style.display="block",this.refilterAllSoon()),document.addEventListener("keydown",this._keyDown.bind(this)),document.addEventListener("keyup",this._keyUp.bind(this)),r=document.querySelector("#torrent-container"),r.addEventListener("click",i=>{this.popup[n.default_popup_level]&&this.setCurrentPopup(null),i.target===i.currentTarget&&this._deselectAll()}),r.addEventListener("dblclick",()=>{(!this.popup[0]||this.popup[0].name!=="inspector")&&this.action_manager.click("show-inspector")}),r.addEventListener("dragenter",n._dragenter),r.addEventListener("dragover",n._dragenter),r.addEventListener("drop",this._drop.bind(this)),this._setupSearchBox(),this.elements={torrent_list:document.querySelector("#torrent-list")};let a=()=>{let i=new te(this.action_manager);this.setCurrentPopup(i);let u=document.querySelector("#torrent-container").getBoundingClientRect(),d=Math.min(this.pointer_device.x,u.right+globalThis.scrollX-i.root.clientWidth),g=Math.min(this.pointer_device.y,u.bottom+globalThis.scrollY-i.root.clientHeight);i.root.style.left=`${Math.max(d,0)}px`,i.root.style.top=`${Math.max(g,0)}px`},l=i=>{if(this.pointer_device.is_touch_device&&i.touches.length>1)return;let c=i.target;for(;c&&!c.classList.contains("torrent");)c=c.parentNode;let u=this._rows.find(d=>d.getElement()===c);u&&!u.isSelected()&&this._setSelectedRow(u),a(),i.preventDefault()};if(this.pointer_device.is_touch_device){let i=this.pointer_device;this.elements.torrent_list.addEventListener("touchstart",c=>{i.x=c.touches[0].pageX,i.y=c.touches[0].pageY,i.long_press_callback?(clearTimeout(i.long_press_callback),i.long_press_callback=null):i.long_press_callback=setTimeout(l.bind(this),500,c)}),this.elements.torrent_list.addEventListener("touchend",()=>{clearTimeout(i.long_press_callback),i.long_press_callback=null,setTimeout(()=>{let c=this.popup[n.default_popup_level];c&&(c.root.style.pointerEvents="auto")},1)}),this.elements.torrent_list.addEventListener("touchmove",c=>{i.x=c.touches[0].pageX,i.y=c.touches[0].pageY,clearTimeout(i.long_press_callback),i.long_press_callback=null}),this.elements.torrent_list.addEventListener("contextmenu",c=>{c.preventDefault()})}else this.elements.torrent_list.addEventListener("mousemove",i=>{this.pointer_device.x=i.pageX,this.pointer_device.y=i.pageY}),this.elements.torrent_list.addEventListener("contextmenu",i=>{l(i);let c=this.popup[n.default_popup_level];c&&(c.root.style.pointerEvents="auto")});this.loadDaemonPrefs(),this._initializeTorrents(),this.refreshTorrents(),this.togglePeriodicSessionRefresh(!0),this.prefs.addEventListener("change",({key:i,value:c})=>this._onPrefChanged(i,c));for(let[i,c]of this.prefs.entries())this._onPrefChanged(i,c)}_openTorrentFromUrl(){setTimeout(()=>{let e=new URLSearchParams(globalThis.location.search).get("addtorrent");if(e){this.setCurrentPopup(new S(this,this.remote,e));let t=new URL(globalThis.location);t.search="",globalThis.history.pushState("","",t.toString())}},0)}loadDaemonPrefs(){this.remote.loadDaemonPrefs(e=>{this.session_properties=e.arguments,this._openTorrentFromUrl()})}get session_properties(){return this._session_properties}set session_properties(e){if(K(this._session_properties,e))return;this._session_properties=Object.seal(e);let t=new Event("session-change");t.session_properties=e,this.dispatchEvent(t),this._updateGuiFromSession(e)}_setupSearchBox(){let e=document.querySelector("#torrent-search"),t="blur";e.classList.add(t),e.addEventListener("blur",()=>e.classList.add(t)),e.addEventListener("focus",()=>e.classList.remove(t)),e.addEventListener("input",()=>{e.value.trim()!==this.filterText&&this._setFilterText(e.value)})}_onPrefChanged(e,t){switch(e){case p.DisplayMode:{this.torrentRenderer=t==="compact"?new pe:new ge,this.refilterAllSoon();break}case p.ContrastMode:{document.body.classList.remove("contrast-more","contrast-less"),document.body.classList.add(`contrast-${t}`);break}case p.FilterMode:case p.SortDirection:case p.SortMode:this.refilterAllSoon();break;case p.RefreshRate:{clearInterval(this.refreshTorrentsInterval);let o=this.refreshTorrents.bind(this),r=this.prefs.refresh_rate_sec,s=r>0?r*1e3:1e3;this.refreshTorrentsInterval=setInterval(o,s);break}default:break}}static get max_popups(){return 2}static get default_popup_level(){return n.max_popups-1}_getAllTorrents(){return Object.values(this._torrents)}static _getTorrentIds(e){return e.map(t=>t.getId())}seedRatioLimit(){let e=this.session_properties;return e&&e.seedRatioLimited?e.seedRatioLimit:-1}_getSelectedRows(){return this._rows.filter(e=>e.isSelected())}getSelectedTorrents(){return this._getSelectedRows().map(e=>e.getTorrent())}_getSelectedTorrentIds(){return n._getTorrentIds(this.getSelectedTorrents())}_setSelectedRow(e){let t=e?e.getElement():null;for(let o of this.elements.torrent_list.children)o.classList.toggle("selected",o===t);this._dispatchSelectionChanged()}_selectRow(e){e.getElement().classList.add("selected"),this._dispatchSelectionChanged()}_deselectRow(e){e.getElement().classList.remove("selected"),this._dispatchSelectionChanged()}_selectAll(){for(let e of this.elements.torrent_list.children)e.classList.add("selected");this._dispatchSelectionChanged()}_deselectAll(){for(let e of this.elements.torrent_list.children)e.classList.remove("selected");this._dispatchSelectionChanged(),delete this._last_torrent_clicked}_indexOfLastTorrent(){return this._rows.findIndex(e=>e.getTorrentId()===this._last_torrent_clicked)}_selectRange(e){let t=this._indexOfLastTorrent();if(t===-1)this._selectRow(e);else{let o=this._rows.indexOf(e),r=Math.min(t,o),s=Math.max(t,o);for(let a=r;a<=s;++a)this._selectRow(this._rows[a])}this._dispatchSelectionChanged()}_dispatchSelectionChanged(){let e=[],t=[];for(let r of this._rows)(r.isSelected()?t:e).push(r.getTorrent());let o=new Event("torrent-selection-changed");o.nonselected=e,o.selected=t,this.dispatchEvent(o)}static _createKeyShortcutFromKeyboardEvent(e){let t=[];return e.ctrlKey&&t.push("Control"),e.altKey&&t.push("Alt"),e.metaKey&&t.push("Meta"),e.shiftKey&&t.push("Shift"),t.push(e.key.length===1?e.key.toUpperCase():e.key),t.join("+")}_keyDown(e){let{ctrlKey:t,keyCode:o,metaKey:r,shiftKey:s,target:a}=e,l=["INPUT","TEXTAREA"].includes(a.tagName);if(!l){let d=n._createKeyShortcutFromKeyboardEvent(e),g=this.action_manager.getActionForShortcut(d);if(g){e.preventDefault(),this.action_manager.click(g);return}}if(o===27&&this.popup.some(Boolean)){this.setCurrentPopup(null,0),e.preventDefault();return}let c=document.querySelector(".popup:not(.hidden)"),u=this._rows;if(!l&&!c&&!r&&!t){let d=o===16,g=o===38,m=o===40;if((g||m)&&u.length>0){let I=this._indexOfLastTorrent(),B=this._shift_index,f=0,C=u.length-1,h=I;m&&h+1<=C?++h:g&&h-1>=f&&--h;let x=u[h];B>=0?B<=I&&I=I&&I>h?this._selectRow(x):(B>=I&&h>I||B<=I&&I>h)&&this._deselectRow(u[I]):s?this._selectRange(x):this._setSelectedRow(x),x&&(this._last_torrent_clicked=x.getTorrentId(),x.getElement().scrollIntoView(),e.preventDefault())}else d&&(this._shift_index=this._indexOfLastTorrent())}}_keyUp(e){e.keyCode===16&&delete this._shift_index}static _dragenter(e){if(e.dataTransfer&&e.dataTransfer.types){let t=new Set(["text/uri-list","text/plain"]);if(e.dataTransfer.types.some(o=>t.has(o))||e.dataTransfer.types.includes("Files"))return e.stopPropagation(),e.preventDefault(),e.dataTransfer.dropEffect="copy",!1}else e.dataTransfer&&(e.dataTransfer.dropEffect="none");return!0}static _isValidURL(e){try{return!!new URL(e)}catch{return!1}}shouldAddedTorrentsStart(){return this.session_properties["start-added-torrents"]}_drop(e){let t=!this.shouldAddedTorrentsStart();if(!e.dataTransfer||!e.dataTransfer.types)return!0;let o=e.dataTransfer.types.findLast(s=>["text/uri-list","text/plain"].includes(s));for(let s of e.dataTransfer.getData(o).split(` +`).map(a=>a.trim()).filter(a=>n._isValidURL(a)))this.remote.addTorrentByUrl(s,t);let{files:r}=e.dataTransfer;return r.length>0&&this.setCurrentPopup(new S(this,this.remote,"",r)),e.preventDefault(),!1}togglePeriodicSessionRefresh(e){!e&&this.sessionInterval&&(clearInterval(this.sessionInterval),delete this.sessionInterval),e&&(this.loadDaemonPrefs(),this.sessionInterval||(this.sessionInterval=setInterval(this.loadDaemonPrefs.bind(this),8e3)))}_setFilterText(e){clearTimeout(this.busytyping),this.busytyping=setTimeout(()=>{this.busytyping=!1,this.filterText=e.trim(),this.refilterAllSoon()},e?250:0)}_onTorrentChanged(e){this.changeStatus&&(this._dispatchSelectionChanged(),this.changeStatus=!1);let t=e.currentTarget;this.dirtyTorrents.add(t.getId()),this.refilterSoon()}updateTorrents(e,t){this.remote.updateTorrents(e,t,(o,r)=>{let s=[],a=o.shift(),l={};for(let i of o){for(let[d,g]of a.entries())l[g]=i[d];let{id:c}=l,u=this._torrents[c];if(u){let d=u.needsMetaData();u.refresh(l),d&&!u.needsMetaData()&&s.push(c)}else u=this._torrents[c]=new A(l),u.addEventListener("dataChanged",this._onTorrentChanged.bind(this)),this.dirtyTorrents.add(c),(!("name"in u.fields)||!("status"in u.fields))&&s.push(c)}if(s.length>0){let i=["id",...A.Fields.Metadata,...A.Fields.Stats];this.updateTorrents(s,i),this.refilterSoon()}r&&(this._deleteTorrents(r),this.refilterSoon())})}refreshTorrents(){let e=["id",...A.Fields.Stats];this.updateTorrents("recently-active",e)}_initializeTorrents(){let e=["id",...A.Fields.Metadata,...A.Fields.Stats];this.updateTorrents(null,e)}_onRowClicked(e){let t=e.metaKey||e.ctrlKey,{row:o}=e.currentTarget;this.popup[n.default_popup_level]&&this.setCurrentPopup(null),e.stopPropagation(),e.shiftKey?(this._selectRange(o),globalThis.focus()):!o.isSelected()&&t?this._selectRow(o):o.isSelected()?o.isSelected()&&t?this._deselectRow(o):o.isSelected()&&this._setSelectedRow(o):this._setSelectedRow(o),this._last_torrent_clicked=o.getTorrentId()}_deleteTorrents(e){if(e&&e.length>0){for(let t of e)this.dirtyTorrents.add(t),delete this._torrents[t];this.refilterSoon()}}_removeSelectedTorrents(){let e=this.getSelectedTorrents();e.length>0&&this.setCurrentPopup(new ne({remote:this.remote,torrents:e}))}_startSelectedTorrents(e){this._startTorrents(this.getSelectedTorrents(),e)}_startTorrents(e,t){this.changeStatus=!0,this.remote.startTorrents(n._getTorrentIds(e),t,this.refreshTorrents,this)}_verifyTorrents(e){this.remote.verifyTorrents(n._getTorrentIds(e),this.refreshTorrents,this)}_reannounceTorrents(e){this.remote.reannounceTorrents(n._getTorrentIds(e),this.refreshTorrents,this)}_stopTorrents(e){this.changeStatus=!0,this.remote.stopTorrents(n._getTorrentIds(e),()=>{setTimeout(()=>{this.refreshTorrents()},500)},this)}changeFileCommand(e,t,o){this.remote.changeFileCommand(e,t,o)}_moveTop(){this.remote.moveTorrentsToTop(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveUp(){this.remote.moveTorrentsUp(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveDown(){this.remote.moveTorrentsDown(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_moveBottom(){this.remote.moveTorrentsToBottom(this._getSelectedTorrentIds(),this.refreshTorrents,this)}_updateGuiFromSession(e){let[,t,o]=e.version.match(/^(.*)\s\(([\da-f]+)\)/);this.version_info={checksum:o,version:t},document.querySelector("#toolbar-overflow").classList.toggle("alt-speed-enabled",e[G._TurtleState])}_updateStatusbar(){let e=y,t=this._getAllTorrents(),o=t.reduce((a,l)=>a+l.getUploadSpeed(),0),r=t.reduce((a,l)=>a+l.getDownloadSpeed(),0),s=e.countString("Transfer","Transfers",this._rows.length);b(this.speed.down,e.speedBps(r)),b(this.speed.up,e.speedBps(o)),b(document.querySelector("#filter-count"),s)}static _displayName(e){let t=e;return t.length>0&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}_updateFilterSelect(){let e=this._getTrackerCounts(),t=Object.keys(e).toSorted();if(t.length!==this.oldTrackers.length||t.some((o,r)=>o!==this.oldTrackers[r])){this.oldTrackers=t;let o=[["All",p.FilterAll,!this.filterTracker],...t.map(s=>[n._displayName(s),s,s===this.filterTracker])],r=document.querySelector("#filter-tracker");for(;r.firstChild;)r.lastChild.remove();N(r,null,o)}}sortRows(e){let t=e.map(r=>r.getTorrent()),o=e.reduce((r,s)=>(r[s.getTorrent().getId()]=s,r),{});A.sortTorrents(t,this.prefs.sort_mode,this.prefs.sort_direction);for(let[r,s]of t.entries())e[r]=o[s.getId()]}_refilter(e){let{sort_mode:t,sort_direction:o,filter_mode:r}=this.prefs,s=this.filterTracker,a=this.torrentRenderer,l=this.elements.torrent_list,i=null,c=null,u=/^labels:([\w,-\s]*)(.*)$/.exec(this.filterText);u?(i=u[2].trim(),c=u[1].split(",")):(i=this.filterText,c=[]);let d=()=>[...l.children].length,g=()=>[...l.children].reduce((Z,Q)=>Z+Q.classList.contains("selected")?1:0,0),m=d(),I=g();if(this._updateFilterSelect(),e){for(;l.firstChild;)l.firstChild.remove();this._rows=[],this.dirtyTorrents=new Set(Object.keys(this._torrents)),document.querySelector("#reset").style.display=this.filterText.length>0?"block":"none"}let B=[],f=[];for(let Z of this._rows)this.dirtyTorrents.has(Z.getTorrentId())?f.push(Z):B.push(Z);for(let Z of f)Z.getElement().remove();let C=[];for(let Z of f){let Q=Z.getTorrentId(),L=this._torrents[Q];L&&L.test(r,s,i,c)&&C.push(Z),this.dirtyTorrents.delete(Q)}f=C;for(let Z of this.dirtyTorrents.values()){let Q=this._torrents[Z];if(Q&&Q.test(r,s,i,c)){let L=new ue(a,this,Q),he=L.getElement();he.row=L,f.push(L),he.addEventListener("click",this._onRowClicked.bind(this))}}this.sortRows(f);let h=[],x=B.length,k=f.length,_=document.createDocumentFragment(),O=0,z=0;for(;O!==x||z!==k;){let Z=null;if(O===x?Z=!1:z===k?Z=!0:Z=A.compareTorrents(B[O].getTorrent(),f[z].getTorrent(),t,o)<0,Z)h.push(B[O++]);else{let Q=f[z++],L=Q.getElement();O===x?_.append(L):l.insertBefore(L,B[O].getElement()),h.push(Q)}}l.append(_),this._rows=h,this.dirtyTorrents.clear(),this._updateStatusbar(),(I!==g()||m!==d())&&this._dispatchSelectionChanged()}setFilterTracker(e){let t=document.querySelector("#filter-tracker");t.value=e,this.filterTracker=e===p.FilterAll?"":e,this.refilterAllSoon()}_getTrackerCounts(){let e={};for(let t of this._getAllTorrents())for(let o of t.getTrackers()){let{sitename:r}=o;e[r]=(e[r]||0)+1}return e}setCurrentPopup(e,t=n.default_popup_level){for(let o=t;o{this.popup[t]&&(this.popup[t].removeEventListener("close",o),this.popup[t]=null)};this.popup[t].addEventListener("close",o)}}};function Je(){let n=new j,e=new p,t=new $(e),o=new me(n,t,e),r=R(()=>o.elements.torrent_list.scrollTo(0,1));globalThis.addEventListener("load",r),globalThis.addEventListener("orientationchange",r)}document.addEventListener("DOMContentLoaded",Je);})(); //# sourceMappingURL=transmission-app.js.map