diff --git a/dist/BlueMarble-For-GreasyFork.user.css b/dist/BlueMarble-For-GreasyFork.user.css index 1d1c1f9..491041d 100644 --- a/dist/BlueMarble-For-GreasyFork.user.css +++ b/dist/BlueMarble-For-GreasyFork.user.css @@ -40,7 +40,7 @@ grid-template-columns: auto 1fr auto; align-items: center; gap: 0.5ch; - background: url('data:image/svg+xml;utf8,') repeat; + background: url('data:image/svg+xml;utf8,') repeat; cursor: grab; width: 100%; height: fit-content; @@ -266,6 +266,27 @@ input[type=file] { height: fit-content; padding: 1ch; } +.bm-filter-color[data-id="-2"] .bm-filter-container-rgb { + background: + conic-gradient( + #aa0000 0%, + #aaaa00 16.6%, + #00aa00 33.3%, + #00aaaa 50%, + #0000aa 66.6%, + #aa00aa 83.3%, + #aa0000 100%); +} +.bm-filter-color[data-id="-1"] .bm-filter-container-rgb { + background: url('data:image/svg+xml;utf8,') repeat; + background-color: transparent !important; +} +.bm-filter-color[data-id="-1"] .bm-filter-container-rgb svg { + fill: white !important; +} +.bm-filter-color[data-id="0"] .bm-filter-container-rgb { + background-color: transparent !important; +} .bm-filter-container-rgb button { padding: 0.75em 0.5ch; } diff --git a/dist/BlueMarble-For-GreasyFork.user.js b/dist/BlueMarble-For-GreasyFork.user.js index 3f8b5a4..03ac08e 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.88.261 +// @version 0.88.293 // @description A userscript to automate and/or enhance the user experience on Wplace.live. Make sure to comply with the site's Terms of Service, and rules! This script is not affiliated with Wplace.live in any way, use at your own risk. This script is not affiliated with TamperMonkey. The author of this userscript is not responsible for any damages, issues, loss of data, or punishment that may occur as a result of using this script. This script is provided "as is" under the MPL-2.0 license. The "Blue Marble" icon is licensed under CC0 1.0 Universal (CC0 1.0) Public Domain Dedication. The image is owned by NASA. // @description:en A userscript to automate and/or enhance the user experience on Wplace.live. Make sure to comply with the site's Terms of Service, and rules! This script is not affiliated with Wplace.live in any way, use at your own risk. This script is not affiliated with TamperMonkey. The author of this userscript is not responsible for any damages, issues, loss of data, or punishment that may occur as a result of using this script. This script is provided "as is" under the MPL-2.0 license. The "Blue Marble" icon is licensed under CC0 1.0 Universal (CC0 1.0) Public Domain Dedication. The image is owned by NASA. // @author SwingTheVine @@ -1760,7 +1760,10 @@ Version: ${this.version}`); } console.log(`Finished calculating correct pixels for the tile ${tileCoords} in ${(Date.now() - timer) / 1e3} seconds! There are ${pixelsCorrectTotal} correct pixels.`); - template.instance.pixelCount["correct"] = pixelsCorrect; + if (typeof template.instance.pixelCount["correct"] == "undefined") { + template.instance.pixelCount["correct"] = {}; + } + template.instance.pixelCount["correct"][tileCoords] = pixelsCorrect; } return await canvas.convertToBlob({ type: "image/png" }); } @@ -2232,7 +2235,9 @@ Time Since Blink: ${String(Math.floor(elapsed / 6e4)).padStart(2, "0")}:${String function buildWindowMain() { overlayMain.addDiv({ "id": "bm-window-main", "class": "bm-window", "style": "top: 10px; left: unset; right: 75px;" }).addDragbar().addButton({ "class": "bm-button-circle", "textContent": "\u25BC", "aria-label": 'Minimize window "Blue Marble"', "data-button-status": "expanded" }, (instance, button) => { button.onclick = () => instance.handleMinimization(button); - button.ontouchend = () => instance.handleMinimization(button); + button.ontouchend = () => { + button.click(); + }; }).buildElement().addDiv().buildElement().buildElement().addDiv({ "class": "bm-window-content" }).addDiv({ "class": "bm-container" }).addImg({ "class": "bm-favicon", "src": "https://raw.githubusercontent.com/SwingTheVine/Wplace-BlueMarble/main/dist/assets/Favicon.png" }).buildElement().addHeader(1, { "textContent": name }).buildElement().buildElement().addHr().buildElement().addDiv({ "class": "bm-container" }).addP({ "id": "bm-user-droplets", "textContent": "Droplets:" }).buildElement().addP({ "id": "bm-user-nextlevel", "textContent": "Next level in..." }).buildElement().buildElement().addHr().buildElement().addDiv({ "class": "bm-container" }).addDiv({ "class": "bm-container" }).addButton( { "class": "bm-button-circle bm-button-pin", "style": "margin-top: 0;", "innerHTML": '' }, (instance, button) => { @@ -2358,6 +2363,8 @@ Version: ${version}`, "readOnly": true }).buildElement().buildElement().addDiv({ } const eyeOpen = ''; const eyeClosed = ''; + const localizeNumber = new Intl.NumberFormat(); + const localizePercent = new Intl.NumberFormat(void 0, { style: "percent", minimumFractionDigits: 2, maximumFractionDigits: 2 }); const overlayFilter = new Overlay(name, version); overlayFilter.addDiv({ "id": "bm-window-filter", "class": "bm-window" }).addDragbar().addButton({ "class": "bm-button-circle", "textContent": "\u25BC", "aria-label": 'Minimize window "Color Filter"', "data-button-status": "expanded" }, (instance, button) => { button.onclick = () => instance.handleMinimization(button); @@ -2372,12 +2379,10 @@ Version: ${version}`, "readOnly": true }).buildElement().buildElement().addDiv({ button.click(); }; }).buildElement().buildElement().addDiv({ "class": "bm-window-content" }).addDiv({ "class": "bm-container bm-center-vertically" }).addHeader(1, { "textContent": "Color Filter" }).buildElement().buildElement().addHr().buildElement().addDiv({ "class": "bm-container bm-flex-between", "style": "gap: 1.5ch; width: fit-content; margin-left: auto; margin-right: auto;" }).addButton({ "textContent": "Select All" }, (instance, button) => { - button.onclick = () => { - }; + button.onclick = () => selectColorList(false); }).buildElement().addButton({ "textContent": "Unselect All" }, (instance, button) => { - button.onclick = () => { - }; - }).buildElement().buildElement().addDiv({ "class": "bm-container bm-scrollable" }).addDiv({ "class": "bm-container", "style": "margin-left: 2.5ch; margin-right: 2.5ch;" }).addForm({ "class": "bm-container" }).addFieldset().addLegend({ "textContent": "Sort Options:" }).buildElement().addDiv({ "class": "bm-container" }).addSelect({ "id": "bm-filter-sort-primary", "name": "sortPrimary", "textContent": "I want to view " }).addOption({ "value": "id", "textContent": "color IDs" }).buildElement().addOption({ "value": "name", "textContent": "color names" }).buildElement().addOption({ "value": "premium", "textContent": "premium colors" }).buildElement().addOption({ "value": "percent", "textContent": "percentage" }).buildElement().addOption({ "value": "correct", "textContent": "correct pixels" }).buildElement().addOption({ "value": "incorrect", "textContent": "incorrect pixels" }).buildElement().addOption({ "value": "total", "textContent": "total pixels" }).buildElement().buildElement().addSelect({ "id": "bm-filter-sort-secondary", "name": "sortSecondary", "textContent": " in " }).addOption({ "value": "ascending", "textContent": "ascending" }).buildElement().addOption({ "value": "descending", "textContent": "descending" }).buildElement().buildElement().addSpan({ "textContent": " order." }).buildElement().buildElement().addDiv({ "class": "bm-container" }).addCheckbox({ "id": "bm-filter-show-unused", "name": "showUnused", "textContent": "Show unused colors" }).buildElement().buildElement().buildElement().addDiv({ "class": "bm-container" }).addButton({ "textContent": "Refresh", "type": "submit" }, (instance, button) => { + button.onclick = () => selectColorList(true); + }).buildElement().buildElement().addDiv({ "class": "bm-container bm-scrollable" }).addDiv({ "class": "bm-container", "style": "margin-left: 2.5ch; margin-right: 2.5ch;" }).addDiv({ "class": "bm-container" }).addSpan({ "id": "bm-filter-tot-correct", "innerHTML": "Correct Pixels: ???" }).buildElement().addBr().buildElement().addSpan({ "id": "bm-filter-tot-total", "innerHTML": "Total Pixels: ???" }).buildElement().addBr().buildElement().addSpan({ "id": "bm-filter-tot-remaining", "innerHTML": "Complete: ??? (???)" }).buildElement().buildElement().addDiv({ "class": "bm-container" }).addP({ "innerHTML": `Colors with the icon ${eyeOpen.replace(" { button.onclick = (event) => { event.preventDefault(); const formData = new FormData(document.querySelector("#bm-window-filter form")); @@ -2388,7 +2393,7 @@ Version: ${version}`, "readOnly": true }).buildElement().buildElement().addDiv({ console.log(`Primary: ${formValues["sortPrimary"]}; Secondary: ${formValues["sortSecondary"]}; Unused: ${formValues["showUnused"] == "on"}`); sortColorList(formValues["sortPrimary"], formValues["sortSecondary"], formValues["showUnused"] == "on"); }; - }).buildElement().buildElement().buildElement().addP({ "innerHTML": `Colors with the icon ${eyeOpen} will be shown on the canvas. Colors with the icon ${eyeClosed} will not be shown on the canvas. The "Select All" and "Unselect All" buttons only apply to colors that display in the list below.` }).buildElement().buildElement().buildElement().buildElement().buildElement().buildOverlay(document.body); + }).buildElement().buildElement().buildElement().buildElement().buildElement().buildElement().buildElement().buildOverlay(document.body); overlayFilter.handleDrag("#bm-window-filter.bm-window", "#bm-window-filter .bm-dragbar"); const scrollableContainer = document.querySelector("#bm-window-filter .bm-container.bm-scrollable"); const { palette, LUT: _ } = templateManager.paletteBM; @@ -2398,22 +2403,28 @@ Version: ${version}`, "readOnly": true }).buildElement().buildElement().addDiv({ const allPixelsColor = /* @__PURE__ */ new Map(); for (const template of templateManager.templatesArray) { const total = template.pixelCount?.total ?? 0; - const colors = template.pixelCount?.colors ?? /* @__PURE__ */ new Map(); - const correct = template.pixelCount?.correct ?? /* @__PURE__ */ new Map(); allPixelsTotal += total ?? 0; - for (const [colorID, correctPixels] of correct) { - const _correctPixels = Number(correctPixels) || 0; - allPixelsCorrectTotal += _correctPixels; - const allPixelsCorrectSoFar = allPixelsCorrect.get(colorID) ?? 0; - allPixelsCorrect.set(colorID, allPixelsCorrectSoFar + _correctPixels); - } + const colors = template.pixelCount?.colors ?? /* @__PURE__ */ new Map(); for (const [colorID, colorPixels] of colors) { const _colorPixels = Number(colorPixels) || 0; const allPixelsColorSoFar = allPixelsColor.get(colorID) ?? 0; allPixelsColor.set(colorID, allPixelsColorSoFar + _colorPixels); } + const correctObject = template.pixelCount?.correct ?? {}; + for (const map of Object.values(correctObject)) { + for (const [colorID, correctPixels] of map) { + const _correctPixels = Number(correctPixels) || 0; + allPixelsCorrectTotal += _correctPixels; + const allPixelsCorrectSoFar = allPixelsCorrect.get(colorID) ?? 0; + allPixelsCorrect.set(colorID, allPixelsCorrectSoFar + _correctPixels); + } + } } + overlayFilter.updateInnerHTML("#bm-filter-tot-correct", `Correct Pixels: ${localizeNumber.format(allPixelsCorrectTotal)}`); + overlayFilter.updateInnerHTML("#bm-filter-tot-total", `Total Pixels: ${localizeNumber.format(allPixelsTotal)}`); + overlayFilter.updateInnerHTML("#bm-filter-tot-remaining", `Remaining: ${localizeNumber.format((allPixelsTotal || 0) - (allPixelsCorrectTotal || 0))} (${localizePercent.format(((allPixelsTotal || 0) - (allPixelsCorrectTotal || 0)) / (allPixelsTotal || 1))})`); buildColorList(); + sortColorList("id", "ascending", false); function buildColorList() { const colorList = new Overlay(name, version); colorList.addDiv({ "class": "bm-filter-flex" }); @@ -2422,14 +2433,14 @@ Version: ${version}`, "readOnly": true }).buildElement().buildElement().addDiv({ const textColorForPaletteColorBackground = 1.05 / (lumin + 0.05) > (lumin + 0.05) / 0.05 ? "white" : "black"; const bgEffectForButtons = textColorForPaletteColorBackground == "white" ? "bm-button-hover-white" : "bm-button-hover-black"; const colorTotal = allPixelsColor.get(color.id) ?? 0; - const colorTotalLocalized = new Intl.NumberFormat().format(colorTotal); + const colorTotalLocalized = localizeNumber.format(colorTotal); let colorCorrect = 0; let colorCorrectLocalized = "0"; - let colorPercent = new Intl.NumberFormat(void 0, { style: "percent", minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(1); + let colorPercent = localizePercent.format(1); if (colorTotal != 0) { colorCorrect = allPixelsCorrect.get(color.id) ?? "???"; - colorCorrectLocalized = typeof colorCorrect == "string" ? colorCorrect : new Intl.NumberFormat().format(colorCorrect); - colorPercent = isNaN(colorCorrect / colorTotal) ? "???" : new Intl.NumberFormat(void 0, { style: "percent", minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(colorCorrect / colorTotal); + colorCorrectLocalized = typeof colorCorrect == "string" ? colorCorrect : localizeNumber.format(colorCorrect); + colorPercent = isNaN(colorCorrect / colorTotal) ? "???" : localizePercent.format(colorCorrect / colorTotal); } const colorIncorrect = parseInt(colorTotal) - parseInt(colorCorrect); colorList.addDiv({ @@ -2489,5 +2500,22 @@ Version: ${version}`, "readOnly": true }).buildElement().buildElement().addDiv({ }); colors.forEach((color) => colorList.appendChild(color)); } + function selectColorList(userWantsUnselect) { + const colorList = document.querySelector(".bm-filter-flex"); + const colors = Array.from(colorList.children); + for (const color of colors) { + if (color.classList?.contains("bm-color-hide")) { + continue; + } + const button = color.querySelector(".bm-filter-container-rgb button"); + if (button.dataset["state"] == "hidden" && !userWantsUnselect) { + continue; + } + if (button.dataset["state"] == "shown" && userWantsUnselect) { + continue; + } + button.click(); + } + } } })(); diff --git a/dist/BlueMarble-Standalone.user.js b/dist/BlueMarble-Standalone.user.js index 98dcb3a..440c526 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.88.261 +// @version 0.88.293 // @description A userscript to automate and/or enhance the user experience on Wplace.live. Make sure to comply with the site's Terms of Service, and rules! This script is not affiliated with Wplace.live in any way, use at your own risk. This script is not affiliated with TamperMonkey. The author of this userscript is not responsible for any damages, issues, loss of data, or punishment that may occur as a result of using this script. This script is provided "as is" under the MPL-2.0 license. The "Blue Marble" icon is licensed under CC0 1.0 Universal (CC0 1.0) Public Domain Dedication. The image is owned by NASA. // @description:en A userscript to automate and/or enhance the user experience on Wplace.live. Make sure to comply with the site's Terms of Service, and rules! This script is not affiliated with Wplace.live in any way, use at your own risk. This script is not affiliated with TamperMonkey. The author of this userscript is not responsible for any damages, issues, loss of data, or punishment that may occur as a result of using this script. This script is provided "as is" under the MPL-2.0 license. The "Blue Marble" icon is licensed under CC0 1.0 Universal (CC0 1.0) Public Domain Dedication. The image is owned by NASA. // @author SwingTheVine @@ -27,4 +27,4 @@ // License --> https://www.mozilla.org/en-US/MPL/2.0/ // Donate --> https://ko-fi.com/swingthevine -(()=>{var t,e,n,i=t=>{throw TypeError(t)},o=(t,e,n)=>e.has(t)?i("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n),s=(t,e,n)=>(((t,e)=>{e.has(t)||i("Cannot access private method")})(t,e),n),a=class{constructor(e,n){o(this,t),this.name=e,this.version=n,this.t=null,this.i="bm-o",this.o=null,this.l=null,this.m=[]}h(t){this.t=t}u(){return this.m.length>0&&(this.l=this.m.pop()),this}p(t){t?.appendChild(this.o),this.o=null,this.l=null,this.m=[]}v(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"div",{},n)),this}$(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"p",{},n)),this}S(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"small",{},n)),this}M(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"span",{},n)),this}C(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"details",{},n)),this}T(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"summary",{},n)),this}D(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"img",{},n)),this}O(n,i={},o=()=>{}){return o(this,s(this,t,e).call(this,"h"+n,{},i)),this}k(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"hr",{},n)),this}N(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"br",{},n)),this}B(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"form",{},n)),this}I(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"fieldset",{},n)),this}L(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"legend",{},n)),this}P(n={},i=()=>{}){const o=s(this,t,e).call(this,"label",{textContent:n.textContent??""});delete n.textContent;const a=s(this,t,e).call(this,"input",{type:"checkbox"},n);return o.insertBefore(a,o.firstChild),this.u(),i(this,o,a),this}G(n={},i=()=>{}){const o=s(this,t,e).call(this,"label",{textContent:n.textContent??"",for:n.id??""});return delete n.textContent,this.u(),i(this,o,s(this,t,e).call(this,"select",{},n)),this}U(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"option",{},n)),this}F(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"ol",{},n)),this}A(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"ul",{},n)),this}W(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"menu",{},n)),this}_(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"li",{},n)),this}H(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"table",{},n)),this}X(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"caption",{},n)),this}J(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"thead",{},n)),this}j(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"tbody",{},n)),this}R(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"tfoot",{},n)),this}V(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"tr",{},n)),this}Y(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"th",{},n)),this}q(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"td",{},n)),this}K(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"button",{},n)),this}Z(n={},i=()=>{}){const o=n.title??n.textContent??"Help: No info";delete n.textContent,n.title=`Help: ${o}`;const a={textContent:"?",className:"bm-D",onclick:()=>{this.tt(this.i,o)}};return i(this,s(this,t,e).call(this,"button",a,n)),this}et(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"input",{},n)),this}nt(n={},i=()=>{}){const o=n.textContent??"";delete n.textContent;const a=s(this,t,e).call(this,"div"),r=s(this,t,e).call(this,"input",{type:"file",tabindex:"-1","aria-hidden":"true",style:"display: none !important; visibility: hidden !important; position: absolute !important; left: -9999px !important; width: 0 !important; height: 0 !important; opacity: 0 !important;"},n);this.u();const l=s(this,t,e).call(this,"button",{textContent:o});return this.u(),this.u(),l.addEventListener("click",()=>{r.click()}),r.addEventListener("change",()=>{l.style.maxWidth=`${l.offsetWidth}px`,r.files.length>0?l.textContent=r.files[0].name:l.textContent=o}),i(this,a,r,l),this}it(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"textarea",{},n)),this}ot(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"div",{class:"bm-1h"},n)),this}tt(t,e,n=!1){const i=document.getElementById(t.replace(/^#/,""));i&&(i instanceof HTMLInputElement?i.value=e:n?i.textContent=e:i.innerHTML=e)}st(t){if(t.disabled)return;t.disabled=!0,t.style.textDecoration="none";const e=t.closest(".bm-1j"),n=t.closest(".bm-1h"),i=e.querySelector("h1"),o=e.querySelector(".bm-V");if("expanded"==t.dataset.buttonStatus){o.style.height=o.scrollHeight+"px",e.style.width=e.scrollWidth+"px",o.style.height="0",o.addEventListener("transitionend",function e(){o.style.display="none",t.disabled=!1,t.style.textDecoration="",o.removeEventListener("transitionend",e)});const n=i.cloneNode(!0),s=n.textContent;t.nextElementSibling.appendChild(n),t.textContent="▶",t.dataset.buttonStatus="collapsed",t.ariaLabel=`Unminimize window "${s}"`}else{const i=n.querySelector("h1"),s=i.textContent;i.remove(),o.style.display="",o.style.height="0",e.style.width="",o.style.height=o.scrollHeight+"px",o.addEventListener("transitionend",function e(){o.style.height="",t.disabled=!1,t.style.textDecoration="",o.removeEventListener("transitionend",e)}),t.textContent="▼",t.dataset.buttonStatus="expanded",t.ariaLabel=`Minimize window "${s}"`}}rt(t,e){if(t=document.querySelector(t),e=document.querySelector(e),!t||!e)return void this.lt(`Can not drag! ${t?"":"moveMe"} ${t||e?"":"and "}${e?"":"iMoveThings "}was not found!`);let n,i=!1,o=0,s=null,a=0,r=0,l=0,c=0,m=null;const d=()=>{if(i){const e=Math.abs(a-l),n=Math.abs(r-c);(e>.5||n>.5)&&(a=l,r=c,t.style.transform=`translate(${a}px, ${r}px)`,t.style.left="0px",t.style.top="0px",t.style.right=""),s=requestAnimationFrame(d)}},h=(h,g)=>{i=!0,m=t.getBoundingClientRect(),n=h-m.left,o=g-m.top;const f=window.getComputedStyle(t).transform;if(f&&"none"!==f){const t=new DOMMatrix(f);a=t.m41,r=t.m42}else a=m.left,r=m.top;l=a,c=r,document.body.style.userSelect="none",e.classList.add("bm-1c"),document.addEventListener("mousemove",b),document.addEventListener("touchmove",p,{passive:!1}),document.addEventListener("mouseup",u),document.addEventListener("touchend",u),document.addEventListener("touchcancel",u),s&&cancelAnimationFrame(s),d()},u=()=>{i=!1,s&&(cancelAnimationFrame(s),s=null),document.body.style.userSelect="",e.classList.remove("bm-1c"),document.removeEventListener("mousemove",b),document.removeEventListener("touchmove",p),document.removeEventListener("mouseup",u),document.removeEventListener("touchend",u),document.removeEventListener("touchcancel",u)},b=t=>{i&&m&&(l=t.clientX-n,c=t.clientY-o)},p=t=>{if(i&&m){const e=t.touches[0];if(!e)return;l=e.clientX-n,c=e.clientY-o,t.preventDefault()}};e.addEventListener("mousedown",function(t){t.preventDefault(),h(t.clientX,t.clientY)}),e.addEventListener("touchstart",function(t){const e=t?.touches?.[0];e&&(h(e.clientX,e.clientY),t.preventDefault())},{passive:!1})}ct(t){(0,console.info)(`${this.name}: ${t}`),this.tt(this.i,"Status: "+t,!0)}lt(t){(0,console.error)(`${this.name}: ${t}`),this.tt(this.i,"Error: "+t,!0)}};function r(...t){(0,console.error)(...t)}function l(t,e){if(0===t)return e[0];let n="";const i=e.length;for(;t>0;)n=e[t%i]+n,t=Math.floor(t/i);return n}function c(t){let e="";for(let n=0;n(t/=255)<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4));return.2126*e[0]+.7152*e[1]+.0722*e[2]}t=new WeakSet,e=function(e,i={},o={}){const a=document.createElement(e);this.o?(this.l?.appendChild(a),this.m.push(this.l),this.l=a):(this.o=a,this.l=a);for(const[e,o]of Object.entries(i))s(this,t,n).call(this,a,e,o);for(const[e,i]of Object.entries(o))s(this,t,n).call(this,a,e,i);return a},n=function(t,e,n){if("class"==e)t.classList.add(...n.split(/\s+/));else if("for"==e)t.htmlFor=n;else if("tabindex"==e)t.tabIndex=Number(n);else if("readonly"==e)t.readOnly="true"==n||"1"==n;else if("maxlength"==e)t.maxLength=Number(n);else if(e.startsWith("data"))t.dataset[e.slice(5).split("-").map((t,e)=>0==e?t:t[0].toUpperCase()+t.slice(1)).join("")]=n;else if(e.startsWith("aria")){const i=e.slice(5).split("-").map((t,e)=>0==e?t:t[0].toUpperCase()+t.slice(1)).join("");t["aria"+i[0].toUpperCase()+i.slice(1)]=n}else t[e]=n};var h,u,b,p,g,f,w,y,x,v=[{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]}],$=class{constructor({displayName:t="My template",dt:e=0,ht:n="",url:i="",file:s=null,coords:a=null,ut:r=null,bt:l={},gt:c=1e3}={}){o(this,h),this.displayName=t,this.dt=e,this.ht=n,this.url=i,this.file=s,this.coords=a,this.ut=r,this.bt=l,this.gt=c,this.ft={total:0,colors:new Map}}async wt(t,e){console.log("Template coordinates:",this.coords);const n=await createImageBitmap(this.file),i=n.width,o=n.height;this.gt=t;const a={},r={},l=new OffscreenCanvas(this.gt,this.gt),m=l.getContext("2d",{yt:!0});l.width=i,l.height=o,m.imageSmoothingEnabled=!1,m.drawImage(n,0,0);let d=Date.now();const b=s(this,h,u).call(this,m.getImageData(0,0,i,o),e);console.log(`Calculating total pixels took ${(Date.now()-d)/1e3} seconds`);let p=0;for(const[t,e]of b)0!=t&&(p+=e);this.ft={total:p,colors:b},d=Date.now();const g=new OffscreenCanvas(3,3),f=g.getContext("2d");f.clearRect(0,0,3,3),f.fillStyle="white",f.fillRect(1,1,1,1);for(let t=this.coords[3];t>>24==0?0:o.get(e)??-2;const a=s.get(i);s.set(i,a?a+1:1)}return console.log(s),s},b=new WeakSet,p=async function(){GM.setValue("bmTemplates",JSON.stringify(this.St))},g=async function(t){console.log("Parsing BlueMarble...");const e=t.templates;if(console.log(`BlueMarble length: ${Object.keys(e).length}`),Object.keys(e).length>0)for(const t in e){const n=t,i=e[t];if(console.log(`Template Key: ${n}`),e.hasOwnProperty(t)){const t=n.split(" "),e=Number(t?.[0]),o=t?.[1]||"0",s=i.name||`Template ${e||""}`,a={total:i.pixels.total,colors:new Map(Object.entries(i.pixels.colors).map(([t,e])=>[Number(t),e]))},r=i.tiles,l={},c={},d=this.gt*this.Mt;for(const t in r)if(console.log(t),r.hasOwnProperty(t)){const e=m(r[t]),n=new Blob([e],{type:"image/png"}),i=await createImageBitmap(n);l[t]=i;const o=new OffscreenCanvas(d,d).getContext("2d");o.drawImage(i,0,0);const s=o.getImageData(0,0,i.width,i.height);c[t]=new Uint32Array(s.data.buffer)}const h=new $({displayName:s,dt:e||this.Ct?.length||0,ht:o||""});h.ft=a,h.ut=l,h.bt=c,this.Ct.push(h),console.log(this.Ct),console.log("^^^ This ^^^")}}},f=function(t,e,n){const i=this.Mt,o=this.gt*i,s=n[0],a=n[1],r=n[2],l=n[3],c=this.Tt,{palette:m,$t:d}=this.Dt,h=new Map;for(let n=1;n>>24&255)<=c||(i>>>24&255)<=c)continue;const u=d.get(i)??-2,b=d.get(m)??-2;if(u!=b)continue;const p=h.get(b);h.set(b,p?p+1:1)}return console.log("List of template pixels that match the tile:"),console.log(h),h},w=new WeakSet,y=async function(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"},x=function(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"};var S=GM_info.script.name.toString(),M=GM_info.script.version.toString();!function(t){const e=document.createElement("script");e.setAttribute("bm-E",S),e.setAttribute("bm-B","color: cornflowerblue;"),e.textContent=`(${t})();`,document.documentElement?.appendChild(e),e.remove()}(()=>{const t=document.currentScript,e=t?.getAttribute("bm-E")||"Blue Marble",n=t?.getAttribute("bm-B")||"",i=new Map;window.addEventListener("message",t=>{const{source:o,endpoint:s,blobID:a,blobData:r,blink:l}=t.data,c=Date.now()-l;if(console.groupCollapsed(`%c${e}%c: ${i.size} Recieved IMAGE message about blob "${a}"`,n,""),console.log(`Blob fetch took %c${String(Math.floor(c/6e4)).padStart(2,"0")}:${String(Math.floor(c/1e3)%60).padStart(2,"0")}.${String(c%1e3).padStart(3,"0")}%c MM:SS.mmm`,n,""),console.log(i),console.groupEnd(),"blue-marble"==o&&a&&r&&!s){const t=i.get(a);"function"==typeof t?t(r):function(...t){(0,console.warn)(...t)}(`%c${e}%c: Attempted to retrieve a blob (%s) from queue, but the blobID was not a function! Skipping...`,n,"",a),i.delete(a)}});const o=window.fetch;window.fetch=async function(...t){const s=await o.apply(this,t),a=s.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}"`,n,""),a.json().then(t=>{window.postMessage({source:"blue-marble",endpoint:r,jsonData:t},"*")}).catch(t=>{console.error(`%c${e}%c: Failed to parse JSON: `,n,"",t)});else if(l.includes("image/")&&!r.includes("openfreemap")&&!r.includes("maps")){const t=Date.now(),o=await a.blob();return console.log(`%c${e}%c: ${i.size} Sending IMAGE message about endpoint "${r}"`,n,""),new Promise(s=>{const l=crypto.randomUUID();i.set(l,t=>{s(new Response(t,{headers:a.headers,status:a.status,statusText:a.statusText})),console.log(`%c${e}%c: ${i.size} Processed blob "${l}"`,n,"")}),window.postMessage({source:"blue-marble",endpoint:r,blobID:l,blobData:o,blink:t})}).catch(o=>{const s=Date.now();console.error(`%c${e}%c: Failed to Promise blob!`,n,""),console.groupCollapsed(`%c${e}%c: Details of failed blob Promise:`,n,""),console.log(`Endpoint: ${r}\nThere are ${i.size} blobs processing...\nBlink: ${t.toLocaleString()}\nTime Since Blink: ${String(Math.floor(s/6e4)).padStart(2,"0")}:${String(Math.floor(s/1e3)%60).padStart(2,"0")}.${String(s%1e3).padStart(3,"0")} MM:SS.mmm`),console.error("Exception stack:",o),console.groupEnd()})}return s}});var C=`.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-1j{position:fixed;background-color:#153063e6;color:#fff;padding:10px;border-radius:8px;z-index:9000;transition:all .3s ease,transform 0s;top:75px;left:60px;width:auto;max-height:calc(100vh - 150px);max-width:calc(100% - 135px);font-family:Roboto Mono,Courier New,Monaco,DejaVu Sans Mono,monospace,Arial;letter-spacing:.05em}#bm-14{max-width:300px}.bm-1h{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:.5ch;background:url('data:image/svg+xml;utf8,') repeat;cursor:grab;width:100%;height:fit-content}.bm-1h.bm-1c{cursor:grabbing}.bm-1j:has(.bm-1h.bm-1c){pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.bm-1h.bm-1c{pointer-events:auto}.bm-1i{display:inline-block;height:2.5em;margin-right:1ch;vertical-align:middle}.bm-1j h1{display:inline-block;font-size:x-large;font-weight:700;vertical-align:middle}.bm-1h h1{font-size:1.2em;user-select:none;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-shadow:3px 0px rgba(21,48,99,.5),-3px 0px rgba(21,48,99,.5),0px 3px rgba(21,48,99,.5),0px -3px rgba(21,48,99,.5),3px 3px rgba(21,48,99,.5),-3px 3px rgba(21,48,99,.5),3px -3px rgba(21,48,99,.5),-3px -3px rgba(21,48,99,.5)}.bm-1h div:has(h1){display:contents}.bm-1j h2{display:inline-block;font-size:larger;font-weight:700;vertical-align:middle}.bm-1b.bm-U:has(>:where(h1,h2,h3,h4,h5,h6)){width:fit-content;margin-left:auto;margin-right:auto}.bm-1b{margin:.5em 0}.bm-1j button{background-color:#144eb9;border-radius:1em;padding:0 .75ch}.bm-1j button:hover,.bm-1j button:focus-visible{background-color:#1061e5}.bm-1j button:active,.bm-1j button:disabled{background-color:#2e97ff}.bm-1j button:disabled{text-decoration:line-through}.bm--{border:white 1px solid;height:1.5em;width:1.5em;margin-top:2px;text-align:center;line-height:1em;padding:0!important}.bm-17{vertical-align:middle}.bm-17 svg{width:50%;margin:0 auto;fill:#111}.bm-1j button.bm-13{background-color:unset}.bm-13.bm-Q:hover,.bm-13.bm-Q:focus{background-color:#ffffff2b}.bm-13.bm-Q:active{background-color:#ffffff38}.bm-13.bm-R:hover,.bm-13.bm-R:focus{background-color:#0000002b}.bm-13.bm-R:active{background-color:#00000038}input[type=number].bm-10{appearance:auto;-moz-appearance:textfield;width:5.5ch;margin-left:1ch;background-color:#0003;padding:0 .5ch;font-size:small}input[type=number].bm-10::-webkit-outer-spin-button,input[type=number].bm-10::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}div:has(>.bm-18)>button{width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bm-18,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-1j select{color:#fff;background-color:#144eb9;border-radius:1em;padding:0 .5ch}.bm-1j label:has(input[type=checkbox]){display:flex;width:fit-content;gap:1ch}.bm-1j input[type=checkbox]{width:1em}.bm-V{overflow:hidden;transition:height .3s cubic-bezier(.4,0,.2,1)}.bm-1j textarea{font-size:small;background-color:#0003;padding:0 .5ch;height:5.25em;width:100%}.bm-1j small{font-size:x-small;color:#d3d3d3}.bm-11{display:flex;align-content:center;justify-content:space-between;align-items:center;gap:.5ch}.bm-flex-center{display:flex;align-content:center;justify-content:center;align-items:center;gap:.5ch}#bm-_ p svg{display:inline;height:1em;fill:#fff}#bm-_ .bm-1b.bm-19{max-height:calc(80vh - 150px);overflow:auto}.bm-15{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:center;gap:1em 3ch}.bm-12{width:fit-content;max-width:35ch;background-color:#153063e6;border-radius:1em;padding:.5em;gap:1ch;transition:background-color .3s ease}.bm-12:hover,.bm-12:focus-within{background-color:#112855e6}.bm-N{display:block;border:thick double darkslategray;width:fit-content;height:fit-content;padding:1ch}.bm-N button{padding:.75em .5ch}.bm-N svg{width:4ch}.bm-12>.bm-11{flex-direction:column;align-items:flex-start;gap:0}.bm-12 small{font-size:.75em}#bm-_ .bm-12.bm-1a{display:none}`;GM_addStyle(C);var T,D="@font-face{font-family:'Roboto Mono';font-style:normal;font-weight:400;src:url(data:font/woff2;base64,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)format('woff2');}";D.indexOf("@font-face")+1?(console.log("Loading Roboto Mono as a file..."),GM_addStyle(D)):((T=document.createElement("link")).href="https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&display=swap",T.rel="preload",T.as="style",T.onload=function(){this.onload=null,this.rel="stylesheet"},document.head?.appendChild(T)),new class{constructor(){this.Ot=null,this.kt=null,this.Nt="#bm-h"}Bt(t){return this.kt=t,this.Ot=new MutationObserver(t=>{for(const e of t)for(const t of e.addedNodes)t instanceof HTMLElement&&t.matches?.(this.Nt)}),this}It(){return this.Ot}observe(t,e=!1,n=!1){t.observe(this.kt,{childList:e,subtree:n})}};var O=new a(S,M),k=(new a(S,M),new class{constructor(t,e,n){o(this,b),this.name=t,this.version=e,this.o=n,this.Lt="1.0.0",this.Pt=null,this.Gt="!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~",this.gt=1e3,this.Mt=3,this.Tt=3,this.Dt=function(t){const e=v;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 n=new Map;for(const i of e){if(0==i.id||-2==i.id)continue;const e=i.rgb[0],o=i.rgb[1],s=i.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=o+r,m=s+l;if(t<0||t>255||c<0||c>255||m<0||m>255)continue;const d=(255<<24|m<<16|c<<8|t)>>>0;n.has(d)||n.set(d,i.id)}}return{palette:e,$t:n}}(this.Tt),this.Ut=null,this.Ft="",this.Ct=[],this.St=null,this.At=!0,this.Wt=null}async _t(){return{whoami:this.name.replace(" ",""),scriptVersion:this.version,schemaVersion:this.Lt,templates:{}}}async Ht(t,e,n){this.St||(this.St=await this._t(),console.log("Creating JSON...")),this.o.ct(`Creating template at ${n.join(", ")}...`);const i=new $({displayName:e,dt:0,ht:l(this.Pt||0,this.Gt),file:t,coords:n}),{xt:o,vt:a}=await i.wt(this.gt,this.Dt);i.ut=o;const r={total:i.ft.total,colors:Object.fromEntries(i.ft.colors)};this.St.templates[`${i.dt} ${i.ht}`]={name:i.displayName,coords:n.join(", "),enabled:!0,pixels:r,tiles:a},this.Ct=[],this.Ct.push(i),this.o.ct(`Template created at ${n.join(", ")}!`),console.log(Object.keys(this.St.templates).length),console.log(this.St),console.log(this.Ct),console.log(JSON.stringify(this.St)),await s(this,b,p).call(this)}Xt(){}async Et(){this.St||(this.St=await this._t(),console.log("Creating JSON..."))}async Jt(t,e){if(!this.At)return t;const n=this.gt*this.Mt;e=e[0].toString().padStart(4,"0")+","+e[1].toString().padStart(4,"0"),console.log(`Searching for templates in tile: "${e}"`);const i=this.Ct;console.log(i),i.sort((t,e)=>t.dt-e.dt),console.log(i);const o=i.map(t=>{const n=Object.keys(t.ut).filter(t=>t.startsWith(e));if(0===n.length)return null;const i=n.map(e=>{const n=e.split(",");return{jt:t,Rt:t.ut[e],bt:t.bt?.[e],Vt:[n[0],n[1]],Yt:[n[2],n[3]]}});return i?.[0]}).filter(Boolean);console.log(o);const a=o?.length||0;if(console.log(`templateCount = ${a}`),!(a>0))return this.o.ct(`Sleeping\nVersion: ${this.version}`),t;{const t=i.filter(t=>Object.keys(t.ut).filter(t=>t.startsWith(e)).length>0).reduce((t,e)=>t+(e.ft.total||0),0),n=(new Intl.NumberFormat).format(t);this.o.ct(`Displaying ${a} template${1==a?"":"s"}.\nTotal pixels: ${n}`)}const r=await createImageBitmap(t),l=new OffscreenCanvas(n,n),c=l.getContext("2d");c.imageSmoothingEnabled=!1,c.beginPath(),c.rect(0,0,n,n),c.clip(),c.clearRect(0,0,n,n),c.drawImage(r,0,0,n,n);const m=c.getImageData(0,0,n,n),d=new Uint32Array(m.data.buffer);for(const t of o){console.log("Template:"),console.log(t);let n=t.bt;const i=Number(t.Yt[0])*this.Mt,o=Number(t.Yt[1])*this.Mt;if(c.drawImage(t.Rt,i,o),!n){const e=c.getImageData(i,o,t.Rt.width,t.Rt.height);n=new Uint32Array(e.data.buffer)}const a=Date.now(),r=s(this,b,f).call(this,d,n,[i,o,t.Rt.width,t.Rt.height]);let l=0;const m=0;for(const[t,e]of r)t!=m&&(l+=e);console.log(`Finished calculating correct pixels for the tile ${e} in ${(Date.now()-a)/1e3} seconds!\nThere are ${l} correct pixels.`),t.jt.ft.correct=r}return await l.convertToBlob({type:"image/png"})}zt(t){console.log("Importing JSON..."),console.log(t),"BlueMarble"==t?.whoami&&s(this,b,g).call(this,t)}qt(t){this.At=t}}(S,M,O)),N=new class{constructor(t){o(this,w),this.Qt=t,this.Kt=!1,this.Zt=[],this.te=[]}ee(t){window.addEventListener("message",async e=>{const n=e.data,i=n.jsonData;if(!n||"blue-marble"!==n.source)return;if(!n.endpoint)return;const o=n.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;","",o),o){case"me":if(i.status&&"2"!=i.status?.toString()[0])return void t.lt("You are not logged in!\nCould not fetch userdata.");const e=Math.ceil(Math.pow(Math.floor(i.level)*Math.pow(30,.65),1/.65)-i.pixelsPainted);console.log(i.id),(i.id||0===i.id)&&console.log(l(i.id,"!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~")),this.Qt.Pt=i.id,t.tt("bm-p",`Droplets: ${(new Intl.NumberFormat).format(i.droplets)}`),t.tt("bm-i",`Next level in ${(new Intl.NumberFormat).format(e)} pixel${1==e?"":"s"}`);break;case"pixel":const o=n.endpoint.split("?")[0].split("/").filter(t=>t&&!isNaN(Number(t))),r=new URLSearchParams(n.endpoint.split("?")[1]),c=[r.get("x"),r.get("y")];if(this.Zt.length&&(!o.length||!c.length))return void t.lt("Coordinates are malformed!\nDid you try clicking the canvas first?");this.Zt=[...o,...c];const m=(s=o,a=c,[parseInt(s[0])%4*1e3+parseInt(a[0]),parseInt(s[1])%4*1e3+parseInt(a[1])]),d=document.querySelectorAll("span");for(const t of d)if(t.textContent.trim().includes(`${m[0]}, ${m[1]}`)){let e=document.querySelector("#bm-h");const n=`(Tl X: ${o[0]}, Tl Y: ${o[1]}, Px X: ${c[0]}, Px Y: ${c[1]})`;e?e.textContent=n:(e=document.createElement("span"),e.id="bm-h",e.textContent=n,e.style="margin-left: calc(var(--spacing)*3); font-size: small;",t.parentNode.parentNode.insertAdjacentElement("afterend",e))}break;case"tiles":let h=n.endpoint.split("/");h=[parseInt(h[h.length-2]),parseInt(h[h.length-1].replace(".png",""))];const u=n.blobID,b=n.blobData,p=Date.now(),g=await this.Qt.Jt(b,h);console.log(`Finished loading the tile in ${(Date.now()-p)/1e3} seconds!`),window.postMessage({source:"blue-marble",blobID:u,blobData:g,blink:n.blink});break;case"robots":this.Kt="false"==i.userscript?.toString().toLowerCase();break}var s,a})}async ne(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 n=navigator.userAgent;let i=await s(this,w,y).call(this,n),o=s(this,w,x).call(this,n);GM_xmlhttpRequest({method:"POST",url:"https://telemetry.thebluecorner.net/heartbeat",headers:{"Content-Type":"application/json"},data:JSON.stringify({uuid:e.uuid,version:t,browser:i,os:o}),onload:t=>{200!==t.status&&r("Failed to send heartbeat:",t.statusText)},onerror:t=>{r("Error sending heartbeat:",t)}})}}(k);O.h(N);var B=JSON.parse(GM_getValue("bmTemplates","{}"));console.log(B),k.zt(B);var I=JSON.parse(GM_getValue("bmUserSettings","{}"));if(console.log(I),console.log(Object.keys(I).length),0==Object.keys(I).length){const t=crypto.randomUUID();console.log(t),GM.setValue("bmUserSettings",JSON.stringify({uuid:t}))}if(setInterval(()=>N.ne(M),18e5),console.log(`Telemetry is ${!(null==I?.telemetry)}`),null==I?.telemetry||I?.telemetry>1){const t=new a(S,M);t.h(N),t.v({id:"bm-d",style:"top: 0px; left: 0px; width: 100vw; max-width: 100vw; height: 100vh; max-height: 100vh; z-index: 9999;"}).v({id:"bm-7",style:"display: flex; flex-direction: column; align-items: center;"}).v({id:"bm-1",style:"margin-top: 10%;"}).O(1,{textContent:`${S} Telemetry`}).u().u().v({id:"bm-e",style:"max-width: 50%; overflow-y: auto; max-height: 80vh;"}).k().u().N().u().v({style:"width: fit-content; margin: auto; text-align: center;"}).K({id:"bm-8",textContent:"More Information"},(t,e)=>{e.onclick=()=>{window.open("https://github.com/SwingTheVine/Wplace-TelemetryServer#telemetry-data","_blank","noopener noreferrer")}}).u().u().N().u().v({style:"width: fit-content; margin: auto; text-align: center;"}).K({id:"bm-5",textContent:"Enable Telemetry",style:"margin-right: 2ch;"},(t,e)=>{e.onclick=()=>{const t=JSON.parse(GM_getValue("bmUserSettings","{}"));t.telemetry=1,GM.setValue("bmUserSettings",JSON.stringify(t));const e=document.getElementById("bm-d");e&&(e.style.display="none")}}).u().K({id:"bm-2",textContent:"Disable Telemetry"},(t,e)=>{e.onclick=()=>{const t=JSON.parse(GM_getValue("bmUserSettings","{}"));t.telemetry=0,GM.setValue("bmUserSettings",JSON.stringify(t));const e=document.getElementById("bm-d");e&&(e.style.display="none")}}).u().u().N().u().$({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 the Blue Marble!"}).u().$({textContent:'You can disable telemetry by pressing the "Disable" button below.'}).u().u().u().p(document.body)}O.v({id:"bm-14",class:"bm-1j",style:"top: 10px; left: unset; right: 75px;"}).ot().K({class:"bm--",textContent:"▼","aria-label":'Minimize window "Blue Marble"',"data-button-status":"expanded"},(t,e)=>{e.onclick=()=>t.st(e),e.ontouchend=()=>t.st(e)}).u().v().u().u().v({class:"bm-V"}).v({class:"bm-1b"}).D({class:"bm-1i",src:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALEQa0zv0AAAACBjSFJNAACHDwAAjA8AAP1SAACBQAAAfXkAAOmLAAA85QAAGcxzPIV3AAABF2lDQ1BJQ0MgUHJvZmlsZQAAKM9jYGDiyUnOLWYSYGDIzSspCnJ3UoiIjFJgv8PAyCDJwMygyWCZmFxc4BgQ4MOAE3y7BlQNBJd1QWYxkAa4UlKLk4H0HyCOSy4oKmFgYIwBsrnLSwpA7AwgWyQpG8yuAbGLgA4EsieA2OkQ9hKwGgh7B1hNSJAzkH0GyHZIR2InIbGh9oIAc7IRA9VBSWpFCYh2c2JgAIUpelghxJjFgNgYGBdLEGL5ixgYLL4CxScgxJJmMjBsb2VgkLiFEFNZwMDA38LAsO18cmlRGdRqKSA+zXiSOZl1Ekc29zcBe9FAaRPFj5oTjCSsJ7mxBpbHvs0uqGLt3DirZk3m/trLh18a/P8PAN5BU32YWvgkAAAACXBIWXMAAA7BAAAOwQG4kWvtAAAAGHRFWHRTb2Z0d2FyZQBQYWludC5ORVQgNS4xLjgbaeqoAAAAjGVYSWZJSSoACAAAAAUAGgEFAAEAAABKAAAAGwEFAAEAAABSAAAAKAEDAAEAAAACAAAAMQECABAAAABaAAAAaYcEAAEAAABqAAAAAAAAANl2AQDoAwAA2XYBAOgDAABQYWludC5ORVQgNS4xLjgAAgAAkAcABAAAADAyMzABoAMAAQAAAP//AAAAAAAAubU+IZJzuMAAAAtoSURBVFhHlZZ3fJSFGce/NzKOhITL4kJCEgmJ7D2UXQKJghVBFEWkLC3ioNWigFrhg9ZRKBZUWigtcTBEQUEgBDAESEJCQvYk+7LnZV4u6+2TV8unfqRqnz9yd2/unvF7fs/veTT8HxaXVKBk52QSNGQSN65dxeThTktbG0tWPkhWtpmq8ho65fOTT87+xX5/9ouRV9MV38BRlKZl4qLvwdJQi03RU9fSQmuFGX9fD3q7e+g3ZAS2tibq65rxDwzEXFjKmjVhP+tf+/3rHS0lvlSZP3YUyWdP4NxazgCNFZMzuGg7aKsq5mjERSy2LmbOmQ3VhXSaywjw82XPnn0cPXmSLa8fUN58M1z53t0d7Y4Z5uQ3KSXJmQTfZaIgJ4Wapka8DY70dzLQqXSRVVROVXMHGYUFpOcUsPG3q4lPSaOsrJ4unQMjh48iJSUFo9GIp7s7OvTs/2jTHWP96OGXX11XTHZ2dHVY8PPxwCLBK2obyMnJU/9fUlsDenvqmhrwMQ1i+tQptJcV0m61EpVXh2mQD7m3CnBwcECvs0ej9PLrB+8nIz2Xd7av+1E83fevqqXlNSiDNBpKSouwaXuJS8wk6VYhCZlZFNfVUCdBrN0KS5c9Rn/n/thLIuYSM55+AQSPu4dDn30uXnoZM3o0nbYOdFo7enp6ce3fDw/3Abh4jtiWkRy1/bto39kPMsq4VqzEpSeTlZUjUHfTam3hMQlWUFBAUZEZN0836i11LJwbQoetmcK8QhRF4S8f7cPbN0AQ88PT012SMxJ9JZqgoEAyMrLQ2Ot4as1akm9m0iRcOvLP3bfj3n5z8JNYpaailAaBeOKUiXR1W7GTVujt9Nw1xBtHgxMbX3yJ3yx/mAN/O0j05dM8/8ImTpw4xdMbt2Ls78zhw4fZsWMb02eMRiee1659lt9v3EhMQgaJiamUmSvwMg3k2KG3bsdVp+C5V95QstLTKSuvZOS48Zw5F0FRcZEgkcF9908TOLsxDnBBo+1h+vQpvL97F4Iss341l4eWLMXoaiA27hLOBmdC50xjzpwFzJy1iH4GN4YODWbnzr8wYcI4nJ0N0iGFdc+8dHsy1Ex2vHdGeXbDAjZufBeFDuqqyqWy/bS22jh+/Dg6nZan1i3n8pU4cjLycHJ25IknliF0IXTBozg7uXDg4G7GCg+CgkZQU9uIl5cXDZZmdQpqa2v59uJZPg4/Rn6h8MvazqEDO9TY6h+LVVGOH7tO5IVvWPrIElKSEklMiWX08BEMDQpg1LBRZGalS/JdpKcms/ihJSTciMfPP5AVKxbx1ekobt7M5datXCqqanBzd1PbFxQUJChmERERQei8+fK7B2U0Pbh+I4709BjOnTym0Z77Nls5+ukVNDobK1YuIV4cOzo50c/BhbgbN5kbMotBvp6kZ6TRabWpaAQFD2HavbPw8vFl3VObpV3VvP76ejy9XAWVTkkmkaTEJKKiolQCL168hJDQEM6cPStC5UeJoGDo59pXO7qpUx/Ydv3GdemNla9PfUNzk4WczEz8/Qbx4d93kxYfS8yVqxgMBiZPGsvqVU9icHTgwoXLglIWZnM5MVejVIjvHjmJkSNHkF9QwiOPLCM//5aqBzU1VcTExuLlaWLixAm0t7ZT1dhMdmrcds3W7V8oVZX5rF2zgkmTfZg3r6+3dvRzdsFqbeXhkAk0WazMDw0lPimewMAgTkecE/oqtHTYizo6SzU6snIShTP2ooZlzJ41i9TUVFz6D6BFdoajqKhOWhIWFkbUpUt0dnaxfsPTrFz6K422trpJoPPlhqBwITKVltZuCdiGz6BB7N3zIff/ehUd1nKK067grBdxirtIeVmukKdbHHVSJgsp8lwkPgN9qayoAEVLQnwigUOCmCIq2dLaohZTVVktvNDjIOM8NPhuIs9HMWHKDEXrNdBNCCFEuXCBzVvfYOaM8fQ9W7XyNzg66Aj/4hCeHgMJmxtKjyCydetrEribygbZgMKV1rZWnFwHkJVbhr2d7AvRA6ObkUQh8uiRQQwWngyQZ31INArsM+6dJm0zy0grOLu5oXn+pXDFIrru4aEVFt+iuqqeKqlk6LBArB1WQcLEc+tX4+/iyF/ff5dRkyeg2PfnVESs6qSns1cds+amViGyXtrQiru7USXY3j27cXfzFOleKpA/x/79/xAS6wgICKC+sY6Y859qNO/uvqTEJ8TgN9gLk7cn0d9eJOy+aQTeNVKd488OfyIE1GNtrOT8ha9F+8vY9/dwFj68nEOHPiYvL4+OjnaZdy8KCovp7OrkgYUP0GipJ1aIFx4ezvhx/gwJnin74LvEFi1aRHV1BQf3/lGj9ZIFH7bgXh5dtoSvvzqlVmPQG2XU7qLcXMILzz9PY50FvZMrkZfjaLPCn/70KtPH+7Hzzd8Rff4zHIUbztKOzq4ORowIFkLexEP2Bppetm9/g7lhK1i8YBZdXV00NzfLdOTLDulRk9Gk5jQqJtMA0lIzOLA/nIeXPsTE8aNlzC7hIFBfkypy5Azz9R2EU39H2ltauW9hGKsef4C2duGBQSuvLdg5uvDOe/tISLyJr7TN5O2Ng07h48Of8/QzzxEaMofHV6xh2oyZ+PkO5tq1y0Sc2K/Rjh1m1OzaeZDBgz1EFXQsk37Nnj2bM2dOsPyJecTFR+Ef4MumV15k7/tvU1FWypYtWzh46DhOMn595mhwIepyNsNEA4xurjRbmnCVdd3c1q0iM3XyFHJyC7hnyiRir8XIiCarwft+q3qYH7Z6W8jscYg+sHBhqDDZDUtjIyufWCwtaSYlNY2YmGvs2f2hZH6WTb/bwJixI9GKi6y8IiGji6qW2bK8CkX5Nr/ysozgZJrFh5u7C9djbzJ82HAcHA2YBpqorq0kNyNBvQvUBJ7d+MY2g5OGiZPGcPTIFwTfPUyqX46vj1HQmMrMmfNEUm/x1o63ZKcnS2UdREcn8cG+f1EnQbJzs4RYi2WSPKmoKGdY8HAyMzKZLaNrsbQKqUPlONGLgjoK+xuorDRLAolqAioMffbt1QJloMlFUtKTmpRFQX42pSWlBAf58uhjK9TxKikuxUNmvEUSOHLkKM7CiQ0bNpCansGpM6eIjDjLp58cFq14leXLH+fk16fp7e1l7pwQBvsHSBuyqSg3c+Rfu27HvX0VN7Y2U1ZSK4pVw+dHD7N+/Vr0ej0h8+/H0bFPYisYM2Y8v//DJpxEft95b5squ2ZzKTnZ6WTKUbrl5dfYvHmzzPsBQegqrq5Gurt71ZugsaGR+IREiSRj9F92O5M+O3e1SPngrx/xzLpVjBoeQHFpGa/+8TXOfvM5WmnWgX3HGDduNK5GV+GJK0Z3J24mpaki5D14IPvlUhou7auqrcNPtp4ok/r5auw1GurrcHPz4u1tT/0g5g8+9FlWoaLs/eDPFOYX4T/YW86uFzj55XF1scyfN0NgN1ApatnT06PefFpZzyXFZpKS06VlZZSUFLN69TpsNhtNMrI1VdWUV9RIZ7Ukxl8k8uxnP51An52KKFCKi7JEt++RSvUoIihGo5sEKMfHx0fOMRGUFgtNcrL3wdvb262qodXWwwDhyIVz0XJHDqGisk5dyc1CvLyCdL48/NGP4t0xgT775ny6YudgwMEOhgT4S0VWGTeNVKLB3l4r46PBJrIrkiYHrCLP7KmptshysoladtHR3ibPHLgUFS0ciSbi9LE7xvqfCfzHXt56QBk/ZYK0w0cNanDSy8WrCLm61Tb09blVBKTvBLN1dFHbYJHv6UTrq8gTBd2968WfjPGzCfzHPj6aoJi8B1JfU42Laz/Z8U4qIl0dNiFhG1qZ84aGeiFbm2zTUnbt3PCLfP/iBP7b/nbwjOLq6isEq5XrqQ9+PfWibq9uXf5/+oN/A9GVF7dbp9A3AAAAAElFTkSuQmCC"}).u().O(1,{textContent:S}).u().u().k().u().v({class:"bm-1b"}).$({id:"bm-p",textContent:"Droplets:"}).u().$({id:"bm-i",textContent:"Next level in..."}).u().u().k().u().v({class:"bm-1b"}).v({class:"bm-1b"}).K({class:"bm-- bm-17",style:"margin-top: 0;",innerHTML:''},(t,e)=>{e.onclick=()=>{const e=t.t?.Zt;e?.[0]?(t.tt("bm-v",e?.[0]||""),t.tt("bm-w",e?.[1]||""),t.tt("bm-x",e?.[2]||""),t.tt("bm-y",e?.[3]||"")):t.lt("Coordinates are malformed! Did you try clicking on the canvas first?")}}).u().et({type:"number",id:"bm-v",class:"bm-10",placeholder:"Tl X",min:0,max:2047,step:1,required:!0},(t,e)=>{e.addEventListener("paste",t=>{let e=(t.clipboardData||window.clipboardData).getData("text").split(" ").filter(t=>t).map(Number).filter(t=>!isNaN(t));if(4!==e.length)return;let n=selectAllCoordinateInputs(document);for(let t=0;t{e.onclick=()=>{e.disabled=!0,"shown"==e.dataset.buttonStatus?(t.t?.Qt?.qt(!1),e.dataset.buttonStatus="hidden",e.textContent="Enable",t.ct("Disabled templates!")):(t.t?.Qt?.qt(!0),e.dataset.buttonStatus="shown",e.textContent="Disable",t.ct("Enabled templates!")),e.disabled=!1}}).u().K({textContent:"Create"},(t,e)=>{e.onclick=()=>{const e=document.querySelector("#bm-14 button.bm-18"),n=document.querySelector("#bm-v");if(!n.checkValidity())return n.reportValidity(),void t.lt("Coordinates are malformed! Did you try clicking on the canvas first?");const i=document.querySelector("#bm-w");if(!i.checkValidity())return i.reportValidity(),void t.lt("Coordinates are malformed! Did you try clicking on the canvas first?");const o=document.querySelector("#bm-x");if(!o.checkValidity())return o.reportValidity(),void t.lt("Coordinates are malformed! Did you try clicking on the canvas first?");const s=document.querySelector("#bm-y");if(!s.checkValidity())return s.reportValidity(),void t.lt("Coordinates are malformed! Did you try clicking on the canvas first?");e?.files[0]?(k.Ht(e.files[0],e.files[0]?.name.replace(/\.[^/.]+$/,""),[Number(n.value),Number(i.value),Number(o.value),Number(s.value)]),t.ct("Drew to canvas!")):t.lt("No file selected!")}}).u().K({textContent:"Filter"},(t,e)=>{e.onclick=()=>function(){if(document.querySelector("#bm-_"))return void O.lt("Color Filter window already exists!");const t='',e='',n=new a(S,M);n.v({id:"bm-_",class:"bm-1j"}).ot().K({class:"bm--",textContent:"▼","aria-label":'Minimize window "Color Filter"',"data-button-status":"expanded"},(t,e)=>{e.onclick=()=>t.st(e),e.ontouchend=()=>{e.click()}}).u().v().u().K({class:"bm--",textContent:"🞪","aria-label":'Close window "Color Filter"'},(t,e)=>{e.onclick=()=>{document.querySelector("#bm-_")?.remove()},e.ontouchend=()=>{e.click()}}).u().u().v({class:"bm-V"}).v({class:"bm-1b bm-U"}).O(1,{textContent:"Color Filter"}).u().u().k().u().v({class:"bm-1b bm-11",style:"gap: 1.5ch; width: fit-content; margin-left: auto; margin-right: auto;"}).K({textContent:"Select All"},(t,e)=>{e.onclick=()=>{}}).u().K({textContent:"Unselect All"},(t,e)=>{e.onclick=()=>{}}).u().u().v({class:"bm-1b bm-19"}).v({class:"bm-1b",style:"margin-left: 2.5ch; margin-right: 2.5ch;"}).B({class:"bm-1b"}).I().L({textContent:"Sort Options:"}).u().v({class:"bm-1b"}).G({id:"bm-O",name:"sortPrimary",textContent:"I want to view "}).U({value:"id",textContent:"color IDs"}).u().U({value:"name",textContent:"color names"}).u().U({value:"premium",textContent:"premium colors"}).u().U({value:"percent",textContent:"percentage"}).u().U({value:"correct",textContent:"correct pixels"}).u().U({value:"incorrect",textContent:"incorrect pixels"}).u().U({value:"total",textContent:"total pixels"}).u().u().G({id:"bm-M",name:"sortSecondary",textContent:" in "}).U({value:"ascending",textContent:"ascending"}).u().U({value:"descending",textContent:"descending"}).u().u().M({textContent:" order."}).u().u().v({class:"bm-1b"}).P({id:"bm-P",name:"showUnused",textContent:"Show unused colors"}).u().u().u().v({class:"bm-1b"}).K({textContent:"Refresh",type:"submit"},(t,e)=>{e.onclick=t=>{t.preventDefault();const e=new FormData(document.querySelector("#bm-_ form")),n={};for([input,value]of e)n[input]=value;console.log(`Primary: ${n.sortPrimary}; Secondary: ${n.sortSecondary}; Unused: ${"on"==n.showUnused}`),function(t,e,n){const i=document.querySelector(".bm-15"),o=Array.from(i.children);o.sort((i,o)=>{const s=i.getAttribute("data-"+t),a=o.getAttribute("data-"+t),r=parseFloat(s),l=parseFloat(a),c=!isNaN(r),m=!isNaN(l);if(n?i.classList.remove("bm-1a"):Number(i.getAttribute("data-total"))||i.classList.add("bm-1a"),c&&m)return"ascending"===e?r-l:l-r;{const t=s.toLowerCase(),n=a.toLowerCase();return tn?"ascending"===e?1:-1:0}}),o.forEach(t=>i.appendChild(t))}(n.sortPrimary,n.sortSecondary,"on"==n.showUnused)}}).u().u().u().$({innerHTML:`Colors with the icon ${t} will be shown on the canvas. Colors with the icon ${e} will not be shown on the canvas. The "Select All" and "Unselect All" buttons only apply to colors that display in the list below.`}).u().u().u().u().u().p(document.body),n.rt("#bm-_.bm-1j","#bm-_ .bm-1h");const i=document.querySelector("#bm-_ .bm-1b.bm-19"),{palette:o,$t:s}=k.Dt;let r=0,l=0;const c=new Map,m=new Map;for(const t of k.Ct){const e=t.ft?.total??0,n=t.ft?.colors??new Map,i=t.ft?.correct??new Map;r+=e??0;for(const[t,e]of i){const n=Number(e)||0;l+=n;const i=c.get(t)??0;c.set(t,i+n)}for(const[t,e]of n){const n=Number(e)||0,i=m.get(t)??0;m.set(t,i+n)}}!function(){const n=new a(S,M);n.v({class:"bm-15"});for(const i of o){const o=d(i.rgb),s=1.05/(o+.05)>(o+.05)/.05?"white":"black",a="white"==s?"bm-Q":"bm-R",r=m.get(i.id)??0,l=(new Intl.NumberFormat).format(r);let h=0,u="0",b=new Intl.NumberFormat(void 0,{style:"percent",ie:2,oe:2}).format(1);0!=r&&(h=c.get(i.id)??"???",u="string"==typeof h?h:(new Intl.NumberFormat).format(h),b=isNaN(h/r)?"???":new Intl.NumberFormat(void 0,{style:"percent",ie:2,oe:2}).format(h/r));const p=parseInt(r)-parseInt(h);n.v({class:"bm-1b bm-12 bm-11","data-id":i.id,"data-name":i.name,"data-premium":+i.premium,"data-correct":Number.isNaN(parseInt(h))?"0":h,"data-total":r,"data-percent":"%"==b.slice(-1)?b.slice(0,-1):"0","data-incorrect":p||0}).v({class:"bm-N",style:`background-color: rgb(${i.rgb?.map(t=>Number(t)||0).join(",")});`}).K({class:"bm-13 "+a,"data-state":"shown","aria-label":`Hide the color ${i.name||"color"} on templates`,innerHTML:t.replace("{i.onclick=()=>{i.style.textDecoration="none",i.disabled=!0,"shown"==i.dataset.state?(i.innerHTML=e.replace("{e.onclick=()=>{window.open("https://pepoafonso.github.io/color_converter_wplace/","_blank","noopener noreferrer")}}).u().K({class:"bm--",innerHTML:"🌐",title:"Official Blue Marble Website"},(t,e)=>{e.onclick=()=>{window.open("https://bluemarble.lol/","_blank","noopener noreferrer")}}).u().u().S({textContent:"Made by SwingTheVine",style:"margin-top: auto;"}).u().u().u().u().u().p(document.body),O.rt("#bm-14.bm-1j","#bm-14 .bm-1h"),N.ee(O),new MutationObserver((t,e)=>{const n=document.querySelector("#color-1");if(!n)return;let i=document.querySelector("#bm-t");if(!i){i=document.createElement("button"),i.id="bm-t",i.textContent="Move ↑",i.className="btn btn-soft",i.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=n.parentNode.parentNode.parentNode.parentNode.querySelector("h2");t.parentNode?.appendChild(i)}}).observe(document.body,{childList:!0,subtree:!0}),function(...t){(0,console.log)(...t)}(`%c${S}%c (${M}) userscript has loaded!`,"color: cornflowerblue;","")})(); \ No newline at end of file +(()=>{var t,e,n,i=t=>{throw TypeError(t)},o=(t,e,n)=>e.has(t)?i("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n),s=(t,e,n)=>(((t,e)=>{e.has(t)||i("Cannot access private method")})(t,e),n),a=class{constructor(e,n){o(this,t),this.name=e,this.version=n,this.t=null,this.i="bm-o",this.o=null,this.l=null,this.m=[]}h(t){this.t=t}u(){return this.m.length>0&&(this.l=this.m.pop()),this}p(t){t?.appendChild(this.o),this.o=null,this.l=null,this.m=[]}v(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"div",{},n)),this}$(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"p",{},n)),this}S(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"small",{},n)),this}M(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"span",{},n)),this}T(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"details",{},n)),this}C(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"summary",{},n)),this}D(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"img",{},n)),this}O(n,i={},o=()=>{}){return o(this,s(this,t,e).call(this,"h"+n,{},i)),this}k(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"hr",{},n)),this}N(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"br",{},n)),this}L(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"form",{},n)),this}B(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"fieldset",{},n)),this}I(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"legend",{},n)),this}P(n={},i=()=>{}){const o=s(this,t,e).call(this,"label",{textContent:n.textContent??""});delete n.textContent;const a=s(this,t,e).call(this,"input",{type:"checkbox"},n);return o.insertBefore(a,o.firstChild),this.u(),i(this,o,a),this}G(n={},i=()=>{}){const o=s(this,t,e).call(this,"label",{textContent:n.textContent??"",for:n.id??""});return delete n.textContent,this.u(),i(this,o,s(this,t,e).call(this,"select",{},n)),this}U(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"option",{},n)),this}A(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"ol",{},n)),this}W(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"ul",{},n)),this}F(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"menu",{},n)),this}H(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"li",{},n)),this}_(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"table",{},n)),this}X(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"caption",{},n)),this}j(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"thead",{},n)),this}J(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"tbody",{},n)),this}R(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"tfoot",{},n)),this}V(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"tr",{},n)),this}Y(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"th",{},n)),this}q(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"td",{},n)),this}K(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"button",{},n)),this}Z(n={},i=()=>{}){const o=n.title??n.textContent??"Help: No info";delete n.textContent,n.title=`Help: ${o}`;const a={textContent:"?",className:"bm-D",onclick:()=>{this.tt(this.i,o)}};return i(this,s(this,t,e).call(this,"button",a,n)),this}et(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"input",{},n)),this}nt(n={},i=()=>{}){const o=n.textContent??"";delete n.textContent;const a=s(this,t,e).call(this,"div"),r=s(this,t,e).call(this,"input",{type:"file",tabindex:"-1","aria-hidden":"true",style:"display: none !important; visibility: hidden !important; position: absolute !important; left: -9999px !important; width: 0 !important; height: 0 !important; opacity: 0 !important;"},n);this.u();const l=s(this,t,e).call(this,"button",{textContent:o});return this.u(),this.u(),l.addEventListener("click",()=>{r.click()}),r.addEventListener("change",()=>{l.style.maxWidth=`${l.offsetWidth}px`,r.files.length>0?l.textContent=r.files[0].name:l.textContent=o}),i(this,a,r,l),this}it(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"textarea",{},n)),this}ot(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"div",{class:"bm-1k"},n)),this}tt(t,e,n=!1){const i=document.getElementById(t.replace(/^#/,""));i&&(i instanceof HTMLInputElement?i.value=e:n?i.textContent=e:i.innerHTML=e)}st(t){if(t.disabled)return;t.disabled=!0,t.style.textDecoration="none";const e=t.closest(".bm-1m"),n=t.closest(".bm-1k"),i=e.querySelector("h1"),o=e.querySelector(".bm-Y");if("expanded"==t.dataset.buttonStatus){o.style.height=o.scrollHeight+"px",e.style.width=e.scrollWidth+"px",o.style.height="0",o.addEventListener("transitionend",function e(){o.style.display="none",t.disabled=!1,t.style.textDecoration="",o.removeEventListener("transitionend",e)});const n=i.cloneNode(!0),s=n.textContent;t.nextElementSibling.appendChild(n),t.textContent="▶",t.dataset.buttonStatus="collapsed",t.ariaLabel=`Unminimize window "${s}"`}else{const i=n.querySelector("h1"),s=i.textContent;i.remove(),o.style.display="",o.style.height="0",e.style.width="",o.style.height=o.scrollHeight+"px",o.addEventListener("transitionend",function e(){o.style.height="",t.disabled=!1,t.style.textDecoration="",o.removeEventListener("transitionend",e)}),t.textContent="▼",t.dataset.buttonStatus="expanded",t.ariaLabel=`Minimize window "${s}"`}}rt(t,e){if(t=document.querySelector(t),e=document.querySelector(e),!t||!e)return void this.lt(`Can not drag! ${t?"":"moveMe"} ${t||e?"":"and "}${e?"":"iMoveThings "}was not found!`);let n,i=!1,o=0,s=null,a=0,r=0,l=0,c=0,m=null;const d=()=>{if(i){const e=Math.abs(a-l),n=Math.abs(r-c);(e>.5||n>.5)&&(a=l,r=c,t.style.transform=`translate(${a}px, ${r}px)`,t.style.left="0px",t.style.top="0px",t.style.right=""),s=requestAnimationFrame(d)}},h=(h,g)=>{i=!0,m=t.getBoundingClientRect(),n=h-m.left,o=g-m.top;const f=window.getComputedStyle(t).transform;if(f&&"none"!==f){const t=new DOMMatrix(f);a=t.m41,r=t.m42}else a=m.left,r=m.top;l=a,c=r,document.body.style.userSelect="none",e.classList.add("bm-1f"),document.addEventListener("mousemove",b),document.addEventListener("touchmove",p,{passive:!1}),document.addEventListener("mouseup",u),document.addEventListener("touchend",u),document.addEventListener("touchcancel",u),s&&cancelAnimationFrame(s),d()},u=()=>{i=!1,s&&(cancelAnimationFrame(s),s=null),document.body.style.userSelect="",e.classList.remove("bm-1f"),document.removeEventListener("mousemove",b),document.removeEventListener("touchmove",p),document.removeEventListener("mouseup",u),document.removeEventListener("touchend",u),document.removeEventListener("touchcancel",u)},b=t=>{i&&m&&(l=t.clientX-n,c=t.clientY-o)},p=t=>{if(i&&m){const e=t.touches[0];if(!e)return;l=e.clientX-n,c=e.clientY-o,t.preventDefault()}};e.addEventListener("mousedown",function(t){t.preventDefault(),h(t.clientX,t.clientY)}),e.addEventListener("touchstart",function(t){const e=t?.touches?.[0];e&&(h(e.clientX,e.clientY),t.preventDefault())},{passive:!1})}ct(t){(0,console.info)(`${this.name}: ${t}`),this.tt(this.i,"Status: "+t,!0)}lt(t){(0,console.error)(`${this.name}: ${t}`),this.tt(this.i,"Error: "+t,!0)}};function r(...t){(0,console.error)(...t)}function l(t,e){if(0===t)return e[0];let n="";const i=e.length;for(;t>0;)n=e[t%i]+n,t=Math.floor(t/i);return n}function c(t){let e="";for(let n=0;n(t/=255)<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4));return.2126*e[0]+.7152*e[1]+.0722*e[2]}t=new WeakSet,e=function(e,i={},o={}){const a=document.createElement(e);this.o?(this.l?.appendChild(a),this.m.push(this.l),this.l=a):(this.o=a,this.l=a);for(const[e,o]of Object.entries(i))s(this,t,n).call(this,a,e,o);for(const[e,i]of Object.entries(o))s(this,t,n).call(this,a,e,i);return a},n=function(t,e,n){if("class"==e)t.classList.add(...n.split(/\s+/));else if("for"==e)t.htmlFor=n;else if("tabindex"==e)t.tabIndex=Number(n);else if("readonly"==e)t.readOnly="true"==n||"1"==n;else if("maxlength"==e)t.maxLength=Number(n);else if(e.startsWith("data"))t.dataset[e.slice(5).split("-").map((t,e)=>0==e?t:t[0].toUpperCase()+t.slice(1)).join("")]=n;else if(e.startsWith("aria")){const i=e.slice(5).split("-").map((t,e)=>0==e?t:t[0].toUpperCase()+t.slice(1)).join("");t["aria"+i[0].toUpperCase()+i.slice(1)]=n}else t[e]=n};var h,u,b,p,g,f,w,y,x,v=[{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]}],$=class{constructor({displayName:t="My template",dt:e=0,ht:n="",url:i="",file:s=null,coords:a=null,ut:r=null,bt:l={},gt:c=1e3}={}){o(this,h),this.displayName=t,this.dt=e,this.ht=n,this.url=i,this.file=s,this.coords=a,this.ut=r,this.bt=l,this.gt=c,this.ft={total:0,colors:new Map}}async wt(t,e){console.log("Template coordinates:",this.coords);const n=await createImageBitmap(this.file),i=n.width,o=n.height;this.gt=t;const a={},r={},l=new OffscreenCanvas(this.gt,this.gt),m=l.getContext("2d",{yt:!0});l.width=i,l.height=o,m.imageSmoothingEnabled=!1,m.drawImage(n,0,0);let d=Date.now();const b=s(this,h,u).call(this,m.getImageData(0,0,i,o),e);console.log(`Calculating total pixels took ${(Date.now()-d)/1e3} seconds`);let p=0;for(const[t,e]of b)0!=t&&(p+=e);this.ft={total:p,colors:b},d=Date.now();const g=new OffscreenCanvas(3,3),f=g.getContext("2d");f.clearRect(0,0,3,3),f.fillStyle="white",f.fillRect(1,1,1,1);for(let t=this.coords[3];t>>24==0?0:o.get(e)??-2;const a=s.get(i);s.set(i,a?a+1:1)}return console.log(s),s},b=new WeakSet,p=async function(){GM.setValue("bmTemplates",JSON.stringify(this.St))},g=async function(t){console.log("Parsing BlueMarble...");const e=t.templates;if(console.log(`BlueMarble length: ${Object.keys(e).length}`),Object.keys(e).length>0)for(const t in e){const n=t,i=e[t];if(console.log(`Template Key: ${n}`),e.hasOwnProperty(t)){const t=n.split(" "),e=Number(t?.[0]),o=t?.[1]||"0",s=i.name||`Template ${e||""}`,a={total:i.pixels.total,colors:new Map(Object.entries(i.pixels.colors).map(([t,e])=>[Number(t),e]))},r=i.tiles,l={},c={},d=this.gt*this.Mt;for(const t in r)if(console.log(t),r.hasOwnProperty(t)){const e=m(r[t]),n=new Blob([e],{type:"image/png"}),i=await createImageBitmap(n);l[t]=i;const o=new OffscreenCanvas(d,d).getContext("2d");o.drawImage(i,0,0);const s=o.getImageData(0,0,i.width,i.height);c[t]=new Uint32Array(s.data.buffer)}const h=new $({displayName:s,dt:e||this.Tt?.length||0,ht:o||""});h.ft=a,h.ut=l,h.bt=c,this.Tt.push(h),console.log(this.Tt),console.log("^^^ This ^^^")}}},f=function(t,e,n){const i=this.Mt,o=this.gt*i,s=n[0],a=n[1],r=n[2],l=n[3],c=this.Ct,{palette:m,$t:d}=this.Dt,h=new Map;for(let n=1;n>>24&255)<=c||(i>>>24&255)<=c)continue;const u=d.get(i)??-2,b=d.get(m)??-2;if(u!=b)continue;const p=h.get(b);h.set(b,p?p+1:1)}return console.log("List of template pixels that match the tile:"),console.log(h),h},w=new WeakSet,y=async function(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"},x=function(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"};var S=GM_info.script.name.toString(),M=GM_info.script.version.toString();!function(t){const e=document.createElement("script");e.setAttribute("bm-E",S),e.setAttribute("bm-B","color: cornflowerblue;"),e.textContent=`(${t})();`,document.documentElement?.appendChild(e),e.remove()}(()=>{const t=document.currentScript,e=t?.getAttribute("bm-E")||"Blue Marble",n=t?.getAttribute("bm-B")||"",i=new Map;window.addEventListener("message",t=>{const{source:o,endpoint:s,blobID:a,blobData:r,blink:l}=t.data,c=Date.now()-l;if(console.groupCollapsed(`%c${e}%c: ${i.size} Recieved IMAGE message about blob "${a}"`,n,""),console.log(`Blob fetch took %c${String(Math.floor(c/6e4)).padStart(2,"0")}:${String(Math.floor(c/1e3)%60).padStart(2,"0")}.${String(c%1e3).padStart(3,"0")}%c MM:SS.mmm`,n,""),console.log(i),console.groupEnd(),"blue-marble"==o&&a&&r&&!s){const t=i.get(a);"function"==typeof t?t(r):function(...t){(0,console.warn)(...t)}(`%c${e}%c: Attempted to retrieve a blob (%s) from queue, but the blobID was not a function! Skipping...`,n,"",a),i.delete(a)}});const o=window.fetch;window.fetch=async function(...t){const s=await o.apply(this,t),a=s.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}"`,n,""),a.json().then(t=>{window.postMessage({source:"blue-marble",endpoint:r,jsonData:t},"*")}).catch(t=>{console.error(`%c${e}%c: Failed to parse JSON: `,n,"",t)});else if(l.includes("image/")&&!r.includes("openfreemap")&&!r.includes("maps")){const t=Date.now(),o=await a.blob();return console.log(`%c${e}%c: ${i.size} Sending IMAGE message about endpoint "${r}"`,n,""),new Promise(s=>{const l=crypto.randomUUID();i.set(l,t=>{s(new Response(t,{headers:a.headers,status:a.status,statusText:a.statusText})),console.log(`%c${e}%c: ${i.size} Processed blob "${l}"`,n,"")}),window.postMessage({source:"blue-marble",endpoint:r,blobID:l,blobData:o,blink:t})}).catch(o=>{const s=Date.now();console.error(`%c${e}%c: Failed to Promise blob!`,n,""),console.groupCollapsed(`%c${e}%c: Details of failed blob Promise:`,n,""),console.log(`Endpoint: ${r}\nThere are ${i.size} blobs processing...\nBlink: ${t.toLocaleString()}\nTime Since Blink: ${String(Math.floor(s/6e4)).padStart(2,"0")}:${String(Math.floor(s/1e3)%60).padStart(2,"0")}.${String(s%1e3).padStart(3,"0")} MM:SS.mmm`),console.error("Exception stack:",o),console.groupEnd()})}return s}});var T=`.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-1m{position:fixed;background-color:#153063e6;color:#fff;padding:10px;border-radius:8px;z-index:9000;transition:all .3s ease,transform 0s;top:75px;left:60px;width:auto;max-height:calc(100vh - 150px);max-width:calc(100% - 135px);font-family:Roboto Mono,Courier New,Monaco,DejaVu Sans Mono,monospace,Arial;letter-spacing:.05em}#bm-17{max-width:300px}.bm-1k{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:.5ch;background:url('data:image/svg+xml;utf8,') repeat;cursor:grab;width:100%;height:fit-content}.bm-1k.bm-1f{cursor:grabbing}.bm-1m:has(.bm-1k.bm-1f){pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.bm-1k.bm-1f{pointer-events:auto}.bm-1l{display:inline-block;height:2.5em;margin-right:1ch;vertical-align:middle}.bm-1m h1{display:inline-block;font-size:x-large;font-weight:700;vertical-align:middle}.bm-1k h1{font-size:1.2em;user-select:none;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-shadow:3px 0px rgba(21,48,99,.5),-3px 0px rgba(21,48,99,.5),0px 3px rgba(21,48,99,.5),0px -3px rgba(21,48,99,.5),3px 3px rgba(21,48,99,.5),-3px 3px rgba(21,48,99,.5),3px -3px rgba(21,48,99,.5),-3px -3px rgba(21,48,99,.5)}.bm-1k div:has(h1){display:contents}.bm-1m h2{display:inline-block;font-size:larger;font-weight:700;vertical-align:middle}.bm-1e.bm-W:has(>:where(h1,h2,h3,h4,h5,h6)){width:fit-content;margin-left:auto;margin-right:auto}.bm-1e{margin:.5em 0}.bm-1m button{background-color:#144eb9;border-radius:1em;padding:0 .75ch}.bm-1m button:hover,.bm-1m button:focus-visible{background-color:#1061e5}.bm-1m button:active,.bm-1m button:disabled{background-color:#2e97ff}.bm-1m button:disabled{text-decoration:line-through}.bm-11{border:white 1px solid;height:1.5em;width:1.5em;margin-top:2px;text-align:center;line-height:1em;padding:0!important}.bm-1a{vertical-align:middle}.bm-1a svg{width:50%;margin:0 auto;fill:#111}.bm-1m button.bm-16{background-color:unset}.bm-16.bm-S:hover,.bm-16.bm-S:focus{background-color:#ffffff2b}.bm-16.bm-S:active{background-color:#ffffff38}.bm-16.bm-T:hover,.bm-16.bm-T:focus{background-color:#0000002b}.bm-16.bm-T:active{background-color:#00000038}input[type=number].bm-13{appearance:auto;-moz-appearance:textfield;width:5.5ch;margin-left:1ch;background-color:#0003;padding:0 .5ch;font-size:small}input[type=number].bm-13::-webkit-outer-spin-button,input[type=number].bm-13::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}div:has(>.bm-1b)>button{width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bm-1b,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-1m select{color:#fff;background-color:#144eb9;border-radius:1em;padding:0 .5ch}.bm-1m label:has(input[type=checkbox]){display:flex;width:fit-content;gap:1ch}.bm-1m input[type=checkbox]{width:1em}.bm-Y{overflow:hidden;transition:height .3s cubic-bezier(.4,0,.2,1)}.bm-1m textarea{font-size:small;background-color:#0003;padding:0 .5ch;height:5.25em;width:100%}.bm-1m small{font-size:x-small;color:#d3d3d3}.bm-14{display:flex;align-content:center;justify-content:space-between;align-items:center;gap:.5ch}.bm-flex-center{display:flex;align-content:center;justify-content:center;align-items:center;gap:.5ch}#bm-12 p svg{display:inline;height:1em;fill:#fff}#bm-12 .bm-1e.bm-1c{max-height:calc(80vh - 150px);overflow:auto}.bm-18{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:center;gap:1em 3ch}.bm-15{width:fit-content;max-width:35ch;background-color:#153063e6;border-radius:1em;padding:.5em;gap:1ch;transition:background-color .3s ease}.bm-15:hover,.bm-15:focus-within{background-color:#112855e6}.bm-O{display:block;border:thick double darkslategray;width:fit-content;height:fit-content;padding:1ch}.bm-15[data-id="-2"] .bm-O{background:conic-gradient(#a00,#aa0 16.6%,#0a0,#0aa 50%,#00a 66.6%,#a0a,#a00)}.bm-15[data-id="-1"] .bm-O{background:url('data:image/svg+xml;utf8,') repeat;background-color:transparent!important}.bm-15[data-id="-1"] .bm-O svg{fill:#fff!important}.bm-15[data-id="0"] .bm-O{background-color:transparent!important}.bm-O button{padding:.75em .5ch}.bm-O svg{width:4ch}.bm-15>.bm-14{flex-direction:column;align-items:flex-start;gap:0}.bm-15 small{font-size:.75em}#bm-12 .bm-15.bm-1d{display:none}`;GM_addStyle(T);var C,D="@font-face{font-family:'Roboto Mono';font-style:normal;font-weight:400;src:url(data:font/woff2;base64,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)format('woff2');}";D.indexOf("@font-face")+1?(console.log("Loading Roboto Mono as a file..."),GM_addStyle(D)):((C=document.createElement("link")).href="https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&display=swap",C.rel="preload",C.as="style",C.onload=function(){this.onload=null,this.rel="stylesheet"},document.head?.appendChild(C)),new class{constructor(){this.Ot=null,this.kt=null,this.Nt="#bm-h"}Lt(t){return this.kt=t,this.Ot=new MutationObserver(t=>{for(const e of t)for(const t of e.addedNodes)t instanceof HTMLElement&&t.matches?.(this.Nt)}),this}Bt(){return this.Ot}observe(t,e=!1,n=!1){t.observe(this.kt,{childList:e,subtree:n})}};var O=new a(S,M),k=(new a(S,M),new class{constructor(t,e,n){o(this,b),this.name=t,this.version=e,this.o=n,this.It="1.0.0",this.Pt=null,this.Gt="!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~",this.gt=1e3,this.Mt=3,this.Ct=3,this.Dt=function(t){const e=v;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 n=new Map;for(const i of e){if(0==i.id||-2==i.id)continue;const e=i.rgb[0],o=i.rgb[1],s=i.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=o+r,m=s+l;if(t<0||t>255||c<0||c>255||m<0||m>255)continue;const d=(255<<24|m<<16|c<<8|t)>>>0;n.has(d)||n.set(d,i.id)}}return{palette:e,$t:n}}(this.Ct),this.Ut=null,this.At="",this.Tt=[],this.St=null,this.Wt=!0,this.Ft=null}async Ht(){return{whoami:this.name.replace(" ",""),scriptVersion:this.version,schemaVersion:this.It,templates:{}}}async _t(t,e,n){this.St||(this.St=await this.Ht(),console.log("Creating JSON...")),this.o.ct(`Creating template at ${n.join(", ")}...`);const i=new $({displayName:e,dt:0,ht:l(this.Pt||0,this.Gt),file:t,coords:n}),{xt:o,vt:a}=await i.wt(this.gt,this.Dt);i.ut=o;const r={total:i.ft.total,colors:Object.fromEntries(i.ft.colors)};this.St.templates[`${i.dt} ${i.ht}`]={name:i.displayName,coords:n.join(", "),enabled:!0,pixels:r,tiles:a},this.Tt=[],this.Tt.push(i),this.o.ct(`Template created at ${n.join(", ")}!`),console.log(Object.keys(this.St.templates).length),console.log(this.St),console.log(this.Tt),console.log(JSON.stringify(this.St)),await s(this,b,p).call(this)}Et(){}async Xt(){this.St||(this.St=await this.Ht(),console.log("Creating JSON..."))}async jt(t,e){if(!this.Wt)return t;const n=this.gt*this.Mt;e=e[0].toString().padStart(4,"0")+","+e[1].toString().padStart(4,"0"),console.log(`Searching for templates in tile: "${e}"`);const i=this.Tt;console.log(i),i.sort((t,e)=>t.dt-e.dt),console.log(i);const o=i.map(t=>{const n=Object.keys(t.ut).filter(t=>t.startsWith(e));if(0===n.length)return null;const i=n.map(e=>{const n=e.split(",");return{Jt:t,Rt:t.ut[e],bt:t.bt?.[e],Vt:[n[0],n[1]],Yt:[n[2],n[3]]}});return i?.[0]}).filter(Boolean);console.log(o);const a=o?.length||0;if(console.log(`templateCount = ${a}`),!(a>0))return this.o.ct(`Sleeping\nVersion: ${this.version}`),t;{const t=i.filter(t=>Object.keys(t.ut).filter(t=>t.startsWith(e)).length>0).reduce((t,e)=>t+(e.ft.total||0),0),n=(new Intl.NumberFormat).format(t);this.o.ct(`Displaying ${a} template${1==a?"":"s"}.\nTotal pixels: ${n}`)}const r=await createImageBitmap(t),l=new OffscreenCanvas(n,n),c=l.getContext("2d");c.imageSmoothingEnabled=!1,c.beginPath(),c.rect(0,0,n,n),c.clip(),c.clearRect(0,0,n,n),c.drawImage(r,0,0,n,n);const m=c.getImageData(0,0,n,n),d=new Uint32Array(m.data.buffer);for(const t of o){console.log("Template:"),console.log(t);let n=t.bt;const i=Number(t.Yt[0])*this.Mt,o=Number(t.Yt[1])*this.Mt;if(c.drawImage(t.Rt,i,o),!n){const e=c.getImageData(i,o,t.Rt.width,t.Rt.height);n=new Uint32Array(e.data.buffer)}const a=Date.now(),r=s(this,b,f).call(this,d,n,[i,o,t.Rt.width,t.Rt.height]);let l=0;const m=0;for(const[t,e]of r)t!=m&&(l+=e);console.log(`Finished calculating correct pixels for the tile ${e} in ${(Date.now()-a)/1e3} seconds!\nThere are ${l} correct pixels.`),void 0===t.Jt.ft.correct&&(t.Jt.ft.correct={}),t.Jt.ft.correct[e]=r}return await l.convertToBlob({type:"image/png"})}zt(t){console.log("Importing JSON..."),console.log(t),"BlueMarble"==t?.whoami&&s(this,b,g).call(this,t)}qt(t){this.Wt=t}}(S,M,O)),N=new class{constructor(t){o(this,w),this.Qt=t,this.Kt=!1,this.Zt=[],this.te=[]}ee(t){window.addEventListener("message",async e=>{const n=e.data,i=n.jsonData;if(!n||"blue-marble"!==n.source)return;if(!n.endpoint)return;const o=n.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;","",o),o){case"me":if(i.status&&"2"!=i.status?.toString()[0])return void t.lt("You are not logged in!\nCould not fetch userdata.");const e=Math.ceil(Math.pow(Math.floor(i.level)*Math.pow(30,.65),1/.65)-i.pixelsPainted);console.log(i.id),(i.id||0===i.id)&&console.log(l(i.id,"!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~")),this.Qt.Pt=i.id,t.tt("bm-p",`Droplets: ${(new Intl.NumberFormat).format(i.droplets)}`),t.tt("bm-i",`Next level in ${(new Intl.NumberFormat).format(e)} pixel${1==e?"":"s"}`);break;case"pixel":const o=n.endpoint.split("?")[0].split("/").filter(t=>t&&!isNaN(Number(t))),r=new URLSearchParams(n.endpoint.split("?")[1]),c=[r.get("x"),r.get("y")];if(this.Zt.length&&(!o.length||!c.length))return void t.lt("Coordinates are malformed!\nDid you try clicking the canvas first?");this.Zt=[...o,...c];const m=(s=o,a=c,[parseInt(s[0])%4*1e3+parseInt(a[0]),parseInt(s[1])%4*1e3+parseInt(a[1])]),d=document.querySelectorAll("span");for(const t of d)if(t.textContent.trim().includes(`${m[0]}, ${m[1]}`)){let e=document.querySelector("#bm-h");const n=`(Tl X: ${o[0]}, Tl Y: ${o[1]}, Px X: ${c[0]}, Px Y: ${c[1]})`;e?e.textContent=n:(e=document.createElement("span"),e.id="bm-h",e.textContent=n,e.style="margin-left: calc(var(--spacing)*3); font-size: small;",t.parentNode.parentNode.insertAdjacentElement("afterend",e))}break;case"tiles":let h=n.endpoint.split("/");h=[parseInt(h[h.length-2]),parseInt(h[h.length-1].replace(".png",""))];const u=n.blobID,b=n.blobData,p=Date.now(),g=await this.Qt.jt(b,h);console.log(`Finished loading the tile in ${(Date.now()-p)/1e3} seconds!`),window.postMessage({source:"blue-marble",blobID:u,blobData:g,blink:n.blink});break;case"robots":this.Kt="false"==i.userscript?.toString().toLowerCase();break}var s,a})}async ne(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 n=navigator.userAgent;let i=await s(this,w,y).call(this,n),o=s(this,w,x).call(this,n);GM_xmlhttpRequest({method:"POST",url:"https://telemetry.thebluecorner.net/heartbeat",headers:{"Content-Type":"application/json"},data:JSON.stringify({uuid:e.uuid,version:t,browser:i,os:o}),onload:t=>{200!==t.status&&r("Failed to send heartbeat:",t.statusText)},onerror:t=>{r("Error sending heartbeat:",t)}})}}(k);O.h(N);var L=JSON.parse(GM_getValue("bmTemplates","{}"));console.log(L),k.zt(L);var B=JSON.parse(GM_getValue("bmUserSettings","{}"));if(console.log(B),console.log(Object.keys(B).length),0==Object.keys(B).length){const t=crypto.randomUUID();console.log(t),GM.setValue("bmUserSettings",JSON.stringify({uuid:t}))}if(setInterval(()=>N.ne(M),18e5),console.log(`Telemetry is ${!(null==B?.telemetry)}`),null==B?.telemetry||B?.telemetry>1){const t=new a(S,M);t.h(N),t.v({id:"bm-d",style:"top: 0px; left: 0px; width: 100vw; max-width: 100vw; height: 100vh; max-height: 100vh; z-index: 9999;"}).v({id:"bm-7",style:"display: flex; flex-direction: column; align-items: center;"}).v({id:"bm-1",style:"margin-top: 10%;"}).O(1,{textContent:`${S} Telemetry`}).u().u().v({id:"bm-e",style:"max-width: 50%; overflow-y: auto; max-height: 80vh;"}).k().u().N().u().v({style:"width: fit-content; margin: auto; text-align: center;"}).K({id:"bm-8",textContent:"More Information"},(t,e)=>{e.onclick=()=>{window.open("https://github.com/SwingTheVine/Wplace-TelemetryServer#telemetry-data","_blank","noopener noreferrer")}}).u().u().N().u().v({style:"width: fit-content; margin: auto; text-align: center;"}).K({id:"bm-5",textContent:"Enable Telemetry",style:"margin-right: 2ch;"},(t,e)=>{e.onclick=()=>{const t=JSON.parse(GM_getValue("bmUserSettings","{}"));t.telemetry=1,GM.setValue("bmUserSettings",JSON.stringify(t));const e=document.getElementById("bm-d");e&&(e.style.display="none")}}).u().K({id:"bm-2",textContent:"Disable Telemetry"},(t,e)=>{e.onclick=()=>{const t=JSON.parse(GM_getValue("bmUserSettings","{}"));t.telemetry=0,GM.setValue("bmUserSettings",JSON.stringify(t));const e=document.getElementById("bm-d");e&&(e.style.display="none")}}).u().u().N().u().$({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 the Blue Marble!"}).u().$({textContent:'You can disable telemetry by pressing the "Disable" button below.'}).u().u().u().p(document.body)}O.v({id:"bm-17",class:"bm-1m",style:"top: 10px; left: unset; right: 75px;"}).ot().K({class:"bm-11",textContent:"▼","aria-label":'Minimize window "Blue Marble"',"data-button-status":"expanded"},(t,e)=>{e.onclick=()=>t.st(e),e.ontouchend=()=>{e.click()}}).u().v().u().u().v({class:"bm-Y"}).v({class:"bm-1e"}).D({class:"bm-1l",src:"data:image/png;base64,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"}).u().O(1,{textContent:S}).u().u().k().u().v({class:"bm-1e"}).$({id:"bm-p",textContent:"Droplets:"}).u().$({id:"bm-i",textContent:"Next level in..."}).u().u().k().u().v({class:"bm-1e"}).v({class:"bm-1e"}).K({class:"bm-11 bm-1a",style:"margin-top: 0;",innerHTML:''},(t,e)=>{e.onclick=()=>{const e=t.t?.Zt;e?.[0]?(t.tt("bm-v",e?.[0]||""),t.tt("bm-w",e?.[1]||""),t.tt("bm-x",e?.[2]||""),t.tt("bm-y",e?.[3]||"")):t.lt("Coordinates are malformed! Did you try clicking on the canvas first?")}}).u().et({type:"number",id:"bm-v",class:"bm-13",placeholder:"Tl X",min:0,max:2047,step:1,required:!0},(t,e)=>{e.addEventListener("paste",t=>{let e=(t.clipboardData||window.clipboardData).getData("text").split(" ").filter(t=>t).map(Number).filter(t=>!isNaN(t));if(4!==e.length)return;let n=selectAllCoordinateInputs(document);for(let t=0;t{e.onclick=()=>{e.disabled=!0,"shown"==e.dataset.buttonStatus?(t.t?.Qt?.qt(!1),e.dataset.buttonStatus="hidden",e.textContent="Enable",t.ct("Disabled templates!")):(t.t?.Qt?.qt(!0),e.dataset.buttonStatus="shown",e.textContent="Disable",t.ct("Enabled templates!")),e.disabled=!1}}).u().K({textContent:"Create"},(t,e)=>{e.onclick=()=>{const e=document.querySelector("#bm-17 button.bm-1b"),n=document.querySelector("#bm-v");if(!n.checkValidity())return n.reportValidity(),void t.lt("Coordinates are malformed! Did you try clicking on the canvas first?");const i=document.querySelector("#bm-w");if(!i.checkValidity())return i.reportValidity(),void t.lt("Coordinates are malformed! Did you try clicking on the canvas first?");const o=document.querySelector("#bm-x");if(!o.checkValidity())return o.reportValidity(),void t.lt("Coordinates are malformed! Did you try clicking on the canvas first?");const s=document.querySelector("#bm-y");if(!s.checkValidity())return s.reportValidity(),void t.lt("Coordinates are malformed! Did you try clicking on the canvas first?");e?.files[0]?(k._t(e.files[0],e.files[0]?.name.replace(/\.[^/.]+$/,""),[Number(n.value),Number(i.value),Number(o.value),Number(s.value)]),t.ct("Drew to canvas!")):t.lt("No file selected!")}}).u().K({textContent:"Filter"},(t,e)=>{e.onclick=()=>function(){if(document.querySelector("#bm-12"))return void O.lt("Color Filter window already exists!");const t='',e='',n=new Intl.NumberFormat,i=new Intl.NumberFormat(void 0,{style:"percent",ie:2,oe:2}),o=new a(S,M);o.v({id:"bm-12",class:"bm-1m"}).ot().K({class:"bm-11",textContent:"▼","aria-label":'Minimize window "Color Filter"',"data-button-status":"expanded"},(t,e)=>{e.onclick=()=>t.st(e),e.ontouchend=()=>{e.click()}}).u().v().u().K({class:"bm-11",textContent:"🞪","aria-label":'Close window "Color Filter"'},(t,e)=>{e.onclick=()=>{document.querySelector("#bm-12")?.remove()},e.ontouchend=()=>{e.click()}}).u().u().v({class:"bm-Y"}).v({class:"bm-1e bm-W"}).O(1,{textContent:"Color Filter"}).u().u().k().u().v({class:"bm-1e bm-14",style:"gap: 1.5ch; width: fit-content; margin-left: auto; margin-right: auto;"}).K({textContent:"Select All"},(t,e)=>{e.onclick=()=>p(!1)}).u().K({textContent:"Unselect All"},(t,e)=>{e.onclick=()=>p(!0)}).u().u().v({class:"bm-1e bm-1c"}).v({class:"bm-1e",style:"margin-left: 2.5ch; margin-right: 2.5ch;"}).v({class:"bm-1e"}).M({id:"bm-Q",innerHTML:"Correct Pixels: ???"}).u().N().u().M({id:"bm-X",innerHTML:"Total Pixels: ???"}).u().N().u().M({id:"bm-N",innerHTML:"Complete: ??? (???)"}).u().u().v({class:"bm-1e"}).$({innerHTML:`Colors with the icon ${t.replace("{e.onclick=t=>{t.preventDefault();const e=new FormData(document.querySelector("#bm-12 form")),n={};for([input,value]of e)n[input]=value;console.log(`Primary: ${n.sortPrimary}; Secondary: ${n.sortSecondary}; Unused: ${"on"==n.showUnused}`),b(n.sortPrimary,n.sortSecondary,"on"==n.showUnused)}}).u().u().u().u().u().u().u().p(document.body),o.rt("#bm-12.bm-1m","#bm-12 .bm-1k");const s=document.querySelector("#bm-12 .bm-1e.bm-1c"),{palette:r,$t:l}=k.Dt;let c=0,m=0;const h=new Map,u=new Map;for(const t of k.Tt){c+=t.ft?.total??0??0;const e=t.ft?.colors??new Map;for(const[t,n]of e){const e=Number(n)||0,i=u.get(t)??0;u.set(t,i+e)}const n=t.ft?.correct??{};for(const t of Object.values(n))for(const[e,n]of t){const t=Number(n)||0;m+=t;const i=h.get(e)??0;h.set(e,i+t)}}function b(t,e,n){const i=document.querySelector(".bm-18"),o=Array.from(i.children);o.sort((i,o)=>{const s=i.getAttribute("data-"+t),a=o.getAttribute("data-"+t),r=parseFloat(s),l=parseFloat(a),c=!isNaN(r),m=!isNaN(l);if(n?i.classList.remove("bm-1d"):Number(i.getAttribute("data-total"))||i.classList.add("bm-1d"),c&&m)return"ascending"===e?r-l:l-r;{const t=s.toLowerCase(),n=a.toLowerCase();return tn?"ascending"===e?1:-1:0}}),o.forEach(t=>i.appendChild(t))}function p(t){const e=document.querySelector(".bm-18"),n=Array.from(e.children);for(const e of n){if(e.classList?.contains("bm-1d"))continue;const n=e.querySelector(".bm-O button");("hidden"!=n.dataset.state||t)&&("shown"==n.dataset.state&&t||n.click())}}o.tt("#bm-Q",`Correct Pixels: ${n.format(m)}`),o.tt("#bm-X",`Total Pixels: ${n.format(c)}`),o.tt("#bm-N",`Remaining: ${n.format((c||0)-(m||0))} (${i.format(((c||0)-(m||0))/(c||1))})`),function(){const o=new a(S,M);o.v({class:"bm-18"});for(const s of r){const a=d(s.rgb),r=1.05/(a+.05)>(a+.05)/.05?"white":"black",l="white"==r?"bm-S":"bm-T",c=u.get(s.id)??0,m=n.format(c);let b=0,p="0",g=i.format(1);0!=c&&(b=h.get(s.id)??"???",p="string"==typeof b?b:n.format(b),g=isNaN(b/c)?"???":i.format(b/c));const f=parseInt(c)-parseInt(b);o.v({class:"bm-1e bm-15 bm-14","data-id":s.id,"data-name":s.name,"data-premium":+s.premium,"data-correct":Number.isNaN(parseInt(b))?"0":b,"data-total":c,"data-percent":"%"==g.slice(-1)?g.slice(0,-1):"0","data-incorrect":f||0}).v({class:"bm-O",style:`background-color: rgb(${s.rgb?.map(t=>Number(t)||0).join(",")});`}).K({class:"bm-16 "+l,"data-state":"shown","aria-label":`Hide the color ${s.name||"color"} on templates`,innerHTML:t.replace("{i.onclick=()=>{i.style.textDecoration="none",i.disabled=!0,"shown"==i.dataset.state?(i.innerHTML=e.replace("{e.onclick=()=>{window.open("https://pepoafonso.github.io/color_converter_wplace/","_blank","noopener noreferrer")}}).u().K({class:"bm-11",innerHTML:"🌐",title:"Official Blue Marble Website"},(t,e)=>{e.onclick=()=>{window.open("https://bluemarble.lol/","_blank","noopener noreferrer")}}).u().u().S({textContent:"Made by SwingTheVine",style:"margin-top: auto;"}).u().u().u().u().u().p(document.body),O.rt("#bm-17.bm-1m","#bm-17 .bm-1k"),N.ee(O),new MutationObserver((t,e)=>{const n=document.querySelector("#color-1");if(!n)return;let i=document.querySelector("#bm-t");if(!i){i=document.createElement("button"),i.id="bm-t",i.textContent="Move ↑",i.className="btn btn-soft",i.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=n.parentNode.parentNode.parentNode.parentNode.querySelector("h2");t.parentNode?.appendChild(i)}}).observe(document.body,{childList:!0,subtree:!0}),function(...t){(0,console.log)(...t)}(`%c${S}%c (${M}) userscript has loaded!`,"color: cornflowerblue;","")})(); \ No newline at end of file diff --git a/dist/BlueMarble.user.css b/dist/BlueMarble.user.css index 7bacbf8..9a39a11 100644 --- a/dist/BlueMarble.user.css +++ b/dist/BlueMarble.user.css @@ -1 +1 @@ -.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-1j{position:fixed;background-color:#153063e6;color:#fff;padding:10px;border-radius:8px;z-index:9000;transition:all .3s ease,transform 0s;top:75px;left:60px;width:auto;max-height:calc(100vh - 150px);max-width:calc(100% - 135px);font-family:Roboto Mono,Courier New,Monaco,DejaVu Sans Mono,monospace,Arial;letter-spacing:.05em}#bm-14{max-width:300px}.bm-1h{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:.5ch;background:url('data:image/svg+xml;utf8,') repeat;cursor:grab;width:100%;height:fit-content}.bm-1h.bm-1c{cursor:grabbing}.bm-1j:has(.bm-1h.bm-1c){pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.bm-1h.bm-1c{pointer-events:auto}.bm-1i{display:inline-block;height:2.5em;margin-right:1ch;vertical-align:middle}.bm-1j h1{display:inline-block;font-size:x-large;font-weight:700;vertical-align:middle}.bm-1h h1{font-size:1.2em;user-select:none;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-shadow:3px 0px rgba(21,48,99,.5),-3px 0px rgba(21,48,99,.5),0px 3px rgba(21,48,99,.5),0px -3px rgba(21,48,99,.5),3px 3px rgba(21,48,99,.5),-3px 3px rgba(21,48,99,.5),3px -3px rgba(21,48,99,.5),-3px -3px rgba(21,48,99,.5)}.bm-1h div:has(h1){display:contents}.bm-1j h2{display:inline-block;font-size:larger;font-weight:700;vertical-align:middle}.bm-1b.bm-U:has(>:where(h1,h2,h3,h4,h5,h6)){width:fit-content;margin-left:auto;margin-right:auto}.bm-1b{margin:.5em 0}.bm-1j button{background-color:#144eb9;border-radius:1em;padding:0 .75ch}.bm-1j button:hover,.bm-1j button:focus-visible{background-color:#1061e5}.bm-1j button:active,.bm-1j button:disabled{background-color:#2e97ff}.bm-1j button:disabled{text-decoration:line-through}.bm--{border:white 1px solid;height:1.5em;width:1.5em;margin-top:2px;text-align:center;line-height:1em;padding:0!important}.bm-17{vertical-align:middle}.bm-17 svg{width:50%;margin:0 auto;fill:#111}.bm-1j button.bm-13{background-color:unset}.bm-13.bm-Q:hover,.bm-13.bm-Q:focus{background-color:#ffffff2b}.bm-13.bm-Q:active{background-color:#ffffff38}.bm-13.bm-R:hover,.bm-13.bm-R:focus{background-color:#0000002b}.bm-13.bm-R:active{background-color:#00000038}input[type=number].bm-10{appearance:auto;-moz-appearance:textfield;width:5.5ch;margin-left:1ch;background-color:#0003;padding:0 .5ch;font-size:small}input[type=number].bm-10::-webkit-outer-spin-button,input[type=number].bm-10::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}div:has(>.bm-18)>button{width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bm-18,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-1j select{color:#fff;background-color:#144eb9;border-radius:1em;padding:0 .5ch}.bm-1j label:has(input[type=checkbox]){display:flex;width:fit-content;gap:1ch}.bm-1j input[type=checkbox]{width:1em}.bm-V{overflow:hidden;transition:height .3s cubic-bezier(.4,0,.2,1)}.bm-1j textarea{font-size:small;background-color:#0003;padding:0 .5ch;height:5.25em;width:100%}.bm-1j small{font-size:x-small;color:#d3d3d3}.bm-11{display:flex;align-content:center;justify-content:space-between;align-items:center;gap:.5ch}.bm-flex-center{display:flex;align-content:center;justify-content:center;align-items:center;gap:.5ch}#bm-_ p svg{display:inline;height:1em;fill:#fff}#bm-_ .bm-1b.bm-19{max-height:calc(80vh - 150px);overflow:auto}.bm-15{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:center;gap:1em 3ch}.bm-12{width:fit-content;max-width:35ch;background-color:#153063e6;border-radius:1em;padding:.5em;gap:1ch;transition:background-color .3s ease}.bm-12:hover,.bm-12:focus-within{background-color:#112855e6}.bm-N{display:block;border:thick double darkslategray;width:fit-content;height:fit-content;padding:1ch}.bm-N button{padding:.75em .5ch}.bm-N svg{width:4ch}.bm-12>.bm-11{flex-direction:column;align-items:flex-start;gap:0}.bm-12 small{font-size:.75em}#bm-_ .bm-12.bm-1a{display:none} +.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-1m{position:fixed;background-color:#153063e6;color:#fff;padding:10px;border-radius:8px;z-index:9000;transition:all .3s ease,transform 0s;top:75px;left:60px;width:auto;max-height:calc(100vh - 150px);max-width:calc(100% - 135px);font-family:Roboto Mono,Courier New,Monaco,DejaVu Sans Mono,monospace,Arial;letter-spacing:.05em}#bm-17{max-width:300px}.bm-1k{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:.5ch;background:url('data:image/svg+xml;utf8,') repeat;cursor:grab;width:100%;height:fit-content}.bm-1k.bm-1f{cursor:grabbing}.bm-1m:has(.bm-1k.bm-1f){pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.bm-1k.bm-1f{pointer-events:auto}.bm-1l{display:inline-block;height:2.5em;margin-right:1ch;vertical-align:middle}.bm-1m h1{display:inline-block;font-size:x-large;font-weight:700;vertical-align:middle}.bm-1k h1{font-size:1.2em;user-select:none;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-shadow:3px 0px rgba(21,48,99,.5),-3px 0px rgba(21,48,99,.5),0px 3px rgba(21,48,99,.5),0px -3px rgba(21,48,99,.5),3px 3px rgba(21,48,99,.5),-3px 3px rgba(21,48,99,.5),3px -3px rgba(21,48,99,.5),-3px -3px rgba(21,48,99,.5)}.bm-1k div:has(h1){display:contents}.bm-1m h2{display:inline-block;font-size:larger;font-weight:700;vertical-align:middle}.bm-1e.bm-W:has(>:where(h1,h2,h3,h4,h5,h6)){width:fit-content;margin-left:auto;margin-right:auto}.bm-1e{margin:.5em 0}.bm-1m button{background-color:#144eb9;border-radius:1em;padding:0 .75ch}.bm-1m button:hover,.bm-1m button:focus-visible{background-color:#1061e5}.bm-1m button:active,.bm-1m button:disabled{background-color:#2e97ff}.bm-1m button:disabled{text-decoration:line-through}.bm-11{border:white 1px solid;height:1.5em;width:1.5em;margin-top:2px;text-align:center;line-height:1em;padding:0!important}.bm-1a{vertical-align:middle}.bm-1a svg{width:50%;margin:0 auto;fill:#111}.bm-1m button.bm-16{background-color:unset}.bm-16.bm-S:hover,.bm-16.bm-S:focus{background-color:#ffffff2b}.bm-16.bm-S:active{background-color:#ffffff38}.bm-16.bm-T:hover,.bm-16.bm-T:focus{background-color:#0000002b}.bm-16.bm-T:active{background-color:#00000038}input[type=number].bm-13{appearance:auto;-moz-appearance:textfield;width:5.5ch;margin-left:1ch;background-color:#0003;padding:0 .5ch;font-size:small}input[type=number].bm-13::-webkit-outer-spin-button,input[type=number].bm-13::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}div:has(>.bm-1b)>button{width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bm-1b,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-1m select{color:#fff;background-color:#144eb9;border-radius:1em;padding:0 .5ch}.bm-1m label:has(input[type=checkbox]){display:flex;width:fit-content;gap:1ch}.bm-1m input[type=checkbox]{width:1em}.bm-Y{overflow:hidden;transition:height .3s cubic-bezier(.4,0,.2,1)}.bm-1m textarea{font-size:small;background-color:#0003;padding:0 .5ch;height:5.25em;width:100%}.bm-1m small{font-size:x-small;color:#d3d3d3}.bm-14{display:flex;align-content:center;justify-content:space-between;align-items:center;gap:.5ch}.bm-flex-center{display:flex;align-content:center;justify-content:center;align-items:center;gap:.5ch}#bm-12 p svg{display:inline;height:1em;fill:#fff}#bm-12 .bm-1e.bm-1c{max-height:calc(80vh - 150px);overflow:auto}.bm-18{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:center;gap:1em 3ch}.bm-15{width:fit-content;max-width:35ch;background-color:#153063e6;border-radius:1em;padding:.5em;gap:1ch;transition:background-color .3s ease}.bm-15:hover,.bm-15:focus-within{background-color:#112855e6}.bm-O{display:block;border:thick double darkslategray;width:fit-content;height:fit-content;padding:1ch}.bm-15[data-id="-2"] .bm-O{background:conic-gradient(#a00,#aa0 16.6%,#0a0,#0aa 50%,#00a 66.6%,#a0a,#a00)}.bm-15[data-id="-1"] .bm-O{background:url('data:image/svg+xml;utf8,') repeat;background-color:transparent!important}.bm-15[data-id="-1"] .bm-O svg{fill:#fff!important}.bm-15[data-id="0"] .bm-O{background-color:transparent!important}.bm-O button{padding:.75em .5ch}.bm-O svg{width:4ch}.bm-15>.bm-14{flex-direction:column;align-items:flex-start;gap:0}.bm-15 small{font-size:.75em}#bm-12 .bm-15.bm-1d{display:none} diff --git a/dist/BlueMarble.user.js b/dist/BlueMarble.user.js index b16d719..3da088f 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.88.261 +// @version 0.88.293 // @description A userscript to automate and/or enhance the user experience on Wplace.live. Make sure to comply with the site's Terms of Service, and rules! This script is not affiliated with Wplace.live in any way, use at your own risk. This script is not affiliated with TamperMonkey. The author of this userscript is not responsible for any damages, issues, loss of data, or punishment that may occur as a result of using this script. This script is provided "as is" under the MPL-2.0 license. The "Blue Marble" icon is licensed under CC0 1.0 Universal (CC0 1.0) Public Domain Dedication. The image is owned by NASA. // @description:en A userscript to automate and/or enhance the user experience on Wplace.live. Make sure to comply with the site's Terms of Service, and rules! This script is not affiliated with Wplace.live in any way, use at your own risk. This script is not affiliated with TamperMonkey. The author of this userscript is not responsible for any damages, issues, loss of data, or punishment that may occur as a result of using this script. This script is provided "as is" under the MPL-2.0 license. The "Blue Marble" icon is licensed under CC0 1.0 Universal (CC0 1.0) Public Domain Dedication. The image is owned by NASA. // @author SwingTheVine @@ -28,4 +28,4 @@ // License --> https://www.mozilla.org/en-US/MPL/2.0/ // Donate --> https://ko-fi.com/swingthevine -(()=>{var t,e,n,i=t=>{throw TypeError(t)},o=(t,e,n)=>e.has(t)?i("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n),s=(t,e,n)=>(((t,e)=>{e.has(t)||i("Cannot access private method")})(t,e),n),a=class{constructor(e,n){o(this,t),this.name=e,this.version=n,this.t=null,this.i="bm-o",this.o=null,this.l=null,this.m=[]}h(t){this.t=t}u(){return this.m.length>0&&(this.l=this.m.pop()),this}p(t){t?.appendChild(this.o),this.o=null,this.l=null,this.m=[]}v(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"div",{},n)),this}$(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"p",{},n)),this}S(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"small",{},n)),this}M(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"span",{},n)),this}C(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"details",{},n)),this}T(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"summary",{},n)),this}D(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"img",{},n)),this}O(n,i={},o=()=>{}){return o(this,s(this,t,e).call(this,"h"+n,{},i)),this}k(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"hr",{},n)),this}N(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"br",{},n)),this}B(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"form",{},n)),this}I(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"fieldset",{},n)),this}L(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"legend",{},n)),this}P(n={},i=()=>{}){const o=s(this,t,e).call(this,"label",{textContent:n.textContent??""});delete n.textContent;const a=s(this,t,e).call(this,"input",{type:"checkbox"},n);return o.insertBefore(a,o.firstChild),this.u(),i(this,o,a),this}G(n={},i=()=>{}){const o=s(this,t,e).call(this,"label",{textContent:n.textContent??"",for:n.id??""});return delete n.textContent,this.u(),i(this,o,s(this,t,e).call(this,"select",{},n)),this}U(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"option",{},n)),this}F(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"ol",{},n)),this}A(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"ul",{},n)),this}W(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"menu",{},n)),this}_(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"li",{},n)),this}H(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"table",{},n)),this}X(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"caption",{},n)),this}J(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"thead",{},n)),this}j(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"tbody",{},n)),this}R(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"tfoot",{},n)),this}V(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"tr",{},n)),this}Y(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"th",{},n)),this}q(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"td",{},n)),this}K(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"button",{},n)),this}Z(n={},i=()=>{}){const o=n.title??n.textContent??"Help: No info";delete n.textContent,n.title=`Help: ${o}`;const a={textContent:"?",className:"bm-D",onclick:()=>{this.tt(this.i,o)}};return i(this,s(this,t,e).call(this,"button",a,n)),this}et(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"input",{},n)),this}nt(n={},i=()=>{}){const o=n.textContent??"";delete n.textContent;const a=s(this,t,e).call(this,"div"),r=s(this,t,e).call(this,"input",{type:"file",tabindex:"-1","aria-hidden":"true",style:"display: none !important; visibility: hidden !important; position: absolute !important; left: -9999px !important; width: 0 !important; height: 0 !important; opacity: 0 !important;"},n);this.u();const l=s(this,t,e).call(this,"button",{textContent:o});return this.u(),this.u(),l.addEventListener("click",()=>{r.click()}),r.addEventListener("change",()=>{l.style.maxWidth=`${l.offsetWidth}px`,r.files.length>0?l.textContent=r.files[0].name:l.textContent=o}),i(this,a,r,l),this}it(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"textarea",{},n)),this}ot(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"div",{class:"bm-1h"},n)),this}tt(t,e,n=!1){const i=document.getElementById(t.replace(/^#/,""));i&&(i instanceof HTMLInputElement?i.value=e:n?i.textContent=e:i.innerHTML=e)}st(t){if(t.disabled)return;t.disabled=!0,t.style.textDecoration="none";const e=t.closest(".bm-1j"),n=t.closest(".bm-1h"),i=e.querySelector("h1"),o=e.querySelector(".bm-V");if("expanded"==t.dataset.buttonStatus){o.style.height=o.scrollHeight+"px",e.style.width=e.scrollWidth+"px",o.style.height="0",o.addEventListener("transitionend",function e(){o.style.display="none",t.disabled=!1,t.style.textDecoration="",o.removeEventListener("transitionend",e)});const n=i.cloneNode(!0),s=n.textContent;t.nextElementSibling.appendChild(n),t.textContent="▶",t.dataset.buttonStatus="collapsed",t.ariaLabel=`Unminimize window "${s}"`}else{const i=n.querySelector("h1"),s=i.textContent;i.remove(),o.style.display="",o.style.height="0",e.style.width="",o.style.height=o.scrollHeight+"px",o.addEventListener("transitionend",function e(){o.style.height="",t.disabled=!1,t.style.textDecoration="",o.removeEventListener("transitionend",e)}),t.textContent="▼",t.dataset.buttonStatus="expanded",t.ariaLabel=`Minimize window "${s}"`}}rt(t,e){if(t=document.querySelector(t),e=document.querySelector(e),!t||!e)return void this.lt(`Can not drag! ${t?"":"moveMe"} ${t||e?"":"and "}${e?"":"iMoveThings "}was not found!`);let n,i=!1,o=0,s=null,a=0,r=0,l=0,c=0,m=null;const d=()=>{if(i){const e=Math.abs(a-l),n=Math.abs(r-c);(e>.5||n>.5)&&(a=l,r=c,t.style.transform=`translate(${a}px, ${r}px)`,t.style.left="0px",t.style.top="0px",t.style.right=""),s=requestAnimationFrame(d)}},h=(h,g)=>{i=!0,m=t.getBoundingClientRect(),n=h-m.left,o=g-m.top;const f=window.getComputedStyle(t).transform;if(f&&"none"!==f){const t=new DOMMatrix(f);a=t.m41,r=t.m42}else a=m.left,r=m.top;l=a,c=r,document.body.style.userSelect="none",e.classList.add("bm-1c"),document.addEventListener("mousemove",b),document.addEventListener("touchmove",p,{passive:!1}),document.addEventListener("mouseup",u),document.addEventListener("touchend",u),document.addEventListener("touchcancel",u),s&&cancelAnimationFrame(s),d()},u=()=>{i=!1,s&&(cancelAnimationFrame(s),s=null),document.body.style.userSelect="",e.classList.remove("bm-1c"),document.removeEventListener("mousemove",b),document.removeEventListener("touchmove",p),document.removeEventListener("mouseup",u),document.removeEventListener("touchend",u),document.removeEventListener("touchcancel",u)},b=t=>{i&&m&&(l=t.clientX-n,c=t.clientY-o)},p=t=>{if(i&&m){const e=t.touches[0];if(!e)return;l=e.clientX-n,c=e.clientY-o,t.preventDefault()}};e.addEventListener("mousedown",function(t){t.preventDefault(),h(t.clientX,t.clientY)}),e.addEventListener("touchstart",function(t){const e=t?.touches?.[0];e&&(h(e.clientX,e.clientY),t.preventDefault())},{passive:!1})}ct(t){(0,console.info)(`${this.name}: ${t}`),this.tt(this.i,"Status: "+t,!0)}lt(t){(0,console.error)(`${this.name}: ${t}`),this.tt(this.i,"Error: "+t,!0)}};function r(...t){(0,console.error)(...t)}function l(t,e){if(0===t)return e[0];let n="";const i=e.length;for(;t>0;)n=e[t%i]+n,t=Math.floor(t/i);return n}function c(t){let e="";for(let n=0;n(t/=255)<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4));return.2126*e[0]+.7152*e[1]+.0722*e[2]}t=new WeakSet,e=function(e,i={},o={}){const a=document.createElement(e);this.o?(this.l?.appendChild(a),this.m.push(this.l),this.l=a):(this.o=a,this.l=a);for(const[e,o]of Object.entries(i))s(this,t,n).call(this,a,e,o);for(const[e,i]of Object.entries(o))s(this,t,n).call(this,a,e,i);return a},n=function(t,e,n){if("class"==e)t.classList.add(...n.split(/\s+/));else if("for"==e)t.htmlFor=n;else if("tabindex"==e)t.tabIndex=Number(n);else if("readonly"==e)t.readOnly="true"==n||"1"==n;else if("maxlength"==e)t.maxLength=Number(n);else if(e.startsWith("data"))t.dataset[e.slice(5).split("-").map((t,e)=>0==e?t:t[0].toUpperCase()+t.slice(1)).join("")]=n;else if(e.startsWith("aria")){const i=e.slice(5).split("-").map((t,e)=>0==e?t:t[0].toUpperCase()+t.slice(1)).join("");t["aria"+i[0].toUpperCase()+i.slice(1)]=n}else t[e]=n};var h,u,b,p,g,f,w,y,x,v=[{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]}],$=class{constructor({displayName:t="My template",dt:e=0,ht:n="",url:i="",file:s=null,coords:a=null,ut:r=null,bt:l={},gt:c=1e3}={}){o(this,h),this.displayName=t,this.dt=e,this.ht=n,this.url=i,this.file=s,this.coords=a,this.ut=r,this.bt=l,this.gt=c,this.ft={total:0,colors:new Map}}async wt(t,e){console.log("Template coordinates:",this.coords);const n=await createImageBitmap(this.file),i=n.width,o=n.height;this.gt=t;const a={},r={},l=new OffscreenCanvas(this.gt,this.gt),m=l.getContext("2d",{yt:!0});l.width=i,l.height=o,m.imageSmoothingEnabled=!1,m.drawImage(n,0,0);let d=Date.now();const b=s(this,h,u).call(this,m.getImageData(0,0,i,o),e);console.log(`Calculating total pixels took ${(Date.now()-d)/1e3} seconds`);let p=0;for(const[t,e]of b)0!=t&&(p+=e);this.ft={total:p,colors:b},d=Date.now();const g=new OffscreenCanvas(3,3),f=g.getContext("2d");f.clearRect(0,0,3,3),f.fillStyle="white",f.fillRect(1,1,1,1);for(let t=this.coords[3];t>>24==0?0:o.get(e)??-2;const a=s.get(i);s.set(i,a?a+1:1)}return console.log(s),s},b=new WeakSet,p=async function(){GM.setValue("bmTemplates",JSON.stringify(this.St))},g=async function(t){console.log("Parsing BlueMarble...");const e=t.templates;if(console.log(`BlueMarble length: ${Object.keys(e).length}`),Object.keys(e).length>0)for(const t in e){const n=t,i=e[t];if(console.log(`Template Key: ${n}`),e.hasOwnProperty(t)){const t=n.split(" "),e=Number(t?.[0]),o=t?.[1]||"0",s=i.name||`Template ${e||""}`,a={total:i.pixels.total,colors:new Map(Object.entries(i.pixels.colors).map(([t,e])=>[Number(t),e]))},r=i.tiles,l={},c={},d=this.gt*this.Mt;for(const t in r)if(console.log(t),r.hasOwnProperty(t)){const e=m(r[t]),n=new Blob([e],{type:"image/png"}),i=await createImageBitmap(n);l[t]=i;const o=new OffscreenCanvas(d,d).getContext("2d");o.drawImage(i,0,0);const s=o.getImageData(0,0,i.width,i.height);c[t]=new Uint32Array(s.data.buffer)}const h=new $({displayName:s,dt:e||this.Ct?.length||0,ht:o||""});h.ft=a,h.ut=l,h.bt=c,this.Ct.push(h),console.log(this.Ct),console.log("^^^ This ^^^")}}},f=function(t,e,n){const i=this.Mt,o=this.gt*i,s=n[0],a=n[1],r=n[2],l=n[3],c=this.Tt,{palette:m,$t:d}=this.Dt,h=new Map;for(let n=1;n>>24&255)<=c||(i>>>24&255)<=c)continue;const u=d.get(i)??-2,b=d.get(m)??-2;if(u!=b)continue;const p=h.get(b);h.set(b,p?p+1:1)}return console.log("List of template pixels that match the tile:"),console.log(h),h},w=new WeakSet,y=async function(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"},x=function(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"};var S=GM_info.script.name.toString(),M=GM_info.script.version.toString();!function(t){const e=document.createElement("script");e.setAttribute("bm-E",S),e.setAttribute("bm-B","color: cornflowerblue;"),e.textContent=`(${t})();`,document.documentElement?.appendChild(e),e.remove()}(()=>{const t=document.currentScript,e=t?.getAttribute("bm-E")||"Blue Marble",n=t?.getAttribute("bm-B")||"",i=new Map;window.addEventListener("message",t=>{const{source:o,endpoint:s,blobID:a,blobData:r,blink:l}=t.data,c=Date.now()-l;if(console.groupCollapsed(`%c${e}%c: ${i.size} Recieved IMAGE message about blob "${a}"`,n,""),console.log(`Blob fetch took %c${String(Math.floor(c/6e4)).padStart(2,"0")}:${String(Math.floor(c/1e3)%60).padStart(2,"0")}.${String(c%1e3).padStart(3,"0")}%c MM:SS.mmm`,n,""),console.log(i),console.groupEnd(),"blue-marble"==o&&a&&r&&!s){const t=i.get(a);"function"==typeof t?t(r):function(...t){(0,console.warn)(...t)}(`%c${e}%c: Attempted to retrieve a blob (%s) from queue, but the blobID was not a function! Skipping...`,n,"",a),i.delete(a)}});const o=window.fetch;window.fetch=async function(...t){const s=await o.apply(this,t),a=s.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}"`,n,""),a.json().then(t=>{window.postMessage({source:"blue-marble",endpoint:r,jsonData:t},"*")}).catch(t=>{console.error(`%c${e}%c: Failed to parse JSON: `,n,"",t)});else if(l.includes("image/")&&!r.includes("openfreemap")&&!r.includes("maps")){const t=Date.now(),o=await a.blob();return console.log(`%c${e}%c: ${i.size} Sending IMAGE message about endpoint "${r}"`,n,""),new Promise(s=>{const l=crypto.randomUUID();i.set(l,t=>{s(new Response(t,{headers:a.headers,status:a.status,statusText:a.statusText})),console.log(`%c${e}%c: ${i.size} Processed blob "${l}"`,n,"")}),window.postMessage({source:"blue-marble",endpoint:r,blobID:l,blobData:o,blink:t})}).catch(o=>{const s=Date.now();console.error(`%c${e}%c: Failed to Promise blob!`,n,""),console.groupCollapsed(`%c${e}%c: Details of failed blob Promise:`,n,""),console.log(`Endpoint: ${r}\nThere are ${i.size} blobs processing...\nBlink: ${t.toLocaleString()}\nTime Since Blink: ${String(Math.floor(s/6e4)).padStart(2,"0")}:${String(Math.floor(s/1e3)%60).padStart(2,"0")}.${String(s%1e3).padStart(3,"0")} MM:SS.mmm`),console.error("Exception stack:",o),console.groupEnd()})}return s}});var C=GM_getResourceText("CSS-BM-File");GM_addStyle(C);var T,D="robotoMonoInjectionPoint";D.indexOf("@font-face")+1?(console.log("Loading Roboto Mono as a file..."),GM_addStyle(D)):((T=document.createElement("link")).href="https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&display=swap",T.rel="preload",T.as="style",T.onload=function(){this.onload=null,this.rel="stylesheet"},document.head?.appendChild(T)),new class{constructor(){this.Ot=null,this.kt=null,this.Nt="#bm-h"}Bt(t){return this.kt=t,this.Ot=new MutationObserver(t=>{for(const e of t)for(const t of e.addedNodes)t instanceof HTMLElement&&t.matches?.(this.Nt)}),this}It(){return this.Ot}observe(t,e=!1,n=!1){t.observe(this.kt,{childList:e,subtree:n})}};var O=new a(S,M),k=(new a(S,M),new class{constructor(t,e,n){o(this,b),this.name=t,this.version=e,this.o=n,this.Lt="1.0.0",this.Pt=null,this.Gt="!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~",this.gt=1e3,this.Mt=3,this.Tt=3,this.Dt=function(t){const e=v;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 n=new Map;for(const i of e){if(0==i.id||-2==i.id)continue;const e=i.rgb[0],o=i.rgb[1],s=i.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=o+r,m=s+l;if(t<0||t>255||c<0||c>255||m<0||m>255)continue;const d=(255<<24|m<<16|c<<8|t)>>>0;n.has(d)||n.set(d,i.id)}}return{palette:e,$t:n}}(this.Tt),this.Ut=null,this.Ft="",this.Ct=[],this.St=null,this.At=!0,this.Wt=null}async _t(){return{whoami:this.name.replace(" ",""),scriptVersion:this.version,schemaVersion:this.Lt,templates:{}}}async Ht(t,e,n){this.St||(this.St=await this._t(),console.log("Creating JSON...")),this.o.ct(`Creating template at ${n.join(", ")}...`);const i=new $({displayName:e,dt:0,ht:l(this.Pt||0,this.Gt),file:t,coords:n}),{xt:o,vt:a}=await i.wt(this.gt,this.Dt);i.ut=o;const r={total:i.ft.total,colors:Object.fromEntries(i.ft.colors)};this.St.templates[`${i.dt} ${i.ht}`]={name:i.displayName,coords:n.join(", "),enabled:!0,pixels:r,tiles:a},this.Ct=[],this.Ct.push(i),this.o.ct(`Template created at ${n.join(", ")}!`),console.log(Object.keys(this.St.templates).length),console.log(this.St),console.log(this.Ct),console.log(JSON.stringify(this.St)),await s(this,b,p).call(this)}Xt(){}async Et(){this.St||(this.St=await this._t(),console.log("Creating JSON..."))}async Jt(t,e){if(!this.At)return t;const n=this.gt*this.Mt;e=e[0].toString().padStart(4,"0")+","+e[1].toString().padStart(4,"0"),console.log(`Searching for templates in tile: "${e}"`);const i=this.Ct;console.log(i),i.sort((t,e)=>t.dt-e.dt),console.log(i);const o=i.map(t=>{const n=Object.keys(t.ut).filter(t=>t.startsWith(e));if(0===n.length)return null;const i=n.map(e=>{const n=e.split(",");return{jt:t,Rt:t.ut[e],bt:t.bt?.[e],Vt:[n[0],n[1]],Yt:[n[2],n[3]]}});return i?.[0]}).filter(Boolean);console.log(o);const a=o?.length||0;if(console.log(`templateCount = ${a}`),!(a>0))return this.o.ct(`Sleeping\nVersion: ${this.version}`),t;{const t=i.filter(t=>Object.keys(t.ut).filter(t=>t.startsWith(e)).length>0).reduce((t,e)=>t+(e.ft.total||0),0),n=(new Intl.NumberFormat).format(t);this.o.ct(`Displaying ${a} template${1==a?"":"s"}.\nTotal pixels: ${n}`)}const r=await createImageBitmap(t),l=new OffscreenCanvas(n,n),c=l.getContext("2d");c.imageSmoothingEnabled=!1,c.beginPath(),c.rect(0,0,n,n),c.clip(),c.clearRect(0,0,n,n),c.drawImage(r,0,0,n,n);const m=c.getImageData(0,0,n,n),d=new Uint32Array(m.data.buffer);for(const t of o){console.log("Template:"),console.log(t);let n=t.bt;const i=Number(t.Yt[0])*this.Mt,o=Number(t.Yt[1])*this.Mt;if(c.drawImage(t.Rt,i,o),!n){const e=c.getImageData(i,o,t.Rt.width,t.Rt.height);n=new Uint32Array(e.data.buffer)}const a=Date.now(),r=s(this,b,f).call(this,d,n,[i,o,t.Rt.width,t.Rt.height]);let l=0;const m=0;for(const[t,e]of r)t!=m&&(l+=e);console.log(`Finished calculating correct pixels for the tile ${e} in ${(Date.now()-a)/1e3} seconds!\nThere are ${l} correct pixels.`),t.jt.ft.correct=r}return await l.convertToBlob({type:"image/png"})}zt(t){console.log("Importing JSON..."),console.log(t),"BlueMarble"==t?.whoami&&s(this,b,g).call(this,t)}qt(t){this.At=t}}(S,M,O)),N=new class{constructor(t){o(this,w),this.Qt=t,this.Kt=!1,this.Zt=[],this.te=[]}ee(t){window.addEventListener("message",async e=>{const n=e.data,i=n.jsonData;if(!n||"blue-marble"!==n.source)return;if(!n.endpoint)return;const o=n.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;","",o),o){case"me":if(i.status&&"2"!=i.status?.toString()[0])return void t.lt("You are not logged in!\nCould not fetch userdata.");const e=Math.ceil(Math.pow(Math.floor(i.level)*Math.pow(30,.65),1/.65)-i.pixelsPainted);console.log(i.id),(i.id||0===i.id)&&console.log(l(i.id,"!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~")),this.Qt.Pt=i.id,t.tt("bm-p",`Droplets: ${(new Intl.NumberFormat).format(i.droplets)}`),t.tt("bm-i",`Next level in ${(new Intl.NumberFormat).format(e)} pixel${1==e?"":"s"}`);break;case"pixel":const o=n.endpoint.split("?")[0].split("/").filter(t=>t&&!isNaN(Number(t))),r=new URLSearchParams(n.endpoint.split("?")[1]),c=[r.get("x"),r.get("y")];if(this.Zt.length&&(!o.length||!c.length))return void t.lt("Coordinates are malformed!\nDid you try clicking the canvas first?");this.Zt=[...o,...c];const m=(s=o,a=c,[parseInt(s[0])%4*1e3+parseInt(a[0]),parseInt(s[1])%4*1e3+parseInt(a[1])]),d=document.querySelectorAll("span");for(const t of d)if(t.textContent.trim().includes(`${m[0]}, ${m[1]}`)){let e=document.querySelector("#bm-h");const n=`(Tl X: ${o[0]}, Tl Y: ${o[1]}, Px X: ${c[0]}, Px Y: ${c[1]})`;e?e.textContent=n:(e=document.createElement("span"),e.id="bm-h",e.textContent=n,e.style="margin-left: calc(var(--spacing)*3); font-size: small;",t.parentNode.parentNode.insertAdjacentElement("afterend",e))}break;case"tiles":let h=n.endpoint.split("/");h=[parseInt(h[h.length-2]),parseInt(h[h.length-1].replace(".png",""))];const u=n.blobID,b=n.blobData,p=Date.now(),g=await this.Qt.Jt(b,h);console.log(`Finished loading the tile in ${(Date.now()-p)/1e3} seconds!`),window.postMessage({source:"blue-marble",blobID:u,blobData:g,blink:n.blink});break;case"robots":this.Kt="false"==i.userscript?.toString().toLowerCase();break}var s,a})}async ne(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 n=navigator.userAgent;let i=await s(this,w,y).call(this,n),o=s(this,w,x).call(this,n);GM_xmlhttpRequest({method:"POST",url:"https://telemetry.thebluecorner.net/heartbeat",headers:{"Content-Type":"application/json"},data:JSON.stringify({uuid:e.uuid,version:t,browser:i,os:o}),onload:t=>{200!==t.status&&r("Failed to send heartbeat:",t.statusText)},onerror:t=>{r("Error sending heartbeat:",t)}})}}(k);O.h(N);var B=JSON.parse(GM_getValue("bmTemplates","{}"));console.log(B),k.zt(B);var I=JSON.parse(GM_getValue("bmUserSettings","{}"));if(console.log(I),console.log(Object.keys(I).length),0==Object.keys(I).length){const t=crypto.randomUUID();console.log(t),GM.setValue("bmUserSettings",JSON.stringify({uuid:t}))}if(setInterval(()=>N.ne(M),18e5),console.log(`Telemetry is ${!(null==I?.telemetry)}`),null==I?.telemetry||I?.telemetry>1){const t=new a(S,M);t.h(N),t.v({id:"bm-d",style:"top: 0px; left: 0px; width: 100vw; max-width: 100vw; height: 100vh; max-height: 100vh; z-index: 9999;"}).v({id:"bm-7",style:"display: flex; flex-direction: column; align-items: center;"}).v({id:"bm-1",style:"margin-top: 10%;"}).O(1,{textContent:`${S} Telemetry`}).u().u().v({id:"bm-e",style:"max-width: 50%; overflow-y: auto; max-height: 80vh;"}).k().u().N().u().v({style:"width: fit-content; margin: auto; text-align: center;"}).K({id:"bm-8",textContent:"More Information"},(t,e)=>{e.onclick=()=>{window.open("https://github.com/SwingTheVine/Wplace-TelemetryServer#telemetry-data","_blank","noopener noreferrer")}}).u().u().N().u().v({style:"width: fit-content; margin: auto; text-align: center;"}).K({id:"bm-5",textContent:"Enable Telemetry",style:"margin-right: 2ch;"},(t,e)=>{e.onclick=()=>{const t=JSON.parse(GM_getValue("bmUserSettings","{}"));t.telemetry=1,GM.setValue("bmUserSettings",JSON.stringify(t));const e=document.getElementById("bm-d");e&&(e.style.display="none")}}).u().K({id:"bm-2",textContent:"Disable Telemetry"},(t,e)=>{e.onclick=()=>{const t=JSON.parse(GM_getValue("bmUserSettings","{}"));t.telemetry=0,GM.setValue("bmUserSettings",JSON.stringify(t));const e=document.getElementById("bm-d");e&&(e.style.display="none")}}).u().u().N().u().$({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 the Blue Marble!"}).u().$({textContent:'You can disable telemetry by pressing the "Disable" button below.'}).u().u().u().p(document.body)}O.v({id:"bm-14",class:"bm-1j",style:"top: 10px; left: unset; right: 75px;"}).ot().K({class:"bm--",textContent:"▼","aria-label":'Minimize window "Blue Marble"',"data-button-status":"expanded"},(t,e)=>{e.onclick=()=>t.st(e),e.ontouchend=()=>t.st(e)}).u().v().u().u().v({class:"bm-V"}).v({class:"bm-1b"}).D({class:"bm-1i",src:"https://raw.githubusercontent.com/SwingTheVine/Wplace-BlueMarble/main/dist/assets/Favicon.png"}).u().O(1,{textContent:S}).u().u().k().u().v({class:"bm-1b"}).$({id:"bm-p",textContent:"Droplets:"}).u().$({id:"bm-i",textContent:"Next level in..."}).u().u().k().u().v({class:"bm-1b"}).v({class:"bm-1b"}).K({class:"bm-- bm-17",style:"margin-top: 0;",innerHTML:''},(t,e)=>{e.onclick=()=>{const e=t.t?.Zt;e?.[0]?(t.tt("bm-v",e?.[0]||""),t.tt("bm-w",e?.[1]||""),t.tt("bm-x",e?.[2]||""),t.tt("bm-y",e?.[3]||"")):t.lt("Coordinates are malformed! Did you try clicking on the canvas first?")}}).u().et({type:"number",id:"bm-v",class:"bm-10",placeholder:"Tl X",min:0,max:2047,step:1,required:!0},(t,e)=>{e.addEventListener("paste",t=>{let e=(t.clipboardData||window.clipboardData).getData("text").split(" ").filter(t=>t).map(Number).filter(t=>!isNaN(t));if(4!==e.length)return;let n=selectAllCoordinateInputs(document);for(let t=0;t{e.onclick=()=>{e.disabled=!0,"shown"==e.dataset.buttonStatus?(t.t?.Qt?.qt(!1),e.dataset.buttonStatus="hidden",e.textContent="Enable",t.ct("Disabled templates!")):(t.t?.Qt?.qt(!0),e.dataset.buttonStatus="shown",e.textContent="Disable",t.ct("Enabled templates!")),e.disabled=!1}}).u().K({textContent:"Create"},(t,e)=>{e.onclick=()=>{const e=document.querySelector("#bm-14 button.bm-18"),n=document.querySelector("#bm-v");if(!n.checkValidity())return n.reportValidity(),void t.lt("Coordinates are malformed! Did you try clicking on the canvas first?");const i=document.querySelector("#bm-w");if(!i.checkValidity())return i.reportValidity(),void t.lt("Coordinates are malformed! Did you try clicking on the canvas first?");const o=document.querySelector("#bm-x");if(!o.checkValidity())return o.reportValidity(),void t.lt("Coordinates are malformed! Did you try clicking on the canvas first?");const s=document.querySelector("#bm-y");if(!s.checkValidity())return s.reportValidity(),void t.lt("Coordinates are malformed! Did you try clicking on the canvas first?");e?.files[0]?(k.Ht(e.files[0],e.files[0]?.name.replace(/\.[^/.]+$/,""),[Number(n.value),Number(i.value),Number(o.value),Number(s.value)]),t.ct("Drew to canvas!")):t.lt("No file selected!")}}).u().K({textContent:"Filter"},(t,e)=>{e.onclick=()=>function(){if(document.querySelector("#bm-_"))return void O.lt("Color Filter window already exists!");const t='',e='',n=new a(S,M);n.v({id:"bm-_",class:"bm-1j"}).ot().K({class:"bm--",textContent:"▼","aria-label":'Minimize window "Color Filter"',"data-button-status":"expanded"},(t,e)=>{e.onclick=()=>t.st(e),e.ontouchend=()=>{e.click()}}).u().v().u().K({class:"bm--",textContent:"🞪","aria-label":'Close window "Color Filter"'},(t,e)=>{e.onclick=()=>{document.querySelector("#bm-_")?.remove()},e.ontouchend=()=>{e.click()}}).u().u().v({class:"bm-V"}).v({class:"bm-1b bm-U"}).O(1,{textContent:"Color Filter"}).u().u().k().u().v({class:"bm-1b bm-11",style:"gap: 1.5ch; width: fit-content; margin-left: auto; margin-right: auto;"}).K({textContent:"Select All"},(t,e)=>{e.onclick=()=>{}}).u().K({textContent:"Unselect All"},(t,e)=>{e.onclick=()=>{}}).u().u().v({class:"bm-1b bm-19"}).v({class:"bm-1b",style:"margin-left: 2.5ch; margin-right: 2.5ch;"}).B({class:"bm-1b"}).I().L({textContent:"Sort Options:"}).u().v({class:"bm-1b"}).G({id:"bm-O",name:"sortPrimary",textContent:"I want to view "}).U({value:"id",textContent:"color IDs"}).u().U({value:"name",textContent:"color names"}).u().U({value:"premium",textContent:"premium colors"}).u().U({value:"percent",textContent:"percentage"}).u().U({value:"correct",textContent:"correct pixels"}).u().U({value:"incorrect",textContent:"incorrect pixels"}).u().U({value:"total",textContent:"total pixels"}).u().u().G({id:"bm-M",name:"sortSecondary",textContent:" in "}).U({value:"ascending",textContent:"ascending"}).u().U({value:"descending",textContent:"descending"}).u().u().M({textContent:" order."}).u().u().v({class:"bm-1b"}).P({id:"bm-P",name:"showUnused",textContent:"Show unused colors"}).u().u().u().v({class:"bm-1b"}).K({textContent:"Refresh",type:"submit"},(t,e)=>{e.onclick=t=>{t.preventDefault();const e=new FormData(document.querySelector("#bm-_ form")),n={};for([input,value]of e)n[input]=value;console.log(`Primary: ${n.sortPrimary}; Secondary: ${n.sortSecondary}; Unused: ${"on"==n.showUnused}`),function(t,e,n){const i=document.querySelector(".bm-15"),o=Array.from(i.children);o.sort((i,o)=>{const s=i.getAttribute("data-"+t),a=o.getAttribute("data-"+t),r=parseFloat(s),l=parseFloat(a),c=!isNaN(r),m=!isNaN(l);if(n?i.classList.remove("bm-1a"):Number(i.getAttribute("data-total"))||i.classList.add("bm-1a"),c&&m)return"ascending"===e?r-l:l-r;{const t=s.toLowerCase(),n=a.toLowerCase();return tn?"ascending"===e?1:-1:0}}),o.forEach(t=>i.appendChild(t))}(n.sortPrimary,n.sortSecondary,"on"==n.showUnused)}}).u().u().u().$({innerHTML:`Colors with the icon ${t} will be shown on the canvas. Colors with the icon ${e} will not be shown on the canvas. The "Select All" and "Unselect All" buttons only apply to colors that display in the list below.`}).u().u().u().u().u().p(document.body),n.rt("#bm-_.bm-1j","#bm-_ .bm-1h");const i=document.querySelector("#bm-_ .bm-1b.bm-19"),{palette:o,$t:s}=k.Dt;let r=0,l=0;const c=new Map,m=new Map;for(const t of k.Ct){const e=t.ft?.total??0,n=t.ft?.colors??new Map,i=t.ft?.correct??new Map;r+=e??0;for(const[t,e]of i){const n=Number(e)||0;l+=n;const i=c.get(t)??0;c.set(t,i+n)}for(const[t,e]of n){const n=Number(e)||0,i=m.get(t)??0;m.set(t,i+n)}}!function(){const n=new a(S,M);n.v({class:"bm-15"});for(const i of o){const o=d(i.rgb),s=1.05/(o+.05)>(o+.05)/.05?"white":"black",a="white"==s?"bm-Q":"bm-R",r=m.get(i.id)??0,l=(new Intl.NumberFormat).format(r);let h=0,u="0",b=new Intl.NumberFormat(void 0,{style:"percent",ie:2,oe:2}).format(1);0!=r&&(h=c.get(i.id)??"???",u="string"==typeof h?h:(new Intl.NumberFormat).format(h),b=isNaN(h/r)?"???":new Intl.NumberFormat(void 0,{style:"percent",ie:2,oe:2}).format(h/r));const p=parseInt(r)-parseInt(h);n.v({class:"bm-1b bm-12 bm-11","data-id":i.id,"data-name":i.name,"data-premium":+i.premium,"data-correct":Number.isNaN(parseInt(h))?"0":h,"data-total":r,"data-percent":"%"==b.slice(-1)?b.slice(0,-1):"0","data-incorrect":p||0}).v({class:"bm-N",style:`background-color: rgb(${i.rgb?.map(t=>Number(t)||0).join(",")});`}).K({class:"bm-13 "+a,"data-state":"shown","aria-label":`Hide the color ${i.name||"color"} on templates`,innerHTML:t.replace("{i.onclick=()=>{i.style.textDecoration="none",i.disabled=!0,"shown"==i.dataset.state?(i.innerHTML=e.replace("{e.onclick=()=>{window.open("https://pepoafonso.github.io/color_converter_wplace/","_blank","noopener noreferrer")}}).u().K({class:"bm--",innerHTML:"🌐",title:"Official Blue Marble Website"},(t,e)=>{e.onclick=()=>{window.open("https://bluemarble.lol/","_blank","noopener noreferrer")}}).u().u().S({textContent:"Made by SwingTheVine",style:"margin-top: auto;"}).u().u().u().u().u().p(document.body),O.rt("#bm-14.bm-1j","#bm-14 .bm-1h"),N.ee(O),new MutationObserver((t,e)=>{const n=document.querySelector("#color-1");if(!n)return;let i=document.querySelector("#bm-t");if(!i){i=document.createElement("button"),i.id="bm-t",i.textContent="Move ↑",i.className="btn btn-soft",i.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=n.parentNode.parentNode.parentNode.parentNode.querySelector("h2");t.parentNode?.appendChild(i)}}).observe(document.body,{childList:!0,subtree:!0}),function(...t){(0,console.log)(...t)}(`%c${S}%c (${M}) userscript has loaded!`,"color: cornflowerblue;","")})(); \ No newline at end of file +(()=>{var t,e,n,i=t=>{throw TypeError(t)},o=(t,e,n)=>e.has(t)?i("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n),s=(t,e,n)=>(((t,e)=>{e.has(t)||i("Cannot access private method")})(t,e),n),a=class{constructor(e,n){o(this,t),this.name=e,this.version=n,this.t=null,this.i="bm-o",this.o=null,this.l=null,this.m=[]}h(t){this.t=t}u(){return this.m.length>0&&(this.l=this.m.pop()),this}p(t){t?.appendChild(this.o),this.o=null,this.l=null,this.m=[]}v(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"div",{},n)),this}$(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"p",{},n)),this}S(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"small",{},n)),this}M(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"span",{},n)),this}T(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"details",{},n)),this}C(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"summary",{},n)),this}D(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"img",{},n)),this}O(n,i={},o=()=>{}){return o(this,s(this,t,e).call(this,"h"+n,{},i)),this}k(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"hr",{},n)),this}N(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"br",{},n)),this}L(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"form",{},n)),this}B(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"fieldset",{},n)),this}I(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"legend",{},n)),this}P(n={},i=()=>{}){const o=s(this,t,e).call(this,"label",{textContent:n.textContent??""});delete n.textContent;const a=s(this,t,e).call(this,"input",{type:"checkbox"},n);return o.insertBefore(a,o.firstChild),this.u(),i(this,o,a),this}G(n={},i=()=>{}){const o=s(this,t,e).call(this,"label",{textContent:n.textContent??"",for:n.id??""});return delete n.textContent,this.u(),i(this,o,s(this,t,e).call(this,"select",{},n)),this}U(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"option",{},n)),this}A(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"ol",{},n)),this}W(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"ul",{},n)),this}F(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"menu",{},n)),this}H(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"li",{},n)),this}_(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"table",{},n)),this}X(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"caption",{},n)),this}j(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"thead",{},n)),this}J(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"tbody",{},n)),this}R(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"tfoot",{},n)),this}V(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"tr",{},n)),this}Y(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"th",{},n)),this}q(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"td",{},n)),this}K(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"button",{},n)),this}Z(n={},i=()=>{}){const o=n.title??n.textContent??"Help: No info";delete n.textContent,n.title=`Help: ${o}`;const a={textContent:"?",className:"bm-D",onclick:()=>{this.tt(this.i,o)}};return i(this,s(this,t,e).call(this,"button",a,n)),this}et(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"input",{},n)),this}nt(n={},i=()=>{}){const o=n.textContent??"";delete n.textContent;const a=s(this,t,e).call(this,"div"),r=s(this,t,e).call(this,"input",{type:"file",tabindex:"-1","aria-hidden":"true",style:"display: none !important; visibility: hidden !important; position: absolute !important; left: -9999px !important; width: 0 !important; height: 0 !important; opacity: 0 !important;"},n);this.u();const l=s(this,t,e).call(this,"button",{textContent:o});return this.u(),this.u(),l.addEventListener("click",()=>{r.click()}),r.addEventListener("change",()=>{l.style.maxWidth=`${l.offsetWidth}px`,r.files.length>0?l.textContent=r.files[0].name:l.textContent=o}),i(this,a,r,l),this}it(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"textarea",{},n)),this}ot(n={},i=()=>{}){return i(this,s(this,t,e).call(this,"div",{class:"bm-1k"},n)),this}tt(t,e,n=!1){const i=document.getElementById(t.replace(/^#/,""));i&&(i instanceof HTMLInputElement?i.value=e:n?i.textContent=e:i.innerHTML=e)}st(t){if(t.disabled)return;t.disabled=!0,t.style.textDecoration="none";const e=t.closest(".bm-1m"),n=t.closest(".bm-1k"),i=e.querySelector("h1"),o=e.querySelector(".bm-Y");if("expanded"==t.dataset.buttonStatus){o.style.height=o.scrollHeight+"px",e.style.width=e.scrollWidth+"px",o.style.height="0",o.addEventListener("transitionend",function e(){o.style.display="none",t.disabled=!1,t.style.textDecoration="",o.removeEventListener("transitionend",e)});const n=i.cloneNode(!0),s=n.textContent;t.nextElementSibling.appendChild(n),t.textContent="▶",t.dataset.buttonStatus="collapsed",t.ariaLabel=`Unminimize window "${s}"`}else{const i=n.querySelector("h1"),s=i.textContent;i.remove(),o.style.display="",o.style.height="0",e.style.width="",o.style.height=o.scrollHeight+"px",o.addEventListener("transitionend",function e(){o.style.height="",t.disabled=!1,t.style.textDecoration="",o.removeEventListener("transitionend",e)}),t.textContent="▼",t.dataset.buttonStatus="expanded",t.ariaLabel=`Minimize window "${s}"`}}rt(t,e){if(t=document.querySelector(t),e=document.querySelector(e),!t||!e)return void this.lt(`Can not drag! ${t?"":"moveMe"} ${t||e?"":"and "}${e?"":"iMoveThings "}was not found!`);let n,i=!1,o=0,s=null,a=0,r=0,l=0,c=0,m=null;const d=()=>{if(i){const e=Math.abs(a-l),n=Math.abs(r-c);(e>.5||n>.5)&&(a=l,r=c,t.style.transform=`translate(${a}px, ${r}px)`,t.style.left="0px",t.style.top="0px",t.style.right=""),s=requestAnimationFrame(d)}},h=(h,g)=>{i=!0,m=t.getBoundingClientRect(),n=h-m.left,o=g-m.top;const f=window.getComputedStyle(t).transform;if(f&&"none"!==f){const t=new DOMMatrix(f);a=t.m41,r=t.m42}else a=m.left,r=m.top;l=a,c=r,document.body.style.userSelect="none",e.classList.add("bm-1f"),document.addEventListener("mousemove",b),document.addEventListener("touchmove",p,{passive:!1}),document.addEventListener("mouseup",u),document.addEventListener("touchend",u),document.addEventListener("touchcancel",u),s&&cancelAnimationFrame(s),d()},u=()=>{i=!1,s&&(cancelAnimationFrame(s),s=null),document.body.style.userSelect="",e.classList.remove("bm-1f"),document.removeEventListener("mousemove",b),document.removeEventListener("touchmove",p),document.removeEventListener("mouseup",u),document.removeEventListener("touchend",u),document.removeEventListener("touchcancel",u)},b=t=>{i&&m&&(l=t.clientX-n,c=t.clientY-o)},p=t=>{if(i&&m){const e=t.touches[0];if(!e)return;l=e.clientX-n,c=e.clientY-o,t.preventDefault()}};e.addEventListener("mousedown",function(t){t.preventDefault(),h(t.clientX,t.clientY)}),e.addEventListener("touchstart",function(t){const e=t?.touches?.[0];e&&(h(e.clientX,e.clientY),t.preventDefault())},{passive:!1})}ct(t){(0,console.info)(`${this.name}: ${t}`),this.tt(this.i,"Status: "+t,!0)}lt(t){(0,console.error)(`${this.name}: ${t}`),this.tt(this.i,"Error: "+t,!0)}};function r(...t){(0,console.error)(...t)}function l(t,e){if(0===t)return e[0];let n="";const i=e.length;for(;t>0;)n=e[t%i]+n,t=Math.floor(t/i);return n}function c(t){let e="";for(let n=0;n(t/=255)<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4));return.2126*e[0]+.7152*e[1]+.0722*e[2]}t=new WeakSet,e=function(e,i={},o={}){const a=document.createElement(e);this.o?(this.l?.appendChild(a),this.m.push(this.l),this.l=a):(this.o=a,this.l=a);for(const[e,o]of Object.entries(i))s(this,t,n).call(this,a,e,o);for(const[e,i]of Object.entries(o))s(this,t,n).call(this,a,e,i);return a},n=function(t,e,n){if("class"==e)t.classList.add(...n.split(/\s+/));else if("for"==e)t.htmlFor=n;else if("tabindex"==e)t.tabIndex=Number(n);else if("readonly"==e)t.readOnly="true"==n||"1"==n;else if("maxlength"==e)t.maxLength=Number(n);else if(e.startsWith("data"))t.dataset[e.slice(5).split("-").map((t,e)=>0==e?t:t[0].toUpperCase()+t.slice(1)).join("")]=n;else if(e.startsWith("aria")){const i=e.slice(5).split("-").map((t,e)=>0==e?t:t[0].toUpperCase()+t.slice(1)).join("");t["aria"+i[0].toUpperCase()+i.slice(1)]=n}else t[e]=n};var h,u,b,p,g,f,w,y,x,v=[{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]}],$=class{constructor({displayName:t="My template",dt:e=0,ht:n="",url:i="",file:s=null,coords:a=null,ut:r=null,bt:l={},gt:c=1e3}={}){o(this,h),this.displayName=t,this.dt=e,this.ht=n,this.url=i,this.file=s,this.coords=a,this.ut=r,this.bt=l,this.gt=c,this.ft={total:0,colors:new Map}}async wt(t,e){console.log("Template coordinates:",this.coords);const n=await createImageBitmap(this.file),i=n.width,o=n.height;this.gt=t;const a={},r={},l=new OffscreenCanvas(this.gt,this.gt),m=l.getContext("2d",{yt:!0});l.width=i,l.height=o,m.imageSmoothingEnabled=!1,m.drawImage(n,0,0);let d=Date.now();const b=s(this,h,u).call(this,m.getImageData(0,0,i,o),e);console.log(`Calculating total pixels took ${(Date.now()-d)/1e3} seconds`);let p=0;for(const[t,e]of b)0!=t&&(p+=e);this.ft={total:p,colors:b},d=Date.now();const g=new OffscreenCanvas(3,3),f=g.getContext("2d");f.clearRect(0,0,3,3),f.fillStyle="white",f.fillRect(1,1,1,1);for(let t=this.coords[3];t>>24==0?0:o.get(e)??-2;const a=s.get(i);s.set(i,a?a+1:1)}return console.log(s),s},b=new WeakSet,p=async function(){GM.setValue("bmTemplates",JSON.stringify(this.St))},g=async function(t){console.log("Parsing BlueMarble...");const e=t.templates;if(console.log(`BlueMarble length: ${Object.keys(e).length}`),Object.keys(e).length>0)for(const t in e){const n=t,i=e[t];if(console.log(`Template Key: ${n}`),e.hasOwnProperty(t)){const t=n.split(" "),e=Number(t?.[0]),o=t?.[1]||"0",s=i.name||`Template ${e||""}`,a={total:i.pixels.total,colors:new Map(Object.entries(i.pixels.colors).map(([t,e])=>[Number(t),e]))},r=i.tiles,l={},c={},d=this.gt*this.Mt;for(const t in r)if(console.log(t),r.hasOwnProperty(t)){const e=m(r[t]),n=new Blob([e],{type:"image/png"}),i=await createImageBitmap(n);l[t]=i;const o=new OffscreenCanvas(d,d).getContext("2d");o.drawImage(i,0,0);const s=o.getImageData(0,0,i.width,i.height);c[t]=new Uint32Array(s.data.buffer)}const h=new $({displayName:s,dt:e||this.Tt?.length||0,ht:o||""});h.ft=a,h.ut=l,h.bt=c,this.Tt.push(h),console.log(this.Tt),console.log("^^^ This ^^^")}}},f=function(t,e,n){const i=this.Mt,o=this.gt*i,s=n[0],a=n[1],r=n[2],l=n[3],c=this.Ct,{palette:m,$t:d}=this.Dt,h=new Map;for(let n=1;n>>24&255)<=c||(i>>>24&255)<=c)continue;const u=d.get(i)??-2,b=d.get(m)??-2;if(u!=b)continue;const p=h.get(b);h.set(b,p?p+1:1)}return console.log("List of template pixels that match the tile:"),console.log(h),h},w=new WeakSet,y=async function(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"},x=function(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"};var S=GM_info.script.name.toString(),M=GM_info.script.version.toString();!function(t){const e=document.createElement("script");e.setAttribute("bm-E",S),e.setAttribute("bm-B","color: cornflowerblue;"),e.textContent=`(${t})();`,document.documentElement?.appendChild(e),e.remove()}(()=>{const t=document.currentScript,e=t?.getAttribute("bm-E")||"Blue Marble",n=t?.getAttribute("bm-B")||"",i=new Map;window.addEventListener("message",t=>{const{source:o,endpoint:s,blobID:a,blobData:r,blink:l}=t.data,c=Date.now()-l;if(console.groupCollapsed(`%c${e}%c: ${i.size} Recieved IMAGE message about blob "${a}"`,n,""),console.log(`Blob fetch took %c${String(Math.floor(c/6e4)).padStart(2,"0")}:${String(Math.floor(c/1e3)%60).padStart(2,"0")}.${String(c%1e3).padStart(3,"0")}%c MM:SS.mmm`,n,""),console.log(i),console.groupEnd(),"blue-marble"==o&&a&&r&&!s){const t=i.get(a);"function"==typeof t?t(r):function(...t){(0,console.warn)(...t)}(`%c${e}%c: Attempted to retrieve a blob (%s) from queue, but the blobID was not a function! Skipping...`,n,"",a),i.delete(a)}});const o=window.fetch;window.fetch=async function(...t){const s=await o.apply(this,t),a=s.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}"`,n,""),a.json().then(t=>{window.postMessage({source:"blue-marble",endpoint:r,jsonData:t},"*")}).catch(t=>{console.error(`%c${e}%c: Failed to parse JSON: `,n,"",t)});else if(l.includes("image/")&&!r.includes("openfreemap")&&!r.includes("maps")){const t=Date.now(),o=await a.blob();return console.log(`%c${e}%c: ${i.size} Sending IMAGE message about endpoint "${r}"`,n,""),new Promise(s=>{const l=crypto.randomUUID();i.set(l,t=>{s(new Response(t,{headers:a.headers,status:a.status,statusText:a.statusText})),console.log(`%c${e}%c: ${i.size} Processed blob "${l}"`,n,"")}),window.postMessage({source:"blue-marble",endpoint:r,blobID:l,blobData:o,blink:t})}).catch(o=>{const s=Date.now();console.error(`%c${e}%c: Failed to Promise blob!`,n,""),console.groupCollapsed(`%c${e}%c: Details of failed blob Promise:`,n,""),console.log(`Endpoint: ${r}\nThere are ${i.size} blobs processing...\nBlink: ${t.toLocaleString()}\nTime Since Blink: ${String(Math.floor(s/6e4)).padStart(2,"0")}:${String(Math.floor(s/1e3)%60).padStart(2,"0")}.${String(s%1e3).padStart(3,"0")} MM:SS.mmm`),console.error("Exception stack:",o),console.groupEnd()})}return s}});var T=GM_getResourceText("CSS-BM-File");GM_addStyle(T);var C,D="robotoMonoInjectionPoint";D.indexOf("@font-face")+1?(console.log("Loading Roboto Mono as a file..."),GM_addStyle(D)):((C=document.createElement("link")).href="https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&display=swap",C.rel="preload",C.as="style",C.onload=function(){this.onload=null,this.rel="stylesheet"},document.head?.appendChild(C)),new class{constructor(){this.Ot=null,this.kt=null,this.Nt="#bm-h"}Lt(t){return this.kt=t,this.Ot=new MutationObserver(t=>{for(const e of t)for(const t of e.addedNodes)t instanceof HTMLElement&&t.matches?.(this.Nt)}),this}Bt(){return this.Ot}observe(t,e=!1,n=!1){t.observe(this.kt,{childList:e,subtree:n})}};var O=new a(S,M),k=(new a(S,M),new class{constructor(t,e,n){o(this,b),this.name=t,this.version=e,this.o=n,this.It="1.0.0",this.Pt=null,this.Gt="!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~",this.gt=1e3,this.Mt=3,this.Ct=3,this.Dt=function(t){const e=v;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 n=new Map;for(const i of e){if(0==i.id||-2==i.id)continue;const e=i.rgb[0],o=i.rgb[1],s=i.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=o+r,m=s+l;if(t<0||t>255||c<0||c>255||m<0||m>255)continue;const d=(255<<24|m<<16|c<<8|t)>>>0;n.has(d)||n.set(d,i.id)}}return{palette:e,$t:n}}(this.Ct),this.Ut=null,this.At="",this.Tt=[],this.St=null,this.Wt=!0,this.Ft=null}async Ht(){return{whoami:this.name.replace(" ",""),scriptVersion:this.version,schemaVersion:this.It,templates:{}}}async _t(t,e,n){this.St||(this.St=await this.Ht(),console.log("Creating JSON...")),this.o.ct(`Creating template at ${n.join(", ")}...`);const i=new $({displayName:e,dt:0,ht:l(this.Pt||0,this.Gt),file:t,coords:n}),{xt:o,vt:a}=await i.wt(this.gt,this.Dt);i.ut=o;const r={total:i.ft.total,colors:Object.fromEntries(i.ft.colors)};this.St.templates[`${i.dt} ${i.ht}`]={name:i.displayName,coords:n.join(", "),enabled:!0,pixels:r,tiles:a},this.Tt=[],this.Tt.push(i),this.o.ct(`Template created at ${n.join(", ")}!`),console.log(Object.keys(this.St.templates).length),console.log(this.St),console.log(this.Tt),console.log(JSON.stringify(this.St)),await s(this,b,p).call(this)}Et(){}async Xt(){this.St||(this.St=await this.Ht(),console.log("Creating JSON..."))}async jt(t,e){if(!this.Wt)return t;const n=this.gt*this.Mt;e=e[0].toString().padStart(4,"0")+","+e[1].toString().padStart(4,"0"),console.log(`Searching for templates in tile: "${e}"`);const i=this.Tt;console.log(i),i.sort((t,e)=>t.dt-e.dt),console.log(i);const o=i.map(t=>{const n=Object.keys(t.ut).filter(t=>t.startsWith(e));if(0===n.length)return null;const i=n.map(e=>{const n=e.split(",");return{Jt:t,Rt:t.ut[e],bt:t.bt?.[e],Vt:[n[0],n[1]],Yt:[n[2],n[3]]}});return i?.[0]}).filter(Boolean);console.log(o);const a=o?.length||0;if(console.log(`templateCount = ${a}`),!(a>0))return this.o.ct(`Sleeping\nVersion: ${this.version}`),t;{const t=i.filter(t=>Object.keys(t.ut).filter(t=>t.startsWith(e)).length>0).reduce((t,e)=>t+(e.ft.total||0),0),n=(new Intl.NumberFormat).format(t);this.o.ct(`Displaying ${a} template${1==a?"":"s"}.\nTotal pixels: ${n}`)}const r=await createImageBitmap(t),l=new OffscreenCanvas(n,n),c=l.getContext("2d");c.imageSmoothingEnabled=!1,c.beginPath(),c.rect(0,0,n,n),c.clip(),c.clearRect(0,0,n,n),c.drawImage(r,0,0,n,n);const m=c.getImageData(0,0,n,n),d=new Uint32Array(m.data.buffer);for(const t of o){console.log("Template:"),console.log(t);let n=t.bt;const i=Number(t.Yt[0])*this.Mt,o=Number(t.Yt[1])*this.Mt;if(c.drawImage(t.Rt,i,o),!n){const e=c.getImageData(i,o,t.Rt.width,t.Rt.height);n=new Uint32Array(e.data.buffer)}const a=Date.now(),r=s(this,b,f).call(this,d,n,[i,o,t.Rt.width,t.Rt.height]);let l=0;const m=0;for(const[t,e]of r)t!=m&&(l+=e);console.log(`Finished calculating correct pixels for the tile ${e} in ${(Date.now()-a)/1e3} seconds!\nThere are ${l} correct pixels.`),void 0===t.Jt.ft.correct&&(t.Jt.ft.correct={}),t.Jt.ft.correct[e]=r}return await l.convertToBlob({type:"image/png"})}zt(t){console.log("Importing JSON..."),console.log(t),"BlueMarble"==t?.whoami&&s(this,b,g).call(this,t)}qt(t){this.Wt=t}}(S,M,O)),N=new class{constructor(t){o(this,w),this.Qt=t,this.Kt=!1,this.Zt=[],this.te=[]}ee(t){window.addEventListener("message",async e=>{const n=e.data,i=n.jsonData;if(!n||"blue-marble"!==n.source)return;if(!n.endpoint)return;const o=n.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;","",o),o){case"me":if(i.status&&"2"!=i.status?.toString()[0])return void t.lt("You are not logged in!\nCould not fetch userdata.");const e=Math.ceil(Math.pow(Math.floor(i.level)*Math.pow(30,.65),1/.65)-i.pixelsPainted);console.log(i.id),(i.id||0===i.id)&&console.log(l(i.id,"!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~")),this.Qt.Pt=i.id,t.tt("bm-p",`Droplets: ${(new Intl.NumberFormat).format(i.droplets)}`),t.tt("bm-i",`Next level in ${(new Intl.NumberFormat).format(e)} pixel${1==e?"":"s"}`);break;case"pixel":const o=n.endpoint.split("?")[0].split("/").filter(t=>t&&!isNaN(Number(t))),r=new URLSearchParams(n.endpoint.split("?")[1]),c=[r.get("x"),r.get("y")];if(this.Zt.length&&(!o.length||!c.length))return void t.lt("Coordinates are malformed!\nDid you try clicking the canvas first?");this.Zt=[...o,...c];const m=(s=o,a=c,[parseInt(s[0])%4*1e3+parseInt(a[0]),parseInt(s[1])%4*1e3+parseInt(a[1])]),d=document.querySelectorAll("span");for(const t of d)if(t.textContent.trim().includes(`${m[0]}, ${m[1]}`)){let e=document.querySelector("#bm-h");const n=`(Tl X: ${o[0]}, Tl Y: ${o[1]}, Px X: ${c[0]}, Px Y: ${c[1]})`;e?e.textContent=n:(e=document.createElement("span"),e.id="bm-h",e.textContent=n,e.style="margin-left: calc(var(--spacing)*3); font-size: small;",t.parentNode.parentNode.insertAdjacentElement("afterend",e))}break;case"tiles":let h=n.endpoint.split("/");h=[parseInt(h[h.length-2]),parseInt(h[h.length-1].replace(".png",""))];const u=n.blobID,b=n.blobData,p=Date.now(),g=await this.Qt.jt(b,h);console.log(`Finished loading the tile in ${(Date.now()-p)/1e3} seconds!`),window.postMessage({source:"blue-marble",blobID:u,blobData:g,blink:n.blink});break;case"robots":this.Kt="false"==i.userscript?.toString().toLowerCase();break}var s,a})}async ne(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 n=navigator.userAgent;let i=await s(this,w,y).call(this,n),o=s(this,w,x).call(this,n);GM_xmlhttpRequest({method:"POST",url:"https://telemetry.thebluecorner.net/heartbeat",headers:{"Content-Type":"application/json"},data:JSON.stringify({uuid:e.uuid,version:t,browser:i,os:o}),onload:t=>{200!==t.status&&r("Failed to send heartbeat:",t.statusText)},onerror:t=>{r("Error sending heartbeat:",t)}})}}(k);O.h(N);var L=JSON.parse(GM_getValue("bmTemplates","{}"));console.log(L),k.zt(L);var B=JSON.parse(GM_getValue("bmUserSettings","{}"));if(console.log(B),console.log(Object.keys(B).length),0==Object.keys(B).length){const t=crypto.randomUUID();console.log(t),GM.setValue("bmUserSettings",JSON.stringify({uuid:t}))}if(setInterval(()=>N.ne(M),18e5),console.log(`Telemetry is ${!(null==B?.telemetry)}`),null==B?.telemetry||B?.telemetry>1){const t=new a(S,M);t.h(N),t.v({id:"bm-d",style:"top: 0px; left: 0px; width: 100vw; max-width: 100vw; height: 100vh; max-height: 100vh; z-index: 9999;"}).v({id:"bm-7",style:"display: flex; flex-direction: column; align-items: center;"}).v({id:"bm-1",style:"margin-top: 10%;"}).O(1,{textContent:`${S} Telemetry`}).u().u().v({id:"bm-e",style:"max-width: 50%; overflow-y: auto; max-height: 80vh;"}).k().u().N().u().v({style:"width: fit-content; margin: auto; text-align: center;"}).K({id:"bm-8",textContent:"More Information"},(t,e)=>{e.onclick=()=>{window.open("https://github.com/SwingTheVine/Wplace-TelemetryServer#telemetry-data","_blank","noopener noreferrer")}}).u().u().N().u().v({style:"width: fit-content; margin: auto; text-align: center;"}).K({id:"bm-5",textContent:"Enable Telemetry",style:"margin-right: 2ch;"},(t,e)=>{e.onclick=()=>{const t=JSON.parse(GM_getValue("bmUserSettings","{}"));t.telemetry=1,GM.setValue("bmUserSettings",JSON.stringify(t));const e=document.getElementById("bm-d");e&&(e.style.display="none")}}).u().K({id:"bm-2",textContent:"Disable Telemetry"},(t,e)=>{e.onclick=()=>{const t=JSON.parse(GM_getValue("bmUserSettings","{}"));t.telemetry=0,GM.setValue("bmUserSettings",JSON.stringify(t));const e=document.getElementById("bm-d");e&&(e.style.display="none")}}).u().u().N().u().$({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 the Blue Marble!"}).u().$({textContent:'You can disable telemetry by pressing the "Disable" button below.'}).u().u().u().p(document.body)}O.v({id:"bm-17",class:"bm-1m",style:"top: 10px; left: unset; right: 75px;"}).ot().K({class:"bm-11",textContent:"▼","aria-label":'Minimize window "Blue Marble"',"data-button-status":"expanded"},(t,e)=>{e.onclick=()=>t.st(e),e.ontouchend=()=>{e.click()}}).u().v().u().u().v({class:"bm-Y"}).v({class:"bm-1e"}).D({class:"bm-1l",src:"https://raw.githubusercontent.com/SwingTheVine/Wplace-BlueMarble/main/dist/assets/Favicon.png"}).u().O(1,{textContent:S}).u().u().k().u().v({class:"bm-1e"}).$({id:"bm-p",textContent:"Droplets:"}).u().$({id:"bm-i",textContent:"Next level in..."}).u().u().k().u().v({class:"bm-1e"}).v({class:"bm-1e"}).K({class:"bm-11 bm-1a",style:"margin-top: 0;",innerHTML:''},(t,e)=>{e.onclick=()=>{const e=t.t?.Zt;e?.[0]?(t.tt("bm-v",e?.[0]||""),t.tt("bm-w",e?.[1]||""),t.tt("bm-x",e?.[2]||""),t.tt("bm-y",e?.[3]||"")):t.lt("Coordinates are malformed! Did you try clicking on the canvas first?")}}).u().et({type:"number",id:"bm-v",class:"bm-13",placeholder:"Tl X",min:0,max:2047,step:1,required:!0},(t,e)=>{e.addEventListener("paste",t=>{let e=(t.clipboardData||window.clipboardData).getData("text").split(" ").filter(t=>t).map(Number).filter(t=>!isNaN(t));if(4!==e.length)return;let n=selectAllCoordinateInputs(document);for(let t=0;t{e.onclick=()=>{e.disabled=!0,"shown"==e.dataset.buttonStatus?(t.t?.Qt?.qt(!1),e.dataset.buttonStatus="hidden",e.textContent="Enable",t.ct("Disabled templates!")):(t.t?.Qt?.qt(!0),e.dataset.buttonStatus="shown",e.textContent="Disable",t.ct("Enabled templates!")),e.disabled=!1}}).u().K({textContent:"Create"},(t,e)=>{e.onclick=()=>{const e=document.querySelector("#bm-17 button.bm-1b"),n=document.querySelector("#bm-v");if(!n.checkValidity())return n.reportValidity(),void t.lt("Coordinates are malformed! Did you try clicking on the canvas first?");const i=document.querySelector("#bm-w");if(!i.checkValidity())return i.reportValidity(),void t.lt("Coordinates are malformed! Did you try clicking on the canvas first?");const o=document.querySelector("#bm-x");if(!o.checkValidity())return o.reportValidity(),void t.lt("Coordinates are malformed! Did you try clicking on the canvas first?");const s=document.querySelector("#bm-y");if(!s.checkValidity())return s.reportValidity(),void t.lt("Coordinates are malformed! Did you try clicking on the canvas first?");e?.files[0]?(k._t(e.files[0],e.files[0]?.name.replace(/\.[^/.]+$/,""),[Number(n.value),Number(i.value),Number(o.value),Number(s.value)]),t.ct("Drew to canvas!")):t.lt("No file selected!")}}).u().K({textContent:"Filter"},(t,e)=>{e.onclick=()=>function(){if(document.querySelector("#bm-12"))return void O.lt("Color Filter window already exists!");const t='',e='',n=new Intl.NumberFormat,i=new Intl.NumberFormat(void 0,{style:"percent",ie:2,oe:2}),o=new a(S,M);o.v({id:"bm-12",class:"bm-1m"}).ot().K({class:"bm-11",textContent:"▼","aria-label":'Minimize window "Color Filter"',"data-button-status":"expanded"},(t,e)=>{e.onclick=()=>t.st(e),e.ontouchend=()=>{e.click()}}).u().v().u().K({class:"bm-11",textContent:"🞪","aria-label":'Close window "Color Filter"'},(t,e)=>{e.onclick=()=>{document.querySelector("#bm-12")?.remove()},e.ontouchend=()=>{e.click()}}).u().u().v({class:"bm-Y"}).v({class:"bm-1e bm-W"}).O(1,{textContent:"Color Filter"}).u().u().k().u().v({class:"bm-1e bm-14",style:"gap: 1.5ch; width: fit-content; margin-left: auto; margin-right: auto;"}).K({textContent:"Select All"},(t,e)=>{e.onclick=()=>p(!1)}).u().K({textContent:"Unselect All"},(t,e)=>{e.onclick=()=>p(!0)}).u().u().v({class:"bm-1e bm-1c"}).v({class:"bm-1e",style:"margin-left: 2.5ch; margin-right: 2.5ch;"}).v({class:"bm-1e"}).M({id:"bm-Q",innerHTML:"Correct Pixels: ???"}).u().N().u().M({id:"bm-X",innerHTML:"Total Pixels: ???"}).u().N().u().M({id:"bm-N",innerHTML:"Complete: ??? (???)"}).u().u().v({class:"bm-1e"}).$({innerHTML:`Colors with the icon ${t.replace("{e.onclick=t=>{t.preventDefault();const e=new FormData(document.querySelector("#bm-12 form")),n={};for([input,value]of e)n[input]=value;console.log(`Primary: ${n.sortPrimary}; Secondary: ${n.sortSecondary}; Unused: ${"on"==n.showUnused}`),b(n.sortPrimary,n.sortSecondary,"on"==n.showUnused)}}).u().u().u().u().u().u().u().p(document.body),o.rt("#bm-12.bm-1m","#bm-12 .bm-1k");const s=document.querySelector("#bm-12 .bm-1e.bm-1c"),{palette:r,$t:l}=k.Dt;let c=0,m=0;const h=new Map,u=new Map;for(const t of k.Tt){c+=t.ft?.total??0??0;const e=t.ft?.colors??new Map;for(const[t,n]of e){const e=Number(n)||0,i=u.get(t)??0;u.set(t,i+e)}const n=t.ft?.correct??{};for(const t of Object.values(n))for(const[e,n]of t){const t=Number(n)||0;m+=t;const i=h.get(e)??0;h.set(e,i+t)}}function b(t,e,n){const i=document.querySelector(".bm-18"),o=Array.from(i.children);o.sort((i,o)=>{const s=i.getAttribute("data-"+t),a=o.getAttribute("data-"+t),r=parseFloat(s),l=parseFloat(a),c=!isNaN(r),m=!isNaN(l);if(n?i.classList.remove("bm-1d"):Number(i.getAttribute("data-total"))||i.classList.add("bm-1d"),c&&m)return"ascending"===e?r-l:l-r;{const t=s.toLowerCase(),n=a.toLowerCase();return tn?"ascending"===e?1:-1:0}}),o.forEach(t=>i.appendChild(t))}function p(t){const e=document.querySelector(".bm-18"),n=Array.from(e.children);for(const e of n){if(e.classList?.contains("bm-1d"))continue;const n=e.querySelector(".bm-O button");("hidden"!=n.dataset.state||t)&&("shown"==n.dataset.state&&t||n.click())}}o.tt("#bm-Q",`Correct Pixels: ${n.format(m)}`),o.tt("#bm-X",`Total Pixels: ${n.format(c)}`),o.tt("#bm-N",`Remaining: ${n.format((c||0)-(m||0))} (${i.format(((c||0)-(m||0))/(c||1))})`),function(){const o=new a(S,M);o.v({class:"bm-18"});for(const s of r){const a=d(s.rgb),r=1.05/(a+.05)>(a+.05)/.05?"white":"black",l="white"==r?"bm-S":"bm-T",c=u.get(s.id)??0,m=n.format(c);let b=0,p="0",g=i.format(1);0!=c&&(b=h.get(s.id)??"???",p="string"==typeof b?b:n.format(b),g=isNaN(b/c)?"???":i.format(b/c));const f=parseInt(c)-parseInt(b);o.v({class:"bm-1e bm-15 bm-14","data-id":s.id,"data-name":s.name,"data-premium":+s.premium,"data-correct":Number.isNaN(parseInt(b))?"0":b,"data-total":c,"data-percent":"%"==g.slice(-1)?g.slice(0,-1):"0","data-incorrect":f||0}).v({class:"bm-O",style:`background-color: rgb(${s.rgb?.map(t=>Number(t)||0).join(",")});`}).K({class:"bm-16 "+l,"data-state":"shown","aria-label":`Hide the color ${s.name||"color"} on templates`,innerHTML:t.replace("{i.onclick=()=>{i.style.textDecoration="none",i.disabled=!0,"shown"==i.dataset.state?(i.innerHTML=e.replace("{e.onclick=()=>{window.open("https://pepoafonso.github.io/color_converter_wplace/","_blank","noopener noreferrer")}}).u().K({class:"bm-11",innerHTML:"🌐",title:"Official Blue Marble Website"},(t,e)=>{e.onclick=()=>{window.open("https://bluemarble.lol/","_blank","noopener noreferrer")}}).u().u().S({textContent:"Made by SwingTheVine",style:"margin-top: auto;"}).u().u().u().u().u().p(document.body),O.rt("#bm-17.bm-1m","#bm-17 .bm-1k"),N.ee(O),new MutationObserver((t,e)=>{const n=document.querySelector("#color-1");if(!n)return;let i=document.querySelector("#bm-t");if(!i){i=document.createElement("button"),i.id="bm-t",i.textContent="Move ↑",i.className="btn btn-soft",i.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=n.parentNode.parentNode.parentNode.parentNode.querySelector("h2");t.parentNode?.appendChild(i)}}).observe(document.body,{childList:!0,subtree:!0}),function(...t){(0,console.log)(...t)}(`%c${S}%c (${M}) userscript has loaded!`,"color: cornflowerblue;","")})(); \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index 4115286..d36b68f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -51,7 +51,7 @@ Contact Me Blue Marble Website WakaTime -Total Patches +Total Patches Total Lines of Code Total Comments Compression diff --git a/package-lock.json b/package-lock.json index 3c274d4..7808e37 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "wplace-bluemarble", - "version": "0.88.261", + "version": "0.88.293", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "wplace-bluemarble", - "version": "0.88.261", + "version": "0.88.293", "devDependencies": { "esbuild": "^0.25.0", "jsdoc": "^4.0.5", diff --git a/package.json b/package.json index af98aff..00d0432 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wplace-bluemarble", - "version": "0.88.261", + "version": "0.88.293", "type": "module", "homepage": "https://bluemarble.lol/", "repository": { diff --git a/src/BlueMarble.meta.js b/src/BlueMarble.meta.js index 5eec7b0..00596b3 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.88.261 +// @version 0.88.293 // @description A userscript to automate and/or enhance the user experience on Wplace.live. Make sure to comply with the site's Terms of Service, and rules! This script is not affiliated with Wplace.live in any way, use at your own risk. This script is not affiliated with TamperMonkey. The author of this userscript is not responsible for any damages, issues, loss of data, or punishment that may occur as a result of using this script. This script is provided "as is" under the MPL-2.0 license. The "Blue Marble" icon is licensed under CC0 1.0 Universal (CC0 1.0) Public Domain Dedication. The image is owned by NASA. // @description:en A userscript to automate and/or enhance the user experience on Wplace.live. Make sure to comply with the site's Terms of Service, and rules! This script is not affiliated with Wplace.live in any way, use at your own risk. This script is not affiliated with TamperMonkey. The author of this userscript is not responsible for any damages, issues, loss of data, or punishment that may occur as a result of using this script. This script is provided "as is" under the MPL-2.0 license. The "Blue Marble" icon is licensed under CC0 1.0 Universal (CC0 1.0) Public Domain Dedication. The image is owned by NASA. // @author SwingTheVine diff --git a/src/Template.js b/src/Template.js index 7a936b7..ef2403e 100644 --- a/src/Template.js +++ b/src/Template.js @@ -41,7 +41,7 @@ export default class Template { this.chunked = chunked; this.chunked32 = chunked32; this.tileSize = tileSize; - /** Total pixel count in template @type {{total: number, colors: Map, correct?: Map}} */ + /** Total pixel count in template @type {{total: number, colors: Map, correct?: { [key: string]: Map }}} */ this.pixelCount = { total: 0, colors: new Map() }; } diff --git a/src/main.js b/src/main.js index cf283d7..fe9919b 100644 --- a/src/main.js +++ b/src/main.js @@ -465,6 +465,9 @@ function buildWindowFilter() { const eyeOpen = ''; const eyeClosed = ''; + const localizeNumber = new Intl.NumberFormat(); + const localizePercent = new Intl.NumberFormat(undefined, { style: 'percent', minimumFractionDigits: 2, maximumFractionDigits: 2 }); + // Creates a new color filter window const overlayFilter = new Overlay(name, version); overlayFilter.addDiv({'id': 'bm-window-filter', 'class': 'bm-window'}) @@ -486,21 +489,28 @@ function buildWindowFilter() { .addHr().buildElement() .addDiv({'class': 'bm-container bm-flex-between', 'style': 'gap: 1.5ch; width: fit-content; margin-left: auto; margin-right: auto;'}) .addButton({'textContent': 'Select All'}, (instance, button) => { - button.onclick = () => { - - } + button.onclick = () => selectColorList(false); }).buildElement() .addButton({'textContent': 'Unselect All'}, (instance, button) => { - button.onclick = () => { - - } + button.onclick = () => selectColorList(true); }).buildElement() .buildElement() .addDiv({'class': 'bm-container bm-scrollable'}) .addDiv({'class': 'bm-container', 'style': 'margin-left: 2.5ch; margin-right: 2.5ch;'}) + .addDiv({'class': 'bm-container'}) + .addSpan({'id': 'bm-filter-tot-correct', 'innerHTML': 'Correct Pixels: ???'}).buildElement() + .addBr().buildElement() + .addSpan({'id': 'bm-filter-tot-total', 'innerHTML': 'Total Pixels: ???'}).buildElement() + .addBr().buildElement() + .addSpan({'id': 'bm-filter-tot-remaining', 'innerHTML': 'Complete: ??? (???)'}).buildElement() + .buildElement() + .addDiv({'class': 'bm-container'}) + .addP({'innerHTML': `Colors with the icon ${eyeOpen.replace(' { + .addButton({'textContent': 'Sort Colors', 'type': 'submit'}, (instance, button) => { button.onclick = (event) => { event.preventDefault(); // Stop default form submission @@ -540,7 +550,6 @@ function buildWindowFilter() { }).buildElement() .buildElement() .buildElement() - .addP({'innerHTML': `Colors with the icon ${eyeOpen} will be shown on the canvas. Colors with the icon ${eyeClosed} will not be shown on the canvas. The "Select All" and "Unselect All" buttons only apply to colors that display in the list below.`}).buildElement() .buildElement() // Color list will appear here in the DOM tree .buildElement() @@ -567,18 +576,9 @@ function buildWindowFilter() { for (const template of templateManager.templatesArray) { const total = template.pixelCount?.total ?? 0; - const colors = template.pixelCount?.colors ?? new Map(); - const correct = template.pixelCount?.correct ?? new Map(); - allPixelsTotal += total ?? 0; // Sums the pixels placed as "total" per everything - // Sums the pixels placed as "correct" per color ID - for (const [colorID, correctPixels] of correct) { - const _correctPixels = Number(correctPixels) || 0; // Boilerplate - allPixelsCorrectTotal += _correctPixels; // Sums the pixels placed as "correct" per everything - const allPixelsCorrectSoFar = allPixelsCorrect.get(colorID) ?? 0; // The total correct pixels for this color ID so far, or zero if none counted so far - allPixelsCorrect.set(colorID, allPixelsCorrectSoFar + _correctPixels); - } + const colors = template.pixelCount?.colors ?? new Map(); // Sums the color pixels placed as "total" per color ID for (const [colorID, colorPixels] of colors) { @@ -586,9 +586,29 @@ function buildWindowFilter() { const allPixelsColorSoFar = allPixelsColor.get(colorID) ?? 0; // The total color pixels for this color ID so far, or zero if none counted so far allPixelsColor.set(colorID, allPixelsColorSoFar + _colorPixels); } + + // Object that contains the tiles which contain Maps as correct pixels per tile as the value in the key-value pair + const correctObject = template.pixelCount?.correct ?? {}; + + // Sums the pixels placed as "correct" per color ID + for (const map of Object.values(correctObject)) { // Per tile per template + for (const [colorID, correctPixels] of map) { // Per color per tile per template + const _correctPixels = Number(correctPixels) || 0; // Boilerplate + allPixelsCorrectTotal += _correctPixels; // Sums the pixels placed as "correct" per everything + const allPixelsCorrectSoFar = allPixelsCorrect.get(colorID) ?? 0; // The total correct pixels for this color ID so far, or zero if none counted so far + allPixelsCorrect.set(colorID, allPixelsCorrectSoFar + _correctPixels); + } + } } + // Displays the total amounts across all colors to the user + overlayFilter.updateInnerHTML('#bm-filter-tot-correct', `Correct Pixels: ${localizeNumber.format(allPixelsCorrectTotal)}`); + overlayFilter.updateInnerHTML('#bm-filter-tot-total', `Total Pixels: ${localizeNumber.format(allPixelsTotal)}`); + overlayFilter.updateInnerHTML('#bm-filter-tot-remaining', `Remaining: ${localizeNumber.format((allPixelsTotal || 0) - (allPixelsCorrectTotal || 0))} (${localizePercent.format(((allPixelsTotal || 0) - (allPixelsCorrectTotal || 0)) / (allPixelsTotal || 1))})`); + + // These run when the user opens the Color Filter window buildColorList(); + sortColorList('id', 'ascending', false); // Creates the color list container function buildColorList() { @@ -612,18 +632,18 @@ function buildWindowFilter() { // Turns "total" color into a string of a number; "0" if unknown const colorTotal = allPixelsColor.get(color.id) ?? 0 - const colorTotalLocalized = new Intl.NumberFormat().format(colorTotal); + const colorTotalLocalized = localizeNumber.format(colorTotal); // This will be displayed if the total pixels for this color is zero let colorCorrect = 0; let colorCorrectLocalized = '0'; - let colorPercent = new Intl.NumberFormat(undefined, { style: 'percent', minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(1); + let colorPercent = localizePercent.format(1); // This will be displayed if the total pixels for this color is non-zero if (colorTotal != 0) { colorCorrect = allPixelsCorrect.get(color.id) ?? '???'; - colorCorrectLocalized = (typeof colorCorrect == 'string') ? colorCorrect : new Intl.NumberFormat().format(colorCorrect); - colorPercent = isNaN(colorCorrect / colorTotal) ? '???' : new Intl.NumberFormat(undefined, { style: 'percent', minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(colorCorrect / colorTotal); + colorCorrectLocalized = (typeof colorCorrect == 'string') ? colorCorrect : localizeNumber.format(colorCorrect); + colorPercent = isNaN(colorCorrect / colorTotal) ? '???' : localizePercent.format(colorCorrect / colorTotal); } // Incorrect pixels for this color @@ -672,6 +692,7 @@ function buildWindowFilter() { colorList.buildOverlay(scrollableContainer); } + // Sorts the color list & hides unused colors function sortColorList(sortPrimary, sortSecondary, showUnused) { // "sortSecondary" can be either 'ascending' or 'descending' @@ -714,28 +735,28 @@ function buildWindowFilter() { colors.forEach(color => colorList.appendChild(color)); } -} -function buildOverlayTabTemplate() { - overlayTabTemplate.addDiv({'id': 'bm-tab-template', 'style': 'top: 20%; left: 10%;'}) - .addDiv() - .addDiv({'className': 'bm-dragbar'}).buildElement() - .addButton({'className': 'bm-button-minimize', 'textContent': '↑'}, - (instance, button) => { - button.onclick = () => { - let isMinimized = false; - if (button.textContent == '↑') { - button.textContent = '↓'; - } else { - button.textContent = '↑'; - isMinimized = true; - } + // (Un)selects all colors in the color list that are visible to the user + function selectColorList(userWantsUnselect) { - - } - } - ).buildElement() - .buildElement() - .buildElement() - .buildOverlay(); + // Gets the colors + const colorList = document.querySelector('.bm-filter-flex'); + const colors = Array.from(colorList.children); + + // For each color... + for (const color of colors) { + + // Skip this color if it is hidden + if (color.classList?.contains('bm-color-hide')) {continue;} + + // Gets the button to click + const button = color.querySelector('.bm-filter-container-rgb button'); + + // Exits early if the button is in its proper state + if ((button.dataset['state'] == 'hidden') && !userWantsUnselect) {continue;} // If the button is selected, and the user wants to select all buttons, then skip this one + if ((button.dataset['state'] == 'shown') && userWantsUnselect) {continue;} // If the button is not selected, and the user wants to unselect all buttons, then skip this one + + button.click(); // If the button is not in its proper state, then we click it + } + } } diff --git a/src/overlay.css b/src/overlay.css index 6c510a2..3621550 100644 --- a/src/overlay.css +++ b/src/overlay.css @@ -50,7 +50,7 @@ align-items: center; gap: 0.5ch; /* For background circles, width & height should be odd, cx & cy should be half of width & height, and r should be less than or equal to cx & cy */ - background: url('data:image/svg+xml;utf8,') repeat; + background: url('data:image/svg+xml;utf8,') repeat; cursor: grab; width: 100%; height: fit-content; @@ -355,6 +355,33 @@ input[type="file"] { padding: 1ch; } +/* Filter window container for RGB color display for Other color */ +.bm-filter-color[data-id="-2"] .bm-filter-container-rgb { + background: conic-gradient( + #aa0000 0%, + #aaaa00 16.6%, + #00aa00 33.3%, + #00aaaa 50%, + #0000aa 66.6%, + #aa00aa 83.3%, + #aa0000 100% + ); +} + +/* Filter window container for RGB color display for Erased color */ +.bm-filter-color[data-id="-1"] .bm-filter-container-rgb { + background: url('data:image/svg+xml;utf8,') repeat; + background-color: transparent !important; +} +.bm-filter-color[data-id="-1"] .bm-filter-container-rgb svg { + fill: white !important; +} + +/* Filter window container for RGB color display for Transparent color */ +.bm-filter-color[data-id="0"] .bm-filter-container-rgb { + background-color: transparent !important; +} + /* Filter window hide color button */ .bm-filter-container-rgb button { padding: 0.75em 0.5ch; @@ -380,4 +407,5 @@ input[type="file"] { /* Filter window hide unused colors */ #bm-window-filter .bm-filter-color.bm-color-hide { display: none; -} \ No newline at end of file +} + diff --git a/src/templateManager.js b/src/templateManager.js index a3f9360..36ca35a 100644 --- a/src/templateManager.js +++ b/src/templateManager.js @@ -310,15 +310,22 @@ export default class TemplateManager { let pixelsCorrectTotal = 0; const transparentColorID = 0; + // For each color with correct pixels placed for this template... for (const [color, total] of pixelsCorrect) { if (color == transparentColorID) {continue;} // Skip Transparent color - pixelsCorrectTotal += total; + pixelsCorrectTotal += total; // Add the current total for this color to the summed total of all correct } console.log(`Finished calculating correct pixels for the tile ${tileCoords} in ${(Date.now() - timer) / 1000} seconds!\nThere are ${pixelsCorrectTotal} correct pixels.`); - template.instance.pixelCount['correct'] = pixelsCorrect; // Adds the correct pixel Map to the template instance + // If "correct" does not exist as a key of the object "pixelCount", we create it + if (typeof template.instance.pixelCount['correct'] == 'undefined') { + template.instance.pixelCount['correct'] = {}; + } + + // Adds the correct pixel Map to the template instance + template.instance.pixelCount['correct'][tileCoords] = pixelsCorrect; } return await canvas.convertToBlob({ type: 'image/png' });