diff --git a/README.md b/README.md index c477d93..eb443e3 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Blue Marble Enhanced -![Blue Marble 0.94.0 liquid-glass UI showcase](./docs/assets/blue-marble.png) +![Blue Marble 0.95.0 liquid-glass UI showcase](./docs/assets/blue-marble.png) This fork is based on [SwingTheVine/Wplace-BlueMarble](https://github.com/SwingTheVine/Wplace-BlueMarble) and focuses on practical improvements for everyday template work on [wplace.live](https://wplace.live/). @@ -8,15 +8,18 @@ The goal is not to replace the upstream project. This fork keeps the original Bl ## What Is Different -Version `0.94.0` introduces the first enhanced release: +Version `0.95.0` continues the enhanced release: - Redesigned Blue Marble windows with a minimal liquid-glass visual style. - Redesigned window controls, buttons, typography, spacing, and transitions. +- Polished the main Blue Marble header and stat cards for a more balanced layout. - Added a resizable windowed mode for Color Filter. +- Redesigned the expanded Color Filter layout with compact stat cards and full-color color cards. - Added Color Filter position and size persistence. - Added persistence for shown and hidden colors in Color Filter. - Added automatic Color Filter refresh every 10 seconds. -- Updated Color Filter visibility icons to match the new interface style. +- Updated Color Filter visibility icons with animated eye-slash transitions. +- Added premium color star backgrounds in the expanded Color Filter cards. ## Installation @@ -32,6 +35,8 @@ Color Filter is one of the main areas improved here. It can be opened as a compa Hidden and visible colors are remembered, so you can isolate the colors you are actively painting without rebuilding the filter state every session. The list also refreshes automatically every 10 seconds, keeping pixel counts current without a manual refresh button. +The expanded Color Filter view now uses larger full-color cards, compact progress text, clearer stat cards, animated visibility icons, and premium star accents while keeping hidden colors recognizable by their actual palette color. + ## Upstream Original project: diff --git a/dist/BlueMarble-For-GreasyFork.user.js b/dist/BlueMarble-For-GreasyFork.user.js index 3e44a6f..1f75b77 100644 --- a/dist/BlueMarble-For-GreasyFork.user.js +++ b/dist/BlueMarble-For-GreasyFork.user.js @@ -2,7 +2,7 @@ // @name Blue Marble // @name:en Blue Marble // @namespace https://github.com/SwingTheVine/ -// @version 0.94.0 +// @version 0.95.0 // @description A userscript to enhance the user experience on Wplace.live. This includes, but is not limited to: uploading images to display locally on a canvas, adding a button to move the Wplace color palette menu, and other QoL features. // @description:en A userscript to enhance the user experience on Wplace.live. This includes, but is not limited to: uploading images to display locally on a canvas, adding a button to move the Wplace color palette menu, and other QoL features. // @author SwingTheVine @@ -4706,4 +4706,4 @@ Time Since Blink: ${String(Math.floor(elapsed / 6e4)).padStart(2, "0")}:${String } })(); -// Build Hash: a40147b07f84 +// Build Hash: 766764cf4c48 diff --git a/dist/BlueMarble-Standalone.user.js b/dist/BlueMarble-Standalone.user.js index cf2a101..aa4b52e 100644 --- a/dist/BlueMarble-Standalone.user.js +++ b/dist/BlueMarble-Standalone.user.js @@ -2,7 +2,7 @@ // @name Blue Marble // @name:en Blue Marble // @namespace https://github.com/SwingTheVine/ -// @version 0.94.0 +// @version 0.95.0 // @description A userscript to enhance the user experience on Wplace.live. This includes, but is not limited to: uploading images to display locally on a canvas, adding a button to move the Wplace color palette menu, and other QoL features. // @description:en A userscript to enhance the user experience on Wplace.live. This includes, but is not limited to: uploading images to display locally on a canvas, adding a button to move the Wplace color palette menu, and other QoL features. // @author SwingTheVine @@ -40,4 +40,4 @@ (()=>{var t=t=>{throw TypeError(t)},e=(e,i,s)=>i.has(e)?t("Cannot add the same private member more than once"):i instanceof WeakSet?i.add(e):i.set(e,s),i=(e,i,s)=>(((e,i)=>{i.has(e)||t("Cannot access private method")})(e,i),s);function s(t){return new Promise(e=>setTimeout(e,t))}function n(t){return(new Intl.NumberFormat).format(t)}function o(t){return new Intl.NumberFormat(void 0,{style:"percent",t:2,i:2}).format(t)}function a(t){const e=document.createElement("div");return e.textContent=t,e.innerHTML}function r(...t){(0,console.log)(...t)}function l(...t){(0,console.error)(...t)}function c(...t){(0,console.warn)(...t)}function h(t,e){if(0===t)return e[0];let i="";const s=e.length;for(;t>0;)i=e[t%s]+i,t=Math.floor(t/s);return i}function m(t,e){let i=0;const s=e.length;for(const n of t){const t=e.indexOf(n);-1==t&&l(`Invalid character '${n}' encountered whilst decoding! Is the decode alphabet/base incorrect?`),i=i*s+t}return i}function d(t){let e="";for(let i=0;i(t/=255)<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4));return.2126*e[0]+.7152*e[1]+.0722*e[2]}function p(t,e,i){return Array.isArray(t)&&([t,e,i]=t),(1<<24|t<<16|e<<8|i).toString(16).slice(1)}var f,g,w,x=[{id:0,premium:!1,name:"Transparent",rgb:[0,0,0]},{id:1,premium:!1,name:"Black",rgb:[0,0,0]},{id:2,premium:!1,name:"Dark Gray",rgb:[60,60,60]},{id:3,premium:!1,name:"Gray",rgb:[120,120,120]},{id:4,premium:!1,name:"Light Gray",rgb:[210,210,210]},{id:5,premium:!1,name:"White",rgb:[255,255,255]},{id:6,premium:!1,name:"Deep Red",rgb:[96,0,24]},{id:7,premium:!1,name:"Red",rgb:[237,28,36]},{id:8,premium:!1,name:"Orange",rgb:[255,127,39]},{id:9,premium:!1,name:"Gold",rgb:[246,170,9]},{id:10,premium:!1,name:"Yellow",rgb:[249,221,59]},{id:11,premium:!1,name:"Light Yellow",rgb:[255,250,188]},{id:12,premium:!1,name:"Dark Green",rgb:[14,185,104]},{id:13,premium:!1,name:"Green",rgb:[19,230,123]},{id:14,premium:!1,name:"Light Green",rgb:[135,255,94]},{id:15,premium:!1,name:"Dark Teal",rgb:[12,129,110]},{id:16,premium:!1,name:"Teal",rgb:[16,174,166]},{id:17,premium:!1,name:"Light Teal",rgb:[19,225,190]},{id:18,premium:!1,name:"Dark Blue",rgb:[40,80,158]},{id:19,premium:!1,name:"Blue",rgb:[64,147,228]},{id:20,premium:!1,name:"Cyan",rgb:[96,247,242]},{id:21,premium:!1,name:"Indigo",rgb:[107,80,246]},{id:22,premium:!1,name:"Light Indigo",rgb:[153,177,251]},{id:23,premium:!1,name:"Dark Purple",rgb:[120,12,153]},{id:24,premium:!1,name:"Purple",rgb:[170,56,185]},{id:25,premium:!1,name:"Light Purple",rgb:[224,159,249]},{id:26,premium:!1,name:"Dark Pink",rgb:[203,0,122]},{id:27,premium:!1,name:"Pink",rgb:[236,31,128]},{id:28,premium:!1,name:"Light Pink",rgb:[243,141,169]},{id:29,premium:!1,name:"Dark Brown",rgb:[104,70,52]},{id:30,premium:!1,name:"Brown",rgb:[149,104,42]},{id:31,premium:!1,name:"Beige",rgb:[248,178,119]},{id:32,premium:!0,name:"Medium Gray",rgb:[170,170,170]},{id:33,premium:!0,name:"Dark Red",rgb:[165,14,30]},{id:34,premium:!0,name:"Light Red",rgb:[250,128,114]},{id:35,premium:!0,name:"Dark Orange",rgb:[228,92,26]},{id:36,premium:!0,name:"Light Tan",rgb:[214,181,148]},{id:37,premium:!0,name:"Dark Goldenrod",rgb:[156,132,49]},{id:38,premium:!0,name:"Goldenrod",rgb:[197,173,49]},{id:39,premium:!0,name:"Light Goldenrod",rgb:[232,212,95]},{id:40,premium:!0,name:"Dark Olive",rgb:[74,107,58]},{id:41,premium:!0,name:"Olive",rgb:[90,148,74]},{id:42,premium:!0,name:"Light Olive",rgb:[132,197,115]},{id:43,premium:!0,name:"Dark Cyan",rgb:[15,121,159]},{id:44,premium:!0,name:"Light Cyan",rgb:[187,250,242]},{id:45,premium:!0,name:"Light Blue",rgb:[125,199,255]},{id:46,premium:!0,name:"Dark Indigo",rgb:[77,49,184]},{id:47,premium:!0,name:"Dark Slate Blue",rgb:[74,66,132]},{id:48,premium:!0,name:"Slate Blue",rgb:[122,113,196]},{id:49,premium:!0,name:"Light Slate Blue",rgb:[181,174,241]},{id:50,premium:!0,name:"Light Brown",rgb:[219,164,99]},{id:51,premium:!0,name:"Dark Beige",rgb:[209,128,81]},{id:52,premium:!0,name:"Light Beige",rgb:[255,197,165]},{id:53,premium:!0,name:"Dark Peach",rgb:[155,82,73]},{id:54,premium:!0,name:"Peach",rgb:[209,128,120]},{id:55,premium:!0,name:"Light Peach",rgb:[250,182,164]},{id:56,premium:!0,name:"Dark Tan",rgb:[123,99,82]},{id:57,premium:!0,name:"Tan",rgb:[156,132,107]},{id:58,premium:!0,name:"Dark Slate",rgb:[51,57,65]},{id:59,premium:!0,name:"Slate",rgb:[109,117,141]},{id:60,premium:!0,name:"Light Slate",rgb:[179,185,209]},{id:61,premium:!0,name:"Dark Stone",rgb:[109,100,63]},{id:62,premium:!0,name:"Stone",rgb:[148,140,107]},{id:63,premium:!0,name:"Light Stone",rgb:[205,197,158]}],y='',$=class{constructor(t,i){e(this,f),this.name=t,this.version=i,this.o=null,this.l=null,this.h="bm-r",this.m=null,this.u=null,this.p=[]}$(t){this.o=t}v(t){this.l=t}M(){return this.p.length>0&&(this.u=this.p.pop()),this}C(t){t?.appendChild(this.m),this.m=null,this.u=null,this.p=[]}S(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"div",{},t)),this}T(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"p",{},t)),this}k(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"small",{},t)),this}N(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"span",{},t)),this}D(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"details",{},t)),this}L(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"summary",{},t)),this}O(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"img",{},t)),this}H(t,e={},s=()=>{}){return s(this,i(this,f,g).call(this,"h"+t,{},e)),this}I(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"hr",{},t)),this}B(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"br",{},t)),this}P(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"form",{},t)),this}A(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"fieldset",{},t)),this}F(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"legend",{},t)),this}W(t={},e=()=>{}){const s={};t.textContent?(s.textContent=t.textContent,delete t.textContent):t.innerHTML&&(s.innerHTML=t.innerHTML,delete t.textContent);const n=i(this,f,g).call(this,"label",s),o=i(this,f,g).call(this,"input",{type:"checkbox"},t);return n.insertBefore(o,n.firstChild),this.M(),e(this,n,o),this}U(t={},e=()=>{}){const s=i(this,f,g).call(this,"label",{textContent:t.textContent??"",for:t.id??""});return delete t.textContent,this.M(),e(this,s,i(this,f,g).call(this,"select",{},t)),this}V(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"option",{},t)),this}G(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"ol",{},t)),this}R(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"ul",{},t)),this}j(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"menu",{},t)),this}Y(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"li",{},t)),this}J(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"table",{},t)),this}X(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"caption",{},t)),this}_(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"thead",{},t)),this}q(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"tbody",{},t)),this}Z(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"tfoot",{},t)),this}K(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"tr",{},t)),this}tt(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"th",{},t)),this}et(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"td",{},t)),this}it(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"button",{},t)),this}st(t={},e=()=>{}){const s=t.title??t.textContent??"Help: No info";delete t.textContent,t.title=`Help: ${s}`;const n={textContent:"?",className:"bm-10",onclick:()=>{this.nt(this.h,s)}};return e(this,i(this,f,g).call(this,"button",n,t)),this}ot(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"input",{},t)),this}rt(t={},e=()=>{}){const s=t.textContent??"";delete t.textContent;const n=i(this,f,g).call(this,"div"),o=i(this,f,g).call(this,"input",{type:"file",tabindex:"-1","aria-hidden":"true"},t);this.M();const a=i(this,f,g).call(this,"button",{textContent:s});return this.M(),this.M(),a.addEventListener("click",()=>{o.click()}),o.addEventListener("change",()=>{a.style.maxWidth=`${a.offsetWidth}px`,o.files.length>0?a.textContent=o.files[0].name:a.textContent=s}),e(this,n,o,a),this}lt(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"textarea",{},t)),this}ct(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"div",{class:"bm-S"},t)),this}ht(t=Date.now(),e=500,s={},n=()=>{}){const o="bm--",a=s?.id||o+"-"+crypto.randomUUID().slice(0,8),r={class:o},l=i(this,f,g).call(this,"time",r,s);return l.id=a,l.dataset.endDate=t,setInterval(()=>{if(!l.isConnected)return;const t=Math.max(l.dataset.endDate-Date.now(),0),e=Math.floor(t/1e3),i=Math.floor(e/3600),s=Math.floor(e%60),n=Math.floor(e%3600/60);l.setAttribute("datetime",`PT${i}H${n}M${s}S`),l.textContent=String(i).padStart(2,"0")+":"+String(n).padStart(2,"0")+":"+String(s).padStart(2,"0")},e),n(this,l),this}nt(t,e,i=!1){const s=document.getElementById(t.replace(/^#/,""));s&&(s instanceof HTMLInputElement?s.value=e:i?s.textContent=e:s.innerHTML=e)}dt(t){if(t.disabled)return;t.disabled=!0,t.style.textDecoration="none";const e=t.closest(".bm-W"),i=t.closest(".bm-S"),s=e?.querySelector("h1"),n=e?.querySelector(".bm-m");if(!e||!i||!n)return t.disabled=!1,void(t.style.textDecoration="");const o=e=>{let i,s=!1;const o=()=>{s||(s=!0,clearTimeout(i),n.removeEventListener("transitionend",a),e(),t.disabled=!1,t.style.textDecoration="")},a=t=>{t.target==n&&"height"==t.propertyName&&o()};n.addEventListener("transitionend",a),i=setTimeout(o,360)};if(e.parentElement.append(e),"expanded"==t.dataset.buttonStatus){e.dataset.widthBeforeMinimize=e.style.width,e.dataset.heightBeforeMinimize=e.style.height,e.dataset.minHeightBeforeMinimize=e.style.minHeight,n.style.height=n.scrollHeight+"px",n.offsetHeight,e.style.width||(e.style.width=e.scrollWidth+"px"),o(()=>{n.style.display="none"}),n.style.height="0",(e.style.height||e.classList.contains("bm-N"))&&(e.style.minHeight="0px",e.style.height=(()=>{const t=getComputedStyle(e),s=t=>parseFloat(t)||0,n="border-box"==t.boxSizing?s(t.paddingTop)+s(t.paddingBottom)+s(t.borderTopWidth)+s(t.borderBottomWidth):0;return Math.ceil(i.getBoundingClientRect().height+n+2)})()+"px");const a=s?.cloneNode(!0)??document.createElement("h1"),r=a.textContent;t.nextElementSibling.appendChild(a),t.innerHTML='',t.dataset.buttonStatus="collapsed",t.ariaLabel=`Unminimize window "${r}"`}else{const s=i.querySelector("h1"),a=s.textContent;s.remove(),n.style.display="",n.style.height="0",e.style.width=e.dataset.widthBeforeMinimize??"",e.style.minHeight=e.dataset.minHeightBeforeMinimize??"",e.style.height=e.dataset.heightBeforeMinimize??"",n.offsetHeight,o(()=>{n.style.height="",delete e.dataset.widthBeforeMinimize,delete e.dataset.heightBeforeMinimize,delete e.dataset.minHeightBeforeMinimize}),n.style.height=n.scrollHeight+"px",t.innerHTML=y,t.dataset.buttonStatus="expanded",t.ariaLabel=`Minimize window "${a}"`}}ut(t,e,i={}){const s=document.querySelector(t),n=document.querySelector(e),o=i?.bt??(()=>{});if(!s||!n)return void this.ft(`Can not drag! ${s?"":"moveMe"} ${s||n?"":"and "}${n?"":"iMoveThings "}was not found!`);let a,r=!1,l=0,c=null,h=0,m=0,d=0,u=0,b=null;const p=()=>{if(r){const t=Math.abs(h-d),e=Math.abs(m-u);(t>.5||e>.5)&&(h=d,m=u,s.style.transform=`translate(${h}px, ${m}px)`,s.style.left="0px",s.style.top="0px",s.style.right=""),c=requestAnimationFrame(p)}},f=(t,e)=>{r=!0,b=s.getBoundingClientRect(),a=t-b.left,l=e-b.top;const i=window.getComputedStyle(s).transform;if(i&&"none"!==i){const t=new DOMMatrix(i);h=t.m41,m=t.m42}else h=b.left,m=b.top;d=h,u=m,document.body.style.userSelect="none",n.classList.add("bm-M"),document.addEventListener("mousemove",w),document.addEventListener("touchmove",x,{passive:!1}),document.addEventListener("mouseup",g),document.addEventListener("touchend",g),document.addEventListener("touchcancel",g),c&&cancelAnimationFrame(c),p()},g=()=>{r=!1,c&&(cancelAnimationFrame(c),c=null),document.body.style.userSelect="",n.classList.remove("bm-M"),document.removeEventListener("mousemove",w),document.removeEventListener("touchmove",x),document.removeEventListener("mouseup",g),document.removeEventListener("touchend",g),document.removeEventListener("touchcancel",g),o({element:s,x:h,y:m}),b=null},w=t=>{r&&b&&(d=t.clientX-a,u=t.clientY-l)},x=t=>{if(r&&b){const e=t.touches[0];if(!e)return;d=e.clientX-a,u=e.clientY-l,t.preventDefault()}};n.addEventListener("mousedown",function(t){t.preventDefault(),f(t.clientX,t.clientY)}),n.addEventListener("touchstart",function(t){const e=t?.touches?.[0];e&&(f(e.clientX,e.clientY),t.preventDefault())},{passive:!1})}gt(t,e,i={}){const s=document.querySelector(t),n=document.querySelector(e),o=i?.bt??(()=>{});if(!s||!n)return void this.ft(`Can not resize! ${s?"":"resizeMe"} ${s||n?"":"and "}${n?"":"iResizeThings "}was not found!`);let a=!1,r=0,l=0,c=0,h=0,m=0,d=0,u=0,b=0,p=null;const f=()=>Number.isFinite(i?.maxWidth)?i.maxWidth:window.innerWidth-16,g=()=>Number.isFinite(i?.maxHeight)?i.maxHeight:window.innerHeight-16,w=Number.isFinite(i?.minWidth)?i.minWidth:200,x=Number.isFinite(i?.minHeight)?i.minHeight:160,y=(t,e,i)=>Math.min(Math.max(t,e),Math.max(e,i)),$=()=>{if(a){const t=Math.abs(m-u),e=Math.abs(d-b);(t>.5||e>.5)&&(m=u,d=b,s.style.width=`${m}px`,s.style.height=`${d}px`),p=requestAnimationFrame($)}},v=(t,e)=>{a=!0,r=t,l=e,c=s.offsetWidth,h=s.offsetHeight,m=c,d=h,u=c,b=h,document.body.style.userSelect="none",n.classList.add("bm-2u"),document.addEventListener("mousemove",C),document.addEventListener("touchmove",S,{passive:!1}),document.addEventListener("mouseup",M),document.addEventListener("touchend",M),document.addEventListener("touchcancel",M),p&&cancelAnimationFrame(p),$()},M=()=>{a=!1,p&&(cancelAnimationFrame(p),p=null),document.body.style.userSelect="",n.classList.remove("bm-2u"),document.removeEventListener("mousemove",C),document.removeEventListener("touchmove",S),document.removeEventListener("mouseup",M),document.removeEventListener("touchend",M),document.removeEventListener("touchcancel",M),o({element:s,width:m,height:d})},C=t=>{a&&(u=y(c+(t.clientX-r),w,f()),b=y(h+(t.clientY-l),x,g()))},S=t=>{if(!a)return;const e=t?.touches?.[0];e&&(u=y(c+(e.clientX-r),w,f()),b=y(h+(e.clientY-l),x,g()),t.preventDefault())};n.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),v(t.clientX,t.clientY)}),n.addEventListener("touchstart",t=>{const e=t?.touches?.[0];e&&(t.preventDefault(),t.stopPropagation(),v(e.clientX,e.clientY))},{passive:!1})}wt(t){(0,console.info)(`${this.name}: ${t}`),this.nt(this.h,"Status: "+t,!0)}ft(t){(0,console.error)(`${this.name}: ${t}`),this.nt(this.h,"Error: "+t,!0)}};f=new WeakSet,g=function(t,e={},s={}){const n=document.createElement(t);this.m?(this.u?.appendChild(n),this.p.push(this.u),this.u=n):(this.m=n,this.u=n);for(const[t,s]of Object.entries(e))i(this,f,w).call(this,n,t,s);for(const[t,e]of Object.entries(s))i(this,f,w).call(this,n,t,e);return n},w=function(t,e,i){"class"==e?t.classList.add(...i.split(/\s+/)):"for"==e?t.htmlFor=i:"tabindex"==e?t.tabIndex=Number(i):"readonly"==e?t.readOnly="true"==i||"1"==i:"maxlength"==e?t.maxLength=Number(i):e.startsWith("data")?t.dataset[e.slice(5).split("-").map((t,e)=>0==e?t:t[0].toUpperCase()+t.slice(1)).join("")]=i:e.startsWith("aria")?t.setAttribute(e,i):t[e]=i};var v,M,C,S,T,k,N,D,L,O,H,I,B,P=class extends ${constructor(t,i){super(t,i),e(this,v),this.window=null,this.xt="bm-l",this.yt=document.body,this.$t="windowSettings"}vt(){document.querySelector(`#${this.xt}`)?i(this,v,C).call(this):(this.window=this.S({id:this.xt,class:"bm-W"}).ct().it({class:"bm-s",innerHTML:y,"aria-label":'Minimize window "Settings"',"data-button-status":"expanded"},(t,e)=>{e.onclick=()=>t.dt(e),e.ontouchend=()=>{e.click()}}).M().S().M().S({class:"bm-D"}).it({class:"bm-s",innerHTML:'',"aria-label":'Close window "Settings"'},(t,e)=>{e.onclick=()=>i(this,v,C).call(this),e.ontouchend=()=>{e.click()}}).M().M().M().S({class:"bm-m"}).S({class:"bm-L bm-h"}).H(1,{textContent:"Settings"}).M().M().I().M().T({textContent:"Settings take 5 seconds to save."}).M().S({class:"bm-L bm-H"},(t,e)=>{this.Mt(),this.Ct()}).M().M().M().C(this.yt),i(this,v,N).call(this))}Mt(){i(this,v,D).call(this,"Pixel Highlight")}Ct(){i(this,v,D).call(this,"Template")}};v=new WeakSet,M=function(){var t,e;return this.St?((t=this.St)[e=this.$t]??(t[e]={}),this.St[this.$t]):null},C=function(){const t=document.querySelector(`#${this.xt}`);i(this,v,k).call(this,t),t?.remove()},S=function(t,e,i){const s=Math.max(8,window.innerWidth-t.offsetWidth-8),n=Math.max(8,window.innerHeight-t.offsetHeight-8);return{x:Math.min(Math.max(Math.round(Number(e)||8),8),s),y:Math.min(Math.max(Math.round(Number(i)||8),8),n)}},T=function(t){const e=i(this,v,M).call(this);e&&t&&requestAnimationFrame(()=>{if(!t.isConnected)return;const s=Number(e.x),n=Number(e.y);if(!Number.isFinite(s)||!Number.isFinite(n))return;const o=i(this,v,S).call(this,t,s,n);t.style.left="0px",t.style.top="0px",t.style.right="",t.style.transform=`translate(${o.x}px, ${o.y}px)`,o.x==s&&o.y==n||(e.x=o.x,e.y=o.y,this.Tt?.())})},k=function(t){const e=i(this,v,M).call(this);if(!e||!t?.isConnected)return;const s=t.getBoundingClientRect(),n=i(this,v,S).call(this,t,s.left,s.top);t.style.left="0px",t.style.top="0px",t.style.right="",t.style.transform=`translate(${n.x}px, ${n.y}px)`,e.x=n.x,e.y=n.y,this.Tt?.()},N=function(){const t=document.querySelector(`#${this.xt}.bm-W`);t&&(i(this,v,T).call(this,t),this.ut(`#${this.xt}.bm-W`,`#${this.xt} .bm-S`,{bt:({element:t})=>i(this,v,k).call(this,t)}))},D=function(t){this.window=this.S({class:"bm-L"}).H(2,{textContent:t}).M().I().M().T({innerHTML:`An error occured loading the ${t} category. SettingsManager failed to override the ${t} function inside WindowSettings.`}).M().M()},L=new WeakSet,O=function(t,e){t.disabled=!0;const i=t.dataset.status,s=this.St?.highlight??[[1,0,1],[2,0,0],[1,-1,0],[1,1,0],[1,0,-1]];let n=[2,0,0];const o=s;switch(i){case"Disabled":t.dataset.status="Incorrect",t.ariaLabel="Sub-pixel incorrect",n=[1,...e];break;case"Incorrect":t.dataset.status="Template",t.ariaLabel="Sub-pixel template",n=[2,...e];break;case"Template":t.dataset.status="Disabled",t.ariaLabel="Sub-pixel disabled",n=[0,...e];break}const a=s.findIndex(([,t,e])=>t==n[1]&&e==n[2]);0!=n[0]?-1!=a?o[a]=n:o.push(n):-1!=a&&o.splice(a,1),this.St.highlight=o,t.disabled=!1},H=async function(t){const e=document.querySelectorAll(".bm-3 button");for(const t of e)t.disabled=!0;let i=[0,0,0,0,2,0,0,0,0];switch(t){case"Cross":i=[0,1,0,1,2,1,0,1,0];break;case"X":i=[1,0,1,0,2,0,1,0,1];break;case"Full":i=[2,2,2,2,2,2,2,2,2];break}const n=document.querySelector(".bm-n")?.childNodes??[];for(let t=0;t{const[s,n,o,a]=e.split(",").map(Number);(n>>24==0?0:n.get(e)??-2;const a=o.get(s);o.set(s,a?a+1:1)}return console.log(o),o};var z=class{constructor(){this.Et=Math.ceil(80/1300*window.innerWidth),this.Yt=x.slice(1)}Jt(t){const e=document.createElement("div");for(let t=0;t{t.parentNode.childElementCount<=1?t.parentNode.remove():t.remove()},e.appendChild(t)}t.appendChild(e)}},F=class extends HTMLElement{};customElements.define("confetti-piece",F);var W,U,V,G,R,j,E,Y,J,X,_,q,Z,K,Q,tt,et,it,st,nt,ot,at,rt,lt,ct,ht,mt,dt,ut,bt='',pt=class extends ${constructor(t){super(t.name,t.version),e(this,W),this.window=null,this.xt="bm-t",this.Xt="bm-E",this.yt=document.body,this.l=t.l??null,this._t="ftr-oWin",this.$t="windowFilter",this.qt=null,this.Zt=null,this.Kt=null,this.Qt=null,this.te=1e4,this.ee=360,this.ie=220,this.se=1e3,this.ne=1400,this.oe=t.o?.oe,this.ae='',this.re='';const{palette:i,jt:s}=this.oe.le;this.palette=i,this.ce=0,this.he=0,this.me=new Map,this.de=new Map,this.ue=0,this.be=0,this.timeRemaining=0,this.pe="",this.sortPrimary="total",this.sortSecondary="descending",this.showUnused=!1}fe(){i(this,W,V).call(this)?this.ge():this.vt()}vt(){if(document.querySelector(`#${this.xt}`))return void i(this,W,j).call(this);this.window=this.S({id:this.xt,class:"bm-W"},(t,e)=>{}).ct().it({class:"bm-s",innerHTML:y,"aria-label":'Minimize window "Color Filter"',"data-button-status":"expanded"},(t,e)=>{e.onclick=()=>t.dt(e),e.ontouchend=()=>{e.click()}}).M().S().M().S({class:"bm-D"}).it({class:"bm-s",innerHTML:'',"aria-label":'Switch to windowed mode for "Color Filter"'},(t,e)=>{e.onclick=()=>{i(this,W,G).call(this,!0),i(this,W,j).call(this),this.ge()},e.ontouchend=()=>{e.click()}}).M().it({class:"bm-s",innerHTML:bt,"aria-label":'Close window "Color Filter"'},(t,e)=>{e.onclick=()=>i(this,W,j).call(this),e.ontouchend=()=>{e.click()}}).M().M().M().S({class:"bm-m"}).S({class:"bm-L bm-h bm-20"}).H(1,{textContent:"Color Filter"}).M().M().I().M().S({class:"bm-L bm-x bm-h bm-1S",style:"gap: 1.5ch;"}).it({class:"bm-1F",textContent:"Hide All Colors"},(t,e)=>{e.onclick=()=>i(this,W,it).call(this,!1)}).M().it({class:"bm-1F",textContent:"Show All Colors"},(t,e)=>{e.onclick=()=>i(this,W,it).call(this,!0)}).M().M().I().M().S({class:"bm-L bm-H bm-1z"}).S({class:"bm-L bm-1N"}).S({class:"bm-1G"}).S({class:"bm-1H"}).N({class:"bm-1A",textContent:"Tiles"}).M().N({id:"bm-i",class:"bm-1B",textContent:"0 / ???"}).M().M().S({class:"bm-1H"}).N({class:"bm-1A",textContent:"Correct"}).M().N({id:"bm-d",class:"bm-1B",textContent:"???"}).M().M().S({class:"bm-1H"}).N({class:"bm-1A",textContent:"Total"}).M().N({id:"bm-j",class:"bm-1B",textContent:"???"}).M().M().S({class:"bm-1H"}).N({class:"bm-1A",textContent:"Remaining"}).M().N({id:"bm-7",class:"bm-1B",textContent:"???"}).M().M().S({class:"bm-1H bm-1c"}).N({class:"bm-1A",textContent:"Finish At"}).M().N({id:"bm-8",class:"bm-1B",textContent:"???"}).M().M().M().I().M().P({class:"bm-L bm-1C"}).A().F({textContent:"Sort Options:",style:"font-weight: 700;"}).M().S({class:"bm-L"}).U({id:"bm-c",name:"sortPrimary",textContent:"I want to view "}).V({value:"id",textContent:"color IDs"}).M().V({value:"name",textContent:"color names"}).M().V({value:"premium",textContent:"premium colors"}).M().V({value:"percent",textContent:"percentage"}).M().V({value:"correct",textContent:"correct pixels"}).M().V({value:"incorrect",textContent:"incorrect pixels"}).M().V({value:"total",textContent:"total pixels"}).M().M().U({id:"bm-5",name:"sortSecondary",textContent:" in "}).V({value:"ascending",textContent:"ascending"}).M().V({value:"descending",textContent:"descending"}).M().M().N({textContent:" order."}).M().M().S({class:"bm-L"}).W({id:"bm-e",name:"showUnused",textContent:"Show unused colors"}).M().M().M().S({class:"bm-L bm-1q"}).it({class:"bm-1T",textContent:"Sort Colors",type:"submit"},(t,e)=>{e.onclick=t=>{t.preventDefault();const e=new FormData(document.querySelector(`#${this.xt} form`)),s={};for(const[t,i]of e)s[t]=i;console.log(`Primary: ${s.sortPrimary}; Secondary: ${s.sortSecondary}; Unused: ${"on"==s.showUnused}`),i(this,W,et).call(this,s.sortPrimary,s.sortSecondary,"on"==s.showUnused)}}).M().M().M().M().M().M().M().C(this.yt),this.ut(`#${this.xt}.bm-W`,`#${this.xt} .bm-S`);const t=document.querySelector(`#${this.xt} .bm-L.bm-H`);i(this,W,tt).call(this,t),i(this,W,R).call(this),i(this,W,et).call(this,this.sortPrimary,this.sortSecondary,this.showUnused),this.nt("#bm-i",`${n(this.ce)} / ${n(this.he)}`),this.nt("#bm-d",n(this.ue)),this.nt("#bm-j",n(this.be)),this.nt("#bm-7",`${n((this.be||0)-(this.ue||0))} (${o(((this.be||0)-(this.ue||0))/(this.be||1))})`),this.nt("#bm-8",``),i(this,W,E).call(this)}ge(){if(document.querySelector(`#${this.xt}`))return void i(this,W,j).call(this);this.window=this.S({id:this.xt,class:"bm-W bm-N",style:`width: 360px; height: min(70vh, 32rem); min-width: ${this.ee}px; min-height: ${this.ie}px; max-width: min(${this.se}px, calc(100vw - 16px)); max-height: min(${this.ne}px, calc(100vh - 16px));`}).ct().it({class:"bm-s",innerHTML:y,"aria-label":'Minimize window "Color Filter"',"data-button-status":"expanded"},(t,e)=>{e.onclick=()=>{const i=document.querySelector("#bm-2");i&&(i.style.display="expanded"==e.dataset.buttonStatus?"none":""),t.dt(e)},e.ontouchend=()=>{e.click()}}).M().S().N({id:"bm-2",class:"bm-y",style:"font-weight: 700;"}).M().M().S({class:"bm-D"}).it({class:"bm-s",innerHTML:'',"aria-label":'Switch to fullscreen mode for "Color Filter"'},(t,e)=>{e.onclick=()=>{i(this,W,G).call(this,!1),i(this,W,j).call(this),this.vt()},e.ontouchend=()=>{e.click()}}).M().it({class:"bm-s",innerHTML:bt,"aria-label":'Close window "Color Filter"'},(t,e)=>{e.onclick=()=>i(this,W,j).call(this),e.ontouchend=()=>{e.click()}}).M().M().M().S({class:"bm-m"}).S({class:"bm-L bm-h bm-20"}).H(1,{textContent:"Color Filter"}).M().M().I().M().S({class:"bm-L bm-x bm-h bm-1S",style:"gap: 1.5ch;"}).it({class:"bm-1F",textContent:"None"},(t,e)=>{e.onclick=()=>i(this,W,it).call(this,!1)}).M().it({class:"bm-1F",textContent:"All"},(t,e)=>{e.onclick=()=>i(this,W,it).call(this,!0)}).M().M().I().M().S({class:"bm-L bm-H bm-1z"}).M().M().S({class:"bm-21",title:"Resize Color Filter window","aria-label":"Resize Color Filter window",role:"presentation",textContent:"◢",style:"position: absolute; right: 0; bottom: 0; width: 28px; height: 28px; display: flex; align-items: flex-end; justify-content: flex-end; padding-right: 4px; padding-bottom: 4px; box-sizing: border-box; z-index: 5; cursor: nwse-resize; pointer-events: auto; touch-action: none; user-select: none; font-size: 8px; line-height: 1; color: rgba(255,255,255,0.95); background: transparent; border: none; box-shadow: none;"}).M().M().C(this.yt),i(this,W,Q).call(this);const t=document.querySelector(`#${this.xt} .bm-L.bm-H`);i(this,W,tt).call(this,t),i(this,W,R).call(this),i(this,W,et).call(this,this.sortPrimary,this.sortSecondary,this.showUnused),i(this,W,E).call(this)}we(){i(this,W,rt).call(this);const t=document.querySelector(`#${this.Xt}`),e={};for(const t of this.palette){const i=this.me.get(t.id)??0,s=n(i);let a=0,r="0",l=o(1);0!=i&&(a=this.de.get(t.id)??"???","number"!=typeof a&&this.ce==this.he&&t.id&&(a=0),r="string"==typeof a?a:n(a),l=isNaN(a/i)?"???":o(a/i));const c=parseInt(i)-parseInt(a);e[t.id]={xe:i,ye:s,$e:a,ve:r,Me:l,Ce:c}}if(document.querySelector("#bm-2")){const t=this.ue.toString().length>7?this.ue.toString().slice(0,2)+"…"+this.ue.toString().slice(-3):this.ue.toString(),e=this.be.toString().length>7?this.be.toString().slice(0,2)+"…"+this.be.toString().slice(-3):this.be.toString();this.nt("#bm-2",`${t}/${e}`,!0)}if(this.nt("#bm-i",`${n(this.ce)} / ${n(this.he)}`),this.nt("#bm-d",n(this.ue)),this.nt("#bm-j",n(this.be)),this.nt("#bm-7",`${n((this.be||0)-(this.ue||0))} (${o(((this.be||0)-(this.ue||0))/(this.be||1))})`),this.nt("#bm-8",``),!t)return e;const s=Array.from(t.children);for(const t of s){const i=parseInt(t.dataset.id),{$e:s,ve:n,Me:o,xe:a,ye:r,Ce:l}=e[i];t.dataset.correct=Number.isNaN(parseInt(s))?"0":s,t.dataset.total=a,t.dataset.percent="%"==o.slice(-1)?o.slice(0,-1):"0",t.dataset.incorrect=l||0;const c=document.querySelector(`#${this.xt} .bm-z[data-id="${i}"] .bm-9`);c&&(c.closest(`#${this.xt}.bm-N`)?c.textContent=`${n} / ${r}`:c.innerHTML=`${n} /
${r}`);const h=document.querySelector(`#${this.xt} .bm-z[data-id="${i}"] .bm-6`);h&&(h.innerHTML=`${o} done
${"number"!=typeof l||isNaN(l)?"???":l} off`)}i(this,W,et).call(this,this.sortPrimary,this.sortSecondary,this.showUnused)}};W=new WeakSet,U=function(){var t,e;return this.l?((t=this.l.St)[e=this.$t]??(t[e]={}),this.l.St[this.$t]):null},V=function(){const t=i(this,W,U).call(this);return"windowed"==t?.mode||"fullscreen"!=t?.mode},G=function(t){const e=i(this,W,U).call(this);e&&(e.mode=t?"windowed":"fullscreen"),this.l&&(this.l.Se(this._t,t),this.l.Tt())},R=function(){const t=document.querySelector(`#${this.xt} #bm-c`),e=document.querySelector(`#${this.xt} #bm-5`),i=document.querySelector(`#${this.xt} #bm-e`);t instanceof HTMLSelectElement&&(t.value=this.sortPrimary),e instanceof HTMLSelectElement&&(e.value=this.sortSecondary),i instanceof HTMLInputElement&&(i.checked=this.showUnused)},j=function(){const t=document.querySelector(`#${this.xt}`);t?.classList.contains("bm-N")&&i(this,W,Z).call(this,t),i(this,W,Y).call(this),i(this,W,J).call(this),t?.remove()},E=function(){i(this,W,Y).call(this),this.Qt=setInterval(()=>{document.querySelector(`#${this.xt}`)?this.we():i(this,W,Y).call(this)},this.te)},Y=function(){this.Qt&&(clearInterval(this.Qt),this.Qt=null)},J=function(){this.qt&&(this.qt.disconnect(),this.qt=null),this.Zt&&(window.removeEventListener("resize",this.Zt),this.Zt=null),this.Kt&&(clearTimeout(this.Kt),this.Kt=null)},X=function(t,e,i){const s=Math.max(e,i);return Math.min(Math.max(Math.round(Number(t)||e),e),s)},_=function(t,e,i){const s=Math.max(8,window.innerWidth-t.offsetWidth-8),n=Math.max(8,window.innerHeight-t.offsetHeight-8);return{x:Math.min(Math.max(Math.round(Number(e)||8),8),s),y:Math.min(Math.max(Math.round(Number(i)||8),8),n)}},q=function(t){const e=i(this,W,U).call(this);if(!e||!t)return;const s=Number(e.width),n=Number(e.height),o=Number.isFinite(s),a=Number.isFinite(n);o&&(e.width=i(this,W,X).call(this,s,this.ee,Math.min(this.se,window.innerWidth-16)),t.style.width=`${e.width}px`),a&&(e.height=i(this,W,X).call(this,n,this.ie,Math.min(this.ne,window.innerHeight-16)),t.style.height=`${e.height}px`),requestAnimationFrame(()=>{if(!t.isConnected)return;const s=Number(e.x),n=Number(e.y);if(!Number.isFinite(s)||!Number.isFinite(n))return;const o=i(this,W,_).call(this,t,s,n);t.style.left="0px",t.style.top="0px",t.style.right="",t.style.transform=`translate(${o.x}px, ${o.y}px)`,o.x==s&&o.y==n||(e.x=o.x,e.y=o.y,this.l?.Tt())})},Z=function(t){const e=i(this,W,U).call(this);if(!e||!t?.isConnected||!t.classList.contains("bm-N"))return;if(t.querySelector('.bm-S button[data-button-status="collapsed"]'))return;const s=t.getBoundingClientRect(),n=i(this,W,X).call(this,s.width,this.ee,Math.min(this.se,window.innerWidth-16)),o=i(this,W,X).call(this,s.height,this.ie,Math.min(this.ne,window.innerHeight-16));Math.round(s.width)!=n&&(t.style.width=`${n}px`),Math.round(s.height)!=o&&(t.style.height=`${o}px`);const a=i(this,W,_).call(this,t,s.left,s.top);t.style.left="0px",t.style.top="0px",t.style.right="",t.style.transform=`translate(${a.x}px, ${a.y}px)`,e.x=a.x,e.y=a.y,e.width=n,e.height=o,this.l?.Tt()},K=function(t,e=150){this.Kt&&clearTimeout(this.Kt),this.Kt=setTimeout(()=>{this.Kt=null,i(this,W,Z).call(this,t)},e)},Q=function(){const t=document.querySelector(`#${this.xt}.bm-W`);t&&(i(this,W,J).call(this),i(this,W,q).call(this,t),this.ut(`#${this.xt}.bm-W`,`#${this.xt} .bm-S`,{bt:({element:t})=>i(this,W,Z).call(this,t)}),this.gt(`#${this.xt}.bm-W`,`#${this.xt} .bm-21`,{minWidth:this.ee,minHeight:this.ie,maxWidth:Math.min(this.se,window.innerWidth-16),maxHeight:Math.min(this.ne,window.innerHeight-16),bt:({element:t})=>i(this,W,Z).call(this,t)}),"function"==typeof ResizeObserver&&(this.qt=new ResizeObserver(()=>i(this,W,K).call(this,t)),this.qt.observe(t)),this.Zt=()=>i(this,W,K).call(this,t,0),window.addEventListener("resize",this.Zt))},tt=function(t){const e=t.closest(`#${this.xt}`)?.classList.contains("bm-N");console.log(`Is Windowed Mode: ${e}`);const s=new $(this.name,this.version);s.S({id:this.Xt});const n=this.we();for(const t of this.palette){const o="#"+p(t.rgb).toUpperCase(),a=b(t.rgb);let r=1.05/(a+.05)>(a+.05)/.05?"white":"black";t.id||(r="transparent");const l="white"==r?"bm-f":"bm-g",c=t.rgb?.map(t=>Number(t)||0).join(","),h=-2==t.id||-1==t.id||0==t.id?"white":r,m=`--bm-1U: rgb(${c}); --bm-1V: ${h};`,{$e:d,ve:u,Me:f,xe:g,ye:w,Ce:x}=n[t.id],y=!!this.oe.Te.get(t.id);if(e){const e=`background-size: auto 100%; background-repeat: repeat-x; background-image: url("data:image/svg+xml;utf8,");`;s.S({class:"bm-L bm-z bm-x","data-id":t.id,"data-name":t.name,"data-premium":+t.premium,"data-state":y?"hidden":"shown","data-correct":Number.isNaN(parseInt(d))?"0":d,"data-total":g,"data-percent":"%"==f.slice(-1)?f.slice(0,-1):"0","data-incorrect":x||0},(e,s)=>i(this,W,at).call(this,s,t)).S({class:"bm-a",style:`background-color: rgb(${t.rgb?.map(t=>Number(t)||0).join(",")});${t.premium?e:""}`}).it({class:"bm-A bm-z-visibility "+l,"data-state":y?"hidden":"shown","aria-label":y?`Show the color ${t.name||""} on templates.`:`Hide the color ${t.name||""} on templates.`,innerHTML:y?this.re:this.ae,style:`color: ${r};`},(e,s)=>{s.onclick=e=>{e.stopPropagation(),i(this,W,nt).call(this,s,t)},t.id||(s.disabled=!0),i(this,W,st).call(this,s,t)}).M().k({textContent:`#${t.id.toString().padStart(2,0)}`,style:`color: ${-1==t.id||0==t.id?"white":r}`}).M().H(2,{textContent:t.name,style:`color: ${-1==t.id||0==t.id?"white":r}`}).M().k({class:"bm-9",textContent:`${u} / ${w}`,style:`color: ${-1==t.id||0==t.id?"white":r}; flex: 1 1 auto; text-align: right;`}).M().M().M()}else s.S({class:"bm-L bm-z bm-x",style:m,"data-id":t.id,"data-name":t.name,"data-premium":+t.premium,"data-state":y?"hidden":"shown","data-correct":Number.isNaN(parseInt(d))?"0":d,"data-total":g,"data-percent":"%"==f.slice(-1)?f.slice(0,-1):"0","data-incorrect":x||0},(e,s)=>i(this,W,at).call(this,s,t)).S({class:"bm-1r","aria-hidden":"true"}).M().S({class:"bm-z-main"}).S({class:"bm-a"}).it({class:"bm-A bm-z-visibility "+l,"data-state":y?"hidden":"shown","aria-label":y?`Show the color ${t.name||""} on templates.`:`Hide the color ${t.name||""} on templates.`,innerHTML:y?this.re:this.ae,style:`color: ${h};`},(e,s)=>{s.onclick=e=>{e.stopPropagation(),i(this,W,nt).call(this,s,t)},t.id||(s.disabled=!0),i(this,W,st).call(this,s,t)}).M().M().S({class:"bm-z-title"}).k({textContent:`#${t.id.toString().padStart(2,0)} / ${-2==t.id?"mixed":o}`}).M().H(2,{textContent:t.name}).M().M().M().S({class:"bm-z-meta"}).S({class:"bm-z-progress"}).N({class:"bm-9",innerHTML:`${u} /
${w}`}).M().k({class:"bm-6",innerHTML:`${f} done
${"number"!=typeof x||isNaN(x)?"???":x} off`}).M().M().M().M()}s.C(t)},et=function(t,e,i){this.sortPrimary=t,this.sortSecondary=e,this.showUnused=i;const s=document.querySelector(`#${this.Xt}`),n=Array.from(s.children);n.sort((s,n)=>{const o=s.getAttribute("data-"+t),a=n.getAttribute("data-"+t),r=parseFloat(o),l=parseFloat(a),c=!isNaN(r),h=!isNaN(l);if(i?s.classList.remove("bm-I"):Number(s.getAttribute("data-total"))||s.classList.add("bm-I"),c&&h)return"ascending"===e?r-l:l-r;{const t=o.toLowerCase(),i=a.toLowerCase();return ti?"ascending"===e?1:-1:0}}),n.forEach(t=>s.appendChild(t))},it=function(t){const e=document.querySelector(`#${this.Xt}`),i=Array.from(e.children);for(const e of i){if(e.classList?.contains("bm-I"))continue;const i=e.querySelector(".bm-z-visibility");("hidden"!=i.dataset.state||t)&&("shown"==i.dataset.state&&t||i.click())}},st=function(t,e){const i="hidden"==t.dataset.state?`Show the color ${e.name||""} on templates.`:`Hide the color ${e.name||""} on templates.`;t.ariaLabel=i;const s=t.closest(".bm-z");s?.setAttribute("aria-label",i),s?.setAttribute("data-state",t.dataset.state)},nt=function(t,e){t&&!t.disabled&&e.id&&(t.style.textDecoration="none",t.disabled=!0,"shown"==t.dataset.state?(t.innerHTML=this.re,t.dataset.state="hidden",this.oe.ke(e.id,!0),i(this,W,ot).call(this,t,"hide")):(t.dataset.state="shown",this.oe.ke(e.id,!1),i(this,W,ot).call(this,t,"show")),i(this,W,st).call(this,t,e),t.disabled=!1,t.style.textDecoration="")},ot=function(t,e){if(!t)return;const i="hide"==e?"bm-19":"bm-1a";t.classList.remove("bm-19","bm-1a"),t.offsetWidth,t.classList.add(i);let s=null;const n=()=>{window.clearTimeout(s),t.classList.remove(i),"show"==e&&"shown"==t.dataset.state&&(t.innerHTML=this.ae)};t.addEventListener("animationend",n,{once:!0}),s=window.setTimeout(n,280)},at=function(t,e){t&&e.id&&(t.classList.add("bm-z-toggle"),t.tabIndex=0,t.setAttribute("role","button"),t.onclick=s=>{if(s.target instanceof Element&&s.target.closest("button, a, input, select, textarea"))return;const n=t.querySelector(".bm-z-visibility");i(this,W,nt).call(this,n,e)},t.onkeydown=e=>{"Enter"!=e.key&&" "!=e.key||(e.preventDefault(),t.click())})},rt=function(){this.ce=0,this.he=0,this.be=0,this.ue=0,this.de=new Map,this.me=new Map;for(const t of this.oe.Ne){const e=t.Ht?.total??0;this.be+=e??0;const i=t.Ht?.colors??new Map;for(const[t,e]of i){const i=Number(e)||0,s=this.me.get(t)??0;this.me.set(t,s+i)}const s=t.Ht?.correct??{};this.ce+=Object.keys(s).length,this.he+=Object.keys(t.Dt).length;for(const t of Object.values(s))for(const[e,i]of t){const t=Number(i)||0;this.ue+=t;const s=this.de.get(e)??0;this.de.set(e,s+t)}}console.log(`Tiles loaded: ${this.ce} / ${this.he}`),this.ue>=this.be&&this.be&&this.ce==this.he&&(new z).Jt(document.querySelector(`#${this.xt}`)),this.timeRemaining=new Date(30*(this.be-this.ue)*1e3+Date.now()),this.pe=function(t){const e=t.getMonth()+1,i=t.getDate(),s=String(t.getFullYear()).slice(-2),n=String(t.getMinutes()).padStart(2,"0"),o=new Intl.DateTimeFormat(void 0,{De:"numeric"}).resolvedOptions().hour12;let a=t.getHours(),r="";return o?(r=a>=12?" PM":" AM",a=a%12||12):a=String(a).padStart(2,"0"),`${e}/${i}/${s} ${a}:${n}${r}`}(this.timeRemaining)},lt=new WeakSet,ct=async function(t,e,i){i.preventDefault();const s=await async function(t){let e="";return t&&(e=t.clipboardData.getData("text/plain")),0!=e.length||(await navigator.clipboard.readText().then(t=>{e=t}).catch(t=>{r("Failed to retrieve clipboard data using navigator! Using fallback methods...")}),0!=e.length||(e=window.clipboardData?.getData("Text"))),e}(i),n=s.split(/[^a-zA-Z0-9]+/).filter(t=>t).map(Number).filter(t=>!isNaN(t));2==n.length&&"bm-O"==e.id?(t.nt("bm-O",n?.[0]||""),t.nt("bm-P",n?.[1]||"")):1==n.length?t.nt(e.id,n?.[0]||""):(t.nt("bm-Q",n?.[0]||""),t.nt("bm-R",n?.[1]||""),t.nt("bm-O",n?.[2]||""),t.nt("bm-P",n?.[3]||""))};var ft=class extends ${constructor(t,i,s,n=void 0){super(t,i),e(this,ht),this.window=null,this.xt="bm-u",this.yt=document.body,this.Le=JSON.parse(GM_getValue("bmTemplates","{}")),this.scriptVersion=this.Le?.scriptVersion,this.schemaVersion=this.Le?.schemaVersion,this.Oe=void 0,this.He=s,this.oe=n}vt(){if(document.querySelector(`#${this.xt}`))return void document.querySelector(`#${this.xt}`).remove();let t="";document.querySelector("#bm-F")||(t=t.concat("z-index: 9001;").trim()),this.window=this.S({id:this.xt,class:"bm-W",style:t},(t,e)=>{}).ct().it({class:"bm-s",innerHTML:y,"aria-label":'Minimize window "Template Wizard"',"data-button-status":"expanded"},(t,e)=>{e.onclick=()=>t.dt(e),e.ontouchend=()=>{e.click()}}).M().S().M().it({class:"bm-s",textContent:"✖","aria-label":'Close window "Template Wizard"'},(t,e)=>{e.onclick=()=>{document.querySelector(`#${this.xt}`)?.remove()},e.ontouchend=()=>{e.click()}}).M().M().S({class:"bm-m"}).S({class:"bm-L bm-h"}).H(1,{textContent:"Template Wizard"}).M().M().I().M().S({class:"bm-L"}).H(2,{textContent:"Status"}).M().T({id:"bm-v",textContent:"Loading template storage status..."}).M().M().S({class:"bm-L bm-H"}).H(2,{textContent:"Detected templates:"}).M().M().M().M().C(this.yt),this.ut(`#${this.xt}.bm-W`,`#${this.xt} .bm-S`),i(this,ht,mt).call(this),i(this,ht,dt).call(this)}};ht=new WeakSet,mt=function(){const t=this.schemaVersion.split(/[-\.\+]/),e=this.He.split(/[-\.\+]/);let s="";t[0]==e[0]?t[1]==e[1]?(s='Template storage health: Healthy!
No futher action required. (Reason: Semantic version matches)',this.Oe="Good"):(s='Template storage health: Poor!
You can still use your template, but some features may not work. It is recommended that you update Blue Marble\'s template storage. (Reason: MINOR version mismatch)',this.Oe="Poor"):t[0]Bad!
It is guaranteed that some features are broken. You might still be able to use the template. It is HIGHLY recommended that you download all templates and update Blue Marble\'s template storage before continuing. (Reason: MAJOR version mismatch)',this.Oe="Bad"):(s='Template storage health: Dead!
Blue Marble can not load the template storage. (Reason: MAJOR version unknown)',this.Oe="Dead");const n=`
If you want to continue using your current templates, then make sure the template storage (schema) is up-to-date.
If you don't want to update the template storage, then downgrade Blue Marble to version ${a(this.scriptVersion)} to continue using your templates.
Alternatively, if you don't care about corrupting the templates listed below, you can fix any issues with the template storage by uploading a new template.`,o=function(){const t=[...document.querySelectorAll("body > div > .hidden")].filter(t=>/version:/i.test(t.textContent));if(t[0]){const e=t[0].textContent?.match(/\d+/);return e?new Date(Number(e[0])):void 0}}();let r=o?o.toLocaleString(void 0,{Ie:"long",Be:"numeric",De:"2-digit",Pe:"2-digit",Ae:"2-digit"}):"???";this.nt("#bm-v",`${s}
Your templates were created during Blue Marble version ${a(this.scriptVersion)} with schema version ${a(this.schemaVersion)}.
The current Blue Marble version is ${a(this.version)} and requires schema version ${a(this.He)}.
Wplace was last updated on ${r}.${"Good"!=this.Oe?n:""}`);const l=new $(this.name,this.version);"Dead"!=this.Oe&&(l.S({class:"bm-L bm-D bm-h",style:"gap: 1.5ch;"}),l.it({textContent:"Download all templates"},(t,e)=>{e.onclick=()=>{e.disabled=!0,this.oe.ze().then(()=>{e.disabled=!1})}}).M()),"Poor"!=this.Oe&&"Bad"!=this.Oe||l.it({textContent:`Update template storage to ${this.He}`},(t,e)=>{e.onclick=()=>{e.disabled=!0,i(this,ht,ut).call(this,!0)}}).M(),l.M().C(document.querySelector("#bm-v").parentNode)},dt=function(){const t=this.Le?.templates;if(Object.keys(t).length>0){const e=document.querySelector(`#${this.xt} .bm-H`),i=new $(this.name,this.version);i.S({id:"bm-B",class:"bm-L"});for(const e in t){const s=e,o=t[e];if(t.hasOwnProperty(e)){const t=s.split(" "),e=Number(t?.[0]),a=m(t?.[1]||"0",this.oe.Fe),r=o.name||`Template ${e||""}`,l=o?.coords?.split(",").map(Number),c=o.pixels?.total??void 0,h=void 0,d="number"==typeof e?n(e):"???",u="number"==typeof a?n(a):"???",b="number"==typeof c?n(c):"???";i.S({class:"bm-L bm-D"}).S({class:"bm-D",style:"flex-direction: column; gap: 0;"}).S({class:"bm-1",textContent:h||"🖼️"}).M().k({textContent:`#${d}`}).M().M().S({class:"bm-D bm-0"}).H(3,{textContent:r}).M().N({textContent:`Uploaded by user #${u}`}).M().N({textContent:`Coordinates: ${l.join(", ")}`}).M().N({textContent:`Total Pixels: ${b}`}).M().M().M()}}i.M().C(e)}},ut=async function(t){if(t){const t=document.querySelector(`#${this.xt} .bm-m`);t.innerHTML="",new $(this.name,this.version).S({class:"bm-L"}).S({class:"bm-L bm-h"}).H(1,{textContent:"Template Wizard"}).M().M().I().M().S({class:"bm-L"}).H(2,{textContent:"Status"}).M().T({textContent:"Updating template storage. Please wait..."}).M().M().M().C(t)}GM_deleteValue("bmCoords");const e=this.Le?.templates;if(Object.keys(e).length>0)for(const[t,i]of Object.entries(e))if(e.hasOwnProperty(t)){const t=new A({displayName:i.name,Dt:i.tiles});t.Rt();const e=await this.oe.We(t);await this.oe.Ue(e,t.displayName,t.coords)}t&&(console.log("Restarting Template Wizard..."),document.querySelector(`#${this.xt}`).remove(),new ft(this.name,this.version,this.He,this.oe).vt())};var gt,wt,xt,yt,$t,vt,Mt,Ct,St=ft;gt=new WeakSet,wt=function(){const t=this.l?.St?.filter,e=Array.isArray(t)?t:[];this.Te.clear();for(const t of e){const e=Number(t);Number.isFinite(e)&&this.Te.set(e,!0)}},xt=function(){this.l&&(this.l.St.filter=Array.from(this.Te.keys()).map(t=>Number(t)).filter(t=>Number.isFinite(t)).sort((t,e)=>t-e),this.l.Tt())},yt=async function(){GM.setValue("bmTemplates",JSON.stringify(this.Ve))},$t=async function(t){console.log("Parsing BlueMarble...");const e=t.templates;console.log(`BlueMarble length: ${Object.keys(e).length}`);const i=t?.schemaVersion,s=i.split(/[-\.\+]/),n=this.schemaVersion.split(/[-\.\+]/),o=t?.scriptVersion;console.log(`BlueMarble Template Schema: ${i}; Script Version: ${o}`),s[0]==n[0]?(s[1]!=n[1]&&new St(this.name,this.version,this.schemaVersion,this).vt(),this.Ne=await async function({Ot:t,Ge:i,Ne:s}){if(Object.keys(e).length>0)for(const n in e){const o=n,a=e[n];if(console.log(`Template Key: ${o}`),e.hasOwnProperty(n)){const e=o.split(" "),n=Number(e?.[0]),r=e?.[1]||"0",l=a.name||`Template ${n||""}`,c={total:a.pixels?.total,colors:new Map(Object.entries(a.pixels?.colors||{}).map(([t,e])=>[Number(t),e]))},h=a.tiles,m={},d={},b=t*i;for(const t in h)if(console.log(t),h.hasOwnProperty(t)){const e=u(h[t]),i=new Blob([e],{type:"image/png"}),s=await createImageBitmap(i);m[t]=s;const n=new OffscreenCanvas(b,b).getContext("2d");n.drawImage(s,0,0);const o=n.getImageData(0,0,s.width,s.height);d[t]=new Uint32Array(o.data.buffer)}const p=new A({displayName:l,kt:n||this.Ne?.length||0,Nt:r||""});p.Ht=c,p.Dt=m,p.Lt=d,s.push(p),console.log(this.Ne),console.log("^^^ This ^^^")}}return s}({Ot:this.Ot,Ge:this.Ge,Ne:this.Ne})):s[0]>>24&255,y=g>>>24&255,$=b.get(w)??-2,v=b.get(g)??-2;if(this.Te.get($)&&(e[i*c+h]=g),-1==$){const t=536870912;this.Te.get($)?e[i*c+h]=0:(u/o&1)==(f/o&1)?(e[i*c+h]=t,e[(i-1)*c+(h-1)]=t,e[(i-1)*c+(h+1)]=t,e[(i+1)*c+(h-1)]=t,e[(i+1)*c+(h+1)]=t):(e[i*c+h]=0,e[(i-1)*c+h]=t,e[(i+1)*c+h]=t,e[i*c+(h-1)]=t,e[i*c+(h+1)]=t)}if(!n&&x>m&&v!=$&&(d||y>m)){const t=e[i*c+h];for(const n of s){const[s,o,a]=n,r=0!=s?1!=s?t:4278190335:0;e[(i+a)*c+(h+o)]=r}}if(-1==$&&g<=m){const t=p.get($);p.set($,t?t+1:1);continue}if(x<=m||y<=m)continue;if(v!=$)continue;const M=p.get($);p.set($,M?M+1:1)}return console.log("List of template pixels that match the tile:"),console.log(p),{qe:p,Ze:e}},Mt=new WeakSet,Ct=function(t){const e=JSON.parse(GM_getValue("bmUserSettings","{}"));e.telemetry=t,GM.setValue("bmUserSettings",JSON.stringify(e))};var Tt=GM_info.script.name.toString(),kt=GM_info.script.version.toString();!function(t){const e=document.createElement("script");e.setAttribute("bm-11",Tt),e.setAttribute("bm-X","color: cornflowerblue;"),e.textContent=`(${t})();`,document.documentElement?.appendChild(e),e.remove()}(()=>{const t=document.currentScript,e=t?.getAttribute("bm-11")||"Blue Marble",i=t?.getAttribute("bm-X")||"",s=new Map;window.addEventListener("message",t=>{const{source:n,endpoint:o,blobID:a,blobData:r,blink:l}=t.data,h=Date.now()-l;if(console.groupCollapsed(`%c${e}%c: ${s.size} Recieved IMAGE message about blob "${a}"`,i,""),console.log(`Blob fetch took %c${String(Math.floor(h/6e4)).padStart(2,"0")}:${String(Math.floor(h/1e3)%60).padStart(2,"0")}.${String(h%1e3).padStart(3,"0")}%c MM:SS.mmm`,i,""),console.log(s),console.groupEnd(),"blue-marble"==n&&a&&r&&!o){const t=s.get(a);"function"==typeof t?t(r):c(`%c${e}%c: Attempted to retrieve a blob (%s) from queue, but the blobID was not a function! Skipping...`,i,"",a),s.delete(a)}});const n=window.fetch;window.fetch=async function(...t){const o=await n.apply(this,t),a=o.clone(),r=(t[0]instanceof Request?t[0]?.url:t[0])||"ignore",l=a.headers.get("content-type")||"";if(l.includes("application/json"))console.log(`%c${e}%c: Sending JSON message about endpoint "${r}"`,i,""),a.json().then(t=>{const s=r?.split("?")[0].split("/").filter(t=>t&&isNaN(Number(t))).filter(t=>t&&!t.includes(".")).pop();if("me"==s)try{sessionStorage.setItem("bm-2A",JSON.stringify(t))}catch(t){console.warn(`%c${e}%c: Failed to cache "/me" payload`,i,"",t)}window.postMessage({source:"blue-marble",endpoint:r,jsonData:t},"*")}).catch(t=>{console.error(`%c${e}%c: Failed to parse JSON: `,i,"",t)});else if(l.includes("image/")&&!r.includes("openfreemap")&&!r.includes("maps")){const t=Date.now(),n=await a.blob();return console.log(`%c${e}%c: ${s.size} Sending IMAGE message about endpoint "${r}"`,i,""),new Promise(o=>{const l=crypto.randomUUID();s.set(l,t=>{o(new Response(t,{headers:a.headers,status:a.status,statusText:a.statusText})),console.log(`%c${e}%c: ${s.size} Processed blob "${l}"`,i,"")}),window.postMessage({source:"blue-marble",endpoint:r,blobID:l,blobData:n,blink:t})}).catch(n=>{const o=Date.now();console.error(`%c${e}%c: Failed to Promise blob!`,i,""),console.groupCollapsed(`%c${e}%c: Details of failed blob Promise:`,i,""),console.log(`Endpoint: ${r}\nThere are ${s.size} blobs processing...\nBlink: ${t.toLocaleString()}\nTime Since Blink: ${String(Math.floor(o/6e4)).padStart(2,"0")}:${String(Math.floor(o/1e3)%60).padStart(2,"0")}.${String(o%1e3).padStart(3,"0")} MM:SS.mmm`),console.error("Exception stack:",n),console.groupEnd()})}return o}});var Nt=`div:has(>confetti-piece){position:absolute;inset:0;overflow:hidden;pointer-events:none}confetti-piece{position:absolute;top:-10px;width:var(--size);height:var(--size);background:currentColor;transform:translate3d(var(--x),-10vh,0) rotate(var(--rot));animation:fall var(--duration) linear var(--delay);will-change:transform;pointer-events:none}@keyframes fall{to{transform:translate3d(var(--x),110vh,0) rotate(calc(var(--rot) + 720deg))}}.bm-screenreader{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.bm-W{--bm-surface-strong: rgba(9, 20, 42, .5);--bm-surface-soft: rgba(24, 41, 74, .28);--bm-surface-glass: rgba(255, 255, 255, .1);--bm-surface-glass-strong: rgba(255, 255, 255, .18);--bm-border-soft: rgba(255, 255, 255, .18);--bm-border-strong: rgba(163, 228, 255, .34);--bm-text-primary: rgba(17, 36, 66, .96);--bm-text-secondary: rgba(36, 57, 90, .84);--bm-accent-start: #baf6ff;--bm-accent-end: #81b6ff;--bm-accent-shadow: rgba(132, 182, 255, .22);--bm-font-body: "Rajdhani", "Segoe UI Variable Text", "Segoe UI", sans-serif;--bm-font-display: "Michroma", "Orbitron", "Segoe UI", sans-serif;--bm-font-mono: "Roboto Mono", "Rajdhani", "Courier New", monospace;position:fixed;isolation:isolate;overflow:hidden;background:radial-gradient(circle at 14% 12%,rgba(255,255,255,.24),transparent 18%),radial-gradient(circle at 86% 8%,rgba(186,246,255,.22),transparent 24%),radial-gradient(circle at 82% 84%,rgba(129,182,255,.18),transparent 28%),linear-gradient(145deg,#ffffff2e,#ffffff0f 22%,#6991d414 54%,#09142a2e);color:var(--bm-text-primary);padding:6px;border-radius:16px;border:1px solid var(--bm-border-soft);box-shadow:0 18px 40px #0003,inset 0 1px #ffffff38,inset 0 -1px #ffffff0d;z-index:9000;transition:background .32s ease,border-color .22s ease,box-shadow .22s ease,opacity .22s ease,transform 0s,width .22s ease,max-width .22s ease,max-height .22s ease;top:75px;left:60px;width:auto;max-height:fit-content;max-width:calc(100% - 135px);backdrop-filter:blur(26px) saturate(1.25);font-family:var(--bm-font-body);letter-spacing:.04em}.bm-W:before,.bm-W:after{content:"";position:absolute;inset:0;pointer-events:none}.bm-W:before{border-radius:inherit;padding:1px;background:linear-gradient(135deg,#ffffff73,#ffffff1f 24%,#baf6ff38 58%,#81b6ff4d);-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;opacity:.85}.bm-W:after{border-radius:inherit;background:linear-gradient(180deg,rgba(255,255,255,.2),transparent 24%),radial-gradient(circle at 18% 0%,rgba(255,255,255,.22),transparent 22%),radial-gradient(circle at 88% 16%,rgba(186,246,255,.18),transparent 18%);opacity:1}.bm-S{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:.28ch;padding:.18rem .24rem;border-radius:10px;border:1px solid rgba(255,255,255,.16);background:radial-gradient(circle at 0 0,rgba(255,255,255,.22) 0,transparent 42%),linear-gradient(135deg,#ffffff2e,#ffffff14);cursor:grab;width:100%;height:fit-content;box-shadow:inset 0 1px #ffffff29,0 6px 18px #0000001a}.bm-S.bm-M{cursor:grabbing}.bm-W:has(.bm-S.bm-M){pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.bm-S.bm-M{pointer-events:auto}.bm-T{display:inline-block;height:2.2em;margin-right:.45ch;padding:.2rem;border-radius:12px;vertical-align:middle;background:linear-gradient(135deg,#ffffff38,#ffffff14);box-shadow:inset 0 1px #ffffff29,0 8px 18px #0000001f}.bm-W h1{display:inline-block;font-size:1rem;font-weight:700;vertical-align:middle;font-family:var(--bm-font-display);text-transform:uppercase;letter-spacing:.14em;color:#10213cf5}.bm-S h1,.bm-y{font-size:.78rem;user-select:none;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-family:var(--bm-font-display);letter-spacing:.14em;color:#122542f2;text-shadow:0 1px 0 rgba(255,255,255,.28)}.bm-S div:has(h1){display:contents}.bm-W h2{display:inline-block;font-size:.88rem;font-weight:700;vertical-align:middle;font-family:var(--bm-font-display);letter-spacing:.1em;color:#122340f5}.bm-W h3{display:inline-block;font-size:large;font-weight:700;font-family:var(--bm-font-display);letter-spacing:.08em;color:#122340f5}.bm-W p{color:var(--bm-text-secondary);line-height:1.5;letter-spacing:.035em}.bm-W hr{border:none;height:1px;margin:.32rem 0;background:linear-gradient(90deg,transparent,rgba(255,255,255,.28),transparent)}.bm-L.bm-h{width:fit-content;margin-left:auto;margin-right:auto}.bm-L{margin:.24em 0}.bm-W input,.bm-W select,.bm-W textarea,.bm-W button{font:inherit}.bm-W button{appearance:none;color:var(--bm-text-primary);font-family:var(--bm-font-display);background:linear-gradient(135deg,#ffffff38,#a4d0ff24);border:1px solid rgba(255,255,255,.22);border-radius:999px;padding:.28em .62em;min-height:1.78em;font-weight:600;letter-spacing:.1em;box-shadow:inset 0 1px #ffffff38,0 8px 20px #0000001a;transition:background .18s ease,border-color .18s ease,box-shadow .18s ease,filter .18s ease,opacity .18s ease,transform .18s ease}.bm-W button:hover,.bm-W button:focus-visible{background:linear-gradient(135deg,#ffffff47,#baf6ff2e);border-color:#e6f5ff5c;box-shadow:inset 0 1px #ffffff42,0 10px 22px #0000001f;transform:translateY(-1px)}.bm-W button:focus-visible,.bm-W input:focus-visible,.bm-W select:focus-visible,.bm-W textarea:focus-visible{outline:none;border-color:#74e7ff9e;box-shadow:0 0 0 3px #74e7ff26,inset 0 1px #ffffff1f}.bm-W button:active{transform:translateY(0) scale(.98);filter:brightness(.98);box-shadow:inset 0 1px #ffffff1f,0 8px 16px #12244e3d}.bm-W button:disabled{opacity:.56;cursor:not-allowed;text-decoration:none;transform:none;filter:saturate(.72);box-shadow:none}.bm-W button.bm-1T{color:#07203b;background:linear-gradient(135deg,#ffffff6b,#baf6ff57);border-color:#eff8ff6b;box-shadow:inset 0 1px #ffffff70,0 10px 22px #81b6ff24}.bm-W button.bm-1T:hover,.bm-W button.bm-1T:focus-visible{background:linear-gradient(135deg,#ffffff85,#ccfaff5c)}.bm-W button.bm-1F{background:linear-gradient(135deg,#ffffff29,#ffffff14);border-color:#ffffff2e;box-shadow:inset 0 1px #ffffff24,0 8px 20px #00000014}.bm-W button.bm-1F:hover,.bm-W button.bm-1F:focus-visible{background:linear-gradient(135deg,#ffffff3d,#baf6ff1f)}.bm-s{display:inline-flex;align-items:center;justify-content:center;border:1px solid rgba(255,255,255,.16);inline-size:1.62rem;block-size:1.62rem;min-height:1.62rem!important;min-width:1.62rem;margin-top:0;text-align:center;line-height:1;padding:0!important;aspect-ratio:1 / 1;border-radius:50%!important;background:linear-gradient(135deg,#ffffff3d,#ffffff1a)!important;box-shadow:inset 0 1px #ffffff2e,0 8px 18px #0000001a!important;overflow:hidden;flex:0 0 auto;font-size:.74rem}.bm-s svg{display:block;width:70%;height:70%;flex:0 0 auto;margin:auto;color:currentColor;pointer-events:none;transform:translateZ(0);overflow:visible}.bm-s .bm-1l{width:68%;height:68%;transform:translateY(.5px) translateZ(0)}.bm-s .bm-1g{width:62%;height:62%;transform:translateY(.75px) translateZ(0)}#bm-t.bm-N .bm-s .bm-1g{transform:translateZ(0)}.bm-J{vertical-align:middle}.bm-J svg{width:50%;margin:0 auto;fill:#111}.bm-W button.bm-A{background:transparent!important;box-shadow:none!important;border-color:transparent!important}.bm-A.bm-f:hover,.bm-A.bm-f:focus{background-color:#ffffff2e!important}.bm-A.bm-f:active{background-color:#ffffff3d!important}.bm-A.bm-g:hover,.bm-A.bm-g:focus{background-color:#00000024!important}.bm-A.bm-g:active{background-color:#0003!important}.bm-W input[type=number],.bm-W select,.bm-W textarea{color:var(--bm-text-primary);font-family:var(--bm-font-body);background:linear-gradient(180deg,#ffffff29,#ffffff0f);border:1px solid rgba(255,255,255,.18);border-radius:12px;box-shadow:inset 0 1px #ffffff1f}input[type=number].bm-C{appearance:auto;-moz-appearance:textfield;width:5.9ch;margin-left:1ch;padding:.2em .35ch;font-size:small}input[type=number].bm-C::-webkit-outer-spin-button,input[type=number].bm-C::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}div:has(>.bm-K)>button{width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bm-K,input[type=file]{display:none!important;visibility:hidden!important;position:absolute!important;left:-9999px!important;top:-9999px!important;width:0!important;height:0!important;opacity:0!important;z-index:-9999!important;pointer-events:none!important}.bm-W select{padding:.22em .45ch}.bm-W label:has(input[type=checkbox]){display:flex;width:fit-content;gap:1ch;align-items:center;color:var(--bm-text-secondary)}.bm-W input[type=checkbox]{width:1em;accent-color:#74e7ff}.bm-m{overflow:hidden;max-height:calc(100% - 5px);transition:height .3s cubic-bezier(.4,0,.2,1)}.bm-W textarea{font-size:small;padding:.38em .52em;height:4em;width:100%;resize:vertical;line-height:1.45}.bm-W textarea::placeholder,.bm-W input::placeholder{color:#2f446699}.bm-W a:not(:has(*)){color:#1558a4f0;text-decoration:underline;text-decoration-color:#1558a459}.bm-W small{font-size:x-small;font-family:var(--bm-font-display);letter-spacing:.12em;color:var(--bm-text-secondary)}.bm-W ul li{list-style:disc;margin-left:5ch}.bm-W .bm-L.bm-H{max-height:var(--bm-H-max-height, calc(80vh - 150px) );overflow:auto;scrollbar-width:thin;scrollbar-color:rgba(146,221,255,.42) rgba(255,255,255,.05)}.bm-W .bm-L.bm-H::-webkit-scrollbar{width:10px;height:10px}.bm-W .bm-L.bm-H::-webkit-scrollbar-thumb{background:linear-gradient(180deg,#74e7ff7a,#538dff66);border-radius:999px;border:2px solid transparent;background-clip:padding-box}.bm-W .bm-L.bm-H::-webkit-scrollbar-track{background:#ffffff0a;border-radius:999px}.bm-x{display:flex;align-content:center;justify-content:space-between;align-items:center;gap:.35ch}.bm-D{display:flex;align-content:center;justify-content:center;align-items:center;gap:.35ch}.bm-_{white-space:pre;letter-spacing:0;line-height:1!important;font-size:1.6em;font-family:monospace}.bm-N .bm-L:not(#bm-F .bm-L){margin-top:.18em;margin-bottom:.18em}.bm-N h1:not(#bm-F h1){font-size:1em}#bm-t .bm-1M{display:block;width:1.28em;height:1.28em;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round;overflow:visible}#bm-t p svg{display:inline-block;height:1em;width:1em;color:currentColor;vertical-align:-.16em}#bm-t:not(.bm-N){width:min(50rem,calc(100vw - .55rem));max-width:min(50rem,calc(100vw - .55rem))!important}#bm-t .bm-20{padding-top:.08rem}#bm-t .bm-1S{gap:.22rem;flex-wrap:wrap;width:100%;padding:.16rem}#bm-t .bm-1S>button{flex:1 1 10rem}#bm-t .bm-1z{padding-right:.08rem}#bm-t .bm-1N{display:block;margin:0 .18rem}#bm-t .bm-1G{display:grid;grid-template-columns:repeat(4,minmax(0,1fr)) minmax(8.7rem,1.28fr);gap:.24rem}#bm-t .bm-1H,#bm-t .bm-1C{min-width:0;border-radius:11px;border:1px solid rgba(255,255,255,.18);background:linear-gradient(155deg,#ffffff2e,#ffffff12);box-shadow:inset 0 1px #ffffff29,0 8px 20px #00000014}#bm-t .bm-1H{min-height:2.28rem;display:flex;flex-direction:column;justify-content:center;gap:.04rem;padding:.24rem .42rem;color:#12233ff5;line-height:1.12}#bm-t .bm-1A{color:#314769d1;font-size:.62rem;letter-spacing:0;font-family:var(--bm-font-display);text-transform:uppercase}#bm-t .bm-1B{display:inline-block;min-width:0;color:#0f1f38f5;font-size:1em;font-weight:700;overflow-wrap:anywhere}#bm-t .bm-1H time{font-family:var(--bm-font-mono);font-size:.9em;letter-spacing:0;white-space:nowrap}#bm-t .bm-1C{padding:.38rem .48rem}#bm-t .bm-1C fieldset{border:none;padding:0;margin:0}#bm-t .bm-1C legend{margin-bottom:.12rem}#bm-t .bm-1C .bm-L{margin-top:.1rem;margin-bottom:.1rem}#bm-t .bm-1q{display:flex;justify-content:flex-start}#bm-t .bm-1q button{min-width:7.8rem}#bm-E{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-items:stretch;gap:.38rem}#bm-t .bm-z{position:relative;overflow:hidden;width:fit-content;max-width:35ch;padding:.28rem;gap:.28rem;border-radius:13px;border:1px solid rgba(255,255,255,.18);background:linear-gradient(160deg,#ffffff2e,#ffffff12);box-shadow:inset 0 1px #ffffff29,0 8px 20px #00000014;transition:background .25s ease,border-color .25s ease,box-shadow .25s ease,transform .25s ease}#bm-t .bm-z:before{content:"";position:absolute;inset:0;pointer-events:none;background:radial-gradient(circle at top right,rgba(255,255,255,.18),transparent 24%),radial-gradient(circle at 18% 0%,rgba(186,246,255,.12),transparent 22%)}#bm-t:not(.bm-N) .bm-z:before{background:linear-gradient(180deg,#ffffff14,#0000000a)}#bm-t:not(.bm-N) .bm-z:after{content:none}#bm-t .bm-z-toggle{cursor:pointer}#bm-t .bm-z:hover,#bm-t .bm-z:focus-within{transform:translateY(-2px);border-color:#92ddff42;box-shadow:inset 0 1px #fff3,0 10px 24px #0000001a}#bm-t:not(.bm-N) .bm-z{width:min(100%,23.5rem);max-width:23.5rem;min-height:6.15rem;display:grid;grid-template-columns:minmax(0,1.2fr) minmax(7.6rem,.8fr);align-items:stretch;gap:.48rem;padding:.5rem;color:var(--bm-1V);background-color:var(--bm-1U);background-image:none}#bm-t:not(.bm-N) .bm-z[data-id="-2"][data-state=shown]{background-image:conic-gradient(#a00,#aa0 16.6%,#0a0,#0aa 50%,#00a 66.6%,#a0a,#a00)}#bm-t:not(.bm-N) .bm-z[data-id="-1"][data-state=shown],#bm-t:not(.bm-N) .bm-z[data-id="0"][data-state=shown]{background-image:url('data:image/svg+xml;utf8,');background-color:#ffffff2e}#bm-t:not(.bm-N) .bm-z[data-state=hidden]{color:var(--bm-1V);border-color:#ffffff29;background-color:var(--bm-1U);background-image:none}#bm-t:not(.bm-N) .bm-z[data-id="-2"][data-state=hidden]{background-image:conic-gradient(#a00,#aa0 16.6%,#0a0,#0aa 50%,#00a 66.6%,#a0a,#a00)}#bm-t:not(.bm-N) .bm-z[data-id="-1"][data-state=hidden],#bm-t:not(.bm-N) .bm-z[data-id="0"][data-state=hidden]{background-image:url('data:image/svg+xml;utf8,');background-color:#ffffff2e}#bm-t:not(.bm-N) .bm-z[data-state=hidden]:before{opacity:.16}#bm-t:not(.bm-N) .bm-z>*{position:relative;z-index:1}#bm-t:not(.bm-N) .bm-1r{display:none}#bm-t:not(.bm-N) .bm-z[data-premium="1"] .bm-1r{position:absolute;top:50%;right:-3.2rem;z-index:0;display:block;width:10.5rem;aspect-ratio:1;background:currentColor;clip-path:polygon(50% 5%,62% 38%,98% 38%,69% 59%,80% 93%,50% 72%,20% 93%,31% 59%,2% 38%,38% 38%);opacity:.12;pointer-events:none;transform:translateY(-50%)}#bm-t:not(.bm-N) .bm-z[data-premium="1"][data-state=hidden] .bm-1r{opacity:.18}#bm-t:not(.bm-N) .bm-z-main,#bm-t:not(.bm-N) .bm-z-meta,#bm-t:not(.bm-N) .bm-z-progress{min-width:0;display:flex;flex-direction:column}#bm-t:not(.bm-N) .bm-z-main{position:static;justify-content:flex-start;gap:.4rem}#bm-t:not(.bm-N) .bm-z-title{min-width:0}#bm-t:not(.bm-N) .bm-z-meta{align-items:flex-end;justify-content:flex-start;gap:.36rem;text-align:right}#bm-t:not(.bm-N) .bm-z-progress{align-items:flex-end;gap:.18rem}#bm-t:not(.bm-N) .bm-z .bm-9{font-family:var(--bm-font-display);font-size:1rem;font-weight:700;line-height:1.15;min-height:2.3em;overflow-wrap:anywhere}#bm-t .bm-z-toggle:focus-visible{outline:none;border-color:#74e7ff9e;box-shadow:0 0 0 3px #74e7ff26,inset 0 1px #fff3,0 10px 24px #0000001a}#bm-t .bm-a{display:block;width:fit-content;height:fit-content;padding:.26rem;border:1px solid rgba(255,255,255,.18);border-radius:10px;box-shadow:inset 0 1px #ffffff24,0 6px 16px #00000014}#bm-t .bm-z[data-id="-2"] .bm-a{background:conic-gradient(#a00,#aa0 16.6%,#0a0,#0aa 50%,#00a 66.6%,#a0a,#a00)}#bm-t .bm-z[data-id="-1"] .bm-a{background:url('data:image/svg+xml;utf8,') repeat;background-color:transparent!important}#bm-t .bm-z[data-id="-1"] .bm-a svg{color:#fff!important}#bm-t .bm-z[data-id="0"] .bm-a{background-color:transparent!important}#bm-t .bm-a button{display:inline-flex;align-items:center;justify-content:center;padding:.24em;min-width:2.05rem;min-height:2.05rem;border-radius:999px;line-height:1}#bm-t .bm-a .bm-1M{width:1.55rem;height:1.55rem;filter:drop-shadow(0 1px 0 rgba(255,255,255,.18))}#bm-t:not(.bm-N) .bm-a{position:absolute;left:.52rem;bottom:.46rem;z-index:1;display:inline-flex;width:1.65rem;height:1.65rem;align-items:center;justify-content:center;padding:0;color:currentColor;background:transparent!important;border:none;border-radius:0;box-shadow:none;opacity:.72;pointer-events:none}#bm-t:not(.bm-N) .bm-z[data-state=hidden] .bm-a{opacity:.88}#bm-t:not(.bm-N) .bm-a button{min-width:1.65rem;min-height:1.65rem;padding:0;border-radius:0;color:currentColor!important;pointer-events:none}#bm-t:not(.bm-N) .bm-a .bm-1M{width:1.65rem;height:1.65rem;filter:none}#bm-t .bm-z-visibility.bm-19 .bm-1M path:nth-of-type(3),#bm-t .bm-z-visibility.bm-1a .bm-1M path:nth-of-type(3){stroke-dasharray:20}#bm-t .bm-z-visibility.bm-19 .bm-1M path:nth-of-type(3){stroke-dashoffset:20;animation:bm-filter-eye-slash-draw .22s ease-out forwards}#bm-t .bm-z-visibility.bm-1a .bm-1M path:nth-of-type(3){stroke-dashoffset:0;animation:bm-filter-eye-slash-erase .22s ease-in forwards}@keyframes bm-filter-eye-slash-draw{to{stroke-dashoffset:0}}@keyframes bm-filter-eye-slash-erase{to{stroke-dashoffset:20}}#bm-t .bm-z>.bm-x{flex-direction:column;align-items:flex-start;gap:.02rem}#bm-t .bm-z h2{margin:.04rem 0 0}#bm-t:not(.bm-N) .bm-z h2{display:block;max-width:100%;margin:.08rem 0 0;color:currentColor;font-size:1.02rem;letter-spacing:0;line-height:1.12;overflow-wrap:anywhere}#bm-t .bm-z .bm-6{margin:.1rem 0 0}#bm-t .bm-z small{font-size:.75em}#bm-t:not(.bm-N) .bm-z small{color:currentColor;letter-spacing:0;opacity:.82}#bm-t .bm-z.bm-I{display:none}#bm-t.bm-N{--bm-H-max-height: 100%;display:grid;grid-template-rows:auto minmax(0,1fr);width:360px;height:min(60vh,22rem);min-width:360px;min-height:180px;max-width:min(1000px,calc(100vw - 16px))!important;max-height:min(1400px,calc(100vh - 16px))!important;overflow:hidden;box-sizing:border-box;position:fixed;transition:background .32s ease,border-color .22s ease,box-shadow .22s ease,transform 0s}#bm-t.bm-N .bm-m{display:grid;grid-template-rows:auto auto auto auto minmax(0,1fr);grid-row:2;min-height:0;min-width:0;overflow:hidden}#bm-t.bm-N .bm-1S{gap:.16rem;flex-wrap:nowrap;width:100%;padding:.12rem}#bm-t.bm-N .bm-1S>button{flex:1 1 0;min-width:0}#bm-t.bm-N #bm-E{flex-direction:column;align-items:stretch;gap:.16rem;width:100%;align-self:stretch;min-width:0;box-sizing:border-box}#bm-t.bm-N .bm-z{width:100%;max-width:none;align-self:stretch;flex:1 1 auto;min-width:0;margin:0;padding:.12rem;border-radius:11px;box-sizing:border-box}#bm-t.bm-N .bm-z>.bm-x{width:100%;min-width:0;flex:1 1 auto}#bm-t.bm-N .bm-L.bm-H{display:block;grid-row:5;min-height:0;min-width:0;height:100%;width:100%;max-height:100%!important;overflow:auto;box-sizing:border-box}#bm-t.bm-N .bm-21{position:absolute;right:4px;bottom:4px;display:flex;width:20px;height:20px;align-items:flex-end;justify-content:flex-end;padding-right:4px;padding-bottom:4px;box-sizing:border-box;z-index:5;cursor:nwse-resize;pointer-events:auto;opacity:.78;touch-action:none;user-select:none;color:#ffffffdb;background:linear-gradient(135deg,#ffffff24,#538dff24);border:1px solid rgba(255,255,255,.12);border-radius:8px;box-shadow:inset 0 1px #ffffff14}#bm-t.bm-N .bm-21:hover,#bm-t.bm-N .bm-21.bm-2u{opacity:1;border-color:#92ddff5c;box-shadow:inset 0 1px #ffffff1a,0 8px 16px #00000029}#bm-t.bm-N .bm-a{display:flex;width:100%;min-width:0;flex:1 1 auto;gap:.5ch;align-items:center;padding:.1rem .2rem;border:none;border-radius:8px;box-sizing:border-box}#bm-t.bm-N .bm-a button{padding:.2em;flex:0 0 auto}#bm-t.bm-N .bm-a .bm-1M{width:1.36rem;height:1.36rem}#bm-t.bm-N .bm-z h2{font-size:.78rem;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#bm-t #bm-2{display:inline-flex;align-items:center;padding:.08rem .24rem;border-radius:999px;background:#ffffff1f;box-shadow:inset 0 1px #ffffff14;font-size:1em}@media (max-width: 980px){#bm-t:not(.bm-N){width:min(100vw - .35rem,50rem);max-width:min(100vw - .35rem,50rem)!important}#bm-t .bm-1G{grid-template-columns:repeat(3,minmax(0,1fr))}#bm-t .bm-1c{grid-column:span 2}}@media (max-width: 620px){#bm-t .bm-1G{grid-template-columns:1fr}#bm-t .bm-1c{grid-column:auto}#bm-t:not(.bm-N) .bm-z{width:100%;max-width:none;grid-template-columns:1fr}#bm-t:not(.bm-N) .bm-z-meta,#bm-t:not(.bm-N) .bm-z-progress{align-items:flex-start;text-align:left}}#bm-F{width:min(25.5rem,calc(100vw - .65rem));max-width:min(25.5rem,calc(100vw - .65rem))!important}#bm-F .bm-m{display:flex;flex-direction:column}#bm-F .bm-2r,#bm-F .bm-2n{position:relative;overflow:hidden;border-radius:14px;border:1px solid rgba(255,255,255,.18);background:linear-gradient(150deg,#ffffff2e,#ffffff14);box-shadow:inset 0 1px #fff3,0 10px 24px #0000001a}#bm-F .bm-2r:before,#bm-F .bm-2n:before{content:"";position:absolute;inset:0;pointer-events:none;background:radial-gradient(circle at top right,rgba(255,255,255,.2),transparent 26%),radial-gradient(circle at 20% 0%,rgba(186,246,255,.16),transparent 24%)}#bm-F .bm-2r{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.48rem .58rem;text-align:center}#bm-F .bm-2r .bm-T,#bm-F .bm-2r h1{position:relative;z-index:1}#bm-F .bm-2r .bm-T{margin-right:0;padding:0;background:none;border-radius:0;box-shadow:none}#bm-F .bm-2r h1{margin:0}#bm-F .bm-2m{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.24rem}#bm-F .bm-1X{min-width:0;min-height:2.55rem;display:flex;align-items:flex-start;padding:.34rem .45rem;border-radius:11px;border:1px solid rgba(255,255,255,.18);background:linear-gradient(160deg,#ffffff2e,#ffffff12);box-shadow:inset 0 1px #ffffff29;color:#12233ff5;line-height:1.22}#bm-F .bm-1X>span,#bm-F .bm-1X>time{min-width:0}#bm-F .bm-1m,#bm-F .bm-1n{flex-direction:column;justify-content:center;gap:.08rem}#bm-F .bm-1P{display:inline-block;font-size:1.3em;color:#0f1f38f5;white-space:normal;overflow-wrap:anywhere}#bm-F .bm-1P b{font-size:1em}#bm-F .bm-1O{color:#314769d1;font-size:.62rem;letter-spacing:.08em;font-family:var(--bm-font-display);text-transform:uppercase}#bm-F .bm-1X time{white-space:nowrap;font-family:inherit;font-size:1.3em;letter-spacing:inherit}#bm-F .bm-2n{padding:.48rem}#bm-F .bm-2g{display:grid;grid-template-columns:auto repeat(4,minmax(0,1fr));gap:.22rem;align-items:center}#bm-F .bm-2g .bm-J{width:1.8rem;height:1.8rem}#bm-F .bm-2g .bm-C{width:100%;margin-left:0;text-align:center}#bm-F .bm-2h,#bm-F .bm-2i{margin-top:.24rem}#bm-F .bm-2h>div{width:100%}#bm-F .bm-2b{gap:.24rem;margin-top:.3rem}#bm-F .bm-2b>button{flex:1 1 0}#bm-F .bm-2i textarea{min-height:4.1rem}@media (max-width: 720px){#bm-F{width:min(100vw - .45rem,25.5rem);max-width:min(100vw - .45rem,25.5rem)!important}#bm-F .bm-2m{grid-template-columns:1fr}#bm-F .bm-2g{grid-template-columns:repeat(2,minmax(0,1fr))}#bm-F .bm-2g .bm-J{grid-column:1 / -1;width:100%;aspect-ratio:auto;height:1.8rem}#bm-F .bm-2b{flex-direction:column}}#bm-l div:has(>.bm-3){width:fit-content;justify-content:flex-start}#bm-l .bm-3{display:flex;flex-direction:column;width:13%}#bm-l .bm-3 span{width:fit-content;margin:auto;font-size:.7em}#bm-l .bm-3 button{width:fit-content;padding:0;border-radius:0}#bm-l .bm-3 svg{stroke:#333;stroke-width:.02px;width:100%;min-width:1.5ch;max-width:14.5ch}#bm-l .bm-3 button:hover svg,#bm-l .bm-3 button:focus svg{opacity:.9}#bm-l .bm-n{display:grid;grid-template-columns:1fr 1fr 1fr;width:25%;min-width:3ch;max-width:15ch}#bm-l .bm-n>button{width:100%;padding:0;aspect-ratio:1 / 1;background-color:#fff;border:#333 1px solid;border-radius:0;box-sizing:border-box}#bm-l .bm-n>button[data-status=Incorrect]{background-color:brown}#bm-l .bm-n>button[data-status=Template]{background-color:#2f4f4f}#bm-l .bm-n>button:hover,#bm-l .bm-n>button:focus{opacity:.8}#bm-B{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start}#bm-B>.bm-L{width:100%;justify-content:flex-start;background-color:#153063e6;border-radius:1em;padding:.5em;transition:background-color .3s ease}#bm-B>.bm-L:hover,#bm-B>.bm-L:focus-within{background-color:#112855e6}#bm-B .bm-1{height:100%;font-size:xxx-large}#bm-B .bm-0{flex-direction:column;align-items:flex-start;gap:0}`;function Dt(t){const e=document.createElement("link");e.href=t,e.rel="preload",e.as="style",e.onload=function(){this.onload=null,this.rel="stylesheet"},document.head?.appendChild(e)}GM_addStyle(Nt);var Lt="@font-face{font-family:'Roboto Mono';font-style:normal;font-weight:400;src:url(data:font/woff2;base64,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)format('woff2');}";Dt("https://fonts.googleapis.com/css2?family=Michroma&family=Rajdhani:wght@400;500;600;700&display=swap"),Lt.indexOf("@font-face")+1?(console.log("Loading Roboto Mono as a file..."),GM_addStyle(Lt)):Dt("https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&display=swap");var Ot=JSON.parse(GM_getValue("bmUserSettings","{}")),Ht=(new class{constructor(){this.Ke=null,this.Qe=null,this.ti="#bm-p"}ei(t){return this.Qe=t,this.Ke=new MutationObserver(t=>{for(const e of t)for(const t of e.addedNodes)t instanceof HTMLElement&&t.matches?.(this.ti)}),this}ii(){return this.Ke}observe(t,e=!1,i=!1){t.observe(this.Qe,{childList:e,subtree:i})}},new class extends ${constructor(t,i){super(t,i),e(this,lt),this.window=null,this.xt="bm-F",this.yt=document.body}vt(){document.querySelector(`#${this.xt}`)?this.ft("Main window already exists!"):(this.window=this.S({id:this.xt,class:"bm-W bm-N",style:"top: 10px; left: unset; right: 75px;"},(t,e)=>{}).ct().it({class:"bm-s",innerHTML:y,"aria-label":'Minimize window "Blue Marble"',"data-button-status":"expanded"},(t,e)=>{e.onclick=()=>t.dt(e),e.ontouchend=()=>{e.click()}}).M().S().M().S({class:"bm-D"}).it({class:"bm-s",innerHTML:'',title:"Settings","aria-label":"Open settings"},(t,e)=>{e.onclick=()=>{t.l.vt()}}).M().M().M().S({class:"bm-m"}).I().M().S({class:"bm-L bm-2r"}).O({class:"bm-T",src:"data:image/png;base64,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"},(t,e)=>{const i=new Date;204==Math.floor((i.getTime()-new Date(i.getFullYear(),0,1))/864e5)+1&&(e.parentNode.style.position="relative",e.parentNode.innerHTML=e.parentNode.innerHTML+'',e.onload=()=>{(new z).Jt(document.querySelector(`#${this.xt}`))})}).M().H(1,{textContent:this.name}).M().M().I().M().S({class:"bm-L bm-2m"}).S({class:"bm-1X bm-1m"}).N({class:"bm-1O",textContent:"Droplets"}).M().N({id:"bm-w",class:"bm-1P",textContent:"0"}).M().M().S({class:"bm-1X bm-1m"}).N({class:"bm-1O",textContent:"Next Level"}).M().N({id:"bm-q",class:"bm-1P",textContent:"0 px"}).M().M().S({class:"bm-1X bm-1n"}).N({class:"bm-1O",textContent:"Charges"}).M().ht(Date.now(),1e3,{class:"bm-1P",style:"font-weight: 700;"},(t,e)=>{t.o.si=e.id}).M().M().M().I().M().S({class:"bm-L bm-2n"}).S({class:"bm-L bm-2g"}).it({class:"bm-s bm-J",style:"margin-top: 0;",innerHTML:''},(t,e)=>{e.onclick=()=>{const e=t.o?.ni;e?.[0]?(t.nt("bm-Q",e?.[0]||""),t.nt("bm-R",e?.[1]||""),t.nt("bm-O",e?.[2]||""),t.nt("bm-P",e?.[3]||"")):t.ft("Coordinates are malformed! Did you try clicking on the canvas first?")}}).M().ot({type:"number",id:"bm-Q",class:"bm-C",placeholder:"Tl X",min:0,max:2047,step:1,required:!0},(t,e)=>{e.addEventListener("paste",s=>i(this,lt,ct).call(this,t,e,s))}).M().ot({type:"number",id:"bm-R",class:"bm-C",placeholder:"Tl Y",min:0,max:2047,step:1,required:!0},(t,e)=>{e.addEventListener("paste",s=>i(this,lt,ct).call(this,t,e,s))}).M().ot({type:"number",id:"bm-O",class:"bm-C",placeholder:"Px X",min:0,max:2047,step:1,required:!0},(t,e)=>{e.addEventListener("paste",s=>i(this,lt,ct).call(this,t,e,s))}).M().ot({type:"number",id:"bm-P",class:"bm-C",placeholder:"Px Y",min:0,max:2047,step:1,required:!0},(t,e)=>{e.addEventListener("paste",s=>i(this,lt,ct).call(this,t,e,s))}).M().M().S({class:"bm-L bm-2h"}).rt({class:"bm-K",textContent:"Upload Template",accept:"image/png, image/jpeg, image/webp, image/bmp, image/gif"}).M().M().S({class:"bm-L bm-x bm-2b"}).it({class:"bm-1F",textContent:"Disable","data-button-status":"shown"},(t,e)=>{e.onclick=()=>{e.disabled=!0,"shown"==e.dataset.buttonStatus?(t.o?.oe?.oi(!1),e.dataset.buttonStatus="hidden",e.textContent="Enable",t.wt("Disabled templates!")):(t.o?.oe?.oi(!0),e.dataset.buttonStatus="shown",e.textContent="Disable",t.wt("Enabled templates!")),e.disabled=!1}}).M().it({class:"bm-1T",textContent:"Create"},(t,e)=>{e.onclick=()=>{const e=document.querySelector(`#${this.xt} .bm-K`),i=document.querySelector("#bm-Q");if(!i.checkValidity())return i.reportValidity(),void t.ft("Coordinates are malformed! Did you try clicking on the canvas first?");const s=document.querySelector("#bm-R");if(!s.checkValidity())return s.reportValidity(),void t.ft("Coordinates are malformed! Did you try clicking on the canvas first?");const n=document.querySelector("#bm-O");if(!n.checkValidity())return n.reportValidity(),void t.ft("Coordinates are malformed! Did you try clicking on the canvas first?");const o=document.querySelector("#bm-P");if(!o.checkValidity())return o.reportValidity(),void t.ft("Coordinates are malformed! Did you try clicking on the canvas first?");e?.files[0]?(t?.o?.oe.Ue(e.files[0],e.files[0]?.name.replace(/\.[^/.]+$/,""),[Number(i.value),Number(s.value),Number(n.value),Number(o.value)]),t.wt("Drew to canvas!")):t.ft("No file selected!")}}).M().it({class:"bm-1F",textContent:"Filter"},(t,e)=>{e.onclick=()=>this.ai()}).M().M().S({class:"bm-L bm-2i"}).lt({id:this.h,placeholder:`Status: Sleeping...\nVersion: ${this.version}`,readOnly:!0}).M().M().M().M().M().C(this.yt),this.ut(`#${this.xt}.bm-W`,`#${this.xt} .bm-S`))}ai(){new pt(this).fe()}}(Tt,kt)),It=new class{constructor(t,i){e(this,gt),this.name=t,this.version=i,this.Re=null,this.l=null,this.schemaVersion="2.0.0",this.ri=null,this.Fe="!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~",this.Ot=1e3,this.Ge=3,this._e=3,this.le=function(t){const e=x;e.unshift({id:-1,premium:!1,name:"Erased",rgb:[222,250,206]}),e.unshift({id:-2,premium:!1,name:"Other",rgb:[0,0,0]});const i=new Map;for(const s of e){if(0==s.id||-2==s.id)continue;const e=s.rgb[0],n=s.rgb[1],o=s.rgb[2];for(let a=-t;a<=t;a++)for(let r=-t;r<=t;r++)for(let l=-t;l<=t;l++){const t=e+a,c=n+r,h=o+l;if(t<0||t>255||c<0||c>255||h<0||h>255)continue;const m=(255<<24|h<<16|c<<8|t)>>>0;i.has(m)||i.set(m,s.id)}}return{palette:e,jt:i}}(this._e),this.Ee=null,this.li="",this.Ne=[],this.Ve=null,this.ci=!0,this.hi=null,this.Te=new Map}mi(t){this.Re=t}v(t){this.l=t,i(this,gt,wt).call(this)}ke(t,e){const s=Number(t);Number.isFinite(s)&&(e?this.Te.set(s,!0):this.Te.delete(s),i(this,gt,xt).call(this))}async di(){return{whoami:this.name.replace(" ",""),scriptVersion:this.version,schemaVersion:this.schemaVersion,templates:{}}}async Ue(t,e,s){this.Ve||(this.Ve=await this.di(),console.log("Creating JSON...")),this.Re.wt(`Creating template at ${s.join(", ")}...`);const n=new A({displayName:e,kt:0,Nt:h(this.ri||0,this.Fe),file:t,coords:s}),o=!this.l?.St?.flags?.includes("hl-noSkip"),a=this.l?.St?.flags?.includes("hl-agSkip");console.log(`Should Skip: ${o}; Should Agg Skip: ${a}`);const{Vt:r,Gt:l}=await n.Pt(this.Ot,this.le,o,a);n.Dt=r;const c={total:n.Ht.total,colors:Object.fromEntries(n.Ht.colors)};this.Ve.templates[`${n.kt} ${n.Nt}`]={name:n.displayName,coords:s.join(", "),enabled:!0,pixels:c,tiles:l},this.Ne=[],this.Ne.push(n),this.Re.wt(`Template created at ${s.join(", ")}!`),console.log(Object.keys(this.Ve.templates).length),console.log(this.Ve),console.log(this.Ne),console.log(JSON.stringify(this.Ve)),await i(this,gt,yt).call(this)}ui(){}async bi(){this.Ve||(this.Ve=await this.di(),console.log("Creating JSON..."))}async pi(){r("Downloading all templates..."),console.log(this.Ne);for(const t of this.Ne)await this.fi(t),await s(500)}async ze(){const t=JSON.parse(GM_getValue("bmTemplates","{}"))?.templates;if(console.log(t),Object.keys(t).length>0)for(const[e,i]of Object.entries(t))t.hasOwnProperty(e)&&(await this.fi(new A({displayName:i.name,kt:e.split(" ")?.[0],Nt:e.split(" ")?.[1],Dt:i.tiles})),await s(500))}async fi(t){t.Rt();const e=`${t.coords.join("-")}_${t.displayName.replaceAll(" ","-")}`,i=await this.We(t);await GM.download({url:URL.createObjectURL(i),name:e+".png",gi:"uniquify",onload:()=>{r(`Download of template '${e}' complete!`)},onerror:(t,i)=>{l(`Download of template '${e}' failed because ${t}! Details: ${i}`)},ontimeout:()=>{c(`Download of template '${e}' has timed out!`)}})}async We(t){console.log(t);const e=t.Dt,i=Object.keys(e).sort(),s=await Promise.all(i.map(t=>{return i=e[t],new Promise((t,e)=>{const s=new Image;s.onload=()=>t(s),s.onerror=e,s.src="data:image/png;base64,"+i});var i}));let n=1/0,o=1/0,a=0,r=0;i.forEach((t,e)=>{const[i,l,c,h]=t.split(",").map(Number),m=s[e],d=i*this.Ot+c,u=l*this.Ot+h;n=Math.min(n,d),o=Math.min(o,u),a=Math.max(a,d+m.width/this.Ge),r=Math.max(r,u+m.height/this.Ge)}),console.log(`Absolute coordinates: (${n}, ${o}) and (${a}, ${r})`);const l=a-n,c=r-o,h=l*this.Ge,m=c*this.Ge;console.log(`Template Width: ${l}\nTemplate Height: ${c}\nCanvas Width: ${h}\nCanvas Height: ${m}`);const d=new OffscreenCanvas(h,m),u=d.getContext("2d");i.forEach((t,e)=>{const[i,a,r,l]=t.split(",").map(Number),c=s[e],h=i*this.Ot+r,m=a*this.Ot+l;console.log(`Drawing tile (${i}, ${a}, ${r}, ${l}) (${h}, ${m}) at (${h-n}, ${m-o}) on the canvas...`),u.drawImage(c,(h-n)*this.Ge,(m-o)*this.Ge,c.width,c.height)}),u.globalCompositeOperation="destination-over",u.drawImage(d,0,-1),u.drawImage(d,0,1),u.drawImage(d,-1,0),u.drawImage(d,1,0);const b=new OffscreenCanvas(l,c),p=b.getContext("2d");return p.imageSmoothingEnabled=!1,p.drawImage(d,0,0,l*this.Ge,c*this.Ge,0,0,l,c),b.convertToBlob({type:"image/png"})}async wi(t,e){if(!this.ci)return t;const s=this.Ot*this.Ge;e=e[0].toString().padStart(4,"0")+","+e[1].toString().padStart(4,"0"),console.log(`Searching for templates in tile: "${e}"`);const o=this.Ne;console.log(o),o.sort((t,e)=>t.kt-e.kt),console.log(o);const a=o.map(t=>{const i=Object.keys(t.Dt).filter(t=>t.startsWith(e));if(0===i.length)return null;const s=i.map(e=>{const i=e.split(",");return{xi:t,zt:t.Dt[e],Lt:t.Lt?.[e],yi:[i[0],i[1]],$i:[i[2],i[3]]}});return s?.[0]}).filter(Boolean);console.log(a);const r=a?.length||0;if(console.log(`templateCount = ${r}`),!(r>0))return this.Re.wt(`Sleeping\nVersion: ${this.version}`),t;{const t=n(o.filter(t=>Object.keys(t.Dt).filter(t=>t.startsWith(e)).length>0).reduce((t,e)=>t+(e.Ht.total||0),0));this.Re.wt(`Displaying ${r} template${1==r?"":"s"}.\nTotal pixels: ${t}`)}const l=await createImageBitmap(t),c=new OffscreenCanvas(s,s),h=c.getContext("2d");h.imageSmoothingEnabled=!1,h.beginPath(),h.rect(0,0,s,s),h.clip(),h.clearRect(0,0,s,s),h.drawImage(l,0,0,s,s);const m=h.getImageData(0,0,s,s),d=new Uint32Array(m.data.buffer),u=this.l?.St?.highlight||[[2,0,0]],b=u?.[0],p=1==u?.length&&2==b?.[0]&&0==b?.[1]&&0==b?.[2];for(const t of a){console.log("Template:"),console.log(t);const s=!!t.xi.Ht?.colors?.get(-1);let n=t.Lt.slice();const o=Number(t.$i[0])*this.Ge,a=Number(t.$i[1])*this.Ge;if(0!=this.Te.size||s||h.drawImage(t.zt,o,a),!n){const e=h.getImageData(o,a,t.zt.width,t.zt.height);n=new Uint32Array(e.data.buffer)}const r=Date.now(),{qe:l,Ze:c}=i(this,gt,vt).call(this,{je:d,Ee:n,Ye:[o,a,t.zt.width,t.zt.height],Je:u,Xe:p});let m=0;const b=0;for(const[t,e]of l)t!=b&&(m+=e);0==this.Te.size&&!s&&p||(console.log("Colors to filter: ",this.Te),h.drawImage(await createImageBitmap(new ImageData(new Uint8ClampedArray(c.buffer),t.zt.width,t.zt.height)),o,a)),console.log(`Finished calculating correct pixels & filtering colors for the tile ${e} in ${(Date.now()-r)/1e3} seconds!\nThere are ${m} correct pixels.`),void 0===t.xi.Ht.correct&&(t.xi.Ht.correct={}),t.xi.Ht.correct[e]=l}return await c.convertToBlob({type:"image/png"})}async Mi(t){console.log("Importing JSON..."),console.log(t),"BlueMarble"==t?.whoami&&await i(this,gt,$t).call(this,t)}oi(t){this.ci=t}}(Tt,kt),Bt=new class{constructor(t){this.oe=t,this.Ci=!1,this.si="",this.ni=[],this.Si=[]}Ti(t){window.addEventListener("message",async e=>{const i=e.data,s=i.jsonData;if(!i||"blue-marble"!==i.source)return;if(!i.endpoint)return;const n=i.endpoint?.split("?")[0].split("/").filter(t=>t&&isNaN(Number(t))).filter(t=>t&&!t.includes(".")).pop();switch(console.log('%cBlue Marble%c: Recieved message about "%s"',"color: cornflowerblue;","",n),n){case"me":this.ki(t,s);break;case"pixel":const e=i.endpoint.split("?")[0].split("/").filter(t=>t&&!isNaN(Number(t))),n=new URLSearchParams(i.endpoint.split("?")[1]),r=[n.get("x"),n.get("y")];if(this.ni.length&&(!e.length||!r.length))return void t.ft("Coordinates are malformed!\nDid you try clicking the canvas first?");this.ni=[...e,...r];const l=(o=e,a=r,[parseInt(o[0])%4*1e3+parseInt(a[0]),parseInt(o[1])%4*1e3+parseInt(a[1])]),c=document.querySelectorAll("span");for(const t of c){const i=t.textContent.trim();if(i.includes(l[0])&&i.includes(l[1])){let i=document.querySelector("#bm-p");e[0],e[1],r[0],r[1];const s=["Tl X:","Tl Y:","Px X:","Px Y:"],n=["bm-Y","bm-Z","bm-U","bm-V"],o=[...e,...r];if(i)for(const[t,e]of n.entries())document.getElementById(e).textContent=`${s[t]??"??:"} ${o[t]}`;else{i=document.createElement("span"),i.id="bm-p",i.style="display: flex; flex-wrap: wrap; gap: 0 1ch; font-size: small;";for(const[t,e]of o.entries()){const a=document.createElement("span");a.id=n[o.indexOf(e)??""],a.textContent=`${s[t]??"??:"} ${e}`,i.appendChild(a)}t.parentNode.parentNode.parentNode.insertAdjacentElement("afterend",i)}}}break;case"tile":case"tiles":let h=i.endpoint.split("/");h=[parseInt(h[h.length-2]),parseInt(h[h.length-1].replace(".png",""))];const m=i.blobID,d=i.blobData,u=Date.now(),b=await this.oe.wi(d,h);console.log(`Finished loading the tile in ${(Date.now()-u)/1e3} seconds!`),window.postMessage({source:"blue-marble",blobID:m,blobData:b,blink:i.blink});break;case"robots":this.Ci="false"==s.userscript?.toString().toLowerCase();break}var o,a})}ki(t,e){if(e.status&&"2"!=e.status?.toString()[0])return void t.ft("You are not logged in or Wplace is offline!\nCould not fetch userdata.");const i=Math.ceil(Math.pow(Math.floor(e.level)*Math.pow(30,.65),1/.65)-e.pixelsPainted);if(console.log(e.id),(e.id||0===e.id)&&console.log(h(e.id,"!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~")),this.oe.ri=e.id,0!=this.si.length){const t=document.querySelector("#"+this.si);if(t){const i=e.charges;t.dataset.endDate=Date.now()+(i.max-i.count)*i.cooldownMs}}t.nt("bm-w",`${n(e.droplets)}`),t.nt("bm-q",`${n(i)} px`)}async Ni(t){try{const e=await fetch(`${window.location.origin}/api/me`,{credentials:"include"});if(!e.ok)return void t.ft(`Could not fetch userdata.\nHTTP ${e.status}`);const i=await e.json();this.ki(t,i)}catch(t){l("Failed to fetch current user data:",t)}}Di(t){try{const e=sessionStorage.getItem("bm-2A");if(!e)return!1;const i=JSON.parse(e);return this.ki(t,i),!0}catch(t){return l("Failed to apply cached user data:",t),!1}}async Li(t){console.log("Sending heartbeat to telemetry server...");let e=GM_getValue("bmUserSettings","{}");if(e=JSON.parse(e),!e||!e.telemetry||!e.uuid)return void console.log("Telemetry is disabled, not sending heartbeat.");const i=navigator.userAgent;let s=await this.Oi(i),n=this.Hi(i);GM_xmlhttpRequest({method:"POST",url:"https://telemetry.thebluecorner.net/heartbeat",headers:{"Content-Type":"application/json"},data:JSON.stringify({uuid:e.uuid,version:t,browser:s,os:n}),onload:t=>{200!==t.status&&l("Failed to send heartbeat:",t.statusText)},onerror:t=>{l("Error sending heartbeat:",t)}})}async Oi(t=navigator.userAgent){return(t=t||"").includes("OPR/")||t.includes("Opera")?"Opera":t.includes("Edg/")?"Edge":t.includes("Vivaldi")?"Vivaldi":t.includes("YaBrowser")?"Yandex":t.includes("Kiwi")?"Kiwi":t.includes("Brave")?"Brave":t.includes("Firefox/")?"Firefox":t.includes("Chrome/")?"Chrome":t.includes("Safari/")?"Safari":navigator.brave&&"function"==typeof navigator.brave.isBrave&&await navigator.brave.isBrave()?"Brave":"Unknown"}Hi(t=navigator.userAgent){return/Windows NT 11/i.test(t=t||"")?"Windows 11":/Windows NT 10/i.test(t)?"Windows 10":/Windows NT 6\.3/i.test(t)?"Windows 8.1":/Windows NT 6\.2/i.test(t)?"Windows 8":/Windows NT 6\.1/i.test(t)?"Windows 7":/Windows NT 6\.0/i.test(t)?"Windows Vista":/Windows NT 5\.1|Windows XP/i.test(t)?"Windows XP":/Mac OS X 10[_\.]15/i.test(t)?"macOS Catalina":/Mac OS X 10[_\.]14/i.test(t)?"macOS Mojave":/Mac OS X 10[_\.]13/i.test(t)?"macOS High Sierra":/Mac OS X 10[_\.]12/i.test(t)?"macOS Sierra":/Mac OS X 10[_\.]11/i.test(t)?"OS X El Capitan":/Mac OS X 10[_\.]10/i.test(t)?"OS X Yosemite":/Mac OS X 10[_\.]/i.test(t)?"macOS":/Android/i.test(t)?"Android":/iPhone|iPad|iPod/i.test(t)?"iOS":/Linux/i.test(t)?"Linux":"Unknown"}}(It),Pt=new class extends P{constructor(t,i,s){var n;super(t,i),e(this,L),this.St=s,(n=this.St).flags??(n.flags=[]),this.Ii=structuredClone(this.St),this.Bi="bmUserSettings",this.Pi=5e3,this.Ai=0,setInterval(this.zi.bind(this),this.Pi)}async zi(){await this.Fi()}async Fi(t=!1){const e=JSON.stringify(this.St);e!=JSON.stringify(this.Ii)&&(t||Date.now()-this.Ai>this.Pi)&&(await GM.setValue(this.Bi,e),this.Ii=structuredClone(this.St),this.Ai=Date.now(),console.log(e))}async Tt(){await this.Fi(!0)}Se(t,e=void 0){const i=this.St?.flags?.indexOf(t)??-1;-1!=i&&!0!==e?this.St?.flags?.splice(i,1):-1==i&&!1!==e&&this.St?.flags?.push(t)}Mt(){const t='',e='',s=this.St?.highlight??[[1,0,1],[2,0,0],[1,-1,0],[1,1,0],[1,0,-1]];this.window=this.S({class:"bm-L"}).H(2,{textContent:"Pixel Highlight"}).M().I().M().S({class:"bm-L",style:"margin-left: 1.5ch;"}).W({textContent:"Highlight transparent pixels"},(t,e,i)=>{i.checked=!this.St?.flags?.includes("hl-noTrans"),i.onchange=t=>this.Se("hl-noTrans",!t.target.checked)}).M().T({id:"bm-4",textContent:"Choose a preset:",style:"font-weight: 700;"}).M().S({class:"bm-D",role:"group","aria-labelledby":"bm-4"}).S({class:"bm-3"}).N({textContent:"None"}).M().it({innerHTML:t,"aria-label":'Preset "None"'},(t,e)=>{e.onclick=()=>i(this,L,H).call(this,"None")}).M().M().S({class:"bm-3"}).N({textContent:"Cross"}).M().it({innerHTML:e,"aria-label":'Preset "Cross Shape"'},(t,e)=>{e.onclick=()=>i(this,L,H).call(this,"Cross")}).M().M().S({class:"bm-3"}).N({textContent:"X"}).M().it({innerHTML:e.replace('d="M1,0H2V1H3V2H2V3H1V2H0V1H1Z"','d="M0,0V1H3V0H2V3H3V2H0V3H1V0Z"'),"aria-label":'Preset "X Shape"'},(t,e)=>{e.onclick=()=>i(this,L,H).call(this,"X")}).M().M().S({class:"bm-3"}).N({textContent:"Full"}).M().it({innerHTML:t.replace("#fff","#2f4f4f"),"aria-label":'Preset "Full Template"'},(t,e)=>{e.onclick=()=>i(this,L,H).call(this,"Full")}).M().M().M().T({id:"bm-b",textContent:"Create a custom pattern:",style:"font-weight: 700;"}).M().S({class:"bm-n",role:"group","aria-labelledby":"bm-b"});for(let t=-1;t<=1;t++)for(let e=-1;e<=1;e++){const n=s[s.findIndex(([,i,s])=>i==e&&s==t)]?.[0]??0;let o="Disabled";1==n?o="Incorrect":2==n&&(o="Template"),this.window=this.it({"data-status":o,"aria-label":`Sub-pixel ${o.toLowerCase()}`},(s,n)=>{n.onclick=()=>i(this,L,O).call(this,n,[e,t])}).M()}this.window=this.M().M().M()}Ct(){this.window=this.S({class:"bm-L"}).H(2,{textContent:"Pixel Highlight"}).M().I().M().S({class:"bm-L",style:"margin-left: 1.5ch;"}).W({textContent:"Template creation should skip transparent tiles"},(t,e,i)=>{i.checked=!this.St?.flags?.includes("hl-noSkip"),i.onchange=t=>this.Se("hl-noSkip",!t.target.checked)}).M().W({innerHTML:"Experimental: Template creation should aggressively skip transparent tiles"},(t,e,i)=>{i.checked=this.St?.flags?.includes("hl-agSkip"),i.onchange=t=>this.Se("hl-agSkip",t.target.checked)}).M().M().M()}}(Tt,kt,Ot);Ht.v(Pt),Ht.$(Bt),It.mi(Ht),It.v(Pt);var At=JSON.parse(GM_getValue("bmTemplates","{}"));if(console.log(At),console.log(Ot),console.log(Object.keys(Ot).length),0==Object.keys(Ot).length){const t=crypto.randomUUID();console.log(t),GM.setValue("bmUserSettings",JSON.stringify({uuid:t}))}setInterval(()=>Bt.Li(kt),18e5);var zt=Ot?.telemetry;if(console.log(`Telemetry is ${!(null==zt)}`),null==zt||zt>1){const t=new class extends ${constructor(t,i,s,n){super(t,i),e(this,Mt),this.window=null,this.xt="bm-k",this.yt=document.body,this.Wi=s,this.uuid=n}async vt(){if(document.querySelector(`#${this.xt}`))return void this.ft("Telemetry window already exists!");const t=await this.o.Oi(navigator.userAgent),e=this.o.Hi(navigator.userAgent);this.window=this.S({id:this.xt,class:"bm-W",style:"height: 80vh; z-index: 9998;"}).S({class:"bm-m"}).S({class:"bm-L bm-h"}).H(1,{textContent:`${this.name} Telemetry`}).M().M().I().M().S({class:"bm-L bm-D",style:"gap: 1.5ch; flex-wrap: wrap;"}).it({textContent:"Enable Telemetry"},(t,e)=>{e.onclick=()=>{i(this,Mt,Ct).call(this,this.Wi);const t=document.getElementById(this.xt);t?.remove()}}).M().it({textContent:"Disable Telemetry"},(t,e)=>{e.onclick=()=>{i(this,Mt,Ct).call(this,0);const t=document.getElementById(this.xt);t?.remove()}}).M().it({textContent:"More Information"},(t,e)=>{e.onclick=()=>{window.open("https://github.com/SwingTheVine/Wplace-TelemetryServer#telemetry-data","_blank","noopener noreferrer")}}).M().M().S({class:"bm-L bm-H"}).S({class:"bm-L"}).H(2,{textContent:"Legal"}).M().T({textContent:`We collect anonymous telemetry data such as your browser, OS, and script version to make the experience better for everyone. The data is never shared personally. The data is never sold. You can turn this off by pressing the "Disable" button, but keeping it on helps us improve features and reliability faster. Thank you for supporting ${this.name}!`}).M().M().I().M().S({class:"bm-L"}).H(2,{textContent:"Non-Legal Summary"}).M().T({innerHTML:'You can disable telemetry by pressing the "Disable" button. If you would like to read more about what information we collect, press the "More Information" button.
This is the data stored on our servers:'}).M().R().Y({innerHTML:`A unique identifier (UUIDv4) generated by Blue Marble. This enables our telemetry to function without tracking your actual user ID.
Your UUID is: ${a(this.uuid)}`}).M().Y({innerHTML:`The version of Blue Marble you are using.
Your version is: ${a(this.version)}`}).M().Y({innerHTML:`Your browser type, which is used to determine Blue Marble outages and browser popularity.
Your browser type is: ${a(t)}`}).M().Y({innerHTML:`Your OS type, which is used to determine Blue Marble outages and OS popularity.
Your OS type is: ${a(e)}`}).M().Y({innerHTML:"The date and time that Blue Marble sent the telemetry information."}).M().M().T({innerHTML:'All of the data mentioned above is aggregated every hour. This means every hour, anything that could even remotly be considered "personal data" is deleted from our server. Here, "aggregated" data means things like "42 people used Blue Marble on Google Chrome this hour", which can\'t be used to identify anyone in particular.'}).M().M().M().M().M().C(this.yt)}}(Tt,kt,1,Ot?.uuid);t.$(Bt),t.vt()}!async function(){await It.Mi(At),Bt.Ti(Ht),Ht.vt(),Ht.ai(),Bt.Di(Ht),Bt.Ni(Ht),new MutationObserver((t,e)=>{const i=document.querySelector("#color-1");if(!i)return;let s=document.querySelector("#bm-G");if(!s){s=document.createElement("button"),s.id="bm-G",s.textContent="Move ↑",s.className="btn btn-soft",s.onclick=function(){const t=this.parentNode.parentNode.parentNode.parentNode,e="Move ↑"==this.textContent;t.parentNode.className=t.parentNode.className.replace(e?"bottom":"top",e?"top":"bottom"),t.style.borderTopLeftRadius=e?"0px":"var(--radius-box)",t.style.borderTopRightRadius=e?"0px":"var(--radius-box)",t.style.borderBottomLeftRadius=e?"var(--radius-box)":"0px",t.style.borderBottomRightRadius=e?"var(--radius-box)":"0px",this.textContent=e?"Move ↓":"Move ↑"};const t=i.parentNode.parentNode.parentNode.parentNode.querySelector("h2");t.parentNode?.appendChild(s)}}).observe(document.body,{childList:!0,subtree:!0}),r(`%c${Tt}%c (${kt}) userscript has loaded!`,"color: cornflowerblue;","")}()})(); -// Build Hash: 58cece847d95 +// Build Hash: e8bc4762840b diff --git a/dist/BlueMarble.user.js b/dist/BlueMarble.user.js index 4ae1063..eb879b4 100644 --- a/dist/BlueMarble.user.js +++ b/dist/BlueMarble.user.js @@ -2,7 +2,7 @@ // @name Blue Marble // @name:en Blue Marble // @namespace https://github.com/SwingTheVine/ -// @version 0.94.0 +// @version 0.95.0 // @description A userscript to enhance the user experience on Wplace.live. This includes, but is not limited to: uploading images to display locally on a canvas, adding a button to move the Wplace color palette menu, and other QoL features. // @description:en A userscript to enhance the user experience on Wplace.live. This includes, but is not limited to: uploading images to display locally on a canvas, adding a button to move the Wplace color palette menu, and other QoL features. // @author SwingTheVine @@ -41,4 +41,4 @@ (()=>{var t=t=>{throw TypeError(t)},e=(e,i,s)=>i.has(e)?t("Cannot add the same private member more than once"):i instanceof WeakSet?i.add(e):i.set(e,s),i=(e,i,s)=>(((e,i)=>{i.has(e)||t("Cannot access private method")})(e,i),s);function s(t){return new Promise(e=>setTimeout(e,t))}function n(t){return(new Intl.NumberFormat).format(t)}function o(t){return new Intl.NumberFormat(void 0,{style:"percent",t:2,i:2}).format(t)}function a(t){const e=document.createElement("div");return e.textContent=t,e.innerHTML}function r(...t){(0,console.log)(...t)}function l(...t){(0,console.error)(...t)}function c(...t){(0,console.warn)(...t)}function h(t,e){if(0===t)return e[0];let i="";const s=e.length;for(;t>0;)i=e[t%s]+i,t=Math.floor(t/s);return i}function m(t,e){let i=0;const s=e.length;for(const n of t){const t=e.indexOf(n);-1==t&&l(`Invalid character '${n}' encountered whilst decoding! Is the decode alphabet/base incorrect?`),i=i*s+t}return i}function d(t){let e="";for(let i=0;i(t/=255)<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4));return.2126*e[0]+.7152*e[1]+.0722*e[2]}function p(t,e,i){return Array.isArray(t)&&([t,e,i]=t),(1<<24|t<<16|e<<8|i).toString(16).slice(1)}var f,g,w,x=[{id:0,premium:!1,name:"Transparent",rgb:[0,0,0]},{id:1,premium:!1,name:"Black",rgb:[0,0,0]},{id:2,premium:!1,name:"Dark Gray",rgb:[60,60,60]},{id:3,premium:!1,name:"Gray",rgb:[120,120,120]},{id:4,premium:!1,name:"Light Gray",rgb:[210,210,210]},{id:5,premium:!1,name:"White",rgb:[255,255,255]},{id:6,premium:!1,name:"Deep Red",rgb:[96,0,24]},{id:7,premium:!1,name:"Red",rgb:[237,28,36]},{id:8,premium:!1,name:"Orange",rgb:[255,127,39]},{id:9,premium:!1,name:"Gold",rgb:[246,170,9]},{id:10,premium:!1,name:"Yellow",rgb:[249,221,59]},{id:11,premium:!1,name:"Light Yellow",rgb:[255,250,188]},{id:12,premium:!1,name:"Dark Green",rgb:[14,185,104]},{id:13,premium:!1,name:"Green",rgb:[19,230,123]},{id:14,premium:!1,name:"Light Green",rgb:[135,255,94]},{id:15,premium:!1,name:"Dark Teal",rgb:[12,129,110]},{id:16,premium:!1,name:"Teal",rgb:[16,174,166]},{id:17,premium:!1,name:"Light Teal",rgb:[19,225,190]},{id:18,premium:!1,name:"Dark Blue",rgb:[40,80,158]},{id:19,premium:!1,name:"Blue",rgb:[64,147,228]},{id:20,premium:!1,name:"Cyan",rgb:[96,247,242]},{id:21,premium:!1,name:"Indigo",rgb:[107,80,246]},{id:22,premium:!1,name:"Light Indigo",rgb:[153,177,251]},{id:23,premium:!1,name:"Dark Purple",rgb:[120,12,153]},{id:24,premium:!1,name:"Purple",rgb:[170,56,185]},{id:25,premium:!1,name:"Light Purple",rgb:[224,159,249]},{id:26,premium:!1,name:"Dark Pink",rgb:[203,0,122]},{id:27,premium:!1,name:"Pink",rgb:[236,31,128]},{id:28,premium:!1,name:"Light Pink",rgb:[243,141,169]},{id:29,premium:!1,name:"Dark Brown",rgb:[104,70,52]},{id:30,premium:!1,name:"Brown",rgb:[149,104,42]},{id:31,premium:!1,name:"Beige",rgb:[248,178,119]},{id:32,premium:!0,name:"Medium Gray",rgb:[170,170,170]},{id:33,premium:!0,name:"Dark Red",rgb:[165,14,30]},{id:34,premium:!0,name:"Light Red",rgb:[250,128,114]},{id:35,premium:!0,name:"Dark Orange",rgb:[228,92,26]},{id:36,premium:!0,name:"Light Tan",rgb:[214,181,148]},{id:37,premium:!0,name:"Dark Goldenrod",rgb:[156,132,49]},{id:38,premium:!0,name:"Goldenrod",rgb:[197,173,49]},{id:39,premium:!0,name:"Light Goldenrod",rgb:[232,212,95]},{id:40,premium:!0,name:"Dark Olive",rgb:[74,107,58]},{id:41,premium:!0,name:"Olive",rgb:[90,148,74]},{id:42,premium:!0,name:"Light Olive",rgb:[132,197,115]},{id:43,premium:!0,name:"Dark Cyan",rgb:[15,121,159]},{id:44,premium:!0,name:"Light Cyan",rgb:[187,250,242]},{id:45,premium:!0,name:"Light Blue",rgb:[125,199,255]},{id:46,premium:!0,name:"Dark Indigo",rgb:[77,49,184]},{id:47,premium:!0,name:"Dark Slate Blue",rgb:[74,66,132]},{id:48,premium:!0,name:"Slate Blue",rgb:[122,113,196]},{id:49,premium:!0,name:"Light Slate Blue",rgb:[181,174,241]},{id:50,premium:!0,name:"Light Brown",rgb:[219,164,99]},{id:51,premium:!0,name:"Dark Beige",rgb:[209,128,81]},{id:52,premium:!0,name:"Light Beige",rgb:[255,197,165]},{id:53,premium:!0,name:"Dark Peach",rgb:[155,82,73]},{id:54,premium:!0,name:"Peach",rgb:[209,128,120]},{id:55,premium:!0,name:"Light Peach",rgb:[250,182,164]},{id:56,premium:!0,name:"Dark Tan",rgb:[123,99,82]},{id:57,premium:!0,name:"Tan",rgb:[156,132,107]},{id:58,premium:!0,name:"Dark Slate",rgb:[51,57,65]},{id:59,premium:!0,name:"Slate",rgb:[109,117,141]},{id:60,premium:!0,name:"Light Slate",rgb:[179,185,209]},{id:61,premium:!0,name:"Dark Stone",rgb:[109,100,63]},{id:62,premium:!0,name:"Stone",rgb:[148,140,107]},{id:63,premium:!0,name:"Light Stone",rgb:[205,197,158]}],y='',$=class{constructor(t,i){e(this,f),this.name=t,this.version=i,this.o=null,this.l=null,this.h="bm-r",this.m=null,this.u=null,this.p=[]}$(t){this.o=t}v(t){this.l=t}M(){return this.p.length>0&&(this.u=this.p.pop()),this}C(t){t?.appendChild(this.m),this.m=null,this.u=null,this.p=[]}S(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"div",{},t)),this}T(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"p",{},t)),this}k(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"small",{},t)),this}N(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"span",{},t)),this}D(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"details",{},t)),this}L(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"summary",{},t)),this}O(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"img",{},t)),this}H(t,e={},s=()=>{}){return s(this,i(this,f,g).call(this,"h"+t,{},e)),this}I(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"hr",{},t)),this}B(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"br",{},t)),this}P(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"form",{},t)),this}A(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"fieldset",{},t)),this}F(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"legend",{},t)),this}W(t={},e=()=>{}){const s={};t.textContent?(s.textContent=t.textContent,delete t.textContent):t.innerHTML&&(s.innerHTML=t.innerHTML,delete t.textContent);const n=i(this,f,g).call(this,"label",s),o=i(this,f,g).call(this,"input",{type:"checkbox"},t);return n.insertBefore(o,n.firstChild),this.M(),e(this,n,o),this}U(t={},e=()=>{}){const s=i(this,f,g).call(this,"label",{textContent:t.textContent??"",for:t.id??""});return delete t.textContent,this.M(),e(this,s,i(this,f,g).call(this,"select",{},t)),this}V(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"option",{},t)),this}G(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"ol",{},t)),this}R(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"ul",{},t)),this}j(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"menu",{},t)),this}Y(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"li",{},t)),this}J(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"table",{},t)),this}X(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"caption",{},t)),this}_(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"thead",{},t)),this}q(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"tbody",{},t)),this}Z(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"tfoot",{},t)),this}K(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"tr",{},t)),this}tt(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"th",{},t)),this}et(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"td",{},t)),this}it(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"button",{},t)),this}st(t={},e=()=>{}){const s=t.title??t.textContent??"Help: No info";delete t.textContent,t.title=`Help: ${s}`;const n={textContent:"?",className:"bm-10",onclick:()=>{this.nt(this.h,s)}};return e(this,i(this,f,g).call(this,"button",n,t)),this}ot(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"input",{},t)),this}rt(t={},e=()=>{}){const s=t.textContent??"";delete t.textContent;const n=i(this,f,g).call(this,"div"),o=i(this,f,g).call(this,"input",{type:"file",tabindex:"-1","aria-hidden":"true"},t);this.M();const a=i(this,f,g).call(this,"button",{textContent:s});return this.M(),this.M(),a.addEventListener("click",()=>{o.click()}),o.addEventListener("change",()=>{a.style.maxWidth=`${a.offsetWidth}px`,o.files.length>0?a.textContent=o.files[0].name:a.textContent=s}),e(this,n,o,a),this}lt(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"textarea",{},t)),this}ct(t={},e=()=>{}){return e(this,i(this,f,g).call(this,"div",{class:"bm-S"},t)),this}ht(t=Date.now(),e=500,s={},n=()=>{}){const o="bm--",a=s?.id||o+"-"+crypto.randomUUID().slice(0,8),r={class:o},l=i(this,f,g).call(this,"time",r,s);return l.id=a,l.dataset.endDate=t,setInterval(()=>{if(!l.isConnected)return;const t=Math.max(l.dataset.endDate-Date.now(),0),e=Math.floor(t/1e3),i=Math.floor(e/3600),s=Math.floor(e%60),n=Math.floor(e%3600/60);l.setAttribute("datetime",`PT${i}H${n}M${s}S`),l.textContent=String(i).padStart(2,"0")+":"+String(n).padStart(2,"0")+":"+String(s).padStart(2,"0")},e),n(this,l),this}nt(t,e,i=!1){const s=document.getElementById(t.replace(/^#/,""));s&&(s instanceof HTMLInputElement?s.value=e:i?s.textContent=e:s.innerHTML=e)}dt(t){if(t.disabled)return;t.disabled=!0,t.style.textDecoration="none";const e=t.closest(".bm-W"),i=t.closest(".bm-S"),s=e?.querySelector("h1"),n=e?.querySelector(".bm-m");if(!e||!i||!n)return t.disabled=!1,void(t.style.textDecoration="");const o=e=>{let i,s=!1;const o=()=>{s||(s=!0,clearTimeout(i),n.removeEventListener("transitionend",a),e(),t.disabled=!1,t.style.textDecoration="")},a=t=>{t.target==n&&"height"==t.propertyName&&o()};n.addEventListener("transitionend",a),i=setTimeout(o,360)};if(e.parentElement.append(e),"expanded"==t.dataset.buttonStatus){e.dataset.widthBeforeMinimize=e.style.width,e.dataset.heightBeforeMinimize=e.style.height,e.dataset.minHeightBeforeMinimize=e.style.minHeight,n.style.height=n.scrollHeight+"px",n.offsetHeight,e.style.width||(e.style.width=e.scrollWidth+"px"),o(()=>{n.style.display="none"}),n.style.height="0",(e.style.height||e.classList.contains("bm-N"))&&(e.style.minHeight="0px",e.style.height=(()=>{const t=getComputedStyle(e),s=t=>parseFloat(t)||0,n="border-box"==t.boxSizing?s(t.paddingTop)+s(t.paddingBottom)+s(t.borderTopWidth)+s(t.borderBottomWidth):0;return Math.ceil(i.getBoundingClientRect().height+n+2)})()+"px");const a=s?.cloneNode(!0)??document.createElement("h1"),r=a.textContent;t.nextElementSibling.appendChild(a),t.innerHTML='',t.dataset.buttonStatus="collapsed",t.ariaLabel=`Unminimize window "${r}"`}else{const s=i.querySelector("h1"),a=s.textContent;s.remove(),n.style.display="",n.style.height="0",e.style.width=e.dataset.widthBeforeMinimize??"",e.style.minHeight=e.dataset.minHeightBeforeMinimize??"",e.style.height=e.dataset.heightBeforeMinimize??"",n.offsetHeight,o(()=>{n.style.height="",delete e.dataset.widthBeforeMinimize,delete e.dataset.heightBeforeMinimize,delete e.dataset.minHeightBeforeMinimize}),n.style.height=n.scrollHeight+"px",t.innerHTML=y,t.dataset.buttonStatus="expanded",t.ariaLabel=`Minimize window "${a}"`}}ut(t,e,i={}){const s=document.querySelector(t),n=document.querySelector(e),o=i?.bt??(()=>{});if(!s||!n)return void this.ft(`Can not drag! ${s?"":"moveMe"} ${s||n?"":"and "}${n?"":"iMoveThings "}was not found!`);let a,r=!1,l=0,c=null,h=0,m=0,d=0,u=0,b=null;const p=()=>{if(r){const t=Math.abs(h-d),e=Math.abs(m-u);(t>.5||e>.5)&&(h=d,m=u,s.style.transform=`translate(${h}px, ${m}px)`,s.style.left="0px",s.style.top="0px",s.style.right=""),c=requestAnimationFrame(p)}},f=(t,e)=>{r=!0,b=s.getBoundingClientRect(),a=t-b.left,l=e-b.top;const i=window.getComputedStyle(s).transform;if(i&&"none"!==i){const t=new DOMMatrix(i);h=t.m41,m=t.m42}else h=b.left,m=b.top;d=h,u=m,document.body.style.userSelect="none",n.classList.add("bm-M"),document.addEventListener("mousemove",w),document.addEventListener("touchmove",x,{passive:!1}),document.addEventListener("mouseup",g),document.addEventListener("touchend",g),document.addEventListener("touchcancel",g),c&&cancelAnimationFrame(c),p()},g=()=>{r=!1,c&&(cancelAnimationFrame(c),c=null),document.body.style.userSelect="",n.classList.remove("bm-M"),document.removeEventListener("mousemove",w),document.removeEventListener("touchmove",x),document.removeEventListener("mouseup",g),document.removeEventListener("touchend",g),document.removeEventListener("touchcancel",g),o({element:s,x:h,y:m}),b=null},w=t=>{r&&b&&(d=t.clientX-a,u=t.clientY-l)},x=t=>{if(r&&b){const e=t.touches[0];if(!e)return;d=e.clientX-a,u=e.clientY-l,t.preventDefault()}};n.addEventListener("mousedown",function(t){t.preventDefault(),f(t.clientX,t.clientY)}),n.addEventListener("touchstart",function(t){const e=t?.touches?.[0];e&&(f(e.clientX,e.clientY),t.preventDefault())},{passive:!1})}gt(t,e,i={}){const s=document.querySelector(t),n=document.querySelector(e),o=i?.bt??(()=>{});if(!s||!n)return void this.ft(`Can not resize! ${s?"":"resizeMe"} ${s||n?"":"and "}${n?"":"iResizeThings "}was not found!`);let a=!1,r=0,l=0,c=0,h=0,m=0,d=0,u=0,b=0,p=null;const f=()=>Number.isFinite(i?.maxWidth)?i.maxWidth:window.innerWidth-16,g=()=>Number.isFinite(i?.maxHeight)?i.maxHeight:window.innerHeight-16,w=Number.isFinite(i?.minWidth)?i.minWidth:200,x=Number.isFinite(i?.minHeight)?i.minHeight:160,y=(t,e,i)=>Math.min(Math.max(t,e),Math.max(e,i)),$=()=>{if(a){const t=Math.abs(m-u),e=Math.abs(d-b);(t>.5||e>.5)&&(m=u,d=b,s.style.width=`${m}px`,s.style.height=`${d}px`),p=requestAnimationFrame($)}},v=(t,e)=>{a=!0,r=t,l=e,c=s.offsetWidth,h=s.offsetHeight,m=c,d=h,u=c,b=h,document.body.style.userSelect="none",n.classList.add("bm-2u"),document.addEventListener("mousemove",C),document.addEventListener("touchmove",S,{passive:!1}),document.addEventListener("mouseup",M),document.addEventListener("touchend",M),document.addEventListener("touchcancel",M),p&&cancelAnimationFrame(p),$()},M=()=>{a=!1,p&&(cancelAnimationFrame(p),p=null),document.body.style.userSelect="",n.classList.remove("bm-2u"),document.removeEventListener("mousemove",C),document.removeEventListener("touchmove",S),document.removeEventListener("mouseup",M),document.removeEventListener("touchend",M),document.removeEventListener("touchcancel",M),o({element:s,width:m,height:d})},C=t=>{a&&(u=y(c+(t.clientX-r),w,f()),b=y(h+(t.clientY-l),x,g()))},S=t=>{if(!a)return;const e=t?.touches?.[0];e&&(u=y(c+(e.clientX-r),w,f()),b=y(h+(e.clientY-l),x,g()),t.preventDefault())};n.addEventListener("mousedown",t=>{t.preventDefault(),t.stopPropagation(),v(t.clientX,t.clientY)}),n.addEventListener("touchstart",t=>{const e=t?.touches?.[0];e&&(t.preventDefault(),t.stopPropagation(),v(e.clientX,e.clientY))},{passive:!1})}wt(t){(0,console.info)(`${this.name}: ${t}`),this.nt(this.h,"Status: "+t,!0)}ft(t){(0,console.error)(`${this.name}: ${t}`),this.nt(this.h,"Error: "+t,!0)}};f=new WeakSet,g=function(t,e={},s={}){const n=document.createElement(t);this.m?(this.u?.appendChild(n),this.p.push(this.u),this.u=n):(this.m=n,this.u=n);for(const[t,s]of Object.entries(e))i(this,f,w).call(this,n,t,s);for(const[t,e]of Object.entries(s))i(this,f,w).call(this,n,t,e);return n},w=function(t,e,i){"class"==e?t.classList.add(...i.split(/\s+/)):"for"==e?t.htmlFor=i:"tabindex"==e?t.tabIndex=Number(i):"readonly"==e?t.readOnly="true"==i||"1"==i:"maxlength"==e?t.maxLength=Number(i):e.startsWith("data")?t.dataset[e.slice(5).split("-").map((t,e)=>0==e?t:t[0].toUpperCase()+t.slice(1)).join("")]=i:e.startsWith("aria")?t.setAttribute(e,i):t[e]=i};var v,M,C,S,T,k,N,D,L,O,H,I,B,P=class extends ${constructor(t,i){super(t,i),e(this,v),this.window=null,this.xt="bm-l",this.yt=document.body,this.$t="windowSettings"}vt(){document.querySelector(`#${this.xt}`)?i(this,v,C).call(this):(this.window=this.S({id:this.xt,class:"bm-W"}).ct().it({class:"bm-s",innerHTML:y,"aria-label":'Minimize window "Settings"',"data-button-status":"expanded"},(t,e)=>{e.onclick=()=>t.dt(e),e.ontouchend=()=>{e.click()}}).M().S().M().S({class:"bm-D"}).it({class:"bm-s",innerHTML:'',"aria-label":'Close window "Settings"'},(t,e)=>{e.onclick=()=>i(this,v,C).call(this),e.ontouchend=()=>{e.click()}}).M().M().M().S({class:"bm-m"}).S({class:"bm-L bm-h"}).H(1,{textContent:"Settings"}).M().M().I().M().T({textContent:"Settings take 5 seconds to save."}).M().S({class:"bm-L bm-H"},(t,e)=>{this.Mt(),this.Ct()}).M().M().M().C(this.yt),i(this,v,N).call(this))}Mt(){i(this,v,D).call(this,"Pixel Highlight")}Ct(){i(this,v,D).call(this,"Template")}};v=new WeakSet,M=function(){var t,e;return this.St?((t=this.St)[e=this.$t]??(t[e]={}),this.St[this.$t]):null},C=function(){const t=document.querySelector(`#${this.xt}`);i(this,v,k).call(this,t),t?.remove()},S=function(t,e,i){const s=Math.max(8,window.innerWidth-t.offsetWidth-8),n=Math.max(8,window.innerHeight-t.offsetHeight-8);return{x:Math.min(Math.max(Math.round(Number(e)||8),8),s),y:Math.min(Math.max(Math.round(Number(i)||8),8),n)}},T=function(t){const e=i(this,v,M).call(this);e&&t&&requestAnimationFrame(()=>{if(!t.isConnected)return;const s=Number(e.x),n=Number(e.y);if(!Number.isFinite(s)||!Number.isFinite(n))return;const o=i(this,v,S).call(this,t,s,n);t.style.left="0px",t.style.top="0px",t.style.right="",t.style.transform=`translate(${o.x}px, ${o.y}px)`,o.x==s&&o.y==n||(e.x=o.x,e.y=o.y,this.Tt?.())})},k=function(t){const e=i(this,v,M).call(this);if(!e||!t?.isConnected)return;const s=t.getBoundingClientRect(),n=i(this,v,S).call(this,t,s.left,s.top);t.style.left="0px",t.style.top="0px",t.style.right="",t.style.transform=`translate(${n.x}px, ${n.y}px)`,e.x=n.x,e.y=n.y,this.Tt?.()},N=function(){const t=document.querySelector(`#${this.xt}.bm-W`);t&&(i(this,v,T).call(this,t),this.ut(`#${this.xt}.bm-W`,`#${this.xt} .bm-S`,{bt:({element:t})=>i(this,v,k).call(this,t)}))},D=function(t){this.window=this.S({class:"bm-L"}).H(2,{textContent:t}).M().I().M().T({innerHTML:`An error occured loading the ${t} category. SettingsManager failed to override the ${t} function inside WindowSettings.`}).M().M()},L=new WeakSet,O=function(t,e){t.disabled=!0;const i=t.dataset.status,s=this.St?.highlight??[[1,0,1],[2,0,0],[1,-1,0],[1,1,0],[1,0,-1]];let n=[2,0,0];const o=s;switch(i){case"Disabled":t.dataset.status="Incorrect",t.ariaLabel="Sub-pixel incorrect",n=[1,...e];break;case"Incorrect":t.dataset.status="Template",t.ariaLabel="Sub-pixel template",n=[2,...e];break;case"Template":t.dataset.status="Disabled",t.ariaLabel="Sub-pixel disabled",n=[0,...e];break}const a=s.findIndex(([,t,e])=>t==n[1]&&e==n[2]);0!=n[0]?-1!=a?o[a]=n:o.push(n):-1!=a&&o.splice(a,1),this.St.highlight=o,t.disabled=!1},H=async function(t){const e=document.querySelectorAll(".bm-3 button");for(const t of e)t.disabled=!0;let i=[0,0,0,0,2,0,0,0,0];switch(t){case"Cross":i=[0,1,0,1,2,1,0,1,0];break;case"X":i=[1,0,1,0,2,0,1,0,1];break;case"Full":i=[2,2,2,2,2,2,2,2,2];break}const n=document.querySelector(".bm-n")?.childNodes??[];for(let t=0;t{const[s,n,o,a]=e.split(",").map(Number);(n>>24==0?0:n.get(e)??-2;const a=o.get(s);o.set(s,a?a+1:1)}return console.log(o),o};var z=class{constructor(){this.Et=Math.ceil(80/1300*window.innerWidth),this.Yt=x.slice(1)}Jt(t){const e=document.createElement("div");for(let t=0;t{t.parentNode.childElementCount<=1?t.parentNode.remove():t.remove()},e.appendChild(t)}t.appendChild(e)}},F=class extends HTMLElement{};customElements.define("confetti-piece",F);var W,U,V,G,R,j,E,Y,J,X,_,q,Z,K,Q,tt,et,it,st,nt,ot,at,rt,lt,ct,ht,mt,dt,ut,bt='',pt=class extends ${constructor(t){super(t.name,t.version),e(this,W),this.window=null,this.xt="bm-t",this.Xt="bm-E",this.yt=document.body,this.l=t.l??null,this._t="ftr-oWin",this.$t="windowFilter",this.qt=null,this.Zt=null,this.Kt=null,this.Qt=null,this.te=1e4,this.ee=360,this.ie=220,this.se=1e3,this.ne=1400,this.oe=t.o?.oe,this.ae='',this.re='';const{palette:i,jt:s}=this.oe.le;this.palette=i,this.ce=0,this.he=0,this.me=new Map,this.de=new Map,this.ue=0,this.be=0,this.timeRemaining=0,this.pe="",this.sortPrimary="total",this.sortSecondary="descending",this.showUnused=!1}fe(){i(this,W,V).call(this)?this.ge():this.vt()}vt(){if(document.querySelector(`#${this.xt}`))return void i(this,W,j).call(this);this.window=this.S({id:this.xt,class:"bm-W"},(t,e)=>{}).ct().it({class:"bm-s",innerHTML:y,"aria-label":'Minimize window "Color Filter"',"data-button-status":"expanded"},(t,e)=>{e.onclick=()=>t.dt(e),e.ontouchend=()=>{e.click()}}).M().S().M().S({class:"bm-D"}).it({class:"bm-s",innerHTML:'',"aria-label":'Switch to windowed mode for "Color Filter"'},(t,e)=>{e.onclick=()=>{i(this,W,G).call(this,!0),i(this,W,j).call(this),this.ge()},e.ontouchend=()=>{e.click()}}).M().it({class:"bm-s",innerHTML:bt,"aria-label":'Close window "Color Filter"'},(t,e)=>{e.onclick=()=>i(this,W,j).call(this),e.ontouchend=()=>{e.click()}}).M().M().M().S({class:"bm-m"}).S({class:"bm-L bm-h bm-20"}).H(1,{textContent:"Color Filter"}).M().M().I().M().S({class:"bm-L bm-x bm-h bm-1S",style:"gap: 1.5ch;"}).it({class:"bm-1F",textContent:"Hide All Colors"},(t,e)=>{e.onclick=()=>i(this,W,it).call(this,!1)}).M().it({class:"bm-1F",textContent:"Show All Colors"},(t,e)=>{e.onclick=()=>i(this,W,it).call(this,!0)}).M().M().I().M().S({class:"bm-L bm-H bm-1z"}).S({class:"bm-L bm-1N"}).S({class:"bm-1G"}).S({class:"bm-1H"}).N({class:"bm-1A",textContent:"Tiles"}).M().N({id:"bm-i",class:"bm-1B",textContent:"0 / ???"}).M().M().S({class:"bm-1H"}).N({class:"bm-1A",textContent:"Correct"}).M().N({id:"bm-d",class:"bm-1B",textContent:"???"}).M().M().S({class:"bm-1H"}).N({class:"bm-1A",textContent:"Total"}).M().N({id:"bm-j",class:"bm-1B",textContent:"???"}).M().M().S({class:"bm-1H"}).N({class:"bm-1A",textContent:"Remaining"}).M().N({id:"bm-7",class:"bm-1B",textContent:"???"}).M().M().S({class:"bm-1H bm-1c"}).N({class:"bm-1A",textContent:"Finish At"}).M().N({id:"bm-8",class:"bm-1B",textContent:"???"}).M().M().M().I().M().P({class:"bm-L bm-1C"}).A().F({textContent:"Sort Options:",style:"font-weight: 700;"}).M().S({class:"bm-L"}).U({id:"bm-c",name:"sortPrimary",textContent:"I want to view "}).V({value:"id",textContent:"color IDs"}).M().V({value:"name",textContent:"color names"}).M().V({value:"premium",textContent:"premium colors"}).M().V({value:"percent",textContent:"percentage"}).M().V({value:"correct",textContent:"correct pixels"}).M().V({value:"incorrect",textContent:"incorrect pixels"}).M().V({value:"total",textContent:"total pixels"}).M().M().U({id:"bm-5",name:"sortSecondary",textContent:" in "}).V({value:"ascending",textContent:"ascending"}).M().V({value:"descending",textContent:"descending"}).M().M().N({textContent:" order."}).M().M().S({class:"bm-L"}).W({id:"bm-e",name:"showUnused",textContent:"Show unused colors"}).M().M().M().S({class:"bm-L bm-1q"}).it({class:"bm-1T",textContent:"Sort Colors",type:"submit"},(t,e)=>{e.onclick=t=>{t.preventDefault();const e=new FormData(document.querySelector(`#${this.xt} form`)),s={};for(const[t,i]of e)s[t]=i;console.log(`Primary: ${s.sortPrimary}; Secondary: ${s.sortSecondary}; Unused: ${"on"==s.showUnused}`),i(this,W,et).call(this,s.sortPrimary,s.sortSecondary,"on"==s.showUnused)}}).M().M().M().M().M().M().M().C(this.yt),this.ut(`#${this.xt}.bm-W`,`#${this.xt} .bm-S`);const t=document.querySelector(`#${this.xt} .bm-L.bm-H`);i(this,W,tt).call(this,t),i(this,W,R).call(this),i(this,W,et).call(this,this.sortPrimary,this.sortSecondary,this.showUnused),this.nt("#bm-i",`${n(this.ce)} / ${n(this.he)}`),this.nt("#bm-d",n(this.ue)),this.nt("#bm-j",n(this.be)),this.nt("#bm-7",`${n((this.be||0)-(this.ue||0))} (${o(((this.be||0)-(this.ue||0))/(this.be||1))})`),this.nt("#bm-8",``),i(this,W,E).call(this)}ge(){if(document.querySelector(`#${this.xt}`))return void i(this,W,j).call(this);this.window=this.S({id:this.xt,class:"bm-W bm-N",style:`width: 360px; height: min(70vh, 32rem); min-width: ${this.ee}px; min-height: ${this.ie}px; max-width: min(${this.se}px, calc(100vw - 16px)); max-height: min(${this.ne}px, calc(100vh - 16px));`}).ct().it({class:"bm-s",innerHTML:y,"aria-label":'Minimize window "Color Filter"',"data-button-status":"expanded"},(t,e)=>{e.onclick=()=>{const i=document.querySelector("#bm-2");i&&(i.style.display="expanded"==e.dataset.buttonStatus?"none":""),t.dt(e)},e.ontouchend=()=>{e.click()}}).M().S().N({id:"bm-2",class:"bm-y",style:"font-weight: 700;"}).M().M().S({class:"bm-D"}).it({class:"bm-s",innerHTML:'',"aria-label":'Switch to fullscreen mode for "Color Filter"'},(t,e)=>{e.onclick=()=>{i(this,W,G).call(this,!1),i(this,W,j).call(this),this.vt()},e.ontouchend=()=>{e.click()}}).M().it({class:"bm-s",innerHTML:bt,"aria-label":'Close window "Color Filter"'},(t,e)=>{e.onclick=()=>i(this,W,j).call(this),e.ontouchend=()=>{e.click()}}).M().M().M().S({class:"bm-m"}).S({class:"bm-L bm-h bm-20"}).H(1,{textContent:"Color Filter"}).M().M().I().M().S({class:"bm-L bm-x bm-h bm-1S",style:"gap: 1.5ch;"}).it({class:"bm-1F",textContent:"None"},(t,e)=>{e.onclick=()=>i(this,W,it).call(this,!1)}).M().it({class:"bm-1F",textContent:"All"},(t,e)=>{e.onclick=()=>i(this,W,it).call(this,!0)}).M().M().I().M().S({class:"bm-L bm-H bm-1z"}).M().M().S({class:"bm-21",title:"Resize Color Filter window","aria-label":"Resize Color Filter window",role:"presentation",textContent:"◢",style:"position: absolute; right: 0; bottom: 0; width: 28px; height: 28px; display: flex; align-items: flex-end; justify-content: flex-end; padding-right: 4px; padding-bottom: 4px; box-sizing: border-box; z-index: 5; cursor: nwse-resize; pointer-events: auto; touch-action: none; user-select: none; font-size: 8px; line-height: 1; color: rgba(255,255,255,0.95); background: transparent; border: none; box-shadow: none;"}).M().M().C(this.yt),i(this,W,Q).call(this);const t=document.querySelector(`#${this.xt} .bm-L.bm-H`);i(this,W,tt).call(this,t),i(this,W,R).call(this),i(this,W,et).call(this,this.sortPrimary,this.sortSecondary,this.showUnused),i(this,W,E).call(this)}we(){i(this,W,rt).call(this);const t=document.querySelector(`#${this.Xt}`),e={};for(const t of this.palette){const i=this.me.get(t.id)??0,s=n(i);let a=0,r="0",l=o(1);0!=i&&(a=this.de.get(t.id)??"???","number"!=typeof a&&this.ce==this.he&&t.id&&(a=0),r="string"==typeof a?a:n(a),l=isNaN(a/i)?"???":o(a/i));const c=parseInt(i)-parseInt(a);e[t.id]={xe:i,ye:s,$e:a,ve:r,Me:l,Ce:c}}if(document.querySelector("#bm-2")){const t=this.ue.toString().length>7?this.ue.toString().slice(0,2)+"…"+this.ue.toString().slice(-3):this.ue.toString(),e=this.be.toString().length>7?this.be.toString().slice(0,2)+"…"+this.be.toString().slice(-3):this.be.toString();this.nt("#bm-2",`${t}/${e}`,!0)}if(this.nt("#bm-i",`${n(this.ce)} / ${n(this.he)}`),this.nt("#bm-d",n(this.ue)),this.nt("#bm-j",n(this.be)),this.nt("#bm-7",`${n((this.be||0)-(this.ue||0))} (${o(((this.be||0)-(this.ue||0))/(this.be||1))})`),this.nt("#bm-8",``),!t)return e;const s=Array.from(t.children);for(const t of s){const i=parseInt(t.dataset.id),{$e:s,ve:n,Me:o,xe:a,ye:r,Ce:l}=e[i];t.dataset.correct=Number.isNaN(parseInt(s))?"0":s,t.dataset.total=a,t.dataset.percent="%"==o.slice(-1)?o.slice(0,-1):"0",t.dataset.incorrect=l||0;const c=document.querySelector(`#${this.xt} .bm-z[data-id="${i}"] .bm-9`);c&&(c.closest(`#${this.xt}.bm-N`)?c.textContent=`${n} / ${r}`:c.innerHTML=`${n} /
${r}`);const h=document.querySelector(`#${this.xt} .bm-z[data-id="${i}"] .bm-6`);h&&(h.innerHTML=`${o} done
${"number"!=typeof l||isNaN(l)?"???":l} off`)}i(this,W,et).call(this,this.sortPrimary,this.sortSecondary,this.showUnused)}};W=new WeakSet,U=function(){var t,e;return this.l?((t=this.l.St)[e=this.$t]??(t[e]={}),this.l.St[this.$t]):null},V=function(){const t=i(this,W,U).call(this);return"windowed"==t?.mode||"fullscreen"!=t?.mode},G=function(t){const e=i(this,W,U).call(this);e&&(e.mode=t?"windowed":"fullscreen"),this.l&&(this.l.Se(this._t,t),this.l.Tt())},R=function(){const t=document.querySelector(`#${this.xt} #bm-c`),e=document.querySelector(`#${this.xt} #bm-5`),i=document.querySelector(`#${this.xt} #bm-e`);t instanceof HTMLSelectElement&&(t.value=this.sortPrimary),e instanceof HTMLSelectElement&&(e.value=this.sortSecondary),i instanceof HTMLInputElement&&(i.checked=this.showUnused)},j=function(){const t=document.querySelector(`#${this.xt}`);t?.classList.contains("bm-N")&&i(this,W,Z).call(this,t),i(this,W,Y).call(this),i(this,W,J).call(this),t?.remove()},E=function(){i(this,W,Y).call(this),this.Qt=setInterval(()=>{document.querySelector(`#${this.xt}`)?this.we():i(this,W,Y).call(this)},this.te)},Y=function(){this.Qt&&(clearInterval(this.Qt),this.Qt=null)},J=function(){this.qt&&(this.qt.disconnect(),this.qt=null),this.Zt&&(window.removeEventListener("resize",this.Zt),this.Zt=null),this.Kt&&(clearTimeout(this.Kt),this.Kt=null)},X=function(t,e,i){const s=Math.max(e,i);return Math.min(Math.max(Math.round(Number(t)||e),e),s)},_=function(t,e,i){const s=Math.max(8,window.innerWidth-t.offsetWidth-8),n=Math.max(8,window.innerHeight-t.offsetHeight-8);return{x:Math.min(Math.max(Math.round(Number(e)||8),8),s),y:Math.min(Math.max(Math.round(Number(i)||8),8),n)}},q=function(t){const e=i(this,W,U).call(this);if(!e||!t)return;const s=Number(e.width),n=Number(e.height),o=Number.isFinite(s),a=Number.isFinite(n);o&&(e.width=i(this,W,X).call(this,s,this.ee,Math.min(this.se,window.innerWidth-16)),t.style.width=`${e.width}px`),a&&(e.height=i(this,W,X).call(this,n,this.ie,Math.min(this.ne,window.innerHeight-16)),t.style.height=`${e.height}px`),requestAnimationFrame(()=>{if(!t.isConnected)return;const s=Number(e.x),n=Number(e.y);if(!Number.isFinite(s)||!Number.isFinite(n))return;const o=i(this,W,_).call(this,t,s,n);t.style.left="0px",t.style.top="0px",t.style.right="",t.style.transform=`translate(${o.x}px, ${o.y}px)`,o.x==s&&o.y==n||(e.x=o.x,e.y=o.y,this.l?.Tt())})},Z=function(t){const e=i(this,W,U).call(this);if(!e||!t?.isConnected||!t.classList.contains("bm-N"))return;if(t.querySelector('.bm-S button[data-button-status="collapsed"]'))return;const s=t.getBoundingClientRect(),n=i(this,W,X).call(this,s.width,this.ee,Math.min(this.se,window.innerWidth-16)),o=i(this,W,X).call(this,s.height,this.ie,Math.min(this.ne,window.innerHeight-16));Math.round(s.width)!=n&&(t.style.width=`${n}px`),Math.round(s.height)!=o&&(t.style.height=`${o}px`);const a=i(this,W,_).call(this,t,s.left,s.top);t.style.left="0px",t.style.top="0px",t.style.right="",t.style.transform=`translate(${a.x}px, ${a.y}px)`,e.x=a.x,e.y=a.y,e.width=n,e.height=o,this.l?.Tt()},K=function(t,e=150){this.Kt&&clearTimeout(this.Kt),this.Kt=setTimeout(()=>{this.Kt=null,i(this,W,Z).call(this,t)},e)},Q=function(){const t=document.querySelector(`#${this.xt}.bm-W`);t&&(i(this,W,J).call(this),i(this,W,q).call(this,t),this.ut(`#${this.xt}.bm-W`,`#${this.xt} .bm-S`,{bt:({element:t})=>i(this,W,Z).call(this,t)}),this.gt(`#${this.xt}.bm-W`,`#${this.xt} .bm-21`,{minWidth:this.ee,minHeight:this.ie,maxWidth:Math.min(this.se,window.innerWidth-16),maxHeight:Math.min(this.ne,window.innerHeight-16),bt:({element:t})=>i(this,W,Z).call(this,t)}),"function"==typeof ResizeObserver&&(this.qt=new ResizeObserver(()=>i(this,W,K).call(this,t)),this.qt.observe(t)),this.Zt=()=>i(this,W,K).call(this,t,0),window.addEventListener("resize",this.Zt))},tt=function(t){const e=t.closest(`#${this.xt}`)?.classList.contains("bm-N");console.log(`Is Windowed Mode: ${e}`);const s=new $(this.name,this.version);s.S({id:this.Xt});const n=this.we();for(const t of this.palette){const o="#"+p(t.rgb).toUpperCase(),a=b(t.rgb);let r=1.05/(a+.05)>(a+.05)/.05?"white":"black";t.id||(r="transparent");const l="white"==r?"bm-f":"bm-g",c=t.rgb?.map(t=>Number(t)||0).join(","),h=-2==t.id||-1==t.id||0==t.id?"white":r,m=`--bm-1U: rgb(${c}); --bm-1V: ${h};`,{$e:d,ve:u,Me:f,xe:g,ye:w,Ce:x}=n[t.id],y=!!this.oe.Te.get(t.id);if(e){const e=`background-size: auto 100%; background-repeat: repeat-x; background-image: url("data:image/svg+xml;utf8,");`;s.S({class:"bm-L bm-z bm-x","data-id":t.id,"data-name":t.name,"data-premium":+t.premium,"data-state":y?"hidden":"shown","data-correct":Number.isNaN(parseInt(d))?"0":d,"data-total":g,"data-percent":"%"==f.slice(-1)?f.slice(0,-1):"0","data-incorrect":x||0},(e,s)=>i(this,W,at).call(this,s,t)).S({class:"bm-a",style:`background-color: rgb(${t.rgb?.map(t=>Number(t)||0).join(",")});${t.premium?e:""}`}).it({class:"bm-A bm-z-visibility "+l,"data-state":y?"hidden":"shown","aria-label":y?`Show the color ${t.name||""} on templates.`:`Hide the color ${t.name||""} on templates.`,innerHTML:y?this.re:this.ae,style:`color: ${r};`},(e,s)=>{s.onclick=e=>{e.stopPropagation(),i(this,W,nt).call(this,s,t)},t.id||(s.disabled=!0),i(this,W,st).call(this,s,t)}).M().k({textContent:`#${t.id.toString().padStart(2,0)}`,style:`color: ${-1==t.id||0==t.id?"white":r}`}).M().H(2,{textContent:t.name,style:`color: ${-1==t.id||0==t.id?"white":r}`}).M().k({class:"bm-9",textContent:`${u} / ${w}`,style:`color: ${-1==t.id||0==t.id?"white":r}; flex: 1 1 auto; text-align: right;`}).M().M().M()}else s.S({class:"bm-L bm-z bm-x",style:m,"data-id":t.id,"data-name":t.name,"data-premium":+t.premium,"data-state":y?"hidden":"shown","data-correct":Number.isNaN(parseInt(d))?"0":d,"data-total":g,"data-percent":"%"==f.slice(-1)?f.slice(0,-1):"0","data-incorrect":x||0},(e,s)=>i(this,W,at).call(this,s,t)).S({class:"bm-1r","aria-hidden":"true"}).M().S({class:"bm-z-main"}).S({class:"bm-a"}).it({class:"bm-A bm-z-visibility "+l,"data-state":y?"hidden":"shown","aria-label":y?`Show the color ${t.name||""} on templates.`:`Hide the color ${t.name||""} on templates.`,innerHTML:y?this.re:this.ae,style:`color: ${h};`},(e,s)=>{s.onclick=e=>{e.stopPropagation(),i(this,W,nt).call(this,s,t)},t.id||(s.disabled=!0),i(this,W,st).call(this,s,t)}).M().M().S({class:"bm-z-title"}).k({textContent:`#${t.id.toString().padStart(2,0)} / ${-2==t.id?"mixed":o}`}).M().H(2,{textContent:t.name}).M().M().M().S({class:"bm-z-meta"}).S({class:"bm-z-progress"}).N({class:"bm-9",innerHTML:`${u} /
${w}`}).M().k({class:"bm-6",innerHTML:`${f} done
${"number"!=typeof x||isNaN(x)?"???":x} off`}).M().M().M().M()}s.C(t)},et=function(t,e,i){this.sortPrimary=t,this.sortSecondary=e,this.showUnused=i;const s=document.querySelector(`#${this.Xt}`),n=Array.from(s.children);n.sort((s,n)=>{const o=s.getAttribute("data-"+t),a=n.getAttribute("data-"+t),r=parseFloat(o),l=parseFloat(a),c=!isNaN(r),h=!isNaN(l);if(i?s.classList.remove("bm-I"):Number(s.getAttribute("data-total"))||s.classList.add("bm-I"),c&&h)return"ascending"===e?r-l:l-r;{const t=o.toLowerCase(),i=a.toLowerCase();return ti?"ascending"===e?1:-1:0}}),n.forEach(t=>s.appendChild(t))},it=function(t){const e=document.querySelector(`#${this.Xt}`),i=Array.from(e.children);for(const e of i){if(e.classList?.contains("bm-I"))continue;const i=e.querySelector(".bm-z-visibility");("hidden"!=i.dataset.state||t)&&("shown"==i.dataset.state&&t||i.click())}},st=function(t,e){const i="hidden"==t.dataset.state?`Show the color ${e.name||""} on templates.`:`Hide the color ${e.name||""} on templates.`;t.ariaLabel=i;const s=t.closest(".bm-z");s?.setAttribute("aria-label",i),s?.setAttribute("data-state",t.dataset.state)},nt=function(t,e){t&&!t.disabled&&e.id&&(t.style.textDecoration="none",t.disabled=!0,"shown"==t.dataset.state?(t.innerHTML=this.re,t.dataset.state="hidden",this.oe.ke(e.id,!0),i(this,W,ot).call(this,t,"hide")):(t.dataset.state="shown",this.oe.ke(e.id,!1),i(this,W,ot).call(this,t,"show")),i(this,W,st).call(this,t,e),t.disabled=!1,t.style.textDecoration="")},ot=function(t,e){if(!t)return;const i="hide"==e?"bm-19":"bm-1a";t.classList.remove("bm-19","bm-1a"),t.offsetWidth,t.classList.add(i);let s=null;const n=()=>{window.clearTimeout(s),t.classList.remove(i),"show"==e&&"shown"==t.dataset.state&&(t.innerHTML=this.ae)};t.addEventListener("animationend",n,{once:!0}),s=window.setTimeout(n,280)},at=function(t,e){t&&e.id&&(t.classList.add("bm-z-toggle"),t.tabIndex=0,t.setAttribute("role","button"),t.onclick=s=>{if(s.target instanceof Element&&s.target.closest("button, a, input, select, textarea"))return;const n=t.querySelector(".bm-z-visibility");i(this,W,nt).call(this,n,e)},t.onkeydown=e=>{"Enter"!=e.key&&" "!=e.key||(e.preventDefault(),t.click())})},rt=function(){this.ce=0,this.he=0,this.be=0,this.ue=0,this.de=new Map,this.me=new Map;for(const t of this.oe.Ne){const e=t.Ht?.total??0;this.be+=e??0;const i=t.Ht?.colors??new Map;for(const[t,e]of i){const i=Number(e)||0,s=this.me.get(t)??0;this.me.set(t,s+i)}const s=t.Ht?.correct??{};this.ce+=Object.keys(s).length,this.he+=Object.keys(t.Dt).length;for(const t of Object.values(s))for(const[e,i]of t){const t=Number(i)||0;this.ue+=t;const s=this.de.get(e)??0;this.de.set(e,s+t)}}console.log(`Tiles loaded: ${this.ce} / ${this.he}`),this.ue>=this.be&&this.be&&this.ce==this.he&&(new z).Jt(document.querySelector(`#${this.xt}`)),this.timeRemaining=new Date(30*(this.be-this.ue)*1e3+Date.now()),this.pe=function(t){const e=t.getMonth()+1,i=t.getDate(),s=String(t.getFullYear()).slice(-2),n=String(t.getMinutes()).padStart(2,"0"),o=new Intl.DateTimeFormat(void 0,{De:"numeric"}).resolvedOptions().hour12;let a=t.getHours(),r="";return o?(r=a>=12?" PM":" AM",a=a%12||12):a=String(a).padStart(2,"0"),`${e}/${i}/${s} ${a}:${n}${r}`}(this.timeRemaining)},lt=new WeakSet,ct=async function(t,e,i){i.preventDefault();const s=await async function(t){let e="";return t&&(e=t.clipboardData.getData("text/plain")),0!=e.length||(await navigator.clipboard.readText().then(t=>{e=t}).catch(t=>{r("Failed to retrieve clipboard data using navigator! Using fallback methods...")}),0!=e.length||(e=window.clipboardData?.getData("Text"))),e}(i),n=s.split(/[^a-zA-Z0-9]+/).filter(t=>t).map(Number).filter(t=>!isNaN(t));2==n.length&&"bm-O"==e.id?(t.nt("bm-O",n?.[0]||""),t.nt("bm-P",n?.[1]||"")):1==n.length?t.nt(e.id,n?.[0]||""):(t.nt("bm-Q",n?.[0]||""),t.nt("bm-R",n?.[1]||""),t.nt("bm-O",n?.[2]||""),t.nt("bm-P",n?.[3]||""))};var ft=class extends ${constructor(t,i,s,n=void 0){super(t,i),e(this,ht),this.window=null,this.xt="bm-u",this.yt=document.body,this.Le=JSON.parse(GM_getValue("bmTemplates","{}")),this.scriptVersion=this.Le?.scriptVersion,this.schemaVersion=this.Le?.schemaVersion,this.Oe=void 0,this.He=s,this.oe=n}vt(){if(document.querySelector(`#${this.xt}`))return void document.querySelector(`#${this.xt}`).remove();let t="";document.querySelector("#bm-F")||(t=t.concat("z-index: 9001;").trim()),this.window=this.S({id:this.xt,class:"bm-W",style:t},(t,e)=>{}).ct().it({class:"bm-s",innerHTML:y,"aria-label":'Minimize window "Template Wizard"',"data-button-status":"expanded"},(t,e)=>{e.onclick=()=>t.dt(e),e.ontouchend=()=>{e.click()}}).M().S().M().it({class:"bm-s",textContent:"✖","aria-label":'Close window "Template Wizard"'},(t,e)=>{e.onclick=()=>{document.querySelector(`#${this.xt}`)?.remove()},e.ontouchend=()=>{e.click()}}).M().M().S({class:"bm-m"}).S({class:"bm-L bm-h"}).H(1,{textContent:"Template Wizard"}).M().M().I().M().S({class:"bm-L"}).H(2,{textContent:"Status"}).M().T({id:"bm-v",textContent:"Loading template storage status..."}).M().M().S({class:"bm-L bm-H"}).H(2,{textContent:"Detected templates:"}).M().M().M().M().C(this.yt),this.ut(`#${this.xt}.bm-W`,`#${this.xt} .bm-S`),i(this,ht,mt).call(this),i(this,ht,dt).call(this)}};ht=new WeakSet,mt=function(){const t=this.schemaVersion.split(/[-\.\+]/),e=this.He.split(/[-\.\+]/);let s="";t[0]==e[0]?t[1]==e[1]?(s='Template storage health: Healthy!
No futher action required. (Reason: Semantic version matches)',this.Oe="Good"):(s='Template storage health: Poor!
You can still use your template, but some features may not work. It is recommended that you update Blue Marble\'s template storage. (Reason: MINOR version mismatch)',this.Oe="Poor"):t[0]Bad!
It is guaranteed that some features are broken. You might still be able to use the template. It is HIGHLY recommended that you download all templates and update Blue Marble\'s template storage before continuing. (Reason: MAJOR version mismatch)',this.Oe="Bad"):(s='Template storage health: Dead!
Blue Marble can not load the template storage. (Reason: MAJOR version unknown)',this.Oe="Dead");const n=`
If you want to continue using your current templates, then make sure the template storage (schema) is up-to-date.
If you don't want to update the template storage, then downgrade Blue Marble to version ${a(this.scriptVersion)} to continue using your templates.
Alternatively, if you don't care about corrupting the templates listed below, you can fix any issues with the template storage by uploading a new template.`,o=function(){const t=[...document.querySelectorAll("body > div > .hidden")].filter(t=>/version:/i.test(t.textContent));if(t[0]){const e=t[0].textContent?.match(/\d+/);return e?new Date(Number(e[0])):void 0}}();let r=o?o.toLocaleString(void 0,{Ie:"long",Be:"numeric",De:"2-digit",Pe:"2-digit",Ae:"2-digit"}):"???";this.nt("#bm-v",`${s}
Your templates were created during Blue Marble version ${a(this.scriptVersion)} with schema version ${a(this.schemaVersion)}.
The current Blue Marble version is ${a(this.version)} and requires schema version ${a(this.He)}.
Wplace was last updated on ${r}.${"Good"!=this.Oe?n:""}`);const l=new $(this.name,this.version);"Dead"!=this.Oe&&(l.S({class:"bm-L bm-D bm-h",style:"gap: 1.5ch;"}),l.it({textContent:"Download all templates"},(t,e)=>{e.onclick=()=>{e.disabled=!0,this.oe.ze().then(()=>{e.disabled=!1})}}).M()),"Poor"!=this.Oe&&"Bad"!=this.Oe||l.it({textContent:`Update template storage to ${this.He}`},(t,e)=>{e.onclick=()=>{e.disabled=!0,i(this,ht,ut).call(this,!0)}}).M(),l.M().C(document.querySelector("#bm-v").parentNode)},dt=function(){const t=this.Le?.templates;if(Object.keys(t).length>0){const e=document.querySelector(`#${this.xt} .bm-H`),i=new $(this.name,this.version);i.S({id:"bm-B",class:"bm-L"});for(const e in t){const s=e,o=t[e];if(t.hasOwnProperty(e)){const t=s.split(" "),e=Number(t?.[0]),a=m(t?.[1]||"0",this.oe.Fe),r=o.name||`Template ${e||""}`,l=o?.coords?.split(",").map(Number),c=o.pixels?.total??void 0,h=void 0,d="number"==typeof e?n(e):"???",u="number"==typeof a?n(a):"???",b="number"==typeof c?n(c):"???";i.S({class:"bm-L bm-D"}).S({class:"bm-D",style:"flex-direction: column; gap: 0;"}).S({class:"bm-1",textContent:h||"🖼️"}).M().k({textContent:`#${d}`}).M().M().S({class:"bm-D bm-0"}).H(3,{textContent:r}).M().N({textContent:`Uploaded by user #${u}`}).M().N({textContent:`Coordinates: ${l.join(", ")}`}).M().N({textContent:`Total Pixels: ${b}`}).M().M().M()}}i.M().C(e)}},ut=async function(t){if(t){const t=document.querySelector(`#${this.xt} .bm-m`);t.innerHTML="",new $(this.name,this.version).S({class:"bm-L"}).S({class:"bm-L bm-h"}).H(1,{textContent:"Template Wizard"}).M().M().I().M().S({class:"bm-L"}).H(2,{textContent:"Status"}).M().T({textContent:"Updating template storage. Please wait..."}).M().M().M().C(t)}GM_deleteValue("bmCoords");const e=this.Le?.templates;if(Object.keys(e).length>0)for(const[t,i]of Object.entries(e))if(e.hasOwnProperty(t)){const t=new A({displayName:i.name,Dt:i.tiles});t.Rt();const e=await this.oe.We(t);await this.oe.Ue(e,t.displayName,t.coords)}t&&(console.log("Restarting Template Wizard..."),document.querySelector(`#${this.xt}`).remove(),new ft(this.name,this.version,this.He,this.oe).vt())};var gt,wt,xt,yt,$t,vt,Mt,Ct,St=ft;gt=new WeakSet,wt=function(){const t=this.l?.St?.filter,e=Array.isArray(t)?t:[];this.Te.clear();for(const t of e){const e=Number(t);Number.isFinite(e)&&this.Te.set(e,!0)}},xt=function(){this.l&&(this.l.St.filter=Array.from(this.Te.keys()).map(t=>Number(t)).filter(t=>Number.isFinite(t)).sort((t,e)=>t-e),this.l.Tt())},yt=async function(){GM.setValue("bmTemplates",JSON.stringify(this.Ve))},$t=async function(t){console.log("Parsing BlueMarble...");const e=t.templates;console.log(`BlueMarble length: ${Object.keys(e).length}`);const i=t?.schemaVersion,s=i.split(/[-\.\+]/),n=this.schemaVersion.split(/[-\.\+]/),o=t?.scriptVersion;console.log(`BlueMarble Template Schema: ${i}; Script Version: ${o}`),s[0]==n[0]?(s[1]!=n[1]&&new St(this.name,this.version,this.schemaVersion,this).vt(),this.Ne=await async function({Ot:t,Ge:i,Ne:s}){if(Object.keys(e).length>0)for(const n in e){const o=n,a=e[n];if(console.log(`Template Key: ${o}`),e.hasOwnProperty(n)){const e=o.split(" "),n=Number(e?.[0]),r=e?.[1]||"0",l=a.name||`Template ${n||""}`,c={total:a.pixels?.total,colors:new Map(Object.entries(a.pixels?.colors||{}).map(([t,e])=>[Number(t),e]))},h=a.tiles,m={},d={},b=t*i;for(const t in h)if(console.log(t),h.hasOwnProperty(t)){const e=u(h[t]),i=new Blob([e],{type:"image/png"}),s=await createImageBitmap(i);m[t]=s;const n=new OffscreenCanvas(b,b).getContext("2d");n.drawImage(s,0,0);const o=n.getImageData(0,0,s.width,s.height);d[t]=new Uint32Array(o.data.buffer)}const p=new A({displayName:l,kt:n||this.Ne?.length||0,Nt:r||""});p.Ht=c,p.Dt=m,p.Lt=d,s.push(p),console.log(this.Ne),console.log("^^^ This ^^^")}}return s}({Ot:this.Ot,Ge:this.Ge,Ne:this.Ne})):s[0]>>24&255,y=g>>>24&255,$=b.get(w)??-2,v=b.get(g)??-2;if(this.Te.get($)&&(e[i*c+h]=g),-1==$){const t=536870912;this.Te.get($)?e[i*c+h]=0:(u/o&1)==(f/o&1)?(e[i*c+h]=t,e[(i-1)*c+(h-1)]=t,e[(i-1)*c+(h+1)]=t,e[(i+1)*c+(h-1)]=t,e[(i+1)*c+(h+1)]=t):(e[i*c+h]=0,e[(i-1)*c+h]=t,e[(i+1)*c+h]=t,e[i*c+(h-1)]=t,e[i*c+(h+1)]=t)}if(!n&&x>m&&v!=$&&(d||y>m)){const t=e[i*c+h];for(const n of s){const[s,o,a]=n,r=0!=s?1!=s?t:4278190335:0;e[(i+a)*c+(h+o)]=r}}if(-1==$&&g<=m){const t=p.get($);p.set($,t?t+1:1);continue}if(x<=m||y<=m)continue;if(v!=$)continue;const M=p.get($);p.set($,M?M+1:1)}return console.log("List of template pixels that match the tile:"),console.log(p),{qe:p,Ze:e}},Mt=new WeakSet,Ct=function(t){const e=JSON.parse(GM_getValue("bmUserSettings","{}"));e.telemetry=t,GM.setValue("bmUserSettings",JSON.stringify(e))};var Tt=GM_info.script.name.toString(),kt=GM_info.script.version.toString();!function(t){const e=document.createElement("script");e.setAttribute("bm-11",Tt),e.setAttribute("bm-X","color: cornflowerblue;"),e.textContent=`(${t})();`,document.documentElement?.appendChild(e),e.remove()}(()=>{const t=document.currentScript,e=t?.getAttribute("bm-11")||"Blue Marble",i=t?.getAttribute("bm-X")||"",s=new Map;window.addEventListener("message",t=>{const{source:n,endpoint:o,blobID:a,blobData:r,blink:l}=t.data,h=Date.now()-l;if(console.groupCollapsed(`%c${e}%c: ${s.size} Recieved IMAGE message about blob "${a}"`,i,""),console.log(`Blob fetch took %c${String(Math.floor(h/6e4)).padStart(2,"0")}:${String(Math.floor(h/1e3)%60).padStart(2,"0")}.${String(h%1e3).padStart(3,"0")}%c MM:SS.mmm`,i,""),console.log(s),console.groupEnd(),"blue-marble"==n&&a&&r&&!o){const t=s.get(a);"function"==typeof t?t(r):c(`%c${e}%c: Attempted to retrieve a blob (%s) from queue, but the blobID was not a function! Skipping...`,i,"",a),s.delete(a)}});const n=window.fetch;window.fetch=async function(...t){const o=await n.apply(this,t),a=o.clone(),r=(t[0]instanceof Request?t[0]?.url:t[0])||"ignore",l=a.headers.get("content-type")||"";if(l.includes("application/json"))console.log(`%c${e}%c: Sending JSON message about endpoint "${r}"`,i,""),a.json().then(t=>{const s=r?.split("?")[0].split("/").filter(t=>t&&isNaN(Number(t))).filter(t=>t&&!t.includes(".")).pop();if("me"==s)try{sessionStorage.setItem("bm-2A",JSON.stringify(t))}catch(t){console.warn(`%c${e}%c: Failed to cache "/me" payload`,i,"",t)}window.postMessage({source:"blue-marble",endpoint:r,jsonData:t},"*")}).catch(t=>{console.error(`%c${e}%c: Failed to parse JSON: `,i,"",t)});else if(l.includes("image/")&&!r.includes("openfreemap")&&!r.includes("maps")){const t=Date.now(),n=await a.blob();return console.log(`%c${e}%c: ${s.size} Sending IMAGE message about endpoint "${r}"`,i,""),new Promise(o=>{const l=crypto.randomUUID();s.set(l,t=>{o(new Response(t,{headers:a.headers,status:a.status,statusText:a.statusText})),console.log(`%c${e}%c: ${s.size} Processed blob "${l}"`,i,"")}),window.postMessage({source:"blue-marble",endpoint:r,blobID:l,blobData:n,blink:t})}).catch(n=>{const o=Date.now();console.error(`%c${e}%c: Failed to Promise blob!`,i,""),console.groupCollapsed(`%c${e}%c: Details of failed blob Promise:`,i,""),console.log(`Endpoint: ${r}\nThere are ${s.size} blobs processing...\nBlink: ${t.toLocaleString()}\nTime Since Blink: ${String(Math.floor(o/6e4)).padStart(2,"0")}:${String(Math.floor(o/1e3)%60).padStart(2,"0")}.${String(o%1e3).padStart(3,"0")} MM:SS.mmm`),console.error("Exception stack:",n),console.groupEnd()})}return o}});var Nt=GM_getResourceText("CSS-BM-File");function Dt(t){const e=document.createElement("link");e.href=t,e.rel="preload",e.as="style",e.onload=function(){this.onload=null,this.rel="stylesheet"},document.head?.appendChild(e)}GM_addStyle(Nt);var Lt="robotoMonoInjectionPoint";Dt("https://fonts.googleapis.com/css2?family=Michroma&family=Rajdhani:wght@400;500;600;700&display=swap"),Lt.indexOf("@font-face")+1?(console.log("Loading Roboto Mono as a file..."),GM_addStyle(Lt)):Dt("https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&display=swap");var Ot=JSON.parse(GM_getValue("bmUserSettings","{}")),Ht=(new class{constructor(){this.Ke=null,this.Qe=null,this.ti="#bm-p"}ei(t){return this.Qe=t,this.Ke=new MutationObserver(t=>{for(const e of t)for(const t of e.addedNodes)t instanceof HTMLElement&&t.matches?.(this.ti)}),this}ii(){return this.Ke}observe(t,e=!1,i=!1){t.observe(this.Qe,{childList:e,subtree:i})}},new class extends ${constructor(t,i){super(t,i),e(this,lt),this.window=null,this.xt="bm-F",this.yt=document.body}vt(){document.querySelector(`#${this.xt}`)?this.ft("Main window already exists!"):(this.window=this.S({id:this.xt,class:"bm-W bm-N",style:"top: 10px; left: unset; right: 75px;"},(t,e)=>{}).ct().it({class:"bm-s",innerHTML:y,"aria-label":'Minimize window "Blue Marble"',"data-button-status":"expanded"},(t,e)=>{e.onclick=()=>t.dt(e),e.ontouchend=()=>{e.click()}}).M().S().M().S({class:"bm-D"}).it({class:"bm-s",innerHTML:'',title:"Settings","aria-label":"Open settings"},(t,e)=>{e.onclick=()=>{t.l.vt()}}).M().M().M().S({class:"bm-m"}).I().M().S({class:"bm-L bm-2r"}).O({class:"bm-T",src:"https://raw.githubusercontent.com/SwingTheVine/Wplace-BlueMarble/main/dist/assets/Favicon.png"},(t,e)=>{const i=new Date;204==Math.floor((i.getTime()-new Date(i.getFullYear(),0,1))/864e5)+1&&(e.parentNode.style.position="relative",e.parentNode.innerHTML=e.parentNode.innerHTML+'',e.onload=()=>{(new z).Jt(document.querySelector(`#${this.xt}`))})}).M().H(1,{textContent:this.name}).M().M().I().M().S({class:"bm-L bm-2m"}).S({class:"bm-1X bm-1m"}).N({class:"bm-1O",textContent:"Droplets"}).M().N({id:"bm-w",class:"bm-1P",textContent:"0"}).M().M().S({class:"bm-1X bm-1m"}).N({class:"bm-1O",textContent:"Next Level"}).M().N({id:"bm-q",class:"bm-1P",textContent:"0 px"}).M().M().S({class:"bm-1X bm-1n"}).N({class:"bm-1O",textContent:"Charges"}).M().ht(Date.now(),1e3,{class:"bm-1P",style:"font-weight: 700;"},(t,e)=>{t.o.si=e.id}).M().M().M().I().M().S({class:"bm-L bm-2n"}).S({class:"bm-L bm-2g"}).it({class:"bm-s bm-J",style:"margin-top: 0;",innerHTML:''},(t,e)=>{e.onclick=()=>{const e=t.o?.ni;e?.[0]?(t.nt("bm-Q",e?.[0]||""),t.nt("bm-R",e?.[1]||""),t.nt("bm-O",e?.[2]||""),t.nt("bm-P",e?.[3]||"")):t.ft("Coordinates are malformed! Did you try clicking on the canvas first?")}}).M().ot({type:"number",id:"bm-Q",class:"bm-C",placeholder:"Tl X",min:0,max:2047,step:1,required:!0},(t,e)=>{e.addEventListener("paste",s=>i(this,lt,ct).call(this,t,e,s))}).M().ot({type:"number",id:"bm-R",class:"bm-C",placeholder:"Tl Y",min:0,max:2047,step:1,required:!0},(t,e)=>{e.addEventListener("paste",s=>i(this,lt,ct).call(this,t,e,s))}).M().ot({type:"number",id:"bm-O",class:"bm-C",placeholder:"Px X",min:0,max:2047,step:1,required:!0},(t,e)=>{e.addEventListener("paste",s=>i(this,lt,ct).call(this,t,e,s))}).M().ot({type:"number",id:"bm-P",class:"bm-C",placeholder:"Px Y",min:0,max:2047,step:1,required:!0},(t,e)=>{e.addEventListener("paste",s=>i(this,lt,ct).call(this,t,e,s))}).M().M().S({class:"bm-L bm-2h"}).rt({class:"bm-K",textContent:"Upload Template",accept:"image/png, image/jpeg, image/webp, image/bmp, image/gif"}).M().M().S({class:"bm-L bm-x bm-2b"}).it({class:"bm-1F",textContent:"Disable","data-button-status":"shown"},(t,e)=>{e.onclick=()=>{e.disabled=!0,"shown"==e.dataset.buttonStatus?(t.o?.oe?.oi(!1),e.dataset.buttonStatus="hidden",e.textContent="Enable",t.wt("Disabled templates!")):(t.o?.oe?.oi(!0),e.dataset.buttonStatus="shown",e.textContent="Disable",t.wt("Enabled templates!")),e.disabled=!1}}).M().it({class:"bm-1T",textContent:"Create"},(t,e)=>{e.onclick=()=>{const e=document.querySelector(`#${this.xt} .bm-K`),i=document.querySelector("#bm-Q");if(!i.checkValidity())return i.reportValidity(),void t.ft("Coordinates are malformed! Did you try clicking on the canvas first?");const s=document.querySelector("#bm-R");if(!s.checkValidity())return s.reportValidity(),void t.ft("Coordinates are malformed! Did you try clicking on the canvas first?");const n=document.querySelector("#bm-O");if(!n.checkValidity())return n.reportValidity(),void t.ft("Coordinates are malformed! Did you try clicking on the canvas first?");const o=document.querySelector("#bm-P");if(!o.checkValidity())return o.reportValidity(),void t.ft("Coordinates are malformed! Did you try clicking on the canvas first?");e?.files[0]?(t?.o?.oe.Ue(e.files[0],e.files[0]?.name.replace(/\.[^/.]+$/,""),[Number(i.value),Number(s.value),Number(n.value),Number(o.value)]),t.wt("Drew to canvas!")):t.ft("No file selected!")}}).M().it({class:"bm-1F",textContent:"Filter"},(t,e)=>{e.onclick=()=>this.ai()}).M().M().S({class:"bm-L bm-2i"}).lt({id:this.h,placeholder:`Status: Sleeping...\nVersion: ${this.version}`,readOnly:!0}).M().M().M().M().M().C(this.yt),this.ut(`#${this.xt}.bm-W`,`#${this.xt} .bm-S`))}ai(){new pt(this).fe()}}(Tt,kt)),It=new class{constructor(t,i){e(this,gt),this.name=t,this.version=i,this.Re=null,this.l=null,this.schemaVersion="2.0.0",this.ri=null,this.Fe="!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~",this.Ot=1e3,this.Ge=3,this._e=3,this.le=function(t){const e=x;e.unshift({id:-1,premium:!1,name:"Erased",rgb:[222,250,206]}),e.unshift({id:-2,premium:!1,name:"Other",rgb:[0,0,0]});const i=new Map;for(const s of e){if(0==s.id||-2==s.id)continue;const e=s.rgb[0],n=s.rgb[1],o=s.rgb[2];for(let a=-t;a<=t;a++)for(let r=-t;r<=t;r++)for(let l=-t;l<=t;l++){const t=e+a,c=n+r,h=o+l;if(t<0||t>255||c<0||c>255||h<0||h>255)continue;const m=(255<<24|h<<16|c<<8|t)>>>0;i.has(m)||i.set(m,s.id)}}return{palette:e,jt:i}}(this._e),this.Ee=null,this.li="",this.Ne=[],this.Ve=null,this.ci=!0,this.hi=null,this.Te=new Map}mi(t){this.Re=t}v(t){this.l=t,i(this,gt,wt).call(this)}ke(t,e){const s=Number(t);Number.isFinite(s)&&(e?this.Te.set(s,!0):this.Te.delete(s),i(this,gt,xt).call(this))}async di(){return{whoami:this.name.replace(" ",""),scriptVersion:this.version,schemaVersion:this.schemaVersion,templates:{}}}async Ue(t,e,s){this.Ve||(this.Ve=await this.di(),console.log("Creating JSON...")),this.Re.wt(`Creating template at ${s.join(", ")}...`);const n=new A({displayName:e,kt:0,Nt:h(this.ri||0,this.Fe),file:t,coords:s}),o=!this.l?.St?.flags?.includes("hl-noSkip"),a=this.l?.St?.flags?.includes("hl-agSkip");console.log(`Should Skip: ${o}; Should Agg Skip: ${a}`);const{Vt:r,Gt:l}=await n.Pt(this.Ot,this.le,o,a);n.Dt=r;const c={total:n.Ht.total,colors:Object.fromEntries(n.Ht.colors)};this.Ve.templates[`${n.kt} ${n.Nt}`]={name:n.displayName,coords:s.join(", "),enabled:!0,pixels:c,tiles:l},this.Ne=[],this.Ne.push(n),this.Re.wt(`Template created at ${s.join(", ")}!`),console.log(Object.keys(this.Ve.templates).length),console.log(this.Ve),console.log(this.Ne),console.log(JSON.stringify(this.Ve)),await i(this,gt,yt).call(this)}ui(){}async bi(){this.Ve||(this.Ve=await this.di(),console.log("Creating JSON..."))}async pi(){r("Downloading all templates..."),console.log(this.Ne);for(const t of this.Ne)await this.fi(t),await s(500)}async ze(){const t=JSON.parse(GM_getValue("bmTemplates","{}"))?.templates;if(console.log(t),Object.keys(t).length>0)for(const[e,i]of Object.entries(t))t.hasOwnProperty(e)&&(await this.fi(new A({displayName:i.name,kt:e.split(" ")?.[0],Nt:e.split(" ")?.[1],Dt:i.tiles})),await s(500))}async fi(t){t.Rt();const e=`${t.coords.join("-")}_${t.displayName.replaceAll(" ","-")}`,i=await this.We(t);await GM.download({url:URL.createObjectURL(i),name:e+".png",gi:"uniquify",onload:()=>{r(`Download of template '${e}' complete!`)},onerror:(t,i)=>{l(`Download of template '${e}' failed because ${t}! Details: ${i}`)},ontimeout:()=>{c(`Download of template '${e}' has timed out!`)}})}async We(t){console.log(t);const e=t.Dt,i=Object.keys(e).sort(),s=await Promise.all(i.map(t=>{return i=e[t],new Promise((t,e)=>{const s=new Image;s.onload=()=>t(s),s.onerror=e,s.src="data:image/png;base64,"+i});var i}));let n=1/0,o=1/0,a=0,r=0;i.forEach((t,e)=>{const[i,l,c,h]=t.split(",").map(Number),m=s[e],d=i*this.Ot+c,u=l*this.Ot+h;n=Math.min(n,d),o=Math.min(o,u),a=Math.max(a,d+m.width/this.Ge),r=Math.max(r,u+m.height/this.Ge)}),console.log(`Absolute coordinates: (${n}, ${o}) and (${a}, ${r})`);const l=a-n,c=r-o,h=l*this.Ge,m=c*this.Ge;console.log(`Template Width: ${l}\nTemplate Height: ${c}\nCanvas Width: ${h}\nCanvas Height: ${m}`);const d=new OffscreenCanvas(h,m),u=d.getContext("2d");i.forEach((t,e)=>{const[i,a,r,l]=t.split(",").map(Number),c=s[e],h=i*this.Ot+r,m=a*this.Ot+l;console.log(`Drawing tile (${i}, ${a}, ${r}, ${l}) (${h}, ${m}) at (${h-n}, ${m-o}) on the canvas...`),u.drawImage(c,(h-n)*this.Ge,(m-o)*this.Ge,c.width,c.height)}),u.globalCompositeOperation="destination-over",u.drawImage(d,0,-1),u.drawImage(d,0,1),u.drawImage(d,-1,0),u.drawImage(d,1,0);const b=new OffscreenCanvas(l,c),p=b.getContext("2d");return p.imageSmoothingEnabled=!1,p.drawImage(d,0,0,l*this.Ge,c*this.Ge,0,0,l,c),b.convertToBlob({type:"image/png"})}async wi(t,e){if(!this.ci)return t;const s=this.Ot*this.Ge;e=e[0].toString().padStart(4,"0")+","+e[1].toString().padStart(4,"0"),console.log(`Searching for templates in tile: "${e}"`);const o=this.Ne;console.log(o),o.sort((t,e)=>t.kt-e.kt),console.log(o);const a=o.map(t=>{const i=Object.keys(t.Dt).filter(t=>t.startsWith(e));if(0===i.length)return null;const s=i.map(e=>{const i=e.split(",");return{xi:t,zt:t.Dt[e],Lt:t.Lt?.[e],yi:[i[0],i[1]],$i:[i[2],i[3]]}});return s?.[0]}).filter(Boolean);console.log(a);const r=a?.length||0;if(console.log(`templateCount = ${r}`),!(r>0))return this.Re.wt(`Sleeping\nVersion: ${this.version}`),t;{const t=n(o.filter(t=>Object.keys(t.Dt).filter(t=>t.startsWith(e)).length>0).reduce((t,e)=>t+(e.Ht.total||0),0));this.Re.wt(`Displaying ${r} template${1==r?"":"s"}.\nTotal pixels: ${t}`)}const l=await createImageBitmap(t),c=new OffscreenCanvas(s,s),h=c.getContext("2d");h.imageSmoothingEnabled=!1,h.beginPath(),h.rect(0,0,s,s),h.clip(),h.clearRect(0,0,s,s),h.drawImage(l,0,0,s,s);const m=h.getImageData(0,0,s,s),d=new Uint32Array(m.data.buffer),u=this.l?.St?.highlight||[[2,0,0]],b=u?.[0],p=1==u?.length&&2==b?.[0]&&0==b?.[1]&&0==b?.[2];for(const t of a){console.log("Template:"),console.log(t);const s=!!t.xi.Ht?.colors?.get(-1);let n=t.Lt.slice();const o=Number(t.$i[0])*this.Ge,a=Number(t.$i[1])*this.Ge;if(0!=this.Te.size||s||h.drawImage(t.zt,o,a),!n){const e=h.getImageData(o,a,t.zt.width,t.zt.height);n=new Uint32Array(e.data.buffer)}const r=Date.now(),{qe:l,Ze:c}=i(this,gt,vt).call(this,{je:d,Ee:n,Ye:[o,a,t.zt.width,t.zt.height],Je:u,Xe:p});let m=0;const b=0;for(const[t,e]of l)t!=b&&(m+=e);0==this.Te.size&&!s&&p||(console.log("Colors to filter: ",this.Te),h.drawImage(await createImageBitmap(new ImageData(new Uint8ClampedArray(c.buffer),t.zt.width,t.zt.height)),o,a)),console.log(`Finished calculating correct pixels & filtering colors for the tile ${e} in ${(Date.now()-r)/1e3} seconds!\nThere are ${m} correct pixels.`),void 0===t.xi.Ht.correct&&(t.xi.Ht.correct={}),t.xi.Ht.correct[e]=l}return await c.convertToBlob({type:"image/png"})}async Mi(t){console.log("Importing JSON..."),console.log(t),"BlueMarble"==t?.whoami&&await i(this,gt,$t).call(this,t)}oi(t){this.ci=t}}(Tt,kt),Bt=new class{constructor(t){this.oe=t,this.Ci=!1,this.si="",this.ni=[],this.Si=[]}Ti(t){window.addEventListener("message",async e=>{const i=e.data,s=i.jsonData;if(!i||"blue-marble"!==i.source)return;if(!i.endpoint)return;const n=i.endpoint?.split("?")[0].split("/").filter(t=>t&&isNaN(Number(t))).filter(t=>t&&!t.includes(".")).pop();switch(console.log('%cBlue Marble%c: Recieved message about "%s"',"color: cornflowerblue;","",n),n){case"me":this.ki(t,s);break;case"pixel":const e=i.endpoint.split("?")[0].split("/").filter(t=>t&&!isNaN(Number(t))),n=new URLSearchParams(i.endpoint.split("?")[1]),r=[n.get("x"),n.get("y")];if(this.ni.length&&(!e.length||!r.length))return void t.ft("Coordinates are malformed!\nDid you try clicking the canvas first?");this.ni=[...e,...r];const l=(o=e,a=r,[parseInt(o[0])%4*1e3+parseInt(a[0]),parseInt(o[1])%4*1e3+parseInt(a[1])]),c=document.querySelectorAll("span");for(const t of c){const i=t.textContent.trim();if(i.includes(l[0])&&i.includes(l[1])){let i=document.querySelector("#bm-p");e[0],e[1],r[0],r[1];const s=["Tl X:","Tl Y:","Px X:","Px Y:"],n=["bm-Y","bm-Z","bm-U","bm-V"],o=[...e,...r];if(i)for(const[t,e]of n.entries())document.getElementById(e).textContent=`${s[t]??"??:"} ${o[t]}`;else{i=document.createElement("span"),i.id="bm-p",i.style="display: flex; flex-wrap: wrap; gap: 0 1ch; font-size: small;";for(const[t,e]of o.entries()){const a=document.createElement("span");a.id=n[o.indexOf(e)??""],a.textContent=`${s[t]??"??:"} ${e}`,i.appendChild(a)}t.parentNode.parentNode.parentNode.insertAdjacentElement("afterend",i)}}}break;case"tile":case"tiles":let h=i.endpoint.split("/");h=[parseInt(h[h.length-2]),parseInt(h[h.length-1].replace(".png",""))];const m=i.blobID,d=i.blobData,u=Date.now(),b=await this.oe.wi(d,h);console.log(`Finished loading the tile in ${(Date.now()-u)/1e3} seconds!`),window.postMessage({source:"blue-marble",blobID:m,blobData:b,blink:i.blink});break;case"robots":this.Ci="false"==s.userscript?.toString().toLowerCase();break}var o,a})}ki(t,e){if(e.status&&"2"!=e.status?.toString()[0])return void t.ft("You are not logged in or Wplace is offline!\nCould not fetch userdata.");const i=Math.ceil(Math.pow(Math.floor(e.level)*Math.pow(30,.65),1/.65)-e.pixelsPainted);if(console.log(e.id),(e.id||0===e.id)&&console.log(h(e.id,"!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~")),this.oe.ri=e.id,0!=this.si.length){const t=document.querySelector("#"+this.si);if(t){const i=e.charges;t.dataset.endDate=Date.now()+(i.max-i.count)*i.cooldownMs}}t.nt("bm-w",`${n(e.droplets)}`),t.nt("bm-q",`${n(i)} px`)}async Ni(t){try{const e=await fetch(`${window.location.origin}/api/me`,{credentials:"include"});if(!e.ok)return void t.ft(`Could not fetch userdata.\nHTTP ${e.status}`);const i=await e.json();this.ki(t,i)}catch(t){l("Failed to fetch current user data:",t)}}Di(t){try{const e=sessionStorage.getItem("bm-2A");if(!e)return!1;const i=JSON.parse(e);return this.ki(t,i),!0}catch(t){return l("Failed to apply cached user data:",t),!1}}async Li(t){console.log("Sending heartbeat to telemetry server...");let e=GM_getValue("bmUserSettings","{}");if(e=JSON.parse(e),!e||!e.telemetry||!e.uuid)return void console.log("Telemetry is disabled, not sending heartbeat.");const i=navigator.userAgent;let s=await this.Oi(i),n=this.Hi(i);GM_xmlhttpRequest({method:"POST",url:"https://telemetry.thebluecorner.net/heartbeat",headers:{"Content-Type":"application/json"},data:JSON.stringify({uuid:e.uuid,version:t,browser:s,os:n}),onload:t=>{200!==t.status&&l("Failed to send heartbeat:",t.statusText)},onerror:t=>{l("Error sending heartbeat:",t)}})}async Oi(t=navigator.userAgent){return(t=t||"").includes("OPR/")||t.includes("Opera")?"Opera":t.includes("Edg/")?"Edge":t.includes("Vivaldi")?"Vivaldi":t.includes("YaBrowser")?"Yandex":t.includes("Kiwi")?"Kiwi":t.includes("Brave")?"Brave":t.includes("Firefox/")?"Firefox":t.includes("Chrome/")?"Chrome":t.includes("Safari/")?"Safari":navigator.brave&&"function"==typeof navigator.brave.isBrave&&await navigator.brave.isBrave()?"Brave":"Unknown"}Hi(t=navigator.userAgent){return/Windows NT 11/i.test(t=t||"")?"Windows 11":/Windows NT 10/i.test(t)?"Windows 10":/Windows NT 6\.3/i.test(t)?"Windows 8.1":/Windows NT 6\.2/i.test(t)?"Windows 8":/Windows NT 6\.1/i.test(t)?"Windows 7":/Windows NT 6\.0/i.test(t)?"Windows Vista":/Windows NT 5\.1|Windows XP/i.test(t)?"Windows XP":/Mac OS X 10[_\.]15/i.test(t)?"macOS Catalina":/Mac OS X 10[_\.]14/i.test(t)?"macOS Mojave":/Mac OS X 10[_\.]13/i.test(t)?"macOS High Sierra":/Mac OS X 10[_\.]12/i.test(t)?"macOS Sierra":/Mac OS X 10[_\.]11/i.test(t)?"OS X El Capitan":/Mac OS X 10[_\.]10/i.test(t)?"OS X Yosemite":/Mac OS X 10[_\.]/i.test(t)?"macOS":/Android/i.test(t)?"Android":/iPhone|iPad|iPod/i.test(t)?"iOS":/Linux/i.test(t)?"Linux":"Unknown"}}(It),Pt=new class extends P{constructor(t,i,s){var n;super(t,i),e(this,L),this.St=s,(n=this.St).flags??(n.flags=[]),this.Ii=structuredClone(this.St),this.Bi="bmUserSettings",this.Pi=5e3,this.Ai=0,setInterval(this.zi.bind(this),this.Pi)}async zi(){await this.Fi()}async Fi(t=!1){const e=JSON.stringify(this.St);e!=JSON.stringify(this.Ii)&&(t||Date.now()-this.Ai>this.Pi)&&(await GM.setValue(this.Bi,e),this.Ii=structuredClone(this.St),this.Ai=Date.now(),console.log(e))}async Tt(){await this.Fi(!0)}Se(t,e=void 0){const i=this.St?.flags?.indexOf(t)??-1;-1!=i&&!0!==e?this.St?.flags?.splice(i,1):-1==i&&!1!==e&&this.St?.flags?.push(t)}Mt(){const t='',e='',s=this.St?.highlight??[[1,0,1],[2,0,0],[1,-1,0],[1,1,0],[1,0,-1]];this.window=this.S({class:"bm-L"}).H(2,{textContent:"Pixel Highlight"}).M().I().M().S({class:"bm-L",style:"margin-left: 1.5ch;"}).W({textContent:"Highlight transparent pixels"},(t,e,i)=>{i.checked=!this.St?.flags?.includes("hl-noTrans"),i.onchange=t=>this.Se("hl-noTrans",!t.target.checked)}).M().T({id:"bm-4",textContent:"Choose a preset:",style:"font-weight: 700;"}).M().S({class:"bm-D",role:"group","aria-labelledby":"bm-4"}).S({class:"bm-3"}).N({textContent:"None"}).M().it({innerHTML:t,"aria-label":'Preset "None"'},(t,e)=>{e.onclick=()=>i(this,L,H).call(this,"None")}).M().M().S({class:"bm-3"}).N({textContent:"Cross"}).M().it({innerHTML:e,"aria-label":'Preset "Cross Shape"'},(t,e)=>{e.onclick=()=>i(this,L,H).call(this,"Cross")}).M().M().S({class:"bm-3"}).N({textContent:"X"}).M().it({innerHTML:e.replace('d="M1,0H2V1H3V2H2V3H1V2H0V1H1Z"','d="M0,0V1H3V0H2V3H3V2H0V3H1V0Z"'),"aria-label":'Preset "X Shape"'},(t,e)=>{e.onclick=()=>i(this,L,H).call(this,"X")}).M().M().S({class:"bm-3"}).N({textContent:"Full"}).M().it({innerHTML:t.replace("#fff","#2f4f4f"),"aria-label":'Preset "Full Template"'},(t,e)=>{e.onclick=()=>i(this,L,H).call(this,"Full")}).M().M().M().T({id:"bm-b",textContent:"Create a custom pattern:",style:"font-weight: 700;"}).M().S({class:"bm-n",role:"group","aria-labelledby":"bm-b"});for(let t=-1;t<=1;t++)for(let e=-1;e<=1;e++){const n=s[s.findIndex(([,i,s])=>i==e&&s==t)]?.[0]??0;let o="Disabled";1==n?o="Incorrect":2==n&&(o="Template"),this.window=this.it({"data-status":o,"aria-label":`Sub-pixel ${o.toLowerCase()}`},(s,n)=>{n.onclick=()=>i(this,L,O).call(this,n,[e,t])}).M()}this.window=this.M().M().M()}Ct(){this.window=this.S({class:"bm-L"}).H(2,{textContent:"Pixel Highlight"}).M().I().M().S({class:"bm-L",style:"margin-left: 1.5ch;"}).W({textContent:"Template creation should skip transparent tiles"},(t,e,i)=>{i.checked=!this.St?.flags?.includes("hl-noSkip"),i.onchange=t=>this.Se("hl-noSkip",!t.target.checked)}).M().W({innerHTML:"Experimental: Template creation should aggressively skip transparent tiles"},(t,e,i)=>{i.checked=this.St?.flags?.includes("hl-agSkip"),i.onchange=t=>this.Se("hl-agSkip",t.target.checked)}).M().M().M()}}(Tt,kt,Ot);Ht.v(Pt),Ht.$(Bt),It.mi(Ht),It.v(Pt);var At=JSON.parse(GM_getValue("bmTemplates","{}"));if(console.log(At),console.log(Ot),console.log(Object.keys(Ot).length),0==Object.keys(Ot).length){const t=crypto.randomUUID();console.log(t),GM.setValue("bmUserSettings",JSON.stringify({uuid:t}))}setInterval(()=>Bt.Li(kt),18e5);var zt=Ot?.telemetry;if(console.log(`Telemetry is ${!(null==zt)}`),null==zt||zt>1){const t=new class extends ${constructor(t,i,s,n){super(t,i),e(this,Mt),this.window=null,this.xt="bm-k",this.yt=document.body,this.Wi=s,this.uuid=n}async vt(){if(document.querySelector(`#${this.xt}`))return void this.ft("Telemetry window already exists!");const t=await this.o.Oi(navigator.userAgent),e=this.o.Hi(navigator.userAgent);this.window=this.S({id:this.xt,class:"bm-W",style:"height: 80vh; z-index: 9998;"}).S({class:"bm-m"}).S({class:"bm-L bm-h"}).H(1,{textContent:`${this.name} Telemetry`}).M().M().I().M().S({class:"bm-L bm-D",style:"gap: 1.5ch; flex-wrap: wrap;"}).it({textContent:"Enable Telemetry"},(t,e)=>{e.onclick=()=>{i(this,Mt,Ct).call(this,this.Wi);const t=document.getElementById(this.xt);t?.remove()}}).M().it({textContent:"Disable Telemetry"},(t,e)=>{e.onclick=()=>{i(this,Mt,Ct).call(this,0);const t=document.getElementById(this.xt);t?.remove()}}).M().it({textContent:"More Information"},(t,e)=>{e.onclick=()=>{window.open("https://github.com/SwingTheVine/Wplace-TelemetryServer#telemetry-data","_blank","noopener noreferrer")}}).M().M().S({class:"bm-L bm-H"}).S({class:"bm-L"}).H(2,{textContent:"Legal"}).M().T({textContent:`We collect anonymous telemetry data such as your browser, OS, and script version to make the experience better for everyone. The data is never shared personally. The data is never sold. You can turn this off by pressing the "Disable" button, but keeping it on helps us improve features and reliability faster. Thank you for supporting ${this.name}!`}).M().M().I().M().S({class:"bm-L"}).H(2,{textContent:"Non-Legal Summary"}).M().T({innerHTML:'You can disable telemetry by pressing the "Disable" button. If you would like to read more about what information we collect, press the "More Information" button.
This is the data stored on our servers:'}).M().R().Y({innerHTML:`A unique identifier (UUIDv4) generated by Blue Marble. This enables our telemetry to function without tracking your actual user ID.
Your UUID is: ${a(this.uuid)}`}).M().Y({innerHTML:`The version of Blue Marble you are using.
Your version is: ${a(this.version)}`}).M().Y({innerHTML:`Your browser type, which is used to determine Blue Marble outages and browser popularity.
Your browser type is: ${a(t)}`}).M().Y({innerHTML:`Your OS type, which is used to determine Blue Marble outages and OS popularity.
Your OS type is: ${a(e)}`}).M().Y({innerHTML:"The date and time that Blue Marble sent the telemetry information."}).M().M().T({innerHTML:'All of the data mentioned above is aggregated every hour. This means every hour, anything that could even remotly be considered "personal data" is deleted from our server. Here, "aggregated" data means things like "42 people used Blue Marble on Google Chrome this hour", which can\'t be used to identify anyone in particular.'}).M().M().M().M().M().C(this.yt)}}(Tt,kt,1,Ot?.uuid);t.$(Bt),t.vt()}!async function(){await It.Mi(At),Bt.Ti(Ht),Ht.vt(),Ht.ai(),Bt.Di(Ht),Bt.Ni(Ht),new MutationObserver((t,e)=>{const i=document.querySelector("#color-1");if(!i)return;let s=document.querySelector("#bm-G");if(!s){s=document.createElement("button"),s.id="bm-G",s.textContent="Move ↑",s.className="btn btn-soft",s.onclick=function(){const t=this.parentNode.parentNode.parentNode.parentNode,e="Move ↑"==this.textContent;t.parentNode.className=t.parentNode.className.replace(e?"bottom":"top",e?"top":"bottom"),t.style.borderTopLeftRadius=e?"0px":"var(--radius-box)",t.style.borderTopRightRadius=e?"0px":"var(--radius-box)",t.style.borderBottomLeftRadius=e?"var(--radius-box)":"0px",t.style.borderBottomRightRadius=e?"var(--radius-box)":"0px",this.textContent=e?"Move ↓":"Move ↑"};const t=i.parentNode.parentNode.parentNode.parentNode.querySelector("h2");t.parentNode?.appendChild(s)}}).observe(document.body,{childList:!0,subtree:!0}),r(`%c${Tt}%c (${kt}) userscript has loaded!`,"color: cornflowerblue;","")}()})(); -// Build Hash: 5cb14ac097f3 +// Build Hash: fd82baf56be6 diff --git a/docs/README.md b/docs/README.md index c22e4b0..1cb0cb2 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ # Blue Marble Enhanced -![Blue Marble 0.94.0 liquid-glass UI showcase](./assets/blue-marble.png) +![Blue Marble 0.95.0 liquid-glass UI showcase](./assets/blue-marble.png) This fork is based on [SwingTheVine/Wplace-BlueMarble](https://github.com/SwingTheVine/Wplace-BlueMarble) and focuses on practical improvements for everyday template work on [wplace.live](https://wplace.live/). @@ -8,15 +8,18 @@ The goal is not to replace the upstream project. This fork keeps the original Bl ## What Is Different -Version `0.94.0` introduces the first enhanced release: +Version `0.95.0` continues the enhanced release: - Redesigned Blue Marble windows with a minimal liquid-glass visual style. - Redesigned window controls, buttons, typography, spacing, and transitions. +- Polished the main Blue Marble header and stat cards for a more balanced layout. - Added a resizable windowed mode for Color Filter. +- Redesigned the expanded Color Filter layout with compact stat cards and full-color color cards. - Added Color Filter position and size persistence. - Added persistence for shown and hidden colors in Color Filter. - Added automatic Color Filter refresh every 10 seconds. -- Updated Color Filter visibility icons to match the new interface style. +- Updated Color Filter visibility icons with animated eye-slash transitions. +- Added premium color star backgrounds in the expanded Color Filter cards. ## Installation @@ -32,6 +35,8 @@ Color Filter is one of the main areas improved here. It can be opened as a compa Hidden and visible colors are remembered, so you can isolate the colors you are actively painting without rebuilding the filter state every session. The list also refreshes automatically every 10 seconds, keeping pixel counts current without a manual refresh button. +The expanded Color Filter view now uses larger full-color cards, compact progress text, clearer stat cards, animated visibility icons, and premium star accents while keeping hidden colors recognizable by their actual palette color. + ## Upstream Original project: diff --git a/package-lock.json b/package-lock.json index 703c6d3..92e5f50 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "wplace-bluemarble", - "version": "0.94.0", + "version": "0.95.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "wplace-bluemarble", - "version": "0.94.0", + "version": "0.95.0", "devDependencies": { "esbuild": "^0.25.0", "jsdoc": "^4.0.5", diff --git a/package.json b/package.json index 9249617..5f9fa7e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wplace-bluemarble", - "version": "0.94.0", + "version": "0.95.0", "type": "module", "homepage": "https://bluemarble.lol/", "repository": { diff --git a/src/BlueMarble.meta.js b/src/BlueMarble.meta.js index ac5baa1..66a4acd 100644 --- a/src/BlueMarble.meta.js +++ b/src/BlueMarble.meta.js @@ -2,7 +2,7 @@ // @name Blue Marble // @name:en Blue Marble // @namespace https://github.com/SwingTheVine/ -// @version 0.94.0 +// @version 0.95.0 // @description A userscript to enhance the user experience on Wplace.live. This includes, but is not limited to: uploading images to display locally on a canvas, adding a button to move the Wplace color palette menu, and other QoL features. // @description:en A userscript to enhance the user experience on Wplace.live. This includes, but is not limited to: uploading images to display locally on a canvas, adding a button to move the Wplace color palette menu, and other QoL features. // @author SwingTheVine